用了11個Docker容器,搭建出的最精簡數據庫分片集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

目前MongoDB官網推薦的集群方式,主要有兩種:Replication(複製)和Sharding(分片)。他們的具體實現分別是 ReplicaSet(副本集)Sharded Cluster(分片集群)。在實際生產中,分片集群使用更加廣泛,所以本文也主要講解 Sharded Cluster(分片集群)的搭建過程。

用了11個Docker容器,搭建出的最精簡數據庫分片集群

下圖是MongoDB官網推薦的分片集群架構。

用了11個Docker容器,搭建出的最精簡數據庫分片集群

按照官網要求,分片集群需要三種角色:

Shard 分片: mongod 實例,用於存儲業務數據。用於生產的分片集群,要求至少有兩個分片,每個分片採用副本集方式,那麼分片至少需要6個mongod實例。

Config Servers 配置服務: mongod 實例,存儲集群的元數據。必須實現副本集,可以是1個或3個mongod實例。小編注:即便是1個mongod實例,也要實現副本集,否則會報錯。

Router 路由: mongos 實例,前端路由及負載均衡,客戶端接入入口,為了防止路由單點,至少需要2個mongos實例。

本例一共啟動了11個Docker容器,來完整實現這套分片集群

下面就來講述一下整個集群的搭建過程:

Step 1 下載 MongoDB 鏡像

對於有一定Docker基礎的同學,這一步沒啥要說的

Step 2 搭建 Config Servers 副本集

1、創建mongoconfig1 容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

掛載的啟動參數文件configserver.conf內容如下:

# 默認只能本機訪問,修改後可以允許任何IP訪問

bind_ip=0.0.0.0

# 創建副本集並命名副本集名稱

replSet=configserver

# 此項必須設置,否則無法將此服務配置為config servers

configsvr=true

注:configsvr的默認端口是27019

2、創建mongoconfig2和mongoconfig3容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3、配置config servers副本集

1) 進入任意一個mongoconfig容器,本例進入的是mongoconfig1

用了11個Docker容器,搭建出的最精簡數據庫分片集群

2) 鏈接mongo

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3) 使用admin數據庫

用了11個Docker容器,搭建出的最精簡數據庫分片集群

4) 定義副本集配置信息

用了11個Docker容器,搭建出的最精簡數據庫分片集群

注意:_id配置信息要與configserver.conf中replSet的配置信息保持一致

5) 初始化副本集配置

rs.initiate(config);

6) 檢查config servers 配置結果

rs.status();

用了11個Docker容器,搭建出的最精簡數據庫分片集群

集群信息

用了11個Docker容器,搭建出的最精簡數據庫分片集群

節點1信息

用了11個Docker容器,搭建出的最精簡數據庫分片集群

節點2信息

用了11個Docker容器,搭建出的最精簡數據庫分片集群

節點3信息

Step 3 搭建 Shard 副本集

本文創建2組分片,共6個Docker容器

mongoshard1_1(shard1 primary),

mongoshard1_2(shard1 secondary),

mongoshard1_3(shard1 arbiter)

mongoshard2_1(shard2 primary),

mongoshard2_2(shard2 secondary),

mongoshard2_3(shard2 arbiter)

1、創建mongoshard1_1容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

掛載的啟動參數文件shard1.conf內容如下:

# 默認只能本機訪問,修改後可以允許任何IP訪問

bind_ip=0.0.0.0

# 創建副本集並命名副本集名稱

replSet=shard1

# 此項必須設置,否則無法將此服務配置為shard servers

shardsvr=true

注:shardsvr的默認端口是27018

2、創建mongoshard1_2和mongoshard1_3容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3、配置shard1副本集

1) 任意進入一個shard1容器,本例進入的是mongoshard1_1容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

2) 鏈接mongo

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3) 使用admin數據庫

用了11個Docker容器,搭建出的最精簡數據庫分片集群

4) 定義副本集配置信息

用了11個Docker容器,搭建出的最精簡數據庫分片集群

priority優先級,數值越大,優先級越高。arbiterOnly設置仲裁者,必須指定的參數,否則會報錯。

注意:和config server一樣,_id配置信息要與shard1.conf中replSet的配置信息保持一致。

5) 初始化shard1副本集配置

rs.initiate(config);

6) 檢查shard1副本集狀態

rs.status();

檢查的地方可以查考config servers副本集

Step 4 搭建shard2副本集

小編這裡只講述shard1副本集的搭建,shard2的搭建就不羅列了。

否則文章就太長太囉嗦了,讀者也沒有耐性讀下去了。

不過,讀者能讀到這裡,小編已經覺得同學你是一個很有耐性的人了,小編也相信,只要shard1能搭建成功,對於shard2的搭建應該不是什麼問題了。

Step 5 搭建路由服務mongos

按照官網的建議(一個或多個),那麼最少只要配置一臺即可。但由於路由服務mongos,是整個分片集群的對外接口。為了整個集群的高可用,不能讓mongos成為單點。所以,小編這裡配置兩臺mongos。

1、創建mongos1容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

掛載的啟動參數文件mongos.conf內容如下:

# 默認只能本機訪問,修改後可以允許任何IP訪問

bind_ip=0.0.0.0

# 指定配置服務,格式為host:port,多個服務用逗號連接,configserver為配置服務副本集名稱

configdb=configserver/mongoconfig1:27019,mongoconfig2:27019,mongoconfig3:27019

2、創建mongos2容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

configdb配置,將config servers與mongos聯繫在了一起,那麼shard servers與mongos是怎麼建立關聯的呢?

3、將分片副本集加入到分片集群

1) 任意進入一個mongos容器,本例進入的是mongo1容器

用了11個Docker容器,搭建出的最精簡數據庫分片集群

2) 鏈接mongo

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3) 使用admin數據庫

用了11個Docker容器,搭建出的最精簡數據庫分片集群

4) 將shard1分片、shard2分片加入到集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

5) 為測試數據庫chuanlu開啟分片功能

sh.enableSharding("chuanlu")

6) 為數據庫chuanlu的goods集合開啟分片功能

sh.shardCollection("chuanlu.goods",{"_id":1});

測試可行結果

1) 使用chuanlu數據庫

use chuanlu;

2) 往goods集合插入2579571條測試數據(數據量小的話,數據都散列在一個分片上,看不出分片效果,小編親測,200萬以上數據,才開始看到分片效果)

用了11個Docker容器,搭建出的最精簡數據庫分片集群

3) 查看goods分片狀況

db.goods.stats();

用了11個Docker容器,搭建出的最精簡數據庫分片集群

用了11個Docker容器,搭建出的最精簡數據庫分片集群

可以看到shard2分片數據量 1204622,shard1分片數據量1374949,兩個分片的總數據量2579571。剛好是插入的數量。

測試運行通過。

結束


分享到:


相關文章: