Mongodb实验二——分片集群搭建

news2025/8/4 4:18:14

 

目录

前言

题目一

1.创建副本集实例(Mongod)

cfg0_0配置 

cfg0_1配置

cfg0_2配置

ch0_0配置

ch0_1配置

ch0_2配置

ch1_0配置

 ch1_1配置

ch1_2配置

2.初始化副本集

 ch0conf.js配置

ch1conf.js配置

 3.创建路由节点(分片管理服务器)Mongos

4.添加分片集合

5.Windows批处理文件编写

题目二

1.分片式数据库创建

 2.确认集合片集

 3.分片集合创建

 4.另外一种方法

题目三

1.分片集状态

 2.分片数据库的统计信息

 3.分片集合数据分布情况

前言

本实验在一台电脑上完成,本人自己方法与标准方法略有差异,大家仁者见仁,同时可能你按照一样的步骤下来,会出现各种各样的错误,但希望大家懂得学会去查看日志,查看代码,懂得如何解决问题,这是一个有趣的过程,共勉。

题目一

根据下面的规划表搭建MongoDB分片集群:

 步骤:

1.创建副本集实例(Mongod)

即两个分片服务器ch0,ch1(以大家名字缩写命名)和一个配置服务器cfg0,每个服务器下有包含三个服务,即ch0(ch0_0,ch0_1,ch0_2),ch1(ch1_0,ch1_1,ch1_2),cfg0(cfg0_0,cfg0_1,cfg0_2),于是我们可以开始配置每个服务的配置文件即ini文件,由于个人强迫症原因,喜欢每个服务器用一个文件夹保存(这里大家可以全部放在一个文件夹下,不用这样的)如下图所示

 在cf0服务器下将每个服务用一个文件夹保存

cfg0_0配置 

在cfg0_0这个服务呀创建一个ini文件,然后编写参数(这里你可以自己手动创建db文件夹和log文件,也可以不用创建,只要你在配置文件中把dbpath和logpath明确就行,因为在Windows执行的时候会自己创建的)

 

bind_ip=127.0.0.1
port=27026

dbpath=D:\MongoDB\ch\cfg0\cfg0_0\db
logpath=D:\MongoDB\ch\cfg0\cfg0_0\cfg0_0.log
logappend=true

replSet=cfg0
configsvr=true

然后其他的服务类似配置,这里不细说了,图片展示一下

cfg0_1配置

 

bind_ip=127.0.0.1
port=27027

dbpath=D:\MongoDB\ch\cfg0\cfg0_1\db
logpath=D:\MongoDB\ch\cfg0\cfg0_1\cfg0_1.log
logappend=true

replSet=cfg0
configsvr=true

cfg0_2配置

bind_ip=127.0.0.1
port=27028

dbpath=D:\MongoDB\ch\cfg0\cfg0_2\db
logpath=D:\MongoDB\ch\cfg0\cfg0_2\cfg0_2.log
logappend=true

replSet=cfg0
configsvr=true

ch0_0配置

 bind_ip=127.0.0.1
port=27020

dbpath=D:\MongoDB\ch\ch0\ch0_0\db
logpath=D:\MongoDB\ch\ch0\ch0_0\ch0_0.log
logappend=true

replSet=ch0
shardsvr=true

ch0_1配置

 bind_ip=127.0.0.1
port=27021

dbpath=D:\MongoDB\ch\ch0\ch0_1\db
logpath=D:\MongoDB\ch\ch0\ch0_1\ch0_1.log
logappend=true

replSet=ch0
shardsvr=true

ch0_2配置

 bind_ip=127.0.0.1
port=27022

dbpath=D:\MongoDB\ch\ch0\ch0_2\db
logpath=D:\MongoDB\ch\ch0\ch0_2\ch0_2.log
logappend=true

replSet=ch0
shardsvr=true

ch1_0配置

bind_ip=127.0.0.1
port=27023

dbpath=D:\MongoDB\ch\ch1\ch1_0\db
logpath=D:\MongoDB\ch\ch1\ch1_0\ch1_0.log
logappend=true

replSet=ch1
shardsvr=true

 ch1_1配置

 

bind_ip=127.0.0.1
port=27024

dbpath=D:\MongoDB\ch\ch1\ch1_1\db
logpath=D:\MongoDB\ch\ch1\ch1_1\ch1_1.log
logappend=true

replSet=ch1
shardsvr=true

ch1_2配置

 bind_ip=127.0.0.1
port=27025

dbpath=D:\MongoDB\ch\ch1\ch1_2\db
logpath=D:\MongoDB\ch\ch1\ch1_2\ch1_2.log
logappend=true

replSet=ch1
shardsvr=true

2.初始化副本集

即初始化两个分片服务器(ch0,ch1)和一个配置服务器(cfg0)

这里我分布在ch0,ch1,cfg0下创建了一个js文件(可自己随便在某个位置创建这三个文件)

cfgoconf.js文件配置

 

var rsconf={
	_id:"cfg0",
	"members":[
	{_id:0,host:"127.0.0.1:27026",priority:2},
	{_id:1,host:"127.0.0.1:27027",priority:1},
	{_id:2,host:"127.0.0.1:27028",priority:1}
	]};
	
rs.initiate(rsconf)

 ch0conf.js配置

var rsconf={
	_id:"ch0",
	"members":[
		{_id:0,host:"127.0.0.1:27020",priority:2},
		{_id:1,host:"127.0.0.1:27021",priority:1},
		{_id:2,host:"127.0.0.1:27022",priority:0,arbiterOnly:true}
	]};
	
rs.initiate(rsconf)

ch1conf.js配置

var rsconf={
	_id:"ch1",
	"members":[
	{"_id":0,"host":"127.0.0.1:27023",priority:2},
	{"_id":1,"host":"127.0.0.1:27024",priority:1},
	{"_id":2,"host":"127.0.0.1:27025",priority:0,arbiterOnly:true}
	]};
	
rs.initiate(rsconf)

 3.创建路由节点(分片管理服务器)Mongos

我用了一个文件夹来保存这个服务器,如下图

 然后在该文件夹下编写其配置文件ini

 bind_ip=0.0.0.0
port=27017

logpath=D:\MongoDB\ch\router0\mongos.log
logappend=true

configdb=cfg0/127.0.0.1:27026,127.0.0.1:27027,127.0.0.1:27028

4.添加分片集合

我在router0下创建了一个js文件,其配置参数如下

sh.addShard("ch0/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022");
sh.addShard("ch1/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025");

 到了这里所有配置的基本配置完成,只需要进行启动就好,为了每次启动便捷,我们这里编写一个windows批处理文件

5.Windows批处理文件编写

 先创建一个txt文件,然后配置好后,把后缀改为bat文件即可

REM 0. 配置环境变量 (根据你的实际环境来配置)
SET MONGOD_CMD=D:\MongoDB\bin\mongod.exe
SET MONGOS_CMD=D:\MongoDB\bin\mongos.exe
SET MONGO_CMD=D:\MongoDB\bin\mongo.exe

REM 1. 创建9台服务器实例(server1~server9)路径//已经手动创建,故这里不再创建
REM //mkdir D:\MongoDB\ch\cfg0,D:\MongoDB\ch\cfg0\cfg0_0,D:\MongoDB\ch\cfg0\cfg0_1........这样下去
REM 2. 编写9台服务器的启动配置文件

REM 手动完成 cfg0_0.ini ~ ch1_3.ini

REM 3. 启动配置集、分片集的副本集实例
REM 配置集 cfg0
start "cfg0_0:27026" %MONGOD_CMD% --config=D:\MongoDB\ch\cfg0\cfg0_0\cfg0_0.ini
start "cfg0_1:27027" %MONGOD_CMD% --config=D:\MongoDB\ch\cfg0\cfg0_1\cfg0_1.ini
start "cfg0_2:27028" %MONGOD_CMD% --config=D:\MongoDB\ch\cfg0\cfg0_2\cfg0_2.ini
REM 分片集1 rs0
start "ch0_0:27020" %MONGOD_CMD% --config=D:\MongoDB\ch\ch0\ch0_0\ch0_0.ini
start "ch0_1:27021" %MONGOD_CMD% --config=D:\MongoDB\ch\ch0\ch0_1\ch0_1.ini
start "ch0_2:27022" %MONGOD_CMD% --config=D:\MongoDB\ch\ch0\ch0_2\ch0_2.ini
REM 分片集2 rs1
start "ch1_0:27023" %MONGOD_CMD% --config=D:\MongoDB\ch\ch1\ch1_0\ch1_0.ini
start "ch1_1:27024" %MONGOD_CMD% --config=D:\MongoDB\ch\ch1\ch1_1\ch1_1.ini
start "ch1_2:27025" %MONGOD_CMD% --config=D:\MongoDB\ch\ch1\ch1_2\ch1_2.ini

REM 4. 编写副本集初始化脚本for分片集和配置集
REM 手动完成 rs0conf.js, rs1conf.js, cfg0conf.js

REM 等待5秒确保所有服务器都启动了
TIMEOUT /T 5

REM 5. 初始化配置集、分片集的副本集实例
start "连接到分片1" %MONGO_CMD% --port=27020 --shell D:\MongoDB\ch\ch0\ch0conf.js
start "连接到分片2" %MONGO_CMD% --port=27023 --shell D:\MongoDB\ch\ch1\ch1conf.js
start "连接到配置集" %MONGO_CMD% --port=27026 --shell D:\MongoDB\ch\cfg0\cfg0conf.js

REM 等待11秒确保副本集完成选举
TIMEOUT /T 11

REM 6. 启动路由节点/分片服务器 mongos
start "router0:27017" %MONGOS_CMD% --config=D:\MongoDB\ch\router0\ruoter0.ini

REM 等待2秒确保路由节点完成启动
TIMEOUT /T 10

REM 7. 添加分片到分片集群
REM 手动编写脚本
REM // 添加rs0
REM sh.addShard("ch0/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022");
REM // 添加rs1
REM sh.addShard("ch1/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025");
start "连接到分片集群" %MONGO_CMD% --shell D:\MongoDB\ch\router0\addShards.js

这个有个小注意的地方,如果是你自己创建的txt文本后,请注意一下编码,如果运行后出现乱码问题,将编码改为ANSI。

5.启动服务

出现这四个页面则说明你成功了,恭喜哦

题目二

在分布式集群中创建分片集合: 

 GenerateStudents.js文件如下

//生成随机手机号
function getRandPhone(){
    var heads = ["134","138","139","150","151","152","157","158","159","170","189"];
    var phone = heads[Math.floor(Math.random()*heads.length)];
    var numbers = [1,2,3,4,5,6,7,8,9];
    for(var i=0; i<8; i++){
        phone+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return phone;
}

//生成车牌号
function getRandPlate(){
    //地区,用于生成车牌号
    // var loc = ["川","渝","贵","陕","京","沪","粤","津","赣","湘","鄂"];
		var loc = ["川","渝"];
    //字母,用于生成车牌号
    var chars = ["A","B","C","D"];
    //数字,用于生成车牌号
    var numbers = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,"J","K","L","M"];
    var plate = "";
    plate += loc[Math.floor(Math.random()*loc.length)]; //第一位地区简称
    plate += chars[Math.floor(Math.random()*chars.length)]; //第二位字母简称
    //4位数字
    for(var i=0; i<4; i++){
        plate+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return plate;
}
// print(getRandPlate())

//生成名字
function getRandName(){
    var familyNames = ["赵",  "钱",  "孙",  "李",  "周",  "吴",  "郑",  "王",  "冯",  "陈",  
        "褚",  "卫",  "蒋",  "沈",  "韩",  "杨",  "朱",  "秦",  "尤",  "许",
        "何",  "吕",  "施",  "张",  "孔",  "曹",  "严",  "华",  "金",  "魏",  
        "陶",  "姜",  "戚",  "谢",  "邹",  "喻",  "柏",  "水",  "窦",  "章",
        "云",  "苏",  "潘",  "葛",  "奚",  "范",  "彭",  "郎",  "鲁",  "韦",  
        "昌",  "马",  "苗",  "凤",  "花",  "方",  "俞",  "任",  "袁",  "柳",
        "刘",  "鲍",  "史",  "唐",  "费",  "廉",  "岑",  "薛",  "雷",  "贺",  
        "倪",  "汤",  "滕",  "殷",  "罗",  "毕",  "郝",  "邬",  "安",  "常",
        "乐",  "于",  "时",  "傅",  "皮",  "卞",  "齐",  "董",  "伍",  "余",  
        "元",  "卜",  "顾",  "孟",  "平",  "黄",  "和",  "谭",  "萧",  "尹"
        ];
    var givenNames = ["子璇", "淼", "国栋", "夫子", "瑞堂", "甜", "敏", "尚", "国贤", "贺祥", "晨涛", 
        "昊轩", "易轩", "益辰", "益帆", "益冉", "瑾春", "瑾昆", "春齐", "杨", "文昊", 
        "东东", "雄霖", "浩晨", "熙涵", "溶溶", "冰枫", "欣欣", "宜豪", "欣慧", "建政", 
        "美欣", "淑慧", "文轩", "文杰", "欣源", "忠林", "榕润", "欣汝", "慧嘉", "新建", 
        "建林", "亦菲", "林", "冰洁", "佳欣", "涵涵", "禹辰", "淳美", "泽惠", "伟洋", 
        "涵越", "润丽", "翔", "淑华", "晶莹", "凌晶", "苒溪", "雨涵", "嘉怡", "佳毅", 
        "子辰", "佳琪", "紫轩", "瑞辰", "昕蕊", "萌", "明远", "欣宜", "泽远", "欣怡", 
        "佳怡", "佳惠", "晨茜", "晨璐", "运昊", "汝鑫", "淑君", "晶滢", "润莎", "榕汕", 
        "佳钰", "佳玉", "晓庆", "一鸣", "语晨", "添池", "添昊", "雨泽", "雅晗", "雅涵", 
        "清妍", "诗悦", "嘉乐", "晨涵", "天赫", "玥傲", "佳昊", "天昊", "萌萌", "若萌",
        "泽民", "国强", "胜利", "小凡", "碧瑶", "书书", "京雨", "卫东", "小佳", "长江",
				"文虹", "义凡", "广晨", "宸滔", "嘉岐", "雅珺", "睿明", "皓轩", "程天", "子酝", 
				"艾康", "如羽", "冠玉", "子歉", "永昊", "龙华", "兆颜", "奇文", "月昕", "裕锦", 
				"昂佳", "昊浩", "宇韬", "睿焓", "永译", "鸿彬", "颢霖", "益彬", "虹昊", "飞悦", 
				"睿珏","?宵童", "睿鸿", "容冰", "逸濠", "楷岩", "弘义", "海萦", "昊孺", "梓铭", 
				"生钊", "蓝玺", "晨辕", "宇菡", "砚海", "文揩", "韬瑞", "彦红", "奕韦", "清予", 
				"宁翼", "冬睿", "锦昌", "烨宁", "昌权", "国研", "德运", "孝清", "佳阳", "凯玮", 
				"正真", "民云", "昕冶", "力威", "帅欣", "知淳", "烨飞", "兴远", "子墨", "澄欣", 
				"烨煊", "悦勤", "晨津", "博宏", "育萌", "羽炫", "绍钧", "睿昌", "泓千", "颢炜", 
				"虹金", "筠航", "元甲", "星明", "景涛", "铭虹", "德本", "向辉", "基翔", "家易", 
				"欣鹏", "羽荃", "泽容", "弘亮", "尚廷", "轩梓", "甫津", "彬楷", "寅飞", "愉君", 
				"阳平", "誉杰", "钦昭", "蕴藉", "羽程", "宏海", "涵畅", "光浩", "令沂", "浩浩", 
				"睿锦", "易泽", "俊康", "家文", "晨元", "语洋", "裕宏", "梓榛", "阳嘉", "恒展", 
				"雨远", "哲伊", "逸江", "丰源", "学东", "奇岩", "浩财", "和蔼", "红言", "瑞赫", 
				"森圆", "欣赢", "梓鸿", "博明", "铭育", "颢硕", "宇烯", "宇如", "淳炎", "源承"
        ];
    var name = familyNames[Math.floor(Math.random()*familyNames.length)];
    name+=givenNames[Math.floor(Math.random()*givenNames.length)];
    return name;
}
// print(getRandName())

// 生成随机专业
function getRandMajor() {
		return ["大数据", "应用数学", "应用统计"][Math.floor(Math.random()*3)]

}
// print(getRandMajor())

// 随机取一门课程
function getRandCourse() {
		var courses = ["大数据概论", "大数据开发语言", "Hadoop大数据技术", 
		"分布式数据库原理与应用", "网络操作系统", "结构化数据存储与应用", 
		"数据导入与预处理应用", "数据可视化技术", "数据仓库与挖掘技术", 
		"时间序列分析实践", "大数据分析与内存计算"
		];
		var credits = [2, 4, 4, 
		4, 2, 2, 
		4, 2, 4, 
		4, 4
		];
		var idx = Math.floor(Math.random()*courses.length);
		var course = [courses[idx],credits[idx]];
		return course;
}

// 生成学生数据
function generateStudents(snum=100, sgrade=2020, overwrite=true, sharding=true) {
		db = db.getSiblingDB("cqust"); 
		// use cqust;
		if (sharding) {
			sh.enableSharding("cqust");
		}

		if (overwrite) {
			//db.getCollection("students").drop();
			// db.students.drop() 删除students集合
			if (sharding){
				sh.shardCollection("cqust.students",{"sno":"hashed"});
		}
		}

		for(var i=0; i<snum/100; i++){
			var StudentsDoc = new Array();
			for(var j=0; j<100; j++){
				var sid = sgrade*1e6+i*100+j;
				var sname = getRandName();
				var gender = Math.floor(Math.random()*2);
				var phone = getRandPhone();
				var plate = getRandPlate();
				var major = getRandMajor();
				var height = Math.floor(Math.random()*30+gender*5+150);
				var weight = Math.floor(Math.random()*30+gender*20+40);
				var sclass = Math.floor(Math.random()*4+1);
				var courses = new Array();
				for(var k=0; k<Math.floor(Math.random()*5);k++){
					var course_credit = getRandCourse();
					courses[k] = {"course":course_credit[0], "credit":course_credit[1], "score":Math.floor(Math.random()*50)+50};
				}
				
				StudentsDoc[j] = {
				"sno":sid,
				"name":sname, 
				"gender":gender, 
				// "height":height, 
				// "weight":weight,
				"body":{
					"height":height, 
					"weight":weight
					},
				"list":[Math.ceil(Math.random()*6),Math.ceil(Math.random()*6),Math.ceil(Math.random()*6)],
				"phone":phone, 
				"role":"student", 
				"major": major,
				"grade": sgrade, 
				"class": sclass, 
				"courses":courses
				};
			}
			db.getCollection("students").insertMany(StudentsDoc);
			// db.students.insertMany(StudentsDoc)
		}	
}

// 主程序从这里开始
generateStudents(1000,2018,true,false);
generateStudents(1000,2019,false,false);
generateStudents(1000,2020,false,false);
generateStudents(1000,2021,false,false);

 首先咱们先load一下js文件,先创建个数据库,到入点数据进去这个load里面是跟这个js文件的路径哈,我因为这个文件就保存再这个目录下才没跟哈。

 然后我们浅浅的看一下数据

 长酱紫,咱们正式开始

1.分片式数据库创建

输入命令:

sh.enableSharding("cqust")

出现ok:1你就没问题如果是ok:0你就有问题了,你就完了

 2.确认集合片集

输入命令:

db.students.createIndex({sno:"hashed"})

就是给集合创建哈希索引,这里我们以学号sno为索引创建,出现ok:1就没问题,不然你就完了

 3.分片集合创建

输入命令:

sh.shardCollection("cqust.students",{sno:"hashed"})

同理,出现ok:1成功,不然你就完了

最后呢我们可以输入 sh.status() 命令看一下分片集状态,看看是否真的配好了,看不懂的参数自己百度(像酱紫基本就没问题了)

 4.另外一种方法

另外一种方法,即编写js脚本文件

这里浅浅给大家分析一下GenerateStudents.js文件,

 而你在后面调用的时候 

然后我对代码进行小小的修改

 修改后的js代码

//生成随机手机号
function getRandPhone(){
    var heads = ["134","138","139","150","151","152","157","158","159","170","189"];
    var phone = heads[Math.floor(Math.random()*heads.length)];
    var numbers = [1,2,3,4,5,6,7,8,9];
    for(var i=0; i<8; i++){
        phone+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return phone;
}

//生成车牌号
function getRandPlate(){
    //地区,用于生成车牌号
    // var loc = ["川","渝","贵","陕","京","沪","粤","津","赣","湘","鄂"];
		var loc = ["川","渝"];
    //字母,用于生成车牌号
    var chars = ["A","B","C","D"];
    //数字,用于生成车牌号
    var numbers = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,"J","K","L","M"];
    var plate = "";
    plate += loc[Math.floor(Math.random()*loc.length)]; //第一位地区简称
    plate += chars[Math.floor(Math.random()*chars.length)]; //第二位字母简称
    //4位数字
    for(var i=0; i<4; i++){
        plate+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return plate;
}
// print(getRandPlate())

//生成名字
function getRandName(){
    var familyNames = ["赵",  "钱",  "孙",  "李",  "周",  "吴",  "郑",  "王",  "冯",  "陈",  
        "褚",  "卫",  "蒋",  "沈",  "韩",  "杨",  "朱",  "秦",  "尤",  "许",
        "何",  "吕",  "施",  "张",  "孔",  "曹",  "严",  "华",  "金",  "魏",  
        "陶",  "姜",  "戚",  "谢",  "邹",  "喻",  "柏",  "水",  "窦",  "章",
        "云",  "苏",  "潘",  "葛",  "奚",  "范",  "彭",  "郎",  "鲁",  "韦",  
        "昌",  "马",  "苗",  "凤",  "花",  "方",  "俞",  "任",  "袁",  "柳",
        "刘",  "鲍",  "史",  "唐",  "费",  "廉",  "岑",  "薛",  "雷",  "贺",  
        "倪",  "汤",  "滕",  "殷",  "罗",  "毕",  "郝",  "邬",  "安",  "常",
        "乐",  "于",  "时",  "傅",  "皮",  "卞",  "齐",  "董",  "伍",  "余",  
        "元",  "卜",  "顾",  "孟",  "平",  "黄",  "和",  "谭",  "萧",  "尹"
        ];
    var givenNames = ["子璇", "淼", "国栋", "夫子", "瑞堂", "甜", "敏", "尚", "国贤", "贺祥", "晨涛", 
        "昊轩", "易轩", "益辰", "益帆", "益冉", "瑾春", "瑾昆", "春齐", "杨", "文昊", 
        "东东", "雄霖", "浩晨", "熙涵", "溶溶", "冰枫", "欣欣", "宜豪", "欣慧", "建政", 
        "美欣", "淑慧", "文轩", "文杰", "欣源", "忠林", "榕润", "欣汝", "慧嘉", "新建", 
        "建林", "亦菲", "林", "冰洁", "佳欣", "涵涵", "禹辰", "淳美", "泽惠", "伟洋", 
        "涵越", "润丽", "翔", "淑华", "晶莹", "凌晶", "苒溪", "雨涵", "嘉怡", "佳毅", 
        "子辰", "佳琪", "紫轩", "瑞辰", "昕蕊", "萌", "明远", "欣宜", "泽远", "欣怡", 
        "佳怡", "佳惠", "晨茜", "晨璐", "运昊", "汝鑫", "淑君", "晶滢", "润莎", "榕汕", 
        "佳钰", "佳玉", "晓庆", "一鸣", "语晨", "添池", "添昊", "雨泽", "雅晗", "雅涵", 
        "清妍", "诗悦", "嘉乐", "晨涵", "天赫", "玥傲", "佳昊", "天昊", "萌萌", "若萌",
        "泽民", "国强", "胜利", "小凡", "碧瑶", "书书", "京雨", "卫东", "小佳", "长江",
				"文虹", "义凡", "广晨", "宸滔", "嘉岐", "雅珺", "睿明", "皓轩", "程天", "子酝", 
				"艾康", "如羽", "冠玉", "子歉", "永昊", "龙华", "兆颜", "奇文", "月昕", "裕锦", 
				"昂佳", "昊浩", "宇韬", "睿焓", "永译", "鸿彬", "颢霖", "益彬", "虹昊", "飞悦", 
				"睿珏","?宵童", "睿鸿", "容冰", "逸濠", "楷岩", "弘义", "海萦", "昊孺", "梓铭", 
				"生钊", "蓝玺", "晨辕", "宇菡", "砚海", "文揩", "韬瑞", "彦红", "奕韦", "清予", 
				"宁翼", "冬睿", "锦昌", "烨宁", "昌权", "国研", "德运", "孝清", "佳阳", "凯玮", 
				"正真", "民云", "昕冶", "力威", "帅欣", "知淳", "烨飞", "兴远", "子墨", "澄欣", 
				"烨煊", "悦勤", "晨津", "博宏", "育萌", "羽炫", "绍钧", "睿昌", "泓千", "颢炜", 
				"虹金", "筠航", "元甲", "星明", "景涛", "铭虹", "德本", "向辉", "基翔", "家易", 
				"欣鹏", "羽荃", "泽容", "弘亮", "尚廷", "轩梓", "甫津", "彬楷", "寅飞", "愉君", 
				"阳平", "誉杰", "钦昭", "蕴藉", "羽程", "宏海", "涵畅", "光浩", "令沂", "浩浩", 
				"睿锦", "易泽", "俊康", "家文", "晨元", "语洋", "裕宏", "梓榛", "阳嘉", "恒展", 
				"雨远", "哲伊", "逸江", "丰源", "学东", "奇岩", "浩财", "和蔼", "红言", "瑞赫", 
				"森圆", "欣赢", "梓鸿", "博明", "铭育", "颢硕", "宇烯", "宇如", "淳炎", "源承"
        ];
    var name = familyNames[Math.floor(Math.random()*familyNames.length)];
    name+=givenNames[Math.floor(Math.random()*givenNames.length)];
    return name;
}
// print(getRandName())

// 生成随机专业
function getRandMajor() {
		return ["大数据", "应用数学", "应用统计"][Math.floor(Math.random()*3)]

}
// print(getRandMajor())

// 随机取一门课程
function getRandCourse() {
		var courses = ["大数据概论", "大数据开发语言", "Hadoop大数据技术", 
		"分布式数据库原理与应用", "网络操作系统", "结构化数据存储与应用", 
		"数据导入与预处理应用", "数据可视化技术", "数据仓库与挖掘技术", 
		"时间序列分析实践", "大数据分析与内存计算"
		];
		var credits = [2, 4, 4, 
		4, 2, 2, 
		4, 2, 4, 
		4, 4
		];
		var idx = Math.floor(Math.random()*courses.length);
		var course = [courses[idx],credits[idx]];
		return course;
}

// 生成学生数据
function generateStudents(snum=100, sgrade=2020, sharding=true) {
		db = db.getSiblingDB("cqust"); 
		// use cqust;
		if (sharding) {
			sh.enableSharding("cqust");
			db.students.createIndex({sno:"hashed"})
			sh.shardCollection("cqust.students",{"sno":"hashed"});
		}

		for(var i=0; i<snum/100; i++){
			var StudentsDoc = new Array();
			for(var j=0; j<100; j++){
				var sid = sgrade*1e6+i*100+j;
				var sname = getRandName();
				var gender = Math.floor(Math.random()*2);
				var phone = getRandPhone();
				var plate = getRandPlate();
				var major = getRandMajor();
				var height = Math.floor(Math.random()*30+gender*5+150);
				var weight = Math.floor(Math.random()*30+gender*20+40);
				var sclass = Math.floor(Math.random()*4+1);
				var courses = new Array();
				for(var k=0; k<Math.floor(Math.random()*5);k++){
					var course_credit = getRandCourse();
					courses[k] = {"course":course_credit[0], "credit":course_credit[1], "score":Math.floor(Math.random()*50)+50};
				}
				
				StudentsDoc[j] = {
				"sno":sid,
				"name":sname, 
				"gender":gender, 
				// "height":height, 
				// "weight":weight,
				"body":{
					"height":height, 
					"weight":weight
					},
				"list":[Math.ceil(Math.random()*6),Math.ceil(Math.random()*6),Math.ceil(Math.random()*6)],
				"phone":phone, 
				"role":"student", 
				"major": major,
				"grade": sgrade, 
				"class": sclass, 
				"courses":courses
				};
			}
			db.getCollection("students").insertMany(StudentsDoc);
			// db.students.insertMany(StudentsDoc)
		}	
}

// 主程序从这里开始
generateStudents(10000,2018,true);
generateStudents(10000,2019,true);
generateStudents(10000,2020,true);
generateStudents(10000,2021,true);

 运行一下

 没问题欸嘿

题目三

运行"GenerateStudents.js"Mongoshell脚本,将数据导入分片集合中,并查看

(1)分片集状态

(2)分片数据库的统计信息

(3)分片集合数据分布情况

步骤:

其实我们在第二部已经导入数据了,就其实咱们直接查看就行,如果你的数据没有分片,可能数据量太少,你再导两次(别导多了),然后导完等会,他自己会分片过去

1.分片集状态

 输入命令:

sh.status()

 2.分片数据库的统计信息

输入命令:

db.stats()

你看见ch1和ch0服务器上都有数据了,那么你的数据就已经分片了

 3.分片集合数据分布情况

输入命令:

 db.students.getShardDistribution()

本次实验就酱紫了,点个赞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Live800:避开客服雷区,提升客服转化

小刘在某在线商城开了个小店铺&#xff0c;店铺做得不错&#xff0c;宝贝销量稳定&#xff0c;小日子过得有滋有味。 最近一段时间&#xff0c;流量持续下滑&#xff0c;销量跟着走低&#xff0c;可愁死了。 "流量有波动很正常&#xff0c;但是一直降一直降&#xff0c;肯…

《恋上数据结构与算法》第1季:算法概述

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引算法概述1. 算法和数据结构1.1 什么是算法1.2 什么是数据结构2. 时间复杂度2.1 如何判断一个算法的好坏呢&#xff1f;2.2 基本操作执行次数2.3 大O表示法3. 空间复杂度3.1 概念定义4. 算法…

MCE | BCL6 小分子也能发挥类 PROTAC 的功能

图示摘要&#xff1a;来自作者 Jonas Koeppel (Ph. D., Department of Medical Oncology, Dana-Farber Cancer Institute) 的 Twitter杂合双功能降解技术 (PROTAC&#xff0c;靶蛋白配体-Linker-E3 连接酶配体组成的“三体”聚合物) 已被用于多种疾病相关靶点的降解剂开发&…

老年患者植入LVAD的挑战:胃肠道出血

EF值降低的心力衰竭随着年龄的增长越来越常见。据研究报道&#xff0c;75岁以上人群的患病率是普通人群的4倍&#xff0c;目前是老年人死亡和住院的最常见原因之一。治疗方案主要包括心脏移植(HT)和长期左心室辅助装置(LVAD)植入&#xff0c;这两种方法已被临床研究证明可降低患…

Flutter高仿微信-第34篇-单聊-小视频

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取小视频的部…

Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)

需要源码和服务端代码请点赞关注收藏后评论区留下QQ~~~ 一、通过SocketIO传输文本消息 虽然HTTP协议能够满足多数常见的接口交互&#xff0c;但是他属于短连接&#xff0c;每次调用完就自动断开连接&#xff0c;并且HTTP协议区分了服务端和客户端&#xff0c;双方的通信过程是…

机器学习知识经验分享之三:基于卷积神经网络的经典目标检测算法

文章目录前言一、一阶段目标检测算法1.YOLO系列算法2.SSD检测算法3. RetinaNet检测算法二、两阶段目标检测算法1.Faster R-CNN检测算法2.Mask R-CNN检测算法3.Cascade R-CNN检测算法总结前言 本系列文章将对机器学习知识进行分享总结。便于大家从理论层面了解人工智能基础原理…

软件被人后台篡改了收款码属于入侵吗?

最近很多做平台的小伙伴&#xff0c;碰到了同样的问题&#xff0c;就是软件程序后台被恶意篡改收款二维码 这个问题出现在平台主身上无疑是雪上加霜&#xff0c;第一时间找到了小蚁君&#xff0c;分析了一下当时的情况&#xff0c;先安装了小蚁的入侵检测系统&#xff0c;显示…

计算机毕业设计之java+ssm协同办公系统

项目介绍 本公司文档协同办公管理系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发,主要包括系统用户管理模块、用户信息模块、文件信息管理、个人事务管理、资料信息管理、登录模块、和退出模块等多个模块. 本系统主要包含了等系统用户管理、用户信息管理…

webpack5 PWA解决Web App 项目网络离线情况没法访问情况

为什么 开发 Web App 项目&#xff0c;项目一旦处于网络离线情况&#xff0c;就没法访问了。 我们希望给项目提供离线体验。 是什么 渐进式网络应用程序(progressive web application - PWA)&#xff1a;是一种可以提供类似于 native app(原生应用程序) 体验的 Web App 的技术。…

Go语言中操作Redis

Redis介绍 Redis是一个开源的内存数据库&#xff0c;Redis提供了多种不同类型的数据结构&#xff0c;很多业务场景下的问题都可以很自然地映射到这些数据结构上。 除此之外&#xff0c;通过复制、持久化和客户端分片等特性&#xff0c;我们可以很方便地将Redis扩展成一个能够包…

Word控件Spire.Doc 【图像形状】教程(5) 如何在 C# 中将文本环绕在图像周围

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

frp篇---frp-notify + Gotify 实现 FRP 用户上线通知

frp-notify Gotify 实现 FRP 用户上线通知1. 安装frp_notify2. Gotify 配置3. frp-notify 配置启动 frp_notify开机自启动1. 安装frp_notify 一个专注于消息通知的 frp server manager plugin 实现&#xff0c;让你对进入 frps 的连接了如指掌&#xff0c;不再裸奔。 项目链…

SSM之Spring注解式缓存Redis

目录 Sprig整合Redis 导入相关pom依赖 添加对应的的配置文件 IEDA安装lombok插件 引入外部多文件 applicationContext.xml的整合配置文件 redis注解式缓存 Cacheable 测试类注解 Cacheable 的测试代码 CachePut CachePut测试代码 CacheEvict CacheEvict测试代码 Spr…

如何考察候选人 Vue 技术水平?

答对这些问题&#xff0c;检测你是否真正掌握了Vue 请说一下响应式数据的原理 默认 Vue 在初始化数据时&#xff0c;会给 data 中的属性使用 Object.defineProperty 重新定义所有属性&#xff0c;当页面到对应属性时&#xff0c;会进行依赖收集(收集当前组件中的 watcher)如果…

论文阅读【8】Conditional Random Fields: An Introduction

1.概述 1.1 论文相关 这篇论文是介绍一个经典模型&#xff0c;条件随机场&#xff08;CRF&#xff09;。在很多领域中都存在序列标注任务&#xff0c;例如生物信息识别&#xff0c;计算机语言学和语音识别任务&#xff0c;其中自然语言处理中的词性标注任何和命名实体识别任务…

JS 数据结构:链表

单链表 每个节点中只包含一个指针域的链表称为单链表。 头结点—其指针域指向表中第一个结点的指针&#xff08;头结点不是必须的&#xff0c;只是习惯上加上头结点&#xff0c;而头结点的数据域一般记录的是该链表的相关数据&#xff0c;如&#xff1a;链表长度&#xff09;…

Redis-Linux中安装Redis、命令操作Redis

目录 一、Redis简介 NoSQL与SQL的区别 二、Linux上安装redis 上传并解压redis.gz 进入 redis的解压目录&#xff0c;执行命令 make ​编辑 修改redis为守护进程 们测试一下能否远程连接RedisDesktopManager客户端 开放6379端口 授权&#xff0c;允许远程连接 三、redis命…

小程序上新(2022.10.13~11.14)

20221101 【官方公告】境外主体小程序补充信息存储地区通知20221103 小程序基础库 2.27.1 更新 新增 框架 新增 xr-fame 能力&#xff0c;kanata 更新 详情新增 组件 map 组件新增 bindrendersuccess 属性 详情 (官方文档还查不到这个)新增 API 新增 wx.getRendererUserAgen…

tep时隔8个月迎来重大全新升级

tep此次更新&#xff0c;旨在从“工具”升级为“框架”&#xff0c;为此做了大量的代码整洁工作&#xff0c;重新设计了部分功能&#xff0c;项目脚手架也焕然一新。 功能展示 conftest.py 脚手架生成的conftest.py只有一行代码&#xff1a; fixture自动加载等操作都隐藏到了te…