====== 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