1. 程式人生 > 其它 >實現MongoDB的複製集與分片

實現MongoDB的複製集與分片

簡單實現MongoDB的複製集和分片的功能

介紹

Mongodb複製集(replica set)由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Primary,Secondary通過oplog來同步Primary的資料,保證主從節點資料的一致性;複製集在完成主從複製的基礎上,通過心跳機制,一旦Primary節點出現宕機,則觸發選舉一個新的主節點,剩下的secondary節點指向新的Primary,時間應該在10-30s內完成感知Primary節點故障,實現高可用資料庫叢集

分片(sharding)是指將資料庫拆分,將其分散在不同的機器上的過程。分片叢集(sharded cluster)是一種水平擴充套件資料庫系統性能的方法,能夠將資料集分散式儲存在不同的分片(shard)上,每個分片只儲存資料集的一部分,MongoDB保證各個分片之間不會有重複的資料,所有分片儲存的資料之和就是完整的資料集。分片叢集將資料集分散式儲存,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分資料,充分利用了各個shard的系統資源,提高資料庫系統的吞吐量

一、系統環境

Centos MongoDB 關閉防火牆

192.168.174.131 192.168.174.132 192.168.174.133
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 主節點

埠分配:

  • mongos:20000

  • config:21000

  • shard1:27001

  • shard2:27002

  • shard3:27003

三臺機器的配置服務(21000)形成複製集,分片1、2、3也在各機器都部署一個例項,它們之間形成複製集,客戶端直接連線3個路由服務與之互動,配置服務和分片服務對客戶端是透明的。

二、安裝MangoDB

2.1下載解壓MongoDB

tar -xzvf
mongodb-linux-x86_64-rhel70-3.2.22.tgz -C /nosql/

改名:

cd /nosql/

mv mongodb-linux-x86_64-rhel70-3.2.22 mongodb

2.2建立路由、配置、分片等的相關目錄與檔案

分別在每臺機器建立conf、mongos、config、shard1、shard2、shard3六個目錄,因為mongos不儲存資料,只需要建立日誌檔案目錄即可。

啟動配置檔案存放的資料夾:mkdir -p /nosql/mongodb/conf

路由服務日誌存放檔案: mkdir -p /nosql/mongodb/mongos/log

配置服務資料存放目錄: mkdir -p /nosql/mongodb/config/data

配置服務日誌存放檔案: mkdir -p /nosql/mongodb/config/log

分片1服務資料存放目錄:mkdir -p /nosql/mongodb/shard1/data

分片1服務日誌存放檔案:mkdir -p /nosql/mongodb/shard1/log

分片2服務資料存放目錄:mkdir -p /nosql/mongodb/shard2/data

分片2服務日誌存放檔案:mkdir -p /nosql/mongodb/shard2/log

分片3服務資料存放目錄:mkdir -p /nosql/mongodb/shard3/data

分片3服務日誌存放檔案:mkdir -p /nosql/mongodb/shard3/log

2.3配置環境變數

vi /etc/profile

export MONGODB_HOME=/nosql/mongodb
export PATH=$MONGODB_HOME/bin:$PATH

立即生效:

source /etc/profile

三、config server配置伺服器

3.1(三臺機器)新增配置檔案

vi /nosql/mongodb/conf/config.conf

配置檔案內容

pidfilepath = /nosql/mongodb/config/log/configsrv.pid
dbpath = /nosql/mongodb/config/data
logpath = /nosql/mongodb/config/log/congigsrv.log
logappend =true

bind_ip =0.0.0.0
port = 21000
fork = true
configsvr =true

#副本集名稱
replSet =configs
#設定最大連線數
maxConns =20000

3.2配置副本集

啟動三臺伺服器的config server

mongod -f /nosql/mongodb/conf/config.conf

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

連線 MongoDB: mongo --port 21000

其中,"_id"
"configs"應與配置檔案中配置的 replicaction.replSetName 一致,"members" 中的 "host" 為三個節點的 ip 和 port。響應內容如下:

四、配置分片副本集

4.1設定第一個分片副本集

①配置檔案

vi /nosql/mongodb/conf/shard1.conf

配置檔案內容

pidfilepath = /nosql/mongodb/shard1/log/shard1.pid
dbpath = /nosql/mongodb/shard1/data
logpath = /nosql/mongodb/shard1/log/shard1.log
logappend =true
bind_ip =0.0.0.0
port = 27001
fork = true
#副本集名稱

replSet =shard1
#declare this is a shard db of a cluster;
shardsvr = true
#設定最大連線數
maxConns=20000

②啟動三臺伺服器的shard1 server

mongod -f /nosql/mongodb/conf/shard1.conf

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

4.2設定第二個分片副本集

過程與設定第一個分片副本集類似,這裡直接給出設定結果:

4.3設定第三個分片副本集

過程與設定第一個分片副本集類似,這裡直接給出設定結果:

4.4配置路由器mongos

三臺機器)先啟動配置伺服器和分片伺服器,後啟動路由例項啟動路由例項:

vi /nosql/mongodb/conf/mongos.conf

#內容
pidfilepath = /nosql/mongodb/mongos/log/mongos.pid
logpath = /nosql/mongodb/mongos/log/mongos.log
logappend =true

bind_ip =0.0.0.0
port = 20000
fork = true
#監聽的配置伺服器,只能有1個或者3個 configs為配置伺服器的副本集名字
configdb =
configs/192.168.252.121:21000,192.168.252.122:21000,192.168.252.123:21000
#設定最大連線數
maxConns =20000

啟動三臺伺服器的mongos server

mongos -f /nosql/mongodb/conf/mongos.conf

五、串聯路由伺服器

目前搭建了mongodb配置伺服器、路由伺服器,各個分片伺服器,不過應用程式連線到mongos路由伺服器並不能使用分片機制,還需要在程式裡設定分片配置,讓分片生效。

5.1串聯路由伺服器與分配副本集

登陸任意一臺mongos :mongo --port 20000

使用admin資料庫: use admin

5.2檢視叢集狀態

響應內容如下:

六、啟用集合分片生效

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

6.1指定testdb分片生效

db.runCommand(
{ enablesharding :"testdb"});

6.2指定資料庫裡需要分片的集合和片鍵,雜湊id 分片

db.runCommand(
{ shardcollection : "testdb.table1",key : {"id":
"hashed"} } );

6.3測試分片配置結果

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

切換到 testdb 資料庫 插入測試資料

use testdb;

for(i=1;i<=100000;i++){db.table1.insert({"id":i,"name":"penglei"})};

檢視此時的叢集狀態,並分組檢視總數量:

分組檢視總數量是:100000

有時會發現學習是一件很快樂的事情 比一直跑步容易多了 不是嘛