1. 程式人生 > >CentOS7.4搭建基於用戶認證的MongoDB4.0三節點副本集集群

CentOS7.4搭建基於用戶認證的MongoDB4.0三節點副本集集群

_id 很多 selinux 主從 就是 什麽 its 檢測 clust

mongoDB官方已經不建議使用主從模式了,替代方案是采用副本集的模式,點擊 ,如圖:

技術分享圖片

那什麽是副本集呢?打魔獸世界總說打副本,其實這兩個概念差不多一個意思。遊戲裏的副本是指玩家集中在高峰時間去一個場景打怪,會出現玩家暴多怪物少的情況,遊戲開發商為了保證玩家的體驗度,就為每一批玩家單獨開放一個同樣的空間同樣的數量的怪物,這一個復制的場景就是一個副本,不管有多少個玩家各自在各自的副本裏玩不會互相影響。 mongoDB的副本也是這個,主從模式其實就是一個單副本的應用,沒有很好的擴展性和容錯性。而副本集具有多個副本保證了容錯性,就算一個副本掛掉了還有很多副本存在,並且解決了上面第一個問題“主節點掛掉了,整個集群內會自動切換”。難怪mongoDB官方推薦使用這種模式。

我們來看看mongoDB副本集的架構圖:

技術分享圖片

由圖可以看到客戶端連接到整個副本集,不關心具體哪一臺機器是否掛掉。主服務器負責整個副本集的讀寫,副本集定期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不需要關心。我們看一下主服務器掛掉後的架構:

技術分享圖片

副本集中的副本節點在主節點掛掉後通過心跳機制檢測到後,就會在集群內發起主節點的選舉機制,自動選舉一位新的主服務器。看起來很牛X的樣子,我們趕緊操作部署一下!
官方推薦的副本集機器數量為至少3個,那我們也按照這個數量配置測試。

Mongodb副本集環境部署記錄

系統環境
Centos7.5、MongoDB4.0.6、關閉防火墻、如果在一臺機器上測試,則集群采用不同通訊端口

1) 機器環境
10.153.1.183 master-node(主節點)
10.153.1.184 slave-node1(從節點)
10.153.1.185 slave-node2(從節點)

2) 安裝master-node

#!/bin/bash
#######################
#mongodb簡介
#mongodb是個非關系型數據庫,但操作跟關系型數據最類似。mysql是關系型數據庫
#mongodb是面向文檔存儲的非關系型數據庫,數據以json的格式進行存儲
#mongodb可用來永久存儲,也可用來緩存數據
#mongodb提供副本集和分片集群功能,操作簡單
#############################
if [ `whoami` != root ]
then
echo "Please login as root to continue :)"
exit 1
fi

if [ ! -d /home/tools/ ];then
mkdir -p /home/tools
else
rm -rf /home/tools && mkdir -p /home/tools
fi

#Prohibit memory giant pages
echo ‘never‘ >/sys/kernel/mm/transparent_hugepage/enabled
echo ‘never‘ >/sys/kernel/mm/transparent_hugepage/defrag

#Add commands to /etc/rc.local
chmod +x /etc/rc.d/rc.local
echo "echo ‘never‘ >/sys/kernel/mm/transparent_hugepage/enabled" >>/etc/rc.local
echo "echo ‘never‘ >/sys/kernel/mm/transparent_hugepage/defrag" >>/etc/rc.local

#Disable firewall and selinux
sed -i ‘/SELINUX/s/enforcing/disabled/‘ /etc/selinux/config 
systemctl disable firewalld.service

#Setting Handles Number and Process
cat >> /etc/security/limits.conf << EOF
*          soft   nofile    204800
*          hard   nofile    204800
*          soft   nproc     204800
*          hard   nproc     204800
EOF

sed -i ‘s/4096/204800/g‘ /etc/security/limits.d/20-nproc.conf

#download mongodb on centos 7
cd /home/tools && wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.6.tgz

#install mongodb 
tar zxvf mongodb-linux-x86_64-rhel70-4.0.6.tgz
mv mongodb-linux-x86_64-rhel70-4.0.6 /usr/local/mongodb-linux-x86_64-rhel70-4.0.6
ln -s /usr/local/mongodb-linux-x86_64-rhel70-4.0.6 /usr/local/mongodb

#Create data directory
mkdir -p /data/mongodb/27017/

cat > /data/mongodb/27017/mongodb.conf <<EOF
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/27017/mongodb.log
storage:
  dbPath: /data/mongodb/27017/
  journal:
    enabled: true
processManagement:
  fork: true
net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 40000
replication:
  replSetName: oriente
  oplogSizeMB: 1024
security:
  authorization: enabled
  keyFile: /home/mongodb/keyfile
EOF

#Add mongodb users and setting permission
groupadd -g 800 mongodb && useradd -u 800 -g mongodb mongodb 
chown -R mongodb.mongodb /data/mongodb/ /usr/local/mongodb/

#Create keyfile
cat >/home/mongodb/keyfile <<EOF
raQvX0ESjiZD/LaB4QmGpm/EJUfhea/r9CcGMHA/c46fNezLrIHLpSFlVb3BD7mt
sZY4w4qNuV7mL/6qxVEktSyRu1yvdZG49ImJBH8ssUeCLBBHtfAaayH5
EOF

chmod 600 /home/mongodb/keyfile && chown -R mongodb.mongodb /home/mongodb/keyfile

#Add autoStart script
cat >/etc/init.d/mongodb <<EOF
#!/bin/bash
# Description:mongodb ORS SERVER
# chkconfig: - 85 15
# Written by jerry
MONGODB_EXEC="/usr/local/mongodb/bin/mongod"
MONGODB_DATA="/data/mongodb/27017/"
MONGODB_CONF="/data/mongodb/27017/mongodb.conf"
PORT=\$(netstat -tunlp|grep 27017|awk ‘{print \$4}‘|cut -d ‘:‘ -f2)
MONGODB_USER=mongodb
case \$1 in
        start)
        echo -n "Starting mongodb..."
        if [[ \$PORT = 27017 ]];then
        echo "mongodb is alreday running!"
        else
        /bin/su - \$MONGODB_USER -s /bin/bash -c "\$MONGODB_EXEC -f \$MONGODB_CONF"
        fi
        echo " done"
        ;;
        stop)
        echo -n "Stoping mongodb..."
        /bin/su - \$MONGODB_USER -s /bin/bash -c "\$MONGODB_EXEC --shutdown  --dbpath \$MONGODB_DATA"
        echo " done"
        ;;
        restart)
        \$0 stop
        \$0 start
        ;;
        status)
        if [[ \$PORT != 27017 ]];then
             echo "mongodb is not running!"
        else
             echo "mongodb is running!"
        fi
        ;;
        *)
        echo "Usage: \$0"
        exit 1
esac
EOF

#Setting environment variables
cat >/etc/profile.d/mongodb.sh<<EOF
export MONGODB_HOME=/usr/local/mongodb
export PATH=\$PATH:\$MONGODB_HOME/bin
EOF

source /etc/profile.d/mongodb.sh

#Add permission to /etc/init.d/mongodb
chmod +x /etc/init.d/mongodb

#Add to chkconfig service
chkconfig --add mongodb

#Setting up MongoDB auto-start
chkconfig mongodb on

#Start MongoDB
service mongodb start

3) 安裝slave-node1

安裝步驟同上

4) 安裝slave-node2

安裝步驟同上

5) 登錄master-node
mongo

6) mongodb副本集的初始化及其狀態查看(已設置權重比)

config = { _id:"oriente", members:[
  {_id:0,host:"10.153.1.183:27017",priority : 10},
  {_id:1,host:"10.153.1.184:27017",priority : 5},
  {_id:2,host:"10.153.1.185:27017",priority : 5}]
}

截圖如下

技術分享圖片

use admin
副本集初始化,需要一定時間
rs.initiate( config )

副本集狀態,一個primary,其它SECONDARY
rs.status()

創建admin用戶並且設置密碼

db.createUser({user:"admin",pwd:"oriente1234.com",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

添加管理員可以操作復制集的權限(在primary節點上面)

use admin
db.auth("admin","oriente1234.com")
db.grantRolesToUser( "admin" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },
{ "role": "userAdminAnyDatabase", "db": "admin" },
{ "role": "dbAdminAnyDatabase", "db": "admin" }])

7) 任意一臺從庫上查詢,這裏是node-slave1(10.153.1.184)
mongo admin -uadmin -poriente1234.com

rs.status()

CentOS7.4搭建基於用戶認證的MongoDB4.0三節點副本集集群