一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - MongoDB - mongodb3.4集群搭建實戰之高可用的分片+副本集

mongodb3.4集群搭建實戰之高可用的分片+副本集

2020-05-14 15:01純潔的微笑 MongoDB

這篇文章主要給大家介紹了關于mongodb3.4集群搭建實戰之高可用的分片+副本集的相關資料,文中通過示例代碼將實現的步驟一步步的介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。

前言

最近因為工作的原因,在學習使用mongodb數據庫,mongodb是最常用的nodql數據庫,在數據庫排名中已經上升到了前六。這篇文章介紹如何搭建高可用的mongodb(分片+副本)集群,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

在搭建集群之前,需要首先了解幾個概念:路由,分片、副本集、配置服務器等。

相關概念

先來看一張圖:

mongodb3.4集群搭建實戰之高可用的分片+副本集

從圖中可以看到有四個組件:mongos、config server、shard、replica set。

mongos,數據庫集群請求的入口,所有的請求都通過mongos進行協調,不需要在應用程序添加一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。

config server,顧名思義為配置服務器,存儲所有數據庫元信息(路由、分片)的配置。mongos本身沒有物理存儲分片服務器和數據路由信息,只是緩存在內存里,配置服務器則實際存儲這些數據。mongos第一次啟動或者關掉重啟就會從 config server 加載配置信息,以后如果配置服務器信息變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos 就能繼續準確路由。在生產環境通常有多個 config server 配置服務器,因為它存儲了分片路由的元數據,防止數據丟失!

shard,分片(sharding)是指將數據庫拆分,將其分散在不同的機器上的過程。將數據分散到不同的機器上,不需要功能強大的服務器就可以存儲更多的數據和處理更大的負載。基本思想就是將集合切成小塊,這些塊分散到若干片里,每個片只負責總數據的一部分,最后通過一個均衡器來對各個分片進行均衡(數據遷移)。

replica set,中文翻譯副本集,其實就是shard的備份,防止shard掛掉之后數據丟失。復制提供了數據的冗余備份,并在多個服務器上存儲數據副本,提高了數據的可用性, 并可以保證數據的安全性。

仲裁者(Arbiter),是復制集中的一個MongoDB實例,它并不保存數據。仲裁節點使用最小的資源并且不要求硬件設備,不能將Arbiter部署在同一個數據集節點中,可以部署在其他應用服務器或者監視服務器中,也可部署在單獨的虛擬機中。為了確保復制集中有奇數的投票成員(包括primary),需要添加仲裁節點做為投票,否則primary不能運行時不會自動切換primary。

簡單了解之后,我們可以這樣總結一下,應用請求mongos來操作mongodb的增刪改查,配置服務器存儲數據庫元信息,并且和mongos做同步,數據最終存入在shard(分片)上,為了防止數據丟失同步在副本集中存儲了一份,仲裁在數據存儲到分片的時候決定存儲到哪個節點。

環境準備

  • 系統系統 centos6.5
  • 三臺服務器:192.168.0.75/84/86
  • 安裝包: mongodb-linux-x86_64-3.4.6.tgz

服務器規劃

 

服務器75 服務器84 服務器86
mongos mongos mongos
config server config server config server
shard server1 主節點 shard server1 副節點 shard server1 仲裁
shard server2 仲裁 shard server2 主節點 shard server2 副節點
shard server3 副節點 shard server3 仲裁 shard server3 主節點

 

端口分配:

?
1
2
3
4
5
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003

集群搭建

1、安裝mongodb

?
1
2
3
4
#解壓
tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/
#改名
mv mongodb-linux-x86_64-3.4.6 mongodb

分別在每臺機器建立conf、mongos、config、shard1、shard2、shard3六個目錄,因為mongos不存儲數據,只需要建立日志文件目錄即可。

?
1
2
3
4
5
6
7
8
9
10
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log
mkdir -p /usr/local/mongodb/config/data
mkdir -p /usr/local/mongodb/config/log
mkdir -p /usr/local/mongodb/shard1/data
mkdir -p /usr/local/mongodb/shard1/log
mkdir -p /usr/local/mongodb/shard2/data
mkdir -p /usr/local/mongodb/shard2/log
mkdir -p /usr/local/mongodb/shard3/data
mkdir -p /usr/local/mongodb/shard3/log

配置環境變量

?
1
2
3
4
5
6
vim /etc/profile
# 內容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
# 使立即生效
source /etc/profile

2、config server配置服務器

mongodb3.4以后要求配置服務器也創建副本集,不然集群搭建不成功。

添加配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vi /usr/local/mongodb/conf/config.conf
 
## 配置文件內容
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true
 
bind_ip = 0.0.0.0
port = 21000
fork = true
 
#declare this is a config db of a cluster;
configsvr = true
 
#副本集名稱
replSet=configs
 
#設置最大連接數
maxConns=20000

啟動三臺服務器的config server

?
1
mongod -f /usr/local/mongodb/conf/config.conf

登錄任意一臺配置服務器,初始化配置副本集

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#連接
mongo --port 21000
#config變量
config = {
... _id : "configs",
... members : [
...  {_id : 0, host : "192.168.0.75:21000" },
...  {_id : 1, host : "192.168.0.84:21000" },
...  {_id : 2, host : "192.168.0.86:21000" }
... ]
... }
 
#初始化副本集
rs.initiate(config)

其中,”_id” : “configs”應與配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 為三個節點的 ip 和 port

3、配置分片副本集(三臺機器)

設置第一個分片副本集

配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vi /usr/local/mongodb/conf/shard1.conf
 
#配置文件內容
#——————————————–
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true
 
bind_ip = 0.0.0.0
port = 27001
fork = true
 
#打開web監控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard1
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設置最大連接數
maxConns=20000

啟動三臺服務器的shard1 server

?
1
mongod -f /usr/local/mongodb/conf/shard1.conf

登陸任意一臺服務器,初始化副本集

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mongo --port 27001
#使用admin數據庫
use admin
#定義副本集配置,第三個節點的 "arbiterOnly":true 代表其為仲裁節點。
config = {
... _id : "shard1",
... members : [
...  {_id : 0, host : "192.168.0.75:27001" },
...  {_id : 1, host : "192.168.0.84:27001" },
...  {_id : 2, host : "192.168.0.86:27001” , arbiterOnly: true }
... ]
... }
#初始化副本集配置
rs.initiate(config);

設置第二個分片副本集

配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vi /usr/local/mongodb/conf/shard2.conf
 
#配置文件內容
#——————————————–
pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true
 
bind_ip = 0.0.0.0
port = 27002
fork = true
 
#打開web監控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard2
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設置最大連接數
maxConns=20000

啟動三臺服務器的shard2 server

?
1
mongod -f /usr/local/mongodb/conf/shard2.conf

登陸任意一臺服務器,初始化副本集

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mongo --port 27002
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard2",
... members : [
...  {_id : 0, host : "192.168.0.75:27002" , arbiterOnly: true },
...  {_id : 1, host : "192.168.0.84:27002" },
...  {_id : 2, host : "192.168.0.86:27002" }
... ]
... }
 
#初始化副本集配置
rs.initiate(config);

設置第三個分片副本集

配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
vi /usr/local/mongodb/conf/shard3.conf
 
 
#配置文件內容
#——————————————–
pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true
 
bind_ip = 0.0.0.0
port = 27003
fork = true
 
#打開web監控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard3
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設置最大連接數
maxConns=20000

啟動三臺服務器的shard3 server

?
1
mongod -f /usr/local/mongodb/conf/shard3.conf

登陸任意一臺服務器,初始化副本集

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mongo --port 27003
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard3",
...  members : [
...   {_id : 0, host : "192.168.0.75:27003" },
...   {_id : 1, host : "192.168.0.84:27003" , arbiterOnly: true},
...   {_id : 2, host : "192.168.0.86:27003" }
...  ]
... }
 
#初始化副本集配置
rs.initiate(config);

4、配置路由服務器 mongos

先啟動配置服務器和分片服務器,后啟動路由實例啟動路由實例:(三臺機器)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi /usr/local/mongodb/conf/mongos.conf
 
#內容
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true
 
bind_ip = 0.0.0.0
port = 20000
fork = true
 
#監聽的配置服務器,只能有1個或者3個 configs為配置服務器的副本集名字
configdb = configs/192.168.0.75:21000,192.168.0.84:21000,192.168.0.86:21000
 
#設置最大連接數
maxConns=20000

啟動三臺服務器的mongos server

?
1
mongod -f /usr/local/mongodb/conf/mongos.conf

5、啟用分片

目前搭建了mongodb配置服務器、路由服務器,各個分片服務器,不過應用程序連接到mongos路由服務器并不能使用分片機制,還需要在程序里設置分片配置,讓分片生效。

登陸任意一臺mongos

?
1
2
3
4
5
6
7
8
9
mongo --port 20000
#使用admin數據庫
user admin
#串聯路由服務器與分配副本集
sh.addShard("shard1/192.168.0.75:27001,192.168.0.84:27001,192.168.0.86:27001")
sh.addShard("shard2/192.168.0.75:27002,192.168.0.84:27002,192.168.0.86:27002")
sh.addShard("shard3/192.168.0.75:27003,192.168.0.84:27003,192.168.0.86:27003")
#查看集群狀態
sh.status()

6、測試

目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但我們的目的是希望插入數據,數據能夠自動分片。連接在mongos上,準備讓指定的數據庫、指定的集合分片生效。

?
1
2
3
4
#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});
#指定數據庫里需要分片的集合和片鍵
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )

我們設置testdb的 table1 表需要分片,根據 id 自動分片到 shard1 ,shard2,shard3 上面去。要這樣設置是因為不是所有mongodb 的數據庫和表 都需要分片!

測試分片配置結果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
mongo 127.0.0.1:20000
#使用testdb
use testdb;
#插入測試數據
for (var i = 1; i <= 100000; i++)
db.table1.save({id:i,"test1":"testval1"});
#查看分片情況如下,部分無關信息省掉了
db.table1.stats();
 
{
  "sharded" : true,
  "ns" : "testdb.table1",
  "count" : 100000,
  "numExtents" : 13,
  "size" : 5600000,
  "storageSize" : 22372352,
  "totalIndexSize" : 6213760,
  "indexSizes" : {
    "_id_" : 3335808,
    "id_1" : 2877952
  },
  "avgObjSize" : 56,
  "nindexes" : 2,
  "nchunks" : 3,
  "shards" : {
    "shard1" : {
      "ns" : "testdb.table1",
      "count" : 42183,
      "size" : 0,
      ...
      "ok" : 1
    },
    "shard2" : {
      "ns" : "testdb.table1",
      "count" : 38937,
      "size" : 2180472,
      ...
      "ok" : 1
    },
    "shard3" : {
      "ns" : "testdb.table1",
      "count" :18880,
      "size" : 3419528,
      ...
      "ok" : 1
    }
  },
  "ok" : 1
}

可以看到數據分到3個分片,各自分片數量為: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已經成功了!

后期運維

啟動關閉

mongodb的啟動順序是,先啟動配置服務器,在啟動分片,最后啟動mongos.

?
1
2
3
4
5
mongod -f /usr/local/mongodb/conf/config.conf
mongod -f /usr/local/mongodb/conf/shard1.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf
mongod -f /usr/local/mongodb/conf/mongos.conf

關閉時,直接killall殺掉所有進程

?
1
2
killall mongod
killall mongos

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

參考:

  • 搭建高可用mongodb集群(四)—— 分片
  • MongoDB3.4副本集分片集群搭建
  • Mongodb高可用集群(四)——分片

原文鏈接:http://www.ityouknow.com/mongodb/2017/08/05/mongodb-cluster-setup.html

延伸 · 閱讀

精彩推薦
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
  • MongoDBMongodb實現定時備份與恢復的方法教程

    Mongodb實現定時備份與恢復的方法教程

    這篇文章主要給大家介紹了Mongodb實現定時備份與恢復的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB 內存使用情況分析

    MongoDB 內存使用情況分析

    都說 MongoDB 是個內存大戶,但是怎么知道它到底用了多少內存呢...

    MongoDB教程網10002020-09-29
  • MongoDBmongodb基本命令實例小結

    mongodb基本命令實例小結

    這篇文章主要介紹了mongodb基本命令,結合實例形式總結分析了MongoDB數據庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
  • MongoDB遷移sqlserver數據到MongoDb的方法

    遷移sqlserver數據到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數據到MongoDb的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
  • MongoDBMongoDB中javascript腳本編程簡介和入門實例

    MongoDB中javascript腳本編程簡介和入門實例

    作為一個數據庫,MongoDB有一個很大的優勢——它使用js管理數據庫,所以也能夠使用js腳本進行復雜的管理——這種方法非常靈活 ...

    MongoDB教程網6982020-04-24
  • MongoDB分布式文檔存儲數據庫之MongoDB分片集群的問題

    分布式文檔存儲數據庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數據庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDBMongoDB憑什么躋身數據庫排行前五

    MongoDB憑什么躋身數據庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
主站蜘蛛池模板: 果冻传媒天美传媒在线小视频播放 | 免费看男人狂躁女人 | 91在线播 | 16男男gaygays | 香蕉精品国产高清自在自线 | 好大好硬视频 | 午夜香蕉成视频人网站高清版 | 久久久久嫩草影院精品 | 国产hd老太婆 | 特级淫片大乳女子高清视频 | 久久精品无码人妻无码AV蜜臀 | 亚洲国产精品日韩高清秒播 | 久久久大香菇 | b站免费| 国产成人手机在线好好热 | 东北美女野外bbwbbw免费 | 国产精品免费久久久久影院小说 | 久久亚洲国产成人影院 | 欧美同性猛男videos | 日不卡| 日本护士撒尿xxxx18 | 国产精品视频二区不卡 | 美女被狂揉下部羞羞动漫 | 日韩精品中文字幕视频一区 | ferr孕妇videos毛茸茸 | 校服下的白嫩小乳尖h1v1 | 经典欧美gifxxoo动态图暗网 | 成人在线免费看 | 亚洲国产中文字幕在线视频综合 | 黑人性xxxⅹxxbbbbb| 国产日本欧美亚洲精品视 | 欧美夫妇野外交换hd高清版 | 99在线精品免费视频九九视 | 男生和老师一起差差差 | 九九热国产视频 | 国产午夜亚洲精品不卡 | 亚洲国内精品久久 | 91国产在线视频 | 成人欧美1314www色视频 | 亚洲色图欧美视频 | 二次元美女脱裤子让男人桶爽 |