MongoDB复制集

环境:
三台centos7.6 最小安装,禁用SeLinux,一个PRIMARY,两个SECONDARY。
MongoDB 4.X:各版本下载列表https://www.mongodb.org/dl/linux/x86_64
MongoDB 4.x版本已经不再支持主从复制,而是使用副本集(replica-set)

MongoDB推荐关闭大内存页面,即设置transparent_hugepage=never:

$ grep GRUB_CMDLINE_LINUX /etc/default/grub 
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet transparent_hugepage=never"
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ shutdown -r Now

下载 http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-v4.0-latest.tgz
或YUM安装:

$ cat > /etc/yum.repos.d/mongodb-org-4.0.repo <<EOF
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF

$ yum makecache
$ yum install -y mongodb-org
$ rpm -ql mongodb-org-server

创建server之间认证的key文件(其它机器上不要创建):

$ mkdir -p /data/mongodb/{key,db,logs}
$ openssl rand -base64 522 >/data/mongodb/key/repl_set.key
$ chown -R mongod:mongod /data/mongodb
$ chmod 400 /data/mongodb/key/repl_set.key

将/data/mongodb/key/repl_set.key复制到其它节点,并配置400权限。

编辑/etc/mongod.conf文件

$ grep -v "#" /etc/mongod.conf 
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongod.log

storage:
  dbPath: /data/mongodb/db
  directoryPerDB: true
  journal:
    enabled: true

processManagement:
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27017

security:
  clusterauthMode: keyFile
  keyFile: /data/mongodb/key/repl_set.key
  authorization: enabled

replication:
  oplogSizeMB: 1024
  replSetName: MyRepSet

复制集中的所有member都要开启journal(日志)功能,以及设置合适的oplog大小。–directoryperdb参数将数据库分目录存储,以便后期空间的扩容。

将/etc/mongod.conf复制到其它节点,然后启动mongodb:

$ systemctl enable mongod && systemctl start mongod && systemctl status mongod

连接到本地mongod,配置复制集:

$ mongo
config = { _id: "MyRepSet", members: [
{_id: 0, host: "10.3.8.235:27017"},
{_id: 1, host: "10.3.8.236:27017"},
{_id: 2, host: "10.3.8.237:27017"}]
}
rs.initiate(config);
rs.status();
use admin
db.createuser({user:"root",pwd:"rootpw",roles:[{role:"root",db:"admin"}]})
db.auth("root","rootpw")
db.createuser({user:"clusteradmin",pwd:"Mongo",roles:[{role:"clusteradmin",db:"admin"}]})
exit

#这个角色可以进行复制集的管理(添加成员、查看状态等等)。
登录查看复制集状态:

$ mongo -u "clusteradmin" -p "Mongo" --authenticationDatabase "admin"
> rs.status();
> db.serverStatus().repl.primary
10.3.8.235:27017

节点的关闭顺序
对于PRIMARY(P)、SECONDARY(S)、ARBITER(A),有以下几种关闭顺序:
1:关闭顺序PSA:会报错
2:关闭顺序PAS:可以
3:关闭顺序SAP:主节点会变为从节点
4:关闭顺序SPA:会报错
5:关闭顺序APS:不报错,Primary节点不会再自动切换
6:关闭顺序ASP:主节点会变为从节点
总结:
1:先关闭从节点、仲裁节点。或者先关闭仲裁节点,最后关闭从节点。则:主节点自动变为从节点
2:先关闭主节点,则从节点自动变为主节点,在仲裁节点关闭之前,新主节点不能关闭
3:只要仲裁节点不是最后关闭,都可以。如果没有仲裁节点,是两个SECONDARY,哪种顺序都可以。

关闭MongoDB服务:

$ mongo -u "clusteradmin" -p "Mongo" --authenticationDatabase "admin"
> use admin;
> db.shutdownServer();

或者在系统环境下用命令关闭

$ mongod --shutdown --dbpath /data/mongodb/db

还可以使用操作系统的 kill 命令,给 mongod 进程发送 SIGINT 或 SIGTERM 信号,即 “kill -2 PID” 或者 “kill -15 PID”。建议不要使用 “kill -9 pid”,因为如果 MongoDB 运行在没开启日志(–journal)的情况下,可能会造成数据损失。

在生产环境中,复制集通常为三个members,已经基本满足HA需要,因为mongod本身为系统资源高耗型应用,我们应该尽量避免过于复杂的部署方式。如果需要更多的members参与,则尽可能保证members的个数为奇数,且至少有2个member保存数据;注意replication模式从根本上说并不是解决负载均衡”、“读写分离”的方法,它是HA方案,即“自动Failover”和数据备份;对于流量比较高的应用而言,secondaries需要从primary上复制大量的oplog,要执行和primary等量的write操作,还要接收较多的read操作,可能导致secondary过载、增加数据复制的延迟。所以当mongod流量较高时,replication模式并不能起到“load balance”或者压力分流的作用,此时应该考虑另一种架构模式:sharding。

相关文章

MongoTemplate 是Spring Data MongoDB 中的一个核心类,为 S...
笔者今天要分享的是一个项目重构过程中如何将数据库选型由原...
mongodb/mongoTemplate.upsert批量插入更新数据的实现
进入官网下载官网安装点击next勾选同意,点击next点击custom...
头歌 MongoDB实验——数据库基本操作
期末考试复习总结