小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MongoDB 3.0 常見集群的搭建(主從復制,副本集,分片....)

 邵飛翔 2017-10-24

一、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 #確定我是主服務器
  • 1
  • 2
  • 3
  • 4

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 #確定自己是從服務器
  • 1
  • 2
  • 3
  • 4
  • 5

分別啟動兩臺服務器:

mongod --config master.conf

mongod --config slave.conf
  • 1
  • 2
  • 3

啟動兩個shell客戶端:

mongo 127.0.0.1:8888
mongo 127.0.0.1:7777
  • 1
  • 2

我們給主服務器添加數(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ù)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

如上的操作比較簡單,此處不在多說?,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ū)別的。

  • 該集群沒有特定的主數(shù)據(jù)庫。

  • 如果哪個主數(shù)據(jù)庫宕機了,集群中就會推選出一個從屬數(shù)據(jù)庫作為主數(shù)據(jù)庫頂上,這就具備了自動故障恢復功能.

結構圖:
這里寫圖片描述

  • 第一張圖表明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為集群名稱
  • 1
  • 2
  • 3
  • 4

B.conf

dbpath = /home/wang/mongodbDATA/B
port = 2222
bind_ip = 127.0.0.1
replSet = child/127.0.0.1:3333
  • 1
  • 2
  • 3
  • 4

C.conf

dbpath = /home/wang/mongodbDATA/C
port = 3333
bind_ip = 127.0.0.1
replSet = child/127.0.0.1:1111
  • 1
  • 2
  • 3
  • 4

如上可以看出,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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在以前的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"
}]
}
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

此時你會發(fā)現(xiàn)你當前的shell客戶端的前綴變了。
我們分別鏈接其余的兩個客戶端:現(xiàn)在我們觀察到三個Shell客戶端的前綴:

child:PRIMARY>
child:SECONDARY>
child:SECONDARY>
  • 1
  • 2
  • 3

其中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
}]”
  • 1
  • 2
  • 3
  • 4
  • 5

優(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})
  • 1
  • 2

切記之前不能使用任何數(shù)據(jù)庫語句

  • 打開數(shù)據(jù)分片功能,為數(shù)據(jù)庫foobar打開分片功能
db.runCommand({"enablesharding":"foobar"})
  • 1
  • 對集合進行分片,制定片鍵
db.runCommand({"shardcollection":"foobar.bar","key":{"_id":1}})
  • 1

4.搭建分片:

分片數(shù)據(jù)庫_01.conf:

dbpath = ~/mongodata/01
port = 8081
bind_ip = 127.0.0.1
  • 1
  • 2
  • 3

分片數(shù)據(jù)庫_02.conf:

dbpath = ~/mongodata/02
port = 8082
bind_ip = 127.0.0.1
  • 1
  • 2
  • 3

配置服務器.conf:

dbpath = ~/mongodata/00
port = 2000
bind_ip = 127.0.0.1
  • 1
  • 2
  • 3

路由

mongos --port 1000 --configdb 127.0.0.1:2000
  • 1

啟動上面所有的服務。

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})
  • 1
  • 2

切記之前不能使用任何數(shù)據(jù)庫語句

打開數(shù)據(jù)分片功能,為數(shù)據(jù)庫foobar打開分片功能

db.runCommand({"enablesharding":"foobar"})
  • 1

對集合進行分片

db.runCommand({"shardcollection":"foobar.bar","key":{"_id":1}})
  • 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()
  • 1

查看集群對bar的自動分片機制配置信息

mongos> db.shards.find()
{ "_id" : "shard0000", "host" : "127.0.0.1:8081" }
{ "_id" : "shard0001", "host" : "127.0.0.1:8082" }
  • 1
  • 2
  • 3

如上就是MongoDB中常見的集群搭建。對于分片是最常用的,實際中的分片不可以像我們配置的這么簡單,為了保險期間,實際中分片之間配置為副本集,配置服務器也不會是單單一臺也常見的是一個副本集的集群。只有這樣,才能讓系統(tǒng)更加健壯。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多