阿里云Mongodb副本集使用和自己搭建Mongodb副本集

阿里云MongoDB的使用

  • 阿里云直接由MongoDB的服務可以購買,買完過后可以直接使用的副本集。買服務的好處就是不用自己去搭建了。
  • mongodb&java&netty&rpc高性能學習交流群:876280300
  • 高性能Mongodb的ORM框架zfoo開源地址
mongodb-aliyun.jpg

一、副本集的搭建

1.MongoDB環(huán)境準備

  • 三臺虛擬機的靜態(tài)ip分別設置為
192.168.1.30 mongodb0
192.168.1.31 mongodb1
192.168.1.32 mongodb2
  • 設置好ip后還需要把ip與主機名對應起來
hostname        # 查看主機名使用命令


vim /etc/sysconfig/network,修改主機名,在最后一行加上HOSTNAME=mongodb0,不同主機的對于關系如下
192.168.1.30 -> HOSTNAME=mongodb0
192.168.1.31 -> HOSTNAME=mongodb1
192.168.1.32 -> HOSTNAME=mongodb2

vim /etc/hosts,修改為我們設置的主機名,不同的主機對應不同的mongodb
127.0.0.1   localhost mongodb0 localhost4 localhost4.localdomain4
::1         localhost mongodb0 localhost6 localhost6.localdomain6
192.168.1.30 mongodb0
192.168.1.31 mongodb1
192.168.1.32 mongodb2

  • 重啟服務器后生效,使用hostname命令驗證主機名,使用ping命令驗證三個虛擬機之間相互可以使用主機名ping通。
  • 開啟防火墻端口。

2.創(chuàng)建目錄和修改配置文件

  • mongodb0,mongodb1,mongodb2使用命令
mkdir -p /data/mongodb/db   # 存放數據的目錄
mkdir -p /data/mongodb/logs # 存放日記的目錄
mkdir -p /data/mongodb/key  # 存放密鑰的目錄
  • vim /usr/local/mongodb/mongodb.config,修改配置文件如下
dbpath=/data/mongodb/db

logpath=/data/mongodb/logs/mongodb.log
logappend=true

port=22400
fork=true

#keyFile默認會開啟auth=true
#auth=true
#keyFile=/data/mongodb/key/myKey.txt
replSet=myReplicaSet

#生產環(huán)境需要設置ip:bind_ip=127.0.0.1,本機ip
bind_ip=0.0.0.0

3.初始化副本集

  • 清空一下目錄的歷史數據,因為可能以前是用的單機節(jié)點,集群部署會有不可預知問題,所以先清空數據
/data/mongodb/db
/data/mongodb/logs
  • 分別啟動mongodb0,mongodb1,mongodb2
systemctl restart mongodb
  • 創(chuàng)建副本集
mongo --port 22400      # 進入mongodb0
config = {_id: "myReplicaSet", members: [{_id: 0, host:"mongodb0:22400"}, {_id: 1, host:"mongodb1:22400"}, {_id: 2, host:"mongodb2:22400", arbiterOnly : true}]}
rs.initiate(config)     # 初始化副本集
  • 觀察副本集
rs.conf()       # 副本集配置
rs.status()     # 副本集狀態(tài)

4.副本集初始化后,需要給整個副本集創(chuàng)建帳戶、密碼

  • 創(chuàng)建Key,mongodb0,mongodb1,mongodb2使用命令
echo "replicaSet key" > /data/mongodb/key/myKey.txt
chmod 600 /data/mongodb/key/myKey.txt
  • 在主節(jié)點上,用客戶端連接,創(chuàng)建用戶權限(主節(jié)點,可以用 rs.status() 查看),創(chuàng)建用戶請看mongodb-setup.md

  • 關閉副本集,分別關閉mongodb0,mongodb1,mongodb2

systemctl stop mongodb
  • vim /usr/local/mongodb/mongodb.config,修改配置文件如下
dbpath=/data/mongodb/db

logpath=/data/mongodb/logs/mongodb.log
logappend=true

port=22400
fork=true

#keyFile默認會開啟auth=true
auth=true
keyFile=/data/mongodb/key/myKey.txt
replSet=myReplicaSet

#生產環(huán)境需要設置ip:bind_ip=127.0.0.1,本機ip
bind_ip=0.0.0.0
  • 重新啟動副本集,分別啟動mongodb0,mongodb1,mongodb2
systemctl restart mongodb

5.數據同步測試

  • 首先向PRIMARY(主節(jié)點)寫入一條數據
use test
db.say.insert({"text":"Hello World"})
db.say.find()
  • 進入SECONDARY(副節(jié)點)查看數據是否同步
默認情況下SECONDARY節(jié)點不能讀寫,要設定slaveOk為true才可以從SECONDARY節(jié)點讀取數據。
replSet里只能有一個Primary節(jié)點,只能在Primary寫數據,不能在SECONDARY寫數據。
首先需要在SECONDARY節(jié)點設置slaveOk為true

db.getMongo().setSlaveOk();
use test;
db.say.find();

6.故障切換測試

  • 把主節(jié)點關點,看看副集點是否能接替主節(jié)點進行工作

二、原理解析

1.副本集實現了數據庫的數據同步,故障轉移,讀寫分離

副本集最少應該包含三個節(jié)點,其中有一個必須是主節(jié)點。

數據同步:從節(jié)點會從主節(jié)點同步oplog到自己的節(jié)點,oplog有自己的大小,可以通過--oplogSize來設置。主從之間的讀寫對程序員是透明的。
故障轉移(容災):主從節(jié)點兩秒鐘就會有一個心跳,如果發(fā)現主節(jié)點掛了就從新選取主節(jié)點,選取規(guī)則是從節(jié)點中數據最新的,權重最高的節(jié)點。 如果從節(jié)點掛了就直接選取從節(jié)點,再將主節(jié)點的數據同步給從節(jié)點。
讀寫分離:可以設置是優(yōu)先從主節(jié)點讀數據,還是優(yōu)先從從節(jié)點讀數據。 注:在單個節(jié)點中,數據先被寫到內存,操作被保存在內存的視圖中,內存視圖沒100ms寫到硬盤的journal日志中,mongodb每60s將內存中的數據同步到硬盤。

三、副本集的管理

1.診斷

  • 查看主數據庫的復制的狀態(tài)
db.printReplicationInfo()

configured oplog size:   990MB
log length start to end: 174676secs (48.52hrs)
oplog first event time:  Wed May 01 2019 13:29:38 GMT+0800
oplog last event time:   Fri May 03 2019 14:00:54 GMT+0800
now:                     Fri May 03 2019 14:00:56 GMT+0800

輸出信息oplog大小990MB
log length start to end = oplog last event time - oplog first event time
因為oplog是固定大小,有一個循環(huán),所以必須等oplog循環(huán)幾圈,oplog才和實際相符合。

如果oplog太小,寫入的數據太快,oplog中的日志可能會被頂掉,從節(jié)點想要同步時候發(fā)現找不到切入的oplog,已經跟不上主節(jié)點了,就會停止同步。
如果log length start to end和下面的從節(jié)點behind the primary非常的接近,說明oplog可能太小了 
  • 查看從數據庫的復制的狀態(tài)
db.printSlaveReplicationInfo()

source: mongodb-config1:22400
    syncedTo: Fri May 03 2019 13:56:31 GMT+0800
    0 secs (0 hrs) behind the primary 
source: mongodb-config2:22400
    syncedTo: Fri May 03 2019 13:56:31 GMT+0800
    0 secs (0 hrs) behind the primary 

2.副本集回滾丟失的數據

主節(jié)點故障后重新加入副本集時會回滾恢復寫操作。
只有在主節(jié)點接受了寫請求并且從節(jié)點沒有復制前主節(jié)點就故障的時候才需要回滾。
當主節(jié)點作為從節(jié)點重新加入副本集,他恢復或回滾他的寫操作來與其他成員保持數據庫一致性。

當回滾確實發(fā)生了,MongoDB把回滾數據寫入數據庫的dbPath的rollback文件夾下的BSON文件中,可以用bsondump讀取回滾文件的內容。
回滾文件名如下形式:
<database>.<collection>.<timestamp>.bson
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容