千家信息网

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 至此生产标准的分片架构搭建完毕。。。。
副本 目录 配置 数据 节点 文件 实例 路由 服务 版本 索引 多个 数据库 服务器 注释 管理员 管理 验证 安全 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全对学校有什么重要性 网络安全法五十七条规定 软件开发公司如何定价 联想r680g7服务器装系统 软件开发费用进无形资产 arma3怎么管理服务器 网络安全论坛永久会址最新消息 内蒙古量化积分管理软件开发 高中网络技术应用.ppt 网络安全重要组成部分 机场 代理服务器 鬼泣巅峰之战服务器装备互通吗 西山居网络技术 怎么样打开odbc数据库 云服务器镜像可以改吗 永乐票务服务器繁忙 云服务器地址打不开 我的世界玩别人的服务器掉帧 万维平台数据库 关于数据库的安全性的文献 小程序软件开发制作用什么软件 电视怎么检查dns服务器 有关数据库技术的参考文献 高中网络技术应用.ppt 智能车载网络技术 软件测试和软件开发职业年龄 sql数据库实例功能选择 阜宁县网络安全宣传周启动仪式 客户端和游戏库可以分装服务器吗 浙江商城软件开发外包公司哪个好
0