MongoDB 集羣搭建
概念理解
從圖中能夠看到有四個組件:mongos、config server、shard、replica set。linux
-
mongos,數據庫集羣請求的入口,全部的請求都經過mongos進行協調,不須要在應用程序添加一個路由選擇器,mongos本身就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境一般有多mongos做爲請求的入口,防止其中一個掛掉全部的mongodb請求都沒有辦法操做。mongodb
-
config server,顧名思義爲配置服務器,存儲全部數據庫元信息(路由、分片)的配置。mongos自己沒有物理存儲分片服務器和數據路由信息,只是緩存在內存裏,配置服務器則實際存儲這些數據。mongos第一次啓動或者關掉重啓就會從 config server 加載配置信息,之後若是配置服務器信息變化會通知到全部的 mongos 更新本身的狀態,這樣 mongos 就能繼續準確路由。在生產環境一般有多個 config server 配置服務器,由於它存儲了分片路由的元數據,防止數據丟失!數據庫
-
shard,分片(sharding)是指將數據庫拆分,將其分散在不一樣的機器上的過程。將數據分散到不一樣的機器上,不須要功能強大的服務器就能夠存儲更多的數據和處理更大的負載。基本思想就是將集合切成小塊,這些塊分散到若干片裏,每一個片只負責總數據的一部分,最後經過一個均衡器來對各個分片進行均衡(數據遷移)。vim
-
replica set,中文翻譯副本集,其實就是shard的備份,防止shard掛掉以後數據丟失。複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性, 並能夠保證數據的安全性。緩存
-
仲裁者(Arbiter),是複製集中的一個MongoDB實例,它並不保存數據。仲裁節點使用最小的資源而且不要求硬件設備,不能將Arbiter部署在同一個數據集節點中,能夠部署在其餘應用服務器或者監視服務器中,也可部署在單獨的虛擬機中。爲了確保複製集中有奇數的投票成員(包括primary),須要添加仲裁節點作爲投票,不然primary不能運行時不會自動切換primary。安全
簡單瞭解以後,咱們能夠這樣總結一下,應用請求mongos來操做mongodb的增刪改查,配置服務器存儲數據庫元信息,而且和mongos作同步,數據最終存入在shard(分片)上,爲了防止數據丟失同步在副本集中存儲了一份,仲裁在數據存儲到分片的時候決定存儲到哪一個節點。bash
環境準備
- 系統:CentOS 7.4
- 服務器:192.168.16.150、192.168.16.15一、192.168.16.152
- 安裝包:mongodb-linux-x86_64-rhel70-3.4.9.tgz
服務器規劃:服務器
150 | 151 | 152 |
---|---|---|
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 主節點 |
端口分配:app
mongos:20000 config:21000 shard1:27001 shard2:27002 shard3:27003
集羣搭建
1、安裝MongoDB
# 下載 MongoDB $ cd /opt $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.9.tgz # 解壓 $ tar -zxvf mongodb-linux-x86_64-rhel70-3.4.9.tgz $ ln -s /opt/mongodb-linux-x86_64-rhel70-3.4.9 /opt/mongodb # 建立目錄 $ mkdir -p /opt/mongodb/conf $ mkdir -p /data/mongodb/mongos/log $ mkdir -p /data/mongodb/{config,shard1,shard2,shard3}/{data,log} # 配置環境變量 $ vim /etc/profile.d/mongodb.sh #!/bin/bash export MONGODB_HOME=/opt/mongodb export PATH=$PATH:$MONGODB_HOME/bin $ source /etc/profile.d/mongodb.sh # 驗證 $ mongod -version
2、Config Server 配置
1. 配置並啓動服務
$ vim /opt/mongodb/conf/config.conf sharding: clusterRole: configsvr replication: replSetName: config # log systemLog: destination: file logAppend: true path: /data/mongodb/config/log/config.log # data storage: dbPath: /data/mongodb/config/data journal: enabled: true # process processManagement: fork: true pidFilePath: /var/run/configsrv.pid # network net: port: 21000 bindIp: 192.168.16.150
更多參數配置請參閱:參數配置運維
注意修改bindIp
,並在三臺服務器上啓動 Config Server 服務
$ mongod --config /opt/mongodb/conf/config.conf
2. 鏈接並配置服務
選擇任意服務器進行鏈接
$ mongo --host 192.168.16.150 --port 21000
使用 rs.initiate() 方法來初始化
_id
:必須匹配配置的 replication.replSetName 值member
:所有的副本集configsvr
:對於 config server 副本集,該值必須爲 true
# 初始化副本集 > rs.initiate( { _id: "config", configsvr: true, members: [ { _id : 0, host : "192.168.16.150:21000" }, { _id : 1, host : "192.168.16.151:21000" }, { _id : 2, host : "192.168.16.152:21000" } ] } ) # 查看分區狀態 > rs.status() # 退出 > quit()
3、Shard 配置
1. 配置並啓動服務
# 配置 $ vim /opt/mongodb/conf/shard1.conf sharding: clusterRole: shardsvr replication: replSetName: shard1 # log systemLog: destination: file logAppend: true path: /data/mongodb/shard1/log/shard1.log # data storage: dbPath: /data/mongodb/shard1/data journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 1 # process processManagement: fork: true pidFilePath: /var/run/shard1.pid # network net: port: 27001 bindIp: 192.168.16.150
更多參數配置請參閱:參數配置
注意修改bindIp
,並在三臺服務器上啓動 Shard 服務
$ mongod --config /opt/mongodb/conf/shard1.conf
2. 鏈接並配置服務
選擇任意服務器進行鏈接
$ mongo --host 192.168.16.150 --port 27001
使用 rs.initiate() 方法來初始化
_id
:必須匹配配置的 replication.replSetName 值member
:所有的副本集
# 使用 admin 數據庫 > use admin # 初始化副本集,第三個節點的 "arbiterOnly":true 表明其爲仲裁節點 > rs.initiate( { _id: "shard1", members: [ { _id : 0, host : "192.168.16.150:27001" }, { _id : 1, host : "192.168.16.151:27001" }, { _id : 2, host : "192.168.16.152:27001", arbiterOnly: true } ] } ) # 查看分區狀態 > rs.status() # 退出 > quit()
到這,shard1 就配置好了,shard2 和 shard3 的操做基本同樣,以下:
Shard2(注意修改bindIp
)
$ vim /opt/mongodb/conf/shard2.conf sharding: clusterRole: shardsvr replication: replSetName: shard2 # log systemLog: destination: file logAppend: true path: /data/mongodb/shard2/log/shard2.log # data storage: dbPath: /data/mongodb/shard2/data journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 1 # process processManagement: fork: true pidFilePath: /var/run/shard2.pid # network net: port: 27002 bindIp: 192.168.16.150 $ mongod --config /opt/mongodb/conf/shard2.conf $ mongo --host 192.168.16.150 --port 27002 > use admin > rs.initiate( { _id: "shard2", members: [ { _id : 0, host : "192.168.16.150:27002", arbiterOnly: true }, { _id : 1, host : "192.168.16.151:27002" }, { _id : 2, host : "192.168.16.152:27002" } ] } )
Shard3(注意修改bindIp
)
$ vim /opt/mongodb/conf/shard3.conf sharding: clusterRole: shardsvr replication: replSetName: shard3 # log systemLog: destination: file logAppend: true path: /data/mongodb/shard3/log/shard3.log # data storage: dbPath: /data/mongodb/shard3/data journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 1 # process processManagement: fork: true pidFilePath: /var/run/shard3.pid # network net: port: 27003 bindIp: 192.168.16.150 $ mongod --config /opt/mongodb/conf/shard3.conf $ mongo --host 192.168.16.150 --port 27003 > use admin > rs.initiate( { _id: "shard3", members: [ { _id : 0, host : "192.168.16.150:27003" }, { _id : 1, host : "192.168.16.151:27003", arbiterOnly: true }, { _id : 2, host : "192.168.16.152:27003" } ] } )
4、Mongos 配置
1. 配置並啓動服務
# 配置 $ vim /opt/mongodb/conf/mongos.conf sharding: configDB: config/192.168.16.150:21000,192.168.16.151:21000,192.168.16.152:21000 # log systemLog: destination: file logAppend: true path: /data/mongodb/mongos/log/mongos.log # process processManagement: fork: true pidFilePath: /var/run/mongos.pid # network net: port: 20000 bindIp: 192.168.16.150
更多參數配置請參閱:參數配置
注意修改bindIp
,並在三臺服務器上啓動 Mongos 服務
$ mongos --config /opt/mongodb/conf/mongos.conf
2. 鏈接並配置服務
選擇任意服務器進行鏈接
$ mongo --host 192.168.16.150 --port 20000
使用 rs.initiate() 方法來初始化
_id
:必須匹配配置的 replication.replSetName 值member
:所有的副本集configsvr
:對於 config server 副本集,該值必須爲 true
# 使用 admin 數據庫 > use admin # 串聯路由服務器與分配副本集 > sh.addShard("shard1/192.168.16.150:27001,192.168.16.151:27001,192.168.16.152:27001") > sh.addShard("shard2/192.168.16.150:27002,192.168.16.151:27002,192.168.16.152:27002") > sh.addShard("shard3/192.168.16.150:27003,192.168.16.151:27003,192.168.16.152:27003") # 查看集羣狀態 > sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("59ca06fabd3d4cb527e9368d") } shards: { "_id" : "shard1", "host" : "shard1/192.168.16.150:27001,192.168.16.151:27001", "state" : 1 } { "_id" : "shard2", "host" : "shard2/192.168.16.151:27002,192.168.16.152:27002", "state" : 1 } { "_id" : "shard3", "host" : "shard3/192.168.16.150:27003,192.168.16.152:27003", "state" : 1 } active mongoses: "3.4.9" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Balancer lock taken at Tue Sep 26 2017 15:51:24 GMT+0800 (CST) by ConfigServer:Balancer Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "test", "primary" : "shard3", "partitioned" : false } # 退出 > quit()
使數據庫分片生效
首先必須鏈接到 mongos 服務,而爲了讓集合(collection)可以分片,先必須使得集合對應的數據庫分片生效,數據庫分片生效後,並不會從新分配數據,而是使得數據庫中集合的分片成爲可能。
使用 sh.enableSharding() 方法讓指定數據庫分片生效
> sh.enableSharding("xxxx")
5、測試
# 讓指定數據庫和指定的集合分片生效 $ mongo --host 192.168.16.150 --port 20000 > sh.enableSharding("testdb") > sh.shardCollection("testdb.table1", { id: 1}) # 測試 $ mongo 192.168.16.150:20000 > use testdb # 插入測試數據(當數據量未達到閾值時,是不會進行分割和遷移的) > for (var i = 1; i <= 2000000; i++) db.table1.save({ id: i, "test1": "testval1"}) # 查看分片狀況 > db.table1.stats() mongos> db.table1.stats() mongos> db.table1.stats() { "sharded" : true, "capped" : false, "ns" : "testdb.table1", "count" : 2000001, "size" : 107000053, "storageSize" : 38379520, "totalIndexSize" : 51064832, "indexSizes" : { "_id_" : 21872640, "id_1" : 29192192 }, "avgObjSize" : 53.37500081249959, "nindexes" : 2, "nchunks" : 7, "shards" : { "shard1" : { "ns" : "testdb.table1", "size" : 27000054, "count" : 500001, "avgObjSize" : 54, "storageSize" : 8605696, "capped" : false, "nindexes" : 2, "totalIndexSize" : 11132928, "indexSizes" : { "_id_" : 4755456, "id_1" : 6377472 }, "ok" : 1 }, "shard2" : { "ns" : "testdb.table1", "size" : 66499945, "count" : 1249999, "avgObjSize" : 53, "storageSize" : 25427968, "capped" : false, "nindexes" : 2, "totalIndexSize" : 34476032, "indexSizes" : { "_id_" : 14802944, "id_1" : 19673088 }, "ok" : 1 }, "shard3" : { "ns" : "testdb.table1", "size" : 13500054, "count" : 250001, "avgObjSize" : 54, "storageSize" : 4345856, "capped" : false, "nindexes" : 2, "totalIndexSize" : 5455872, "indexSizes" : { "_id_" : 2314240, "id_1" : 3141632 }, "ok" : 1 } }, "ok" : 1 }
後期運維
1、啓動及關閉
mongodb的啓動順序是,先啓動配置服務器,再啓動分片,最後啓動mongos
$ mongos --config /opt/mongodb/conf/config.conf $ mongos --config /opt/mongodb/conf/shard1.conf $ mongos --config /opt/mongodb/conf/shard2.conf $ mongos --config /opt/mongodb/conf/shard3.conf $ mongos --config /opt/mongodb/conf/mongos.conf
關閉時,直接killall殺掉全部進程
$ killall mongod $ killall mongos