MongoDB4.2副本集部署
由于公司环境需要升级迁移,需要部署指定4.2版本MongoDB主从集群,但是有与mongo4.0后不在推荐使用主从方式。所以遇到了一点问题,最终部署的为4.2副本集。
原环境为一主一从3.8版本环境:
4.0以下部署方式如下:
环境:
主:172.18.57.108
从:172.18.57.109
首先了解配置文件内容:
logpath=/home/data/mongo/log/mongod.log #日志存放路径
logappend=true #是否追加日志
fork=true # 是否后台启动
port=27017 # 启动服务端口
dbpath=/home/data/mongo/data/db # 数据存放目录
pidfilepath=/data/mongo/pid/mongod.pid #进程号存放位置
bind_ip=0.0.0.0 #开放那些可以连接
oplogSize=10240 # 默认oplog大小,不设置也没事
directoryperdb=true # 设置每个数据库将被保存在一个单独的目录
replSet=rs0 # 副本集名称
#slave=true # 是否为从节点
#source=172.18.57.108:27017 # 主库ip与端口
master=true # 是否为主库
目前来说,开启这些就可以满足基本需求,所以更多的就不介绍了。
环境部署准备:
1. 下载软件包:wget https://repo.mongodb.org/yum/redhat/6/mongodb-org/3.6/x86_64/RPMS/mongodb-org-server-3.6.23-1.el6.x86_64.rpm
2. 解压软件包:tar zxf mongodb-org-server-3.6.23-1.el6.x86_64.rpm
3. 更改安装目录: mv mongodb.3.6.23 mongodb
4. 将mongod启动文件做软链接到/usr/bin下,以方便使用: ln -s /data/ops/app/mongodb/bin/mongod /usr/bin/mongod
5. 创建指定目录与文件:
mkdir -p /data/mongo/{data,log}
mkdir -p /data/mongo/data/db
touch /data/mongo/log/mongod.log
6. 编写主配置文件: vim /data/mongo/mongodb.cof
logpath=/home/data/mongo/log/mongod.log
logappend=true
fork=true
port=27017
dbpath=/home/data/mongo/data/db
pidfilepath=/data/mongo/pid/mongod.pid
bind_ip=0.0.0.0
oplogSize=10240
directoryperdb=true # 设置每个数据库将被保存在一个单独的目录
replSet=rs0
master=true
7.以上同样从库执行,从库配置文件如下:
logpath=/home/data/mongo/log/mongod.log
logappend=true
fork=true
port=27017
dbpath=/home/data/mongo/data/db
pidfilepath=/data/mongo/pid/mongod.pid
bind_ip=0.0.0.0
oplogSize=10240
directoryperdb=true # 设置每个数据库将被保存在一个单独的目录
replSet=rs0
slave=true
source=172.18.57.108:27017
8. 启动mongodb: mongod -f /data/mongo/mongodb.cof
9. 进入mongo查看是否为主从
4.2副本集部署:
4.0以上部署配置文件基本没有更改,需把slave、source、master注释
1. 下载4.2版本软件包:wget https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.14-1.el6.x86_64.rpm
2. 一切都和上面一样,只是多了一个仲裁节点,因为mongodb主从不可用,只能部署剧本集。网上有很多说是可以部署主从,但是我没有找到。。。4.2以后的主从即使部署成功后,当主节点宕掉
从节点并不会选替换为主节点,需手动更改才可,如未更改为主节点,原主节点重启后从节点会重新同步数据,所以推荐还是做副本集。
3. 创建仲裁节点目录与配置文件(仲裁节点可以在主或者从主机上随意起一台):
mkdir -p /data/ops/app/mongo/{data,log}
mkdir -p /data/ops/app/mongo/data/db
touch /data/ops/app/mongo/log/mongod.log
vim /data/ops/app/mongo/mongod.conf
logpath=/home/data/ops/app/mongo/log/mongod.log
logappend=true
fork=true
port=28018
dbpath=/home/data/ops/app/mongo/data/db
pidfilepath=/data/ops/app/mongo/pid/mongod.pid
bind_ip=0.0.0.0
oplogSize=10240
directoryperdb=true # 设置每个数据库将被保存在一个单独的目录
replSet=rs0
4. 创建完成后启动所有节点,查看是否启动成功:ss -lnt |grep 27017
5. 启动成功后通过shell连接任意一个数据库执行初始化:
> conf=
{
"_id" : "rs0",
"members" : [
{ "_id" : 0, "host" : "172.16.57.108:27017" },
{ "_id" : 1, "host" : "172.16.57.109:27017" },
{ "_id" : 2, "host" : "172.16.57.109:28018" }
]
>rs.initiate(conf)
也可以直接加上相应的数值,数值越大的则为主:
cfg={ _id:"rs0", members:[ {_id:0,host:'172.18.57.108:27017',priority:2},{_id:2,host:'172.18.57.109:27017',priority:1}, {_id:1,host:'172.18.57.109:28018',arbiterOnly:true}]}
结果输出如下:
{
"ok" : 1,
"operationTime" : Timestamp(1542247326, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1542247326, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
如果在执行 rs.initiate() 方法时不传入任何参数,MongoDB 将以默认的配置文档对副本集进行初始化,后续可以再通过 rs.add() 方法来向副本集中添加成员。
副本集节点操作:
添加:
rs.add("172.18.57.224:27017")
删除:
rs.remove("172.16.57.224:27017")
添加仲裁:
rs.addArb("172.16.57.224:28018")
添加备份节点:
rs.add({"_id":3,"host":"172.16.57.224:27017","priority":0,"hidden":true})
更改副本集配置,强制某个节点为Primary:
cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[1].priority = 1
cfg.members[2].priority = 1
rs.reconfig(cfg
副本查看状态:
rs.status()
查看副本集配置:
rs.conf()
故障案例:
1.启动报错:child process failed, exited with error number 1
一般为配置文件书写错误
2.启动报错:child process failed, exited with error number 100(当时忘记记录下来了,如果是相似的)
一般为非正常启动关闭导致的表锁了(一般删除存储数据目录下的mongodb.soke可以生效)