一般配置
openssl rand -base64 12 > /app/mongodb/conf/keyfile
cat /app/mongodb/conf/keyfile
pXvFZbWEyteLbTHV
# rep.conf
port=27017 #端口
dbpath=/app/data/mongodb #数据文件存放目录
logpath=/app/logs/mongodb/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
#fork=true #在后台运行,Systemd启动时,需要注释掉此配置
maxConns=5000 #最大同时连接数 默认2000
storageEngine = wiredTiger
auth=true #启用验证
nohttpinterface=true
rest=false
replSet=rep # 集群名
oplogSize=10240
keyFile=/app/mongodb/conf/keyfile
wiredTigerCacheSizeGB=4
systemd 启动脚本
说明
- 使用systemd启动脚本时,配置文件的 fork=true 需要注释掉。
- Restart=on-failure , 进程如果异常重启,会自动拉起进程。
- OOMScoreAdjust=-100,会避免被 OOM。 ( OOM 发送的信号为 SIGKILL)
# /etc/systemd/system/mongodb.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
#User=mongodb
Restart=on-failure
RestartSec=30
OOMScoreAdjust=-1000
ExecStartPre=/bin/mkdir -p /app/logs/mongodb /app/data/mongodb
ExecStart=/usr/bin/numactl --interleave=all /app/mongodb/bin/mongod --quiet --config /app/mongodb/conf/rep.conf
[Install]
WantedBy=multi-user.target
集群
角色:PRIMARY(主节点,读写) SECONDARY(从节点,保存数据,默认不读写) ARBITER(仲裁节点,不保存数据,不提供读写)
主从节点的角色可以相互切换。
仲裁节点始终为仲裁节点,仲裁节点只参与主从节点切换时的投票。
节点:一般为3个节点、5个节点。3节点的部署,一般为1主1从1仲裁,或1主2从。
5节点部署一般为1主2从2仲裁,或1主3从1仲裁。
硬件配置:主从节点配置需保持一致,仲裁节点配置因不存业务数据,配置可以低一些。
单节点如何无缝升级到集群
- 单节点上创建用户和库,正常跑业务。此单节点,就是即将升级到集群中的主节点。
- 新增两个节点,参考上文的配置,注意各节点 keyFile 和 replSet 保持一致,正常启动新节点。启动后,不用对这两个节点操作。
- 在主节点上执行下文的初始化集群的命令,执行完
rs.initiate(config)
之后,从节点就会自动同步数据 - 通过命令 rs.status() 查看集群各节点状态。
初始化集群:
说明: priority 越高,则主从切换的时候优先切换到哪台机器上作为主节点。
config = {
_id:"rep",
"version" : 1,
members:[
{_id:0,host:"192.168.10.2:27017",priority:3},
{_id:1,host:"192.168.10.145:27017",priority:1,arbiterOnly: true},
{_id:2,host:"192.168.10.146:27017",priority:2}
]}
//config.members[1] = {"_id":1,"host":"192.168.10.145:27017","arbiterOnly":true}
rs.initiate(config)
初始化之后,在主节点创建用户,其他数据节点会自动同步用户
/app/mongodb/bin/mongo admin
db.createUser({user:"aaa",pwd:"123",roles:[{role:"root",db:"admin"}]})
默认读写都是主节点,(根据业务需要)通过以下命令设置从节点只读:
db.setSlaveOk()
重新配置集群
use local
db.dropDatabase()
config = {
_id:"rep",
"version" : 1,
members:[
{_id:0,host:"192.168.10.2:27017",priority:3},
{_id:1,host:"192.168.10.145:27017",priority:1,arbiterOnly: true},
{_id:2,host:"192.168.10.146:27017",priority:2}
]}
//rs.initiate(config)
rs.reconfig(config, {force: true})
查看集群:
rs.config()
use local
db.system.replset.find()
提升指定服务器为 PRIMARY :
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 1
cfg.members[2].priority = 2
rs.reconfig(cfg)
将主节点切换到从节点,并且指定时间内都不在作为主节点。
rs.freeze(86400); // 该节点 xx 秒内不会作为主节点(实际发现下面的命令更有用)
// 主节点切为从节点,并且一天内不能作为主
rs.stepDown(86400);
关闭从节点
db.shutdownServer()
Docker 部署 mongodb 单节点
自动创建 DB_NAME 的数据库
# docker-compose.yml
version: '2.2'
services:
mongo:
image: mongo:4.0
restart: unless-stopped
container_name: "mongo"
command: mongod --smallfiles --oplogSize 128 --replSet rep --storageEngine=wiredTiger
ports:
- 50007:27017
volumes:
- /srv/mongo/db:/data/db
mongo-init-replica:
image: mongo:4.0
container_name: "mongo-init"
command: ["bash", "-c", 'sleep 10 && mongo mongo/DB_NAME --eval "rs.initiate({ _id: ''rep'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"']
depends_on:
- mongo
常见问题:
关闭 numa
关闭 numa 可以通过numactl –interleave=all mongod ...
来实现cmdline oplogsize (10240) different than existing (400) see: http://dochub.mongodb.org/core/increase-oplog
解决办法,增加 oplogsize 从 400 增加到 10240初始化时,报错 code 13, 提示 “not authorized on admin to execute command { replSetGetStatus: 1.0 }”
解决办法: 使用 mongo localhost:27027/admin 命令进行操作(假设服务端口为27027)。