MongoDB–Linux下搭建的副本集集群(踩过的坑,血和泪的教训)
文章目录
一:环境准备
centOS6.7,mongoDB 3.6的安装包,三个配置好免密和时间同步的节点
二:安装步骤
1.上传安装包到三个节点
2.解压到指定文件夹
tar -zxvf [安装包] -C [指定目录]
3.创建日志存储文件和数据存储目录
mkdir data
mkdir logs
cd logs
touch mongod.log
4.创建配置文件
配置文件放在bin下面
sudo vi conf/mongodb.conf
写入以下内容
dbpath=/home/hadoop/apps/mongodb/data #数据存储目录
fork = true #守护线程运行
port = 27017 #端口号
bind_ip=0.0.0.0 #绑定ip,一定要是0.0.0.0
logpath =/home/hadoop/apps/mongodb/logs/mongod.log #日志存储文件,一定要是文件,不是文件夹
logappend =true #以追加的方式写日志文件
replSet= cqsm1 #复制集名称,自定义
smallfiles =true #以小文件存储
5.在其他的两个节点也创建对应的文件目录和文件
6.将配置文件发送给其他两个节点
scp -r conf hadoop@hadoop01:/home/mongodb/bin
三:启动
1.关闭防火墙
既要关闭iptables也要关闭seLinux,不然一定会报错
关闭iptable
sudo service iptables stop
关闭seLinux
/etc/selinux/config
将SELINUX的值修改为disable,重启
如果没有关闭会报如下的错,显示无法通信
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.145.136:27017 failed with No route to host"
2.三个节点分别启动mongod服务
进入到mongodb的bin下面
./mongod -f conf/mongdn.conf #以加载配置文件的方式启动,要指定conf的目录
三个节点都要启动,成功启动显示内容如下:
child process started successfully, parent exiting
4.进入其中一个客户端
进入客户端
mongo
创建配置文件:
config={
"_id":"cqsm1",
"members":[
{"_id":0,"host":"192.168.2.101:27017"},
{"_id":1,"host":"192.168.2.102:27017"},
{"_id":2,"host":"192.168.2.103:27017"}
]
}
加载配置文件
rs.initiate(config)
如出现以下错误,检查其他节点的mongod服务是否开启,防火墙是否关闭
{
"ok" : 0,
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.2.102:27017 failed with Connection refused, 192.168.2.103:27017 failed with Connection refused",
"code" : 74,
"codeName" : "NodeNotFound"
}
成功启动应该是这样的:
{
"ok" : 1,
"operationTime" : Timestamp(1575431543, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1575431543, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
5.测试
只有主节点是可以读写的,如果读数据例如,show dbs ;show collections都会报错:
"errmsg" : "not master and slaveOk=false" //这个是正常的
可以通过设置副本节点可以读
db.getMongo().setSlaveOk();
在主节点写入数据
cqsm>db.mongo.insert({"title":"aa"})
WriteResult({ "nInserted" : 1 })
当主节点宕机,副节点会自动变为主节点。
四:常见安装错误总结
1.data目录和log目录不对,要手动创建data文件夹和logs/mongodb.log文件,一个是文件一个是文件夹目录,不能搞错,错误:
child process failed, exited with error number 51
To see additional information in this output, start without the "--fork" option.
2.当节点错误方式关闭,再次启动mongod服务可能也会报错
错误:
child process failed, exited with error number 51
To see additional information in this output, start without the "--fork" option.
解决方案
删除 mongod.lock 文件和日志文件 mongodb.log.2014-11-17T06-55-20 ,如果有必要把 log日志全部删除
使用命令netstat -ntlp 查看mongod占用端口,使用kill -9 [PID]杀掉进程
3.初始化副本集的时候显示连接不上
错误:
{
"ok" : 0,
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.2.102:27017 failed with Connection refused, 192.168.2.103:27017 failed with Connection refused",
"code" : 74,
"codeName" : "NodeNotFound"
}
解决方案:
检查其他节点的mongod服务是否开启
是否关闭了iptable和seLinux
配置文件中的bind_ip=0.0.0.0写了没有
4.各个节点上的MongoDB的版本也一定要一致,不然会报错
"stateStr" : "(not reachable/healthy)"