您好,登錄后才能下訂單哦!
mongoDB官方已經不建議使用主從模式了,替代方案是采用副本集的模式,點擊 ,如圖:
那什么是副本集呢?打魔獸世界總說打副本,其實這兩個概念差不多一個意思。游戲里的副本是指玩家集中在高峰時間去一個場景打怪,會出現玩家暴多怪物少的情況,游戲開發商為了保證玩家的體驗度,就為每一批玩家單獨開放一個同樣的空間同樣的數量的怪物,這一個復制的場景就是一個副本,不管有多少個玩家各自在各自的副本里玩不會互相影響。 mongoDB的副本也是這個,主從模式其實就是一個單副本的應用,沒有很好的擴展性和容錯性。而副本集具有多個副本保證了容錯性,就算一個副本掛掉了還有很多副本存在,并且解決了上面第一個問題“主節點掛掉了,整個集群內會自動切換”。難怪mongoDB官方推薦使用這種模式。
我們來看看mongoDB副本集的架構圖:
由圖可以看到客戶端連接到整個副本集,不關心具體哪一臺機器是否掛掉。主服務器負責整個副本集的讀寫,副本集定期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對于應用服務器不需要關心。我們看一下主服務器掛掉后的架構:
副本集中的副本節點在主節點掛掉后通過心跳機制檢測到后,就會在集群內發起主節點的選舉機制,自動選舉一位新的主服務器。看起來很牛X的樣子,我們趕緊操作部署一下!
官方推薦的副本集機器數量為至少3個,那我們也按照這個數量配置測試。
系統環境
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:"root",pwd:"oriente1234.com",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
添加管理員可以操作復制集的權限(在primary節點上面)
use admin
db.auth("root","oriente1234.com")
db.grantRolesToUser( "root" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },
{ "role": "userAdminAnyDatabase", "db": "admin" },
{ "role": "dbAdminAnyDatabase", "db": "admin" },
{ role: "root", db: "admin" }])
7) 任意一臺從庫上查詢,這里是node-slave1(10.153.1.184)mongo admin -uroot -poriente1234.com
rs.status()
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。