环境介绍:10.9.21.17810.9.21.17910.9.21.114MongoDB sharding简介三种角色介绍:1.数据分片(Shards)用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。可以将所有shard的副本集放在一个服务器多个mongodb实例中。sharding的每个node的database中的集合可以是分片也可以不分片,每个db都有一个primary shard,未分片的集合就是存在其各自的primary shard中的。2.查询路由 mongos(Query Routers)路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。mongos第一次启动或者关掉重启就会从 config server加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos就能继续准确路由。一个Sharding集群,可以有一个mongos,也可以为每个App Server配置一个mongos以减轻路由压力,注意这里的mongos并不需要配置为rs,因为只是个路由,并不存储数据,配置多个mongos的意思是配置多个单独的mongos实例。理论上可以部署无数个mongos路由,但是要考虑到config server的压力!3.配置服务器(Config servers)保存集群的元数据(metadata),包含各个Shard的路由规则。3.2版本以后config server可以配置为副本集,3.4以后config server必须配置为副本集。生产上建议config server的rs至少要有3个副本集成员。整体规划:其中mongos 的如下(生产上需要创建多个mongos,然后借助haproxy 或者lvs做高可用):10.9.21.114 27022其中config server的副本集架构如下:10.9.21.178 2701810.9.21.179 2701810.9.21.114 27018分片节点(3个分片节点,都是副本集架构):分片1 (副本集)10.9.21.178 2701910.9.21.179 2701910.9.21.114 27019分片2 (副本集)10.9.21.178 2702010.9.21.179 2702010.9.21.114 27020分片3 (副本集)10.9.21.178 2702110.9.21.179 2702110.9.21.114 27021具体搭建过程:一:目录创建:1.关于分片节点的目录,注意需要在114和178以及179都要创建!1)关于27021分片mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/dbmkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/configmkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/log2)关于27020分片mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/dbmkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/configmkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/log3)关于27019分片mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/dbmkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/configmkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/log2.关于mongos的相关目录创建:mkdir -p /data/mongodb/mongodb_sharding/mongos/configmkdir -p /data/mongodb/mongodb_sharding/mongos/dbmkdir -p /data/mongodb/mongodb_sharding/mongos/log3.关于config server的相关目录的创建:mkdir -p /data/mongodb/mongodb_sharding/config_server/dbmkdir -p /data/mongodb/mongodb_sharding/config_server/logmkdir -p /data/mongodb/mongodb_sharding/config_server/config4.修改目录的数组chown -R mongod.mongod /data/mongodb/mongodb_sharding/5.创建安装mongodb软件的目录:mkdir -p /usr/bin/percona_mongodbchown mongod.mongo /usr/bin/percona_mongodb二:下载mongodb的安装包;我这里采用了percona的版本,我选择了使用.tar.gz包,解压就能用!多实例安装的时候,建议使用.tar.gz包,清晰明了,个人感觉https://www.percona.com/downloads/percona-server-mongodb-4.0/LATEST/将下载好的安装包上传到服务器上,然后解压,移动到你想安装mongodb软件的目录,我这里选择了/data/mongodb/mongodb_sharding/software/(自定义目录), 具体如下操作:tar -xf percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz[root@beijing-fuli-hadoop-04 mongodb]# lltotal 119428drwxrwxr-x 3 root root 4096 Sep 2 09:13 percona-server-mongodb-4.0.12-6-rw-r--r-- 1 root root 122286692 Dec 10 11:52 percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz[root@beijing-fuli-hadoop-04 mongodb]# cd percona-server-mongodb-4.0.12-6[root@beijing-fuli-hadoop-04 mongodb]#mv bin /data/mongodb/mongodb_sharding/software/三:修改配置文件一定注意配置项和具体值之间需要有空格例如:clusterRole: shardsvr冒号和shardsvr之间需要有空格,不能设置成clusterRole:shardsvr!报错:Error parsing YAML config file: yaml-cpp: error at line 18, column 4: end of map not found1.修改分片节点的配置文件如下文件是27019的分片节点的mongodb的配置文件然后依次copy对应的别的端口的对应目录下,并且修改相关内容cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27020/cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27021/需要修改1.端口,2.副本集的名字,3.相关目录,因为我的都是以(ip+端口)来区分的,所以可以直接批量替换:sed -i 's/27019/27020/g' /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.confsed -i 's/27019/27021/g' /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf然后copy到各个机器对应目录下:scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf mongod@10.9.21.178`pwd`scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf mongod@10.9.21.179`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf mongod@10.9.21.178`pwd`scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf mongod@10.9.21.179`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf mongod@10.9.21.178`pwd`scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf mongod@10.9.21.179`pwd`2.修改config server的配置文件,它与mongodbf副本集的区别是 clusterRole: configsvr和replSetName:configserver27018,同时修改路径和端口号;然后依次scp到别的机器上的特定目录下scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf mongod@10.9.21.178`pwd`scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf mongod@10.9.21.179`pwd`3.修改mongos的配置文件:四:生成秘钥文件注意这个mongodb.key文件需要copy到mongodb mongos 以及config server的对应目录中,并且权限需要保证为600!我的这次安装percona mongodb 4.0版本需要先不开启验证,也就是你可以在你搭建好整个架构后再生成key文件![root@beijing-fuli-hadoop-02 mongodb]# openssl rand -base64 756 >/data/mongodb/config/mongodb.key需要保证mongodb.key的权限为 600,否则启动会报错:permissions on /export/mongodb/keyfile are too open这是因为mongo key文件权限过大造成的 !具体关于file key的相关操作如下(只演示了21.114机器上的操作):1.生成file key[mongod@beijing-fuli-hadoop-04 config]$ openssl rand -base64 756 >/data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key2.复制file key到mongodb的27020和27021对应目录下:cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.keycp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key3.复制file key到mongos的对应目录下:cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongos/config/mongodb.key4.复制file key到config server的对应目录下:cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/config_server/config/mongodb.key5.修改文件的权限:chmod 600 /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.keychmod 600 /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.keychmod 600 /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.keychmod 600 /data/mongodb/mongodb_sharding/config_server/config/mongodb.keychmod 600 /data/mongodb/mongodb_sharding/mongos/config/mongodb.key6.把file key传给其余机器;scp mongodb.key mongod@10.9.21.179:`pwd`scp mongodb.key mongod@10.9.21.178:`pwd`然后再在21.178和21.179上的操作和之前21.114上一样;五:启动服务:启动之前最好先注释安全验证相关的参数,mongod、mongos、以及config server都注释掉,最后搭建成功再把注释去掉5.1:启动mongodb实例(在在21.144和178以及179都启动来之后然后再启动config server)这里我的shard节点是副本集的结构,所以需要初始化成副本集!/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf注意:percona 4.0.12 的版本需要首先把安全的参数注释,否则你会报错:requires authentication而无法进行任何操作!新版本的MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员,percona 3.4版本以及社区版本的4.0版本就不需要保证有一个管理员账号就可以初始化成功!#security:# keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key# authorization: enabled初始化成副本集(先启动的就是主节点)如下是三个副本集节点的初始化命令:rs.initiate({_id:'s1092111427019',members: [{ _id: 0 , host: "10.9.21.178:27019"},{ _id: 1 , host: "10.9.21.179:27019"},{ _id: 2 , host: "10.9.21.114:27019"}]})rs.initiate({_id:'s1092111427020',members: [{ _id: 0 , host: "10.9.21.178:27020"},{ _id: 1 , host: "10.9.21.179:27020"},{ _id: 2 , host: "10.9.21.114:27020"}]})rs.initiate({_id:'s1092111427021',members: [{ _id: 0 , host: "10.9.21.178:27021"},{ _id: 1 , host: "10.9.21.179:27021"},{ _id: 2 , host: "10.9.21.114:27021"}]})创建管理员账号:use admindb.createUser({user: "liuwenhe",pwd: "liuwenhe",roles: [ { role: "root", db: "admin" } ]})5.2:启动config server 副本集实例:/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/config_server/config/mongod.conf初始化副本集,也需要先关闭安全验证相关的参数!rs.initiate({_id:'configserver27018',members: [{ _id: 0 , host: "10.9.21.178:27018"},{ _id: 1 , host: "10.9.21.179:27018"},{ _id: 2 , host: "10.9.21.114:27018"}]})5.3:启动mongos 实例,并添加分片节点:/data/mongodb/mongodb_sharding/software/bin/mongos -f /data/mongodb/mongodb_sharding/mongos/config/mongod.conf5.3.1.登录mongos /data/mongodb/mongodb_sharding/software/bin/mongo --port=27017 --host=10.9.21.1145.3.2 添加副本集分片:sh.addShard('s1092111427019/10.9.21.114:27019,10.9.21.179:27019,10.9.21.178:27019')sh.addShard('s1092111427020/10.9.21.114:27020,10.9.21.179:27020,10.9.21.178:27020')sh.addShard('s1092111427021/10.9.21.114:27021,10.9.21.179:27021,10.9.21.178:27021')5.3.3 创建管理员账号:use admindb.createUser({user: "liuwenhe",pwd: "liuwenhe",roles: [ { role: "root", db: "admin" } ]})5.3.4最后把所有的shard、config server、以及mongos配置中都开启验证,也就是把注释去掉然后启动服务:security: keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key authorization: enabled六:操作验证:创建库 liuhemongos> use liuheswitched to db liuhe数据库启动分片,这样才能对数据库liuhe下的集合做分片!mongos> sh.enableSharding("liuhe");查看分片状态:可以看到liuhe这个库的主分片是s1092111427021,当你创建的没有分片的集合的时候,就会创建到s1092111427021分片上!注意:主分片与副本集中的主节点不同:主分片指的是组成分片的整个副本集(当然如果你的分片是个单点的那么他就是单个的mongodb)。而副本集中的主节点是指副本集中能够处理写请求的单台服务器mongos> sh.status()--- Sharding Status ---sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("5df6063235d6298affb1bc49")}shards:{ "_id" : "s1092111427019", "host" : "s1092111427019/10.9.21.114:27019,10.9.21.178:27019,10.9.21.179:27019", "state" : 1 }{ "_id" : "s1092111427020", "host" : "s1092111427020/10.9.21.114:27020,10.9.21.178:27020,10.9.21.179:27020", "state" : 1 }{ "_id" : "s1092111427021", "host" : "s1092111427021/10.9.21.114:27021,10.9.21.178:27021,10.9.21.179:27021", "state" : 1 }active mongoses:"4.0.12-6" : 1autosplit:Currently enabled: yesbalancer:Currently enabled: yesCurrently running: noFailed balancer rounds in last 5 attempts: 0Migration Results for the last 24 hours:No recent migrationsdatabases:{ "_id" : "config", "primary" : "config", "partitioned" : true }config.system.sessionsshard key: { "_id" : 1 }unique: falsebalancing: truechunks:s1092111427019 1{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : s1092111427019 Timestamp(1, 0){ "_id" : "he", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("3e8f2fda-d08c-43be-a0ab-0e2031afc183"), "lastMod" : 1 } } { "_id" : "liuhe", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"), "lastMod" : 1 } }{ "_id" : "liuwenhe", "primary" : "s1092111427020", "partitioned" : true, "version" : { "uuid" : UUID("af30c5bd-9389-482f-95f9-fbb0438baa21"), "lastMod" : 1 } }创建集合并开启分片过程:1.创建数据库,直接use 即可,没有的话,如果你创建集合了,他就自动创建了!use liuwenhe2.插入数据,如果hezi集合不存在,则自动创建for (var i = 0; i < 100; i++) { db.hezi.insert({name: i}); }3.为hezi集合的id列添加索引,因为如果要以name列作为分片键,需要有索引;如果集合是空的,可以不创建索引直接进行下一步的分片,会自动创建索引;如果集合不为空,必须为分片建创建索引才行!,如果你要以hash规则分片,需要先创建hash索引!mongos> db.hezi.createIndex({"name":1})mongos> db.hh.createIndex({name:'hashed'}); 创建hash索引4.为数据库开启分片:mongos> sh.enableSharding("liuwenhe");5.开启集合hezi的分片!1:升序,-1降序,hashed:哈希分布sh.shardCollection("liuwenhe.hezi",{name:1}) ----基于值的分片sh.shardCollection("liuwenhe.hezi", { "name" : "hashed" }) ----hash规则分片6.查看集合是否开启分片:mongos> db.hezi.stats().shardedtrue7.sh.status() 查看分片的信息:可以看到liuhe库的主分片是s1092111427021,然后liuhe.hezi这个集合的分片键是name列升序,liuhe.hezi这个集合目前就1个chunk,在s1092111427021节点上,所以这个时候你去别的节点,例如s1092111427020上看,是没有这个库和这个集合的,当你向liuhe.hezi插入数据,直到触发发生chunk迁移之后,这时候在别的分片才会有可能有这个集合!mongos>sh.status(){ "_id" : "liuwehehe", "primary" : "s1092111427021", "partitioned" : true, "version" : { "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"), "lastMod" : 1 } }liuwenhe.hezishard key: { "name" : 1 }unique: truebalancing: truechunks:s1092111427021 1{ "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : s1092111427021 Timestamp(1, 0)8.当数据超过1个chunk之后,均匀分布在多个节点上,如下所示:不断插入数据,直到触发chunk迁移:for (var i = 0; i < 1000000000000000; i++) { db.hezi.insert({name: i}); }不断查看分片集群状态:mongos>sh.status()liuwenhe.hezishard key: { "name" : 1 }unique: falsebalancing: truechunks:s1092111427019 20s1092111427020 19s1092111427021 20至此生产标准的分片架构搭建完毕。。。。