最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进。如果大家不熟悉什么是分片、副本集、仲裁者的话请先移步查看上一篇文章:mongodb3.4集群搭建:分片+副本集
和前一个版本相比,改动点有:
配置文件采用yaml方式来配置 生产中取消了仲裁者的角色,因为仲裁者也不会存储数据,只是起到选举的作用,线上为了保证数据安全,每份数据都会配置两个副本集,也就是每份数据存储了三份。 优化配置,采用五台集群 使用非root账户搭建mongodb集群。##环境准备
系统系统centos6.9
五台服务器:192.168.0.31/32/33/34/35
安装包:mongodb-linux-x86_64-3.4.6.tgz服务器规划
服务器31 服务器32 服务器33 服务器34 服务器35 mongosserver mongosserver configserver configserver configserver shard1server shard2server shard3server shard4server shard5server shard5server shard1server shard2server shard3server shard4server shard4server shard5server shard1server shard2server shard3server端口分配:
mongos:20000 config:21000 shard1:27001 shard2:27002 shard3:27003 shard4:27004 shard5:27005权限分配:
登录root账户,将安装目录和数据目录权限分配给日常操作(youknow)账户
chown-Ryouknow:youknow/usr/local/ chown-Ryouknow:youknow/data##mongodb安装
###1、下载下载mongodb3.4.6安装包
curl-Ohttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz #解压 tar-xzvfmongodb-linux-x86_64-3.4.6.tgz-C/usr/local/ #改名 mvmongodb-linux-x86_64-3.4.6mongodb###2、创建相关目录
根据服务器的规范,分别在对应的服务器上建立conf、mongos、config、shard1、shard2、shard3、shard4、shard5等目录,因为mongos不存储数据,只需要建立日志文件目录即可。
mkdir-p/usr/local/mongodb/conf mkdir-p/data/mongos/log mkdir-p/data/config/data mkdir-p/data/config/log mkdir-p/data/shard1/data mkdir-p/data/shard1/log mkdir-p/data/shard2/data mkdir-p/data/shard2/log mkdir-p/data/shard3/data mkdir-p/data/shard3/log mkdir-p/data/shard4/data mkdir-p/data/shard4/log mkdir-p/data/shard5/data mkdir-p/data/shard5/log###3、环境变量
为了后续方便操作,配置mongodb的环境变量,需要切到root用户下面
vim/etc/profile #内容 exportMONGODB_HOME=/usr/local/mongodb exportPATH=$MONGODB_HOME/bin:$PATH #使立即生效,在安装用户下(youknow)执行 source/etc/profile查看mongodb版本信息mongod-v输出版本信息表明配置环境变量成功
##集群配置
###1、configserver配置服务器在服务器33、34、35上配置以下内容:
添加配置文件:
添加配置文件
vi/usr/local/mongodb/conf/config.conf ##content systemLog: destination:file logAppend:true path:/data/config/log/config.log #Whereandhowtostoredata. storage: dbPath:/data/config/data journal: enabled:true #howtheprocessruns processManagement: fork:true pidFilePath:/data/config/log/configsrv.pid #networkinterfaces net: port:21000 bindIp:192.168.0.33 #operationProfiling: replication: replSetName:config sharding: clusterRole:configsvr启动三台服务器的configserver
numactl--interleave=allmongod--config/usr/local/mongodb/conf/config.conf登录任意一台配置服务器,初始化配置副本集
#连接 mongo192.168.0.33:21000 #config变量 config={ ..._id:"config", ...members:[ ...{_id:0,host:"192.168.0.33:21000"}, ...{_id:1,host:"192.168.0.34:21000"}, ...{_id:2,host:"192.168.0.35:21000"} ...] ...} #初始化副本集 rs.initiate(config) #查看分区状态 rs.status();其中,"_id":"configs"应与配置文件中配置的replicaction.replSetName一致,"members"中的"host"为三个节点的ip和port
这样配置服务器就配置好了
在服务器31、32、33上面做以下配置
配置文件
vi/usr/local/mongodb/conf/shard1.conf #配置文件内容 #wheretowriteloggingdata. systemLog: destination:file logAppend:true path:/data/shard1/log/shard1.log #Whereandhowtostoredata. storage: dbPath:/data/shard1/data journal: enabled:true wiredTiger: engineConfig: cacheSizeGB:20 #howtheprocessruns processManagement: fork:true pidFilePath:/data/shard1/log/shard1.pid #networkinterfaces net: port:27001 bindIp:192.168.0.33 #operationProfiling: replication: replSetName:shard1 sharding: clusterRole:shardsvr启动三台服务器的shard1server
numactl--interleave=allmongod--config/usr/local/mongodb/conf/shard1.conf登陆任意一台服务器,初始化副本集
mongo192.168.0.31:27001 #使用admin数据库 useadmin #定义副本集配置 config={ ..._id:"shard1", ...members:[ ...{_id:0,host:"192.168.0.31:27001"}, ...{_id:1,host:"192.168.0.32:27001"}, ...{_id:2,host:"192.168.0.33:27001"} ...] ...} #初始化副本集配置 rs.initiate(config); #查看分区状态 rs.status();####配置第二个分片副本集
在服务器32、33、34上面做以下配置
配置文件
vi/usr/local/mongodb/conf/shard2.conf #配置文件内容 #wheretowriteloggingdata. systemLog: destination:file logAppend:true path:/data/shard2/log/shard2.log #Whereandhowtostoredata. storage: dbPath:/data/shard2/data journal: enabled:true wiredTiger: engineConfig: cacheSizeGB:20 #howtheprocessruns processManagement: fork:true pidFilePath:/data/shard2/log/shard2.pid #networkinterfaces net: port:27002 bindIp:192.168.0.33 #operationProfiling: replication: replSetName:shard2 sharding: clusterRole:shardsvr启动三台服务器的shard2server
numactl--interleave=allmongod--config/usr/local/mongodb/conf/shard2.conf登陆任意一台服务器,初始化副本集
mongo192.168.0.32:27002 #使用admin数据库 useadmin #定义副本集配置 config={ ..._id:"shard2", ...members:[ ...{_id:0,host:"192.168.0.32:27002"}, ...{_id:1,host:"192.168.0.33:27002"}, ...{_id:2,host:"192.168.0.34:27002"} ...] ...} #初始化副本集配置 rs.initiate(config); #查看分区状态 rs.status(); 配置第三个分片副本集在服务器33、34、35上面做以下配置
配置文件
vi/usr/local/mongodb/conf/shard3.conf #配置文件内容 #wheretowriteloggingdata. systemLog: destination:file logAppend:true path:/data/shard3/log/shard3.log #Whereandhowtostoredata. storage: dbPath:/data/shard3/data journal: enabled:true wiredTiger: engineConfig: cacheSizeGB:20 #howtheprocessruns processManagement: fork:true pidFilePath:/data/shard3/log/shard3.pid #networkinterfaces net: port:27003 bindIp:192.168.0.33 #operationProfiling: replication: replSetName:shard3 sharding: clusterRole:shardsvr启动三台服务器的shard3server
numactl--interleave=allmongod--config/usr/local/mongodb/conf/shard3.conf登陆任意一台服务器,初始化副本集
mongo192.168.0.33:27003 #使用admin数据库 useadmin #定义副本集配置 config={ ..._id:"shard3", ...members:[ ...{_id:0,host:"192.168.0.33:27003"}, ...{_id:1,host:"192.168.0.34:27003"}, ...{_id:2,host:"192.168.0.35:27003"} ...] ...} #初始化副本集配置 rs.initiate(config); #查看分区状态 rs.status();####配置第四个分片副本集
在服务器34、35、31上面做以下配置
配置文件
vi/usr/local/mongodb/conf/shard4.conf #配置文件内容 #wheretowriteloggingdata. systemLog: destination:file logAppend:true path:/data/shard4/log/shard4.log #Whereandhowtostoredata. storage: dbPath:/data/shard4/data journal: enabled:true wiredTiger: engineConfig: cacheSizeGB:20 #howtheprocessruns processManagement: fork:true pidFilePath:/data/shard4/log/shard4.pid #networkinterfaces net: port:27004 bindIp:192.168.0.35 #operationProfiling: replication: replSetName:shard4 sharding: clusterRole:shardsvr启动三台服务器的shard4server
numactl--interleave=allmongod--config/usr/local/mongodb/conf/shard4.conf登陆任意一台服务器,初始化副本集
mongo192.168.0.34:27004 #使用admin数据库 useadmin #定义副本集配置 config={ ..._id:"shard4", ...members:[ ...{_id:0,host:"192.168.0.34:27004"}, ...{_id:1,host:"192.168.0.35:27004"}, ...{_id:2,host:"192.168.0.31:27004"} ...] ...} #初始化副本集配置 rs.initiate(config); #查看分区状态 rs.status();####配置第五个分片副本集
在服务器35、31、32上面做以下配置
配置文件
vi/usr/local/mongodb/conf/shard5.conf #配置文件内容 #wheretowriteloggingdata. systemLog: destination:file logAppend:true path:/data/shard5/log/shard5.log #Whereandhowtostoredata. storage: dbPath:/data/shard5/data journal: enabled:true wiredTiger: engineConfig: cacheSizeGB:20 #howtheprocessruns processManagement: fork:true pidFilePath:/data/shard5/log/shard5.pid #networkinterfaces net: port:27005 bindIp:192.168.0.35 #operationProfiling: replication: replSetName:shard5 sharding: clusterRole:shardsvr启动三台服务器的shard5server
numactl--interleave=allmongod--config/usr/local/mongodb/conf/shard5.conf登陆任意一台服务器,初始化副本集
mongo192.168.0.35:27005 #使用admin数据库 useadmin #定义副本集配置 config={ ..._id:"shard5", ...members:[ ...{_id:0,host:"192.168.0.35:27005"}, ...{_id:1,host:"192.168.0.31:27005"}, ...{_id:2,host:"192.168.0.32:27005"} ...] ...} #初始化副本集配置 rs.initiate(config); #查看分区状态 rs.status();至此,五个分片和副本集搭建完毕
###3、配置路由服务器mongos
以下配置在服务器31、32上执行
注意:先启动配置服务器和分片服务器,后启动路由实例
vi/usr/local/mongodb/conf/mongos.conf systemLog: destination:file logAppend:true path:/data/mongos/log/mongos.log processManagement: fork:true #pidFilePath:/usr/local/mongodb/mongos.pid #networkinterfaces net: port:20000 bindIp:192.168.0.31 #监听的配置服务器,只能有1个或者3个configs为配置服务器的副本集名字 sharding: configDB:configs/192.168.0.33:21000,192.168.0.34:21000,192.168.0.35:21000启动二台服务器的mongosserver
mongos--config/usr/local/mongodb/conf/mongos.conf###4、启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos
mongo192.168.0.31:20000 #使用admin数据库 useadmin #串联路由服务器与分配副本集 sh.addShard("shard1/192.168.0.31:27001,192.168.0.32:27001,192.168.0.33:27001") sh.addShard("shard2/192.168.0.32:27002,192.168.0.33:27002,192.168.0.34:27002") sh.addShard("shard3/192.168.0.33:27003,192.168.0.34:27003,192.168.0.35:27003") sh.addShard("shard4/192.168.0.34:27004,192.168.0.35:27004,192.168.0.31:27004") sh.addShard("shard5/192.168.0.35:27005,192.168.0.31:27005,192.168.0.32:27005") #查看集群状态 sh.status()这样mongodb的五台集群搭建就已经完成了,后期如何优化和运营请查看下一篇文章。
##错误
###rs.initiate报错执行rs.initiate(config);报错:
rs.initiate(config); { "ok":0, "errmsg":"Nohostdescribedinnewconfiguration1forreplicasetshard1mapstothisnode", "code":93, "codeName":"InvalidReplicaSetConfig" }最后发现是自己的一个端口号写错了。
###启动mongos报错
启动mongos的时候报错:
abouttoforkchildprocess,waitinguntilserverisreadyforconnections. forkedprocess:1436 ERROR:childprocessfailed,exitedwitherrornumber1这个问题卡了我们半天,找了很多的资料,不是说清理lock文件,就是说清理log文件总无解,最后看到这个网站的提示
ERROR:childprocessfailed,exitedwitherrornumber1
去掉了配置文件中--fork,才将真正的错误日志打印了出来,是我们的配置文件中的路径写错了,本来是log写成了logs
原来:path:/data/logs/mongos.log
改为:path:/data/log/mongos.log
成功
为了方便大家拿取配置文件,我在github上面放置了一份:mongodb-five-cluster-conf
本文内容总结:2、配置分片、副本集,
原文链接:https://www.cnblogs.com/ityouknow/p/7566682.html