MongoDB集羣部署(副本集模式)

一、需求背景
1、現狀描述
(1)、針對近期出現的mongodb未授權的安全問題,導致mongodb數據會被非法訪問。應安全平臺部的要求,需要對所有mongodb進行鑑權設置,目前活動側總共有4臺,用於某XX產品;

(2)、某XX產品用到4臺mongodb,屬於2015年機房裁撤的範圍;

(3)、早期的4臺mongodb採用是的M1機型,同時在架構上採取了路由分片的模式。從目前來看,無論是數據量上,還是訪問量上,都比較小,在資源上有點浪費,在架構上屬於過早設計。

而本次新建的mongodb集羣,採用的是副本集模式,且機型選爲B6,機器數量爲3臺。


2、服務器信息

wKiom1VBMg6gm9xrAADOZtzD9AE688.jpg


3、架構圖

wKiom1VBMjTwz09EAAFbHVrDaPo076.jpg


4、系統環境
CentOS 6.3 x86_64


5、軟件包地址
http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.6.7.tgz


二、MongoDB集羣部署
1、mongodb基礎安裝
略過(直接從官方下載二進制包解壓到“/usr/local路徑)

# mkdir -p /data/mongodb/data/repair
# mkdir -p /usr/local/mongodb/{etc,run}
# mkdir -p /data/mongodb/logs


2、前期準備工作
(1)、副本集名稱設置
# vim /usr/local/mongodb/etc/mongod.conf

wKioL1VBM9HwvBtwAAAikLJOlK4434.jpg


初期的配置:
dbpath = /data/mongodb/data
logpath = /data/mongodb/logs/mongod.log
repairpath = /data/mongodb/data/repair
pidfilepath = /usr/local/mongodb/run/mongod.pid

directoryperdb = true
logappend = true

noauth = true

bind_ip = 你的IP
port = 27017

quota = true
quotaFiles = 65535

maxConns = 20000
fork = true
nssize = 16

rest = true
httpinterface = true

journal = true
oplogSize = 2000

cpu = true

replSet = fenglingSet


(2)、啓動參數
對於NUMA架構的CPU,需要增加以下啓動參數:
# vim /usr/local/mongodb/etc/mongod
…..
numactl --interleave=all
…..


wKiom1VBMqOB_FD5AAFcdJBnwYI578.jpg


(3)、完整的啓動腳本
# vim /usr/local/mongodb/etc/mongod

#!/bin/bash## this script start and stop the mongodb daemon
## chkconfig:   - 85 15
# description: mongodb is a document key-value database
# processname: mongod
# config:     /usr/local/mongodb/etc/mongod.conf
# pidfile:     /usr/local/mongodb/run/mongod.pid
#
# code by rocketzhang
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

mongod="/usr/local/mongodb/bin/mongod"
prog=mongod

OPTIONS="--fork --config /usr/local/mongodb/etc/mongod.conf"
RETVAL=0

start() {
    echo -n $"Starting $prog......"
    numactl --interleave=all $mongod $OPTIONS
    
    RETVAL=$?
    echo 
    [ $RETVAL -eq 0 ]
    
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog......"
    /sbin/killproc -9 $prog
    
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ]
    
    return $RETVAL
}

case "$1" in
start)
    start 
    ;;
    
stop) 
    stop 
    ;;
    
restart) 
    stop 
    sleep 1 
    start 
    ;;

*) 
    echo $"Usage: $prog {start|stop|restart}" 
    exit 1
esac

# ln -s /usr/local/mongodb/etc/mongod /etc/init.d/mongod

# chmod +x /usr/local/mongodb/etc/mongod


(4)、服務啓動
# service mongod start

wKioL1VBNDGxS1pHAAB7P9_oRPc514.jpg

wKiom1VBMuCBQ3kzAABRX5hTttQ945.jpg

wKioL1VBNF2B1blJAABRswvkHYA490.jpg

注意:
3臺節點服務器皆做同樣設置。


3、副本集設置
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --port 27017
> use admin
> config={ _id:"fenglingSet", members:[{_id:0,host:"10.157.23.13:27017"},{_id:1,host:"10.193.23.11:27017"},{_id:2,host:"10.193.24.171:27017"}]}

wKioL1VBNIOCSl-MAACV_-65rnY692.jpg

> rs.initiate(config);

wKiom1VBMzLS3M7CAABTDn7YKn0322.jpg

> rs.status();

wKioL1VBNLSzTtRcAAGY4q4gP_4989.jpg


4、其他說明
(1)、集羣狀態信息查看
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --quiet --eval "printjson(rs.status())"


(2)、設置副本節點可讀
mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置副本節點可以讀。
# /usr/local/mongodb/bin/mongo --host 10.193.24.171 --port 27017
> db.getMongo().setSlaveOk();

wKiom1VBM3nB8EjSAAB4VullARA164.jpg

注意:
重啓服務後,需要重新設置。


(3)、節點角色
PRIMARY節點可讀可寫,SECONDARY節點僅可讀。


三、MongoDB授權設置
1、單機模式
(1)、賬號添加
# /usr/local/mongodb/bin/mongo --host XXX.XXX.XXX.XXX --port 27017
> use admin
> db.addUser("huodong", "tenmongo$2356")
> db.system.users.find()


(2)、配置修改並重啓服務
# vim /usr/local/mongodb/etc/mongod.conf
……
auth = ture
…..

# service mongod restart


(3)、連接測試
# /usr/local/mongodb/bin/mongo XXX.XXX.XXX.XXX:27017/admin -uhuodong -p'tenmongo$2356'


2、集羣模式(本次採用)
(1)、keyfile文件創建
# cd /usr/local/mongodb/etc
# openssl rand -base64 513 > keyfile
# chmod 600 keyfile

注意:
需要將keyfile也同步到其他節點服務器上。


(2)、賬號添加
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --port 27017
> use admin
> db.addUser("huodong", "tenmongo$2356")

wKioL1VBNQXD-okeAADXREfiubs628.jpg

> db.system.users.find()

wKiom1VBM7azmBEDAABPWvK0ncg323.jpg


(3)、配置修改並重啓服務
# vim /usr/local/mongodb/etc/mongod.conf

wKioL1VBNT7hEUP7AABeFluefGg027.jpg

# service mongod restart


最終的配置:
dbpath = /data/mongodb/data
logpath = /data/mongodb/logs/mongod.log
repairpath = /data/mongodb/data/repair
pidfilepath = /usr/local/mongodb/run/mongod.pid

directoryperdb = true
logappend = true

auth = true
clusterAuthMode = keyFile
keyFile = /usr/local/mongodb/etc/keyfile

bind_ip = 10.157.23.13
port = 27017

quota = true
quotaFiles = 16

maxConns = 20000
fork = true
nssize = 16

rest = true
httpinterface = true

journal = true
oplogSize = 2000

cpu = true

replSet = fenglingSet

注意:
需要在其他節點服務器上,也做同樣設置。


(4)、簡單測試
# /usr/local/mongodb/bin/mongo 10.157.23.13:27017/admin -uhuodong -p'tenmongo$2356'

wKiom1VBM_vBxtl7AADN4W12SjY021.jpg

# /usr/local/mongodb/bin/mongo --host 10.157.23.13 -uhuodong -p'tenmongo$2356' admin --quiet --eval "printjson(rs.status())"

wKioL1VBNZjwxg7RAAEAW3HDbes047.jpg


四、PRIMARY節點自動Failover(業務側)
1、業務側服務器分佈

wKiom1VBNG-D87_iAADdLeSrz7k020.jpg


2、賬號添加(mongodb集羣上進行)
# /usr/local/mongodb/bin/mongo 10.157.23.13:27017/admin -uhuodong -p'tenmongo$2356'
> use admin
> db.addUser("check_health", "tenmongo$2356")


3、Failover監控設置
(1)、HAPROXY配置(對應的VIP:10.153.224.44
# vim /usr/local/haproxy/etc/haproxy.conf
……
listen FENGLING_MONGO_SERVER
         bind 0.0.0.0:27017
         mode tcp
         balance roundrobin
         option tcpka
         server MONGO_SERVER1 10.157.23.13:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1
         server MONGO_SERVER2 10.193.23.11:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1
         server MONGO_SERVER3 10.193.24.171:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1

……

# service haproxy reload


(2)、監控腳本
# vim /data/scripts/check_mongo_primary.sh

#!/bin/sh
#======================================================================
## MongoDB副本集PRIMARY角色異常監控告警
##
## code by rocketzhang
#======================================================================
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

MONGO_BIN_PATH="/usr/local/mongodb/bin/mongo"

MONITOR="/usr/local/oms/agent/alarm/BusMonitorAgent"
TOKEN="fengling_mongodb"
TITLE="MongoDB副本集PRIMARY角色異常監控"

SRV_IPADDR="10.153.224.44"
SRV_PORT="27017"

## S代表TCP協議,U代表UDP協議
PROT_OPT="S"
SCAN_FLAG=0

HOSTS_FILE="/etc/hosts"

for ((i=0; i<3; i++)); do 
    RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${SRV_IPADDR} | grep open` 
    [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10
done

if [[ ${SCAN_FLAG} -eq 0 ]]; then 
    CONTENT="MongoDB集羣存在異常,27017端口不可達!" 
    ${MONITOR} -c 2 -f ${TOKEN} -t "${TITLE}" -i "${CONTENT}"
fi

CURRENT_MONGO_MASTER=`awk '/fl.mongo.qq.com/{print $1}' /etc/hosts`
NEW_MONGO_MASTER=`${MONGO_BIN_PATH} --host ${SRV_IPADDR} -ucheck_health -p'tenmongo$2356' admin --quiet --eval "printjson(rs.status())" | grep -B 3 PRIMARY | awk -F ':' '/name/{print $2}' | sed 's/ "//'`

if [[ "${NEW_MONGO_MASTER}" != "${CURRENT_MONGO_MASTER}" ]]; then 
    sed -i '/fl.mongo.qq.com/d' ${HOSTS_FILE} 
    echo "${NEW_MONGO_MASTER}    fl.mongo.qq.com" >> ${HOSTS_FILE} 
    /sbin/service nscd restart >/dev/null 2>&1  
    
    CONTENT="MongoDB副本集PRIMARY角色已自動切換,請儘快確認!" 
    ${MONITOR} -c 2 -f ${TOKEN} -t "${TITLE}" -i "${CONTENT}"
fi


(3)、crontab信息添加
# touch /var/run/check_primary.lock
# echo ' touch /var/run/check_primary.lock' >> /etc/rc.d/rc.local

# crontab -uroot -e
* * * * * (flock --timeout=0 /var/run/check_primary.lock /data/scripts/check_mongo_primary.sh >/dev/null 2>&1)


注意:
業務側通過fl.mongo.qq.com域名進行mongodb集羣訪問,當mongodb集羣的primary節點發生故障時,會自動選舉剩下的其中的一個節點爲primary角色,然後業務側的監控腳本會自動發現最新的primary節點,並刷新本地的hosts配置。整個切換過程對業務側保持透明,當然當數據與訪問量到了一定規模時,我們也不推薦採用此架構模式,此時可以考慮自動路由分片的架構模式。


附錄

1、參考資料
http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
 
http://www.lanceyan.com/tech/mongodb_repset2.html 
http://www.lanceyan.com/tech/arch/mongodb_shard1.html


2、數據遷移
(1)、工具一
http://duoyun.org/topic/5173d275cbce24580a033bd8
 
http://pan.baidu.com/s/15YsBs  提取密碼:levr


(2)、工具二
https://github.com/10gen-labs/mongo-connector


本次的遷移命令:
/usr/local/mongodb/bin/mongosync -h 10.217.121.216:27020 --to 10.157.23.13:27017 --tu huodong --tp 'tenmongo$2356' –oplog


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章