實現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
有時會發現學習是一件很快樂的事情 比一直跑步容易多了 不是嘛