CentOS7.4搭建基於用戶認證的MongoDB4.0三節點副本集集群
那什麽是副本集呢?打魔獸世界總說打副本,其實這兩個概念差不多一個意思。遊戲裏的副本是指玩家集中在高峰時間去一個場景打怪,會出現玩家暴多怪物少的情況,遊戲開發商為了保證玩家的體驗度,就為每一批玩家單獨開放一個同樣的空間同樣的數量的怪物,這一個復制的場景就是一個副本,不管有多少個玩家各自在各自的副本裏玩不會互相影響。 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-nodemongo
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,其它SECONDARYrs.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三節點副本集集群