一般配置
openssl rand -base64 12 > /app/mongodb/conf/keyfile
cat /app/mongodb/conf/keyfile
pXvFZbWEyteLbTHV
# rep.conf
port=27017 #端口
dbpath=/app/data/mongodb #數(shù)據(jù)文件存放目錄
logpath=/app/logs/mongodb/mongodb.log #日志文件存放目錄
logappend=true #使用追加的方式寫日志
#fork=true #在后臺運行,Systemd啟動時,需要注釋掉此配置
maxConns=5000 #最大同時連接數(shù) 默認(rèn)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 發(fā)送的信號為 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(主節(jié)點,讀寫) SECONDARY(從節(jié)點,保存數(shù)據(jù),默認(rèn)不讀寫) ARBITER(仲裁節(jié)點,不保存數(shù)據(jù),不提供讀寫)
主從節(jié)點的角色可以相互切換。
仲裁節(jié)點始終為仲裁節(jié)點,仲裁節(jié)點只參與主從節(jié)點切換時的投票。
節(jié)點:一般為3個節(jié)點、5個節(jié)點。3節(jié)點的部署,一般為1主1從1仲裁,或1主2從。
5節(jié)點部署一般為1主2從2仲裁,或1主3從1仲裁。
硬件配置:主從節(jié)點配置需保持一致,仲裁節(jié)點配置因不存業(yè)務(wù)數(shù)據(jù),配置可以低一些。
單節(jié)點如何無縫升級到集群
- 單節(jié)點上創(chuàng)建用戶和庫,正常跑業(yè)務(wù)。此單節(jié)點,就是即將升級到集群中的主節(jié)點。
- 新增兩個節(jié)點,參考上文的配置,注意各節(jié)點 keyFile 和 replSet 保持一致,正常啟動新節(jié)點。啟動后,不用對這兩個節(jié)點操作。
- 在主節(jié)點上執(zhí)行下文的初始化集群的命令,執(zhí)行完
rs.initiate(config)
之后,從節(jié)點就會自動同步數(shù)據(jù) - 通過命令 rs.status() 查看集群各節(jié)點狀態(tài)。
初始化集群:
說明: priority 越高,則主從切換的時候優(yōu)先切換到哪臺機器上作為主節(jié)點。
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)
初始化之后,在主節(jié)點創(chuàng)建用戶,其他數(shù)據(jù)節(jié)點會自動同步用戶
/app/mongodb/bin/mongo admin
db.createUser({user:"aaa",pwd:"123",roles:[{role:"root",db:"admin"}]})
默認(rèn)讀寫都是主節(jié)點,(根據(jù)業(yè)務(wù)需要)通過以下命令設(shè)置從節(jié)點只讀:
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()
提升指定服務(wù)器為 PRIMARY :
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 1
cfg.members[2].priority = 2
rs.reconfig(cfg)
將主節(jié)點切換到從節(jié)點,并且指定時間內(nèi)都不在作為主節(jié)點。
rs.freeze(86400); // 該節(jié)點 xx 秒內(nèi)不會作為主節(jié)點(實際發(fā)現(xiàn)下面的命令更有用)
// 主節(jié)點切為從節(jié)點,并且一天內(nèi)不能作為主
rs.stepDown(86400);
關(guān)閉從節(jié)點
db.shutdownServer()
Docker 部署 mongodb 單節(jié)點
自動創(chuàng)建 DB_NAME 的數(shù)據(jù)庫
# 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
常見問題:
關(guān)閉 numa
關(guān)閉 numa 可以通過numactl –interleave=all mongod ...
來實現(xiàn)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 命令進行操作(假設(shè)服務(wù)端口為27027)。