环境:
三台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。