目录

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()

实际执行

准备三个服务器:

编辑 /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)

:!: 注意事项

添加仲裁节点时要修改写策略 (查看官网说明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