目录
MongoDB 副本集
参考之前的笔记以及收集的文章 1)
连接多副本
单版本的数据库连接通常为 mongodb://localhost:20271
,而多副本的连接可以是 mongodb://localhost:20271,localhost:20272,localhost:20273?replicaSet=myRepl
mongodb://user:password@serverwin,serverfin:33720/?replicaSet=stockdb&readPreference=nearest&wtimeoutMS=20000
创建三个目录用来安装不同的MongoDB
mkdir -p mongos/db1 mkdir -p mongos/db2 mkdir -p mongos/db3
然后安装三个mongodb
mongod --port 2717 --dbpath ~/mongos/db1 --replSet myReplicaSet mongod --port 2718 --dbpath ~/mongos/db2 --replSet myReplicaSet mongod --port 2719 --dbpath ~/mongos/db3 --replSet myReplicaSet
登陆进去 mongodb 的命令行 mongo --port 2717
rs.status()
查看当前状态 。会看到一个错误,因为没有建立任何子集,运行 rs.initiate()
。但是跟着会看到自己在 Secondary 上,需要输入 cls
切换回来 Primary 。
在主集上添加一个副集 rs.add("localhost:2718")
rs.addArb("localhost:2719")
第三个加了一个仲裁节点。
第一个副本还没有用户的时候可以用管理员 > use admin
切换到管理员。
允许在副本集中读取数据 rs.secondaryOk()
实际执行
准备三个服务器:
- 主服务器:88.153.172.7:33720 (局域网内地址是 192.168.0.157)
- 副本集:141.144.205.48:33720 (serverfin)
- 仲裁集:143.47.185.127:33720 (serveroracle)
编辑 /etc/hosts 文件,让所有的机器互相知道。否则会一直卡住联不通
88.153.172.7 mai-ubun 141.144.205.48 serverfin 143.47.185.127 serveroracle
第一步:修改 /etc/mongod.conf
(暂时取消认证)
replication: replSetName: "stockdb"
第二步:登录主力服务器
rs.status()
查看当前状态
rs.initiate()
初始化数据库
cls
切换到 PRIMARY
添加副本集:rs.add("143.47.185.127:33720")
第一次添加失败,原因是在副本服务器上安装了版本5.0,而在主力服务器上安装4.0版本。必须卸载副本集,并安装4.0版本
download
sudo apt-get purge mongodb-org* sudo rm -r /var/log/mongodb sudo rm -r /var/lib/mongodb sudo apt-key list sudo apt-key del "cccc xxxx ...."
并且删除 /etc/apt/sources.list.d/mongodb-org-5.0.list 文件。否则会一直安装最新的版本。
第三步修改数据库的登录模式
download
security: authorization: enabled keyFile: /home/mongo/rs0.key
chmod 600 rs0.key
# 必须修改为600权限,否则无法启动
第四步 修改副本集的优先级
cfg = rs.conf() cfg.members[0].priority = 0.5 cfg.members[1].priority = 1 rs.reconfig(cfg)
注意事项
- CPU还算好,但服务器的内存不能太小。至少要4G以上。否则只适合作为「仲裁」。
- 必须要单数子集。一主两副,或者一主一副一仲裁。
- security 和 replSet 可以在未接入 replication 前就开启的。
- keyfile 需设成 chmod 600 ,否则无法启动 mongod 服务
- 各个主机必须互相认识(设置 /etc/hosts)
- 如果长时间停留在状态 TARTUP,说明PRIMARY已经认出了副本集,但副本集电脑没有认出主集,或者自己的名字。需要修改 /etc/hosts 文件。服务器名指向自己的时候可以设为 127.0.0.1
添加仲裁节点时要修改写策略 (查看官网说明1) 中的 Example )
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 } })
当节点数目为奇数时,可以不需要仲裁节点。 当节点数目为偶数个时,需要部署一个仲裁节点,否则偶数个节点,当主节点挂了后,其他节点会变为只读。
Oracle Cloud 的1核1G内存实例作为副节点会经常宕机。原因是内存不足,一次更新就会占用掉1G的内存。因此微小实例只能用作「仲裁」角色。而仲裁角色也非常重要,否则无论副集还是主集宕机,都会导致数据库不能用。
其它命令
download
# 副本集添加成员 rs.add('mongodb3.example.net:27017') # 副本集添加仲裁节点 rs.addArb('mongodb4.example.net:27017') # 移除节点 rs.remove('hostportstr') # 查看当前的配置 rs.conf() # 查看各个节点状态和身份 rs.status() # 设定某个节点多少秒不可成为主节点 rs.freeze(secs) # 设置次节点从指定节点同步数据 rs.syncFrom(hostportstr) # 降低主节点为次节点,只能在主节点上运行 rs.stepDown([stepdownSecs, catchUpSecs]) # 查看帮助 rs.help() # 次节点执行,表示允许次节点读取数据 rs.slaveOk() # 判断当前节点是否是主节点 rs.isMaster() # 查看 Oplog 信息 rs.printReplicationInfo() # 查看副本集的次节点与主节点延迟 db.printSlaveReplicationInfo() # 移除原有副本集命令 use local db.system.replset.remove({}) # 关闭 mongodb进程服务 use admin db.shutdownServer()
连接命令
var url = format("mongodb://%s,%s?replicaSet=%s&readPreference=%s" , "localhost:27017", , "localhost:27018" , "foo" , "primaryPreferred"); //nearest