Mongo副本集部署

Mongo副本集部署

1.1 安装mongo

1.2. 创建配置文件

vim mongodb.conf
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongodb.log
fork=true
logappend=true
bind_ip=192.168.8.207  # 各节点IP
port=27017
replSet=rs0  # 副本集名称,各个配置文件中,必须相同

1.3. 启动mongo

mongd -f mongodb.conf

1.4. 配置副本集

# 连接任意一台mongo实例,执行rs.initiate()进行初始化
>conf=
... {
... "_id" : "rs0",
... "members" : [
...   {"_id" : 0, "host" : "192.168.8.204:27017"},
...   {"_id" : 1, "host" : "192.168.8.205:27017"},
...   {"_id" : 2, "host" : "192.168.8.207:27017"}
... ]}
> rs.initiate(conf)
{
	"ok" : 1,
	"operationTime" : Timestamp(1639207786, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1639207786, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
# rs.initiate()不传入任何参数, 默认对副本集进行初始化,

1.5. 开启安全认证

1.5.1. 创建用户

> use admin
> db.createUser({user:"name",pwd:"passwd",roles:["root"]})
use admin
> db.createUser({ user: "admin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })

1.5.2. 验证用户

> db.auth("user","passwd")

1.5.3. 创建副本集认证key

该key的权限必须是600

所有副本集节点必须要相同的keyfile

openssl rand -base64 745 -out mongo.keyfile
chmod 400 mongo.keyfile

1.5.4. 添加配置文件

vim mongodb.conf
keyFile=/usr/local/mongodb/mongo.keyfile
auth=true

1.5.5. 启动mongo

mongd -f mongodb.conf 

如果添加keyfile后启动失败,那就是keyfile的问题,查看输出日志,修改keyfile内容

2. 副本集操作

2.1. 副本集操作

  • 向副本集中添加成员

rs.add("192.168.8.208:27017")
  • 向副本集中添加备份节点

rs.add({"_id" :3,"host":"192.168.8.208:27017","priority":0,"hidden":true})
  • 从副本集中删除成员

rs.remove("192.168.8.208:27017")
  • 向副本集中添加仲裁

rs.addArb("192.168.8.208:27017")
  • 修改副本集成员

rs0:PRIMARY> var conf=rs.conf()
rs0:PRIMARY> conf.members[1].priority = 5

# 刷新
rs0:PRIMARY> rs.reconfig(conf)

2.2. 副本集切换

  • 冰冻,该时间内不参于选举primary

rs.freeze(120)
  • 降级并且该时间内不参于选举primary

rs.stepDown(120)
  • 强制让一个节点成为Primary,可以将该节点的优先级设置成最高

cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[0].priority = 1
cfg.members[0].priority = 1
rs.reconfig(cfg)

2.3. 副本集监控

  • 查看副本集配置信息

rs0:PRIMARY> rs.conf()
  • 查看副本集运行状态

rs0:PRIMARY> rs.status()
  • 查看备份节点的复制信息

rs0:PRIMARY> db.printSlaveReplicationInfo()
db.printSecondaryReplicationInfo()

2.4. 副本集测试

  • 在primary上插入一万条数据

rs0:PRIMARY> for(var i=0;i<100;i++){db.customer.insert({"name":"user"+i})}
WriteResult({ "nInserted" : 1 })

rs0:PRIMARY> db.customer.count()
10000
  • 在secondary上查看客户数据是否已经同步

rs0:SECONDARY> rs.slaveOk()  或者  rs.secondaryOk()
rs0:SECONDARY> db.customer.count()

2.5. 故障转移测试

  • 使用 rs.status() 查看当前 PRIMARY 节点,关闭 PRIMARY 节点

mongod --shutdown --dbpath /usr/local/mongodb/data

PRIMARY 由其他节点继承

当再次启动,由于选举优先级最高,自动被选举为Primary