MongoDB 3.2 維護

一般配置

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é)點如何無縫升級到集群

  1. 單節(jié)點上創(chuàng)建用戶和庫,正常跑業(yè)務(wù)。此單節(jié)點,就是即將升級到集群中的主節(jié)點。
  2. 新增兩個節(jié)點,參考上文的配置,注意各節(jié)點 keyFile 和 replSet 保持一致,正常啟動新節(jié)點。啟動后,不用對這兩個節(jié)點操作。
  3. 在主節(jié)點上執(zhí)行下文的初始化集群的命令,執(zhí)行完 rs.initiate(config) 之后,從節(jié)點就會自動同步數(shù)據(jù)
  4. 通過命令 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)。

ref:
http://www.cnblogs.com/ljhdo/p/4583276.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Codis 3.2 部署配置匯總 概念總結(jié) 集群配置前需要了解架構(gòu),集群分片主要分三種: 客戶端分片:這個需要自己...
    三杯水Plus閱讀 6,043評論 0 11
  • 最近在研究Docker的源碼.讀到ApiServer的啟動過程時,發(fā)現(xiàn)其有一個新的概念,叫做service act...
    AlstonWilliams閱讀 1,152評論 1 4
  • 說到挑擔(dān),有個人是不能忘記的,他就是小鎮(zhèn)上的挑水伯伯。 小鎮(zhèn)老街除了有河外,十字街上還有一口公用的井,可以淘米洗菜...
    薇薇安的30天閱讀 312評論 0 0
  • 今天最重要的事情就是去學(xué)校給小十二選照片啦 本來說好一早去的 因為時間緊張怕來不及去上班 就沒去!晚上下班請假啦一...
    路露小魔女閱讀 149評論 0 0