一、mongodb主從復制配置
主從復制是mongodb最常用的復制方式,也是一個簡單的數(shù)據(jù)庫同步備份的集群技術,這種方式很靈活.可用于備份,故障恢復,讀擴展等.
最基本的設置方式就是建立一個主節(jié)點和一個或多個從節(jié)點,每個從節(jié)點要知道主節(jié)點的地址.
結構圖:
配置主從復制的注意點:
- 在數(shù)據(jù)庫集群中要明確的知道誰是主服務器,主服務器只有一臺.
- 從服務器要知道自己的數(shù)據(jù)源也就是對應的主服務是誰.
- –master用來確定主服務器,–slave 和 –source 來控制從服務器
這里在本機上用一主一從實現(xiàn)mongodb的復制:
master.conf:
dbpath = /home/wang/mongodbDATA/master #主數(shù)據(jù)庫地址
port = 8888 #主數(shù)據(jù)庫端口號
bind_ip = 127.0.0.1 #主數(shù)據(jù)庫所在服務器
master = true #確定我是主服務器
slave.conf:
dbpath = /home/wang/mongodbDATA/slave #從數(shù)據(jù)庫地址
port = 7777 #從數(shù)據(jù)庫端口號
bind_ip = 127.0.0.1 #從數(shù)據(jù)庫所在服務器
source = 127.0.0.1:8888 #確定主數(shù)據(jù)庫端口
slave = true #確定自己是從服務器
分別啟動兩臺服務器:
mongod --config master.conf
mongod --config slave.conf
啟動兩個shell客戶端:
mongo 127.0.0.1:8888
mongo 127.0.0.1:7777
我們給主服務器添加數(shù)據(jù):
>use master_slave
> function add(){
... var i = 0;
... for(;i<50;i++){
... db.persons.insert({"name":"wang"+i})
... }
... }
> add()
>db.persons.find()
.....一批數(shù)據(jù)
如上的操作比較簡單,此處不在多說?,F(xiàn)在主服務器添加了50條數(shù)據(jù)后,我們打開從服務器,會驚奇的發(fā)現(xiàn),從服務器中也存在如上的50條數(shù)據(jù)。
此時,我們得到一個結論:
當配置完主從服務器后,一但主服務器上的數(shù)據(jù)發(fā)生變化,從服務器也會發(fā)生變化
主從復制的原理–oplog
在主從結構中,主節(jié)點的操作記錄成為oplog(operation log)。oplog存儲在一個系統(tǒng)數(shù)據(jù)庫local的集合oplog.$main中,這個集合的每個文檔都代表主節(jié)點上執(zhí)行的一個操作。
從服務器會定期從主服務器中獲取oplog記錄,然后在本機上執(zhí)行!對于存儲oplog的集合,MongoDB采用的是固定集合,也就是說隨著操作過多,新的操作會覆蓋舊的操作!
主從復制的其他設置項
–only 從節(jié)點指定復制某個數(shù)據(jù)庫,默認是復制全部數(shù)據(jù)庫
–slavedelay 從節(jié)點設置主數(shù)據(jù)庫同步數(shù)據(jù)的延遲(單位是秒)
–fastsync 從節(jié)點以主數(shù)據(jù)庫的節(jié)點快照為節(jié)點啟動從數(shù)據(jù)庫
–autoresync 從節(jié)點如果不同步則從新同步數(shù)據(jù)庫(即選擇當通過熱添加了一臺從服務器之后,從服務器選擇是否更新主服務器之間的數(shù)據(jù))
–oplogSize 主節(jié)點設置oplog的大小(主節(jié)點操作記錄存儲到local的oplog中)
利用shell動態(tài)的添加或刪除從節(jié)點:
我們在我們上面的從節(jié)點的local數(shù)據(jù)庫中,存在一個集合sources。這個集合就保存了我這個服務器的主服務器是誰。
不難看出從服務器中關于主服務器的信息全部存到local的sources的集合中
我們只要對集合進行操作就可以動態(tài)操作主從關系
掛接主服務器:操作之前只留下從數(shù)據(jù)庫服務
db.sources.insert({“host”:”127.0.0.1:8888”})
刪除已經掛接的主節(jié)點:操作之前只留下從數(shù)據(jù)庫服務
db.sources.remove({“host”:”127.0.0.1:8888”})
二,MongoDB的副本集:
1.副本集的概念:
副本集有點類似主從復制,不過跟真正的主從復制還是有兩點區(qū)別的。
結構圖:
- 第一張圖表明A是活躍的B和C是用于備份的
- 第二張圖當A出現(xiàn)了故障,這時候集群根據(jù)權重算法推選出B為活躍的數(shù)據(jù)庫
- 第三張圖當A恢復后他自動又會變?yōu)閭浞輸?shù)據(jù)庫
如上三臺機器的conf配置文件為:
A.conf
dbpath = /home/wang/mongodbDATA/A
port = 1111 #端口
bind_ip = 127.0.0.1 #服務地址
replSet = child/127.0.0.1:2222 #設定同伴 child為集群名稱
B.conf
dbpath = /home/wang/mongodbDATA/B
port = 2222
bind_ip = 127.0.0.1
replSet = child/127.0.0.1:3333
C.conf
dbpath = /home/wang/mongodbDATA/C
port = 3333
bind_ip = 127.0.0.1
replSet = child/127.0.0.1:1111
如上可以看出,ABC三臺服務器之間形成一個閉環(huán)。
啟動如上三臺服務器。
2,初始化副本集
我們隨意鏈接上面三個服務的一個shell客戶端。
執(zhí)行如下命令:
config = {_id: 'child', members: [{
"_id":1,
"host":"127.0.0.1:1111"
},{
"_id":2,
"host":"127.0.0.1:2222"
},{
"_id":3,
"host":"127.0.0.1:3333"
}]
}
rs.initiate(config);
在以前的2.0系統(tǒng)中是這樣執(zhí)行的:
use admin #必須進admin
db.runCommand({"replSetInitiate":
{
"_id":'child',
"members":[{
"_id":1,
"host":"127.0.0.1:1111"
},{
"_id":2,
"host":"127.0.0.1:2222"
},{
"_id":3,
"host":"127.0.0.1:3333"
}]
}
})
此時你會發(fā)現(xiàn)你當前的shell客戶端的前綴變了。
我們分別鏈接其余的兩個客戶端:現(xiàn)在我們觀察到三個Shell客戶端的前綴:
child:PRIMARY>
child:SECONDARY>
child:SECONDARY>
其中child:PRIMARY>表示活躍節(jié)點。其余為備份節(jié)點。注意:只有活躍節(jié)點才能進行查詢數(shù)據(jù)庫的信息操作,備份節(jié)點不能進行會報錯
在活躍的主機上可以進行 rs.status() 來查看所有狀態(tài):
4.搭建完畢,來進行驗證
主從服務器數(shù)據(jù)是否同步,從服務器沒有讀寫權限
- a:向主服務器寫入數(shù)據(jù) ok 后臺自動同步到從服務器,從服務器有數(shù)據(jù)
- b:向從服務器寫入數(shù)據(jù) false 從服務器不能寫
- c:主服務器讀取數(shù)據(jù) ok
- d:從服務器讀取數(shù)據(jù) false 從服務器不能讀
關閉主服務器,從服務器是否能頂替
此時你關掉活躍節(jié)點的服務。此時你會發(fā)現(xiàn)剩余的兩臺機器有一臺變?yōu)榛钴S節(jié)點了。
5.配置副本集的其他配置參數(shù):
節(jié)點和初始化高級參數(shù)
- standard 常規(guī)節(jié)點:參與投票有可能成為活躍節(jié)點
- passive 副本節(jié)點:參與投票,但是不能成為活躍節(jié)點
- arbiter 仲裁節(jié)點:只是參與投票不復制節(jié)點也不能成為活躍節(jié)點
高級參數(shù)
- Priority 0到1000之間 ,0代表是副本節(jié)點 ,1到1000是常規(guī)節(jié)點
- arbiterOnly : true 仲裁節(jié)點
用法
members":[{
"_id":1,
"host":"127.0.0.1:1111“,
arbiterOnly : true
}]”
優(yōu)先級相同時候仲裁組建的規(guī)則
三,分片
分片技術,跟關系數(shù)據(jù)庫的表分區(qū)類似,我們知道當數(shù)據(jù)量達到T級別的時候,我們的磁盤,內存就吃不消了,或者單個的mongoDB服務器已經不能滿足大量的插入操作,針對這樣的場景我們該如何應對。mongoDB提供的分片技術來應對這種瓶頸。
當然分片除了解決空間不足的問題之外,還極大的提升的查詢速度。
1.分片的概念
mongodb采用將集合進行拆分,然后將拆分的數(shù)據(jù)均攤到幾個片上的一種解決方案。
結構圖:
用戶:代表客戶端,客戶端肯定說,你數(shù)據(jù)庫分片不分片跟我沒關系,我叫你干啥就干啥,沒什么好商量的。
路由: mongos.首先我們要了解”片鍵“的概念,也就是說拆分集合的依據(jù)是什么?按照什么鍵值進行拆分集合….好了,mongos就是一個路由服務器,它會根據(jù)管理員設置的“片鍵”將數(shù)據(jù)分攤到自己管理的mongod集群,數(shù)據(jù)和片的對應關系以及相應的配置信息保存在”config服務器”上。
配置服務器:mongod普通的數(shù)據(jù)庫,一般是一組而圖中我們只畫了一個,由路由管理。它的作用是記錄對數(shù)據(jù)分片的規(guī)則,存儲所有數(shù)據(jù)庫元信息(路由、分片)的配置
片區(qū):具體的存儲信息,根據(jù)路由配置的片鍵不同
2.片鍵的概念和用處
看下面這個普通的集合和分片后的結果。
3.分片步驟
- 創(chuàng)建一個配置服務器
- 創(chuàng)建路由服務器,并且連接配置服務器
- 由器是調用mongos命令
- 添加2個分片數(shù)據(jù)庫 端口為8081和8082
- 利用路由為集群添加分片(允許本地訪問)
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true})
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true})
切記之前不能使用任何數(shù)據(jù)庫語句
- 打開數(shù)據(jù)分片功能,為數(shù)據(jù)庫foobar打開分片功能
db.runCommand({"enablesharding":"foobar"})
db.runCommand({"shardcollection":"foobar.bar","key":{"_id":1}})
4.搭建分片:
分片數(shù)據(jù)庫_01.conf:
dbpath = ~/mongodata/01
port = 8081
bind_ip = 127.0.0.1
分片數(shù)據(jù)庫_02.conf:
dbpath = ~/mongodata/02
port = 8082
bind_ip = 127.0.0.1
配置服務器.conf:
dbpath = ~/mongodata/00
port = 2000
bind_ip = 127.0.0.1
路由
mongos --port 1000 --configdb 127.0.0.1:2000
啟動上面所有的服務。
mongo 127.0.0.1:1000 (此時就通過路由鏈接到了配置服務器)
登錄進路由之后為集群添加分片:
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true})
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true})
切記之前不能使用任何數(shù)據(jù)庫語句
打開數(shù)據(jù)分片功能,為數(shù)據(jù)庫foobar打開分片功能
db.runCommand({"enablesharding":"foobar"})
對集合進行分片
db.runCommand({"shardcollection":"foobar.bar","key":{"_id":1}})
5.利用大數(shù)據(jù)量進行測試
function add(){
var i = 0;
for(;i<200000;i++){
db.bar.insert({"age":i+10,"name":"jim"})
}
}
function add2(){
var i = 0;
for(;i<200000;i++){
db.bar.insert({"age":12,"name":"tom"+i})
}
}
function add3(){
var i = 0;
for(;i<200000;i++){
db.bar.insert({"age":12,"name":"lili"+i})
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
(給foobar插入800000條數(shù)據(jù),然后會發(fā)現(xiàn)這800000條數(shù)據(jù)分批存放在分片上。)
查看配置庫對于分片服務器的配置存儲
db.printShardingStatus()
查看集群對bar的自動分片機制配置信息
mongos> db.shards.find()
{ "_id" : "shard0000", "host" : "127.0.0.1:8081" }
{ "_id" : "shard0001", "host" : "127.0.0.1:8082" }
如上就是MongoDB中常見的集群搭建。對于分片是最常用的,實際中的分片不可以像我們配置的這么簡單,為了保險期間,實際中分片之間配置為副本集,配置服務器也不會是單單一臺也常見的是一個副本集的集群。只有這樣,才能讓系統(tǒng)更加健壯。
|