阿里云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