千家信息网

mongodb 分片集群搭建

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,环境介绍: 10.9.21.178 10.9.21.179 10.9.21.114 MongoDB sharding简介三种角色介绍: 1.数据分片(Shards) 用来保存数据,保证数据的高可用性和
千家信息网最后更新 2024年09月21日mongodb 分片集群搭建环境介绍: 10.9.21.178 10.9.21.179 10.9.21.114 MongoDB 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 27018 10.9.21.179 27018 10.9.21.114 27018 分片节点(3个分片节点,都是副本集架构): 分片1 (副本集) 10.9.21.178 27019 10.9.21.179 27019 10.9.21.114 27019 分片2 (副本集) 10.9.21.178 27020 10.9.21.179 27020 10.9.21.114 27020 分片3 (副本集) 10.9.21.178 27021 10.9.21.179 27021 10.9.21.114 27021 具体搭建过程: 一:目录创建: 1.关于分片节点的目录,注意需要在114和178以及179都要创建! 1)关于27021分片 mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/db mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/config mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/log 2)关于27020分片 mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/db mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/config mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/log 3)关于27019分片 mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/db mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/config mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/log 2.关于mongos的相关目录创建: mkdir -p /data/mongodb/mongodb_sharding/mongos/config mkdir -p /data/mongodb/mongodb_sharding/mongos/db mkdir -p /data/mongodb/mongodb_sharding/mongos/log 3.关于config server的相关目录的创建: mkdir -p /data/mongodb/mongodb_sharding/config_server/db mkdir -p /data/mongodb/mongodb_sharding/config_server/log mkdir -p /data/mongodb/mongodb_sharding/config_server/config 4.修改目录的数组 chown -R mongod.mongod /data/mongodb/mongodb_sharding/ 5.创建安装mongodb软件的目录: mkdir -p /usr/bin/percona_mongodb chown 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]# ll total 119428 drwxrwxr-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 found 1.修改分片节点的配置文件 如下文件是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.conf sed -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.key 2.复制file key到mongodb的27020和27021对应目录下: cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key 3.复制file key到mongos的对应目录下: cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongos/config/mongodb.key 4.复制file key到config server的对应目录下: cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/config_server/config/mongodb.key 5.修改文件的权限: chmod 600 /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key chmod 600 /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key chmod 600 /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key chmod 600 /data/mongodb/mongodb_sharding/config_server/config/mongodb.key chmod 600 /data/mongodb/mongodb_sharding/mongos/config/mongodb.key 6.把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 admin db.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.conf 5.3.1.登录mongos /data/mongodb/mongodb_sharding/software/bin/mongo --port=27017 --host=10.9.21.114 5.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 admin db.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 六:操作验证: 创建库 liuhe mongos> use liuhe switched 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" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } config.system.sessions shard key: { "_id" : 1 } unique: false balancing: true chunks: 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 liuwenhe 2.插入数据,如果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().sharded true 7.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.hezi shard key: { "name" : 1 } unique: true balancing: true chunks: 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.hezi shard key: { "name" : 1 } unique: false balancing: true chunks: s1092111427019 20 s1092111427020 19 s1092111427021 20 至此生产标准的分片架构搭建完毕。。。。
0