====== MongoDB 副本集 ======
参考之前的笔记以及收集的文章 ((a> [[https://blog.simperator.com/mydocs/#/%E7%A7%91%E6%8A%80/coding/database/%E6%90%AD%E5%BB%BA%E5%89%AF%E6%9C%AC|搭建副本]]))
**连接多副本**
单版本的数据库连接通常为 ''%%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版本
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 文件。否则会一直安装最新的版本。
第三步修改数据库的登录模式
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
添加仲裁节点时要修改写策略 (查看官网说明((a>[[https://docs.mongodb.com/manual/reference/command/setDefaultRWConcern/#setdefaultrwconcern|官网说明]])) 中的 **Example** )
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : 2
}
})
当节点数目为奇数时,可以不需要仲裁节点。
当节点数目为偶数个时,需要部署一个仲裁节点,否则偶数个节点,当主节点挂了后,其他节点会变为只读。
Oracle Cloud 的1核1G内存实例作为副节点会经常宕机。原因是内存不足,一次更新就会占用掉1G的内存。因此微小实例只能用作「仲裁」角色。而仲裁角色也非常重要,否则无论副集还是主集宕机,都会导致数据库不能用。
====== 其它命令 ======
# 副本集添加成员
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