1· MongoDB 分片概述
2· 部署 MongoDB 分片羣集
3· MongoDB 分片管理
4· 推薦 MongoDB 、MySQL 基礎文章
5· 文章總結前端
1)什麼是分片:linux
1·不用專業的術語說,從字面的意思講解,就是把一塊東西分紅不少不少塊。mongodb
2·稍微專業術語:分片是一種技術,它是使用多個服務器來存放數據,再也不是隻用一臺服務器。這樣就能夠知足大量的數據寫入,若是沒有分片技術,使用其餘方法那麼隨着數據量的增長,磁盤空間、服務器壓力總會產生問題shell
3·分片技術是一種將海量數據水平擴展的數據庫羣集系統,數據分佈存儲在分片(sharding)的各個節點上,管理者經過簡單的配置就能夠方便的構建一個分佈式 MongoDB 分片羣集數據庫
2).分片的條件vim
1:服務器磁盤不夠的時候服務器
2:服務器出現寫瓶頸的時候app
3:想將大量數據放在內存中提升性能分佈式
3)MongoDB 分片羣集的組成ide
1· Shard: 分片服務器,用於存儲實際的數據,在生產環境中一個 shard server 角色能夠由幾臺服務器組成一個 Replica Set 承擔,防止單點故障
2· Config Server :配置服務器,存儲了整個分片羣集的配置信息,其中包括chunk信息
3· Routers :前端路由,客戶端是由它來接入,且讓整個羣集看上去像單一數據庫,前端應用能夠透明使用
MongoDB 分片羣集的組成以下圖
部署前說明:
1· 部署環境: CenOS 7.4
2· MongoDB 的安裝這裏再也不演示,須要的朋友請點擊:MongoDB 安裝詳解
3· 須要源碼包的請點擊:MongoDB 源碼包點擊下載密碼:tpkt
1)部署開始
1·解壓源碼包、優化
[root@localhost ~]# tar xvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
[root@localhost ~]# cd /opt/
[root@localhost opt]# mv mongodb-linux-x86_64-3.2.1 /usr/local/mongodb
[root@localhost opt]# ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
[root@localhost opt]# ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
2·建立日誌文件和存儲文件的路徑
[root@localhost opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4} ----(能夠連續建立4個數據儲存目錄)
[root@localhost opt]# cd /data/mongodb/
[root@localhost mongodb]# mkdir logs
[root@localhost mongodb]# touch mongodb{1,2,3,4}.log ----(建立日誌文件)
[root@localhost mongodb]# chmod 777 .log ---(賦予權限)
[root@localhost mongodb]# ulimit -n 25000 ----(調高shell系統所暫用的資源比例)
[root@localhost mongodb]# ulimit -u 25000 ----(放大文件數量)
3·添加配置文件
[root@localhost mongodb]# vim /usr/local/mongodb/bin/mongodb1.conf ---(添加配置文件)
添加內容以下:
- > port=37017 ----(配置服務器端口)
- > dbpath=/data/mongodb/mongodb1 ----(數據存儲目錄)
- > logpath=/data/mongodb/logs/mongodb1.log ----(指定日誌文件存儲目錄)
- > logappend=true -----(使用追加方式寫日誌)
- > maxConns=5000 -----(最大連接數)
- > fork=true -----(後臺運行)
- > storageEngine=mmapv1 -----(指定存儲引擎爲內存映射文件)
- > configsvr=true -----(模式爲配置服務器模式)
當一個節點可用內存不足時,系統會從其餘幾點分配內存
[root@localhost mongodb]# sysctl -w vm.zone_reclaim_mode=0
[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
到這裏配置服務器已經配置完畢,接下來會配置第一個分片服務器:
[root@localhost mongodb]# cd /usr/local/mongodb/bin/
[root@localhost bin]# cp -p mongodb1.conf mongodb2.conf ---(把配置文件複製一份出來,稍做修改)
[root@localhost bin]# vim mongodb2.conf ---(修改內容以下)
加粗內容須要注意與修改:
- > port=47017 ---(這裏的端口號須要修改)
- > dbpath=/data/mongodb/mongodb2 ---(數據存儲路徑修改)
- > logpath=/data/mongodb/logs/mongodb2.log ----(日誌存儲路徑修改)
- > logappend=true
- > maxConns=5000
- > fork=true
- > storageEngine=mmapv1
- > shardsvr=true ----(這裏是最重要的,這裏的模式就是表明分片模式)
配置第二個分片服務器,方法以下:
[root@localhost bin]# cp -p mongodb2.conf mongodb3.conf ---(在複製一份配置文件)
[root@localhost bin]# vim mongodb3.conf ---(修改內容以下)
修改內容以下:
- > port=47018 ----(端口號須要修改)
- > dbpath=/data/mongodb/mongodb3 ----(數據存儲路徑)
- > logpath=/data/mongodb/logs/mongodb3.log ---(日誌文件)
- > logappend=true
- > maxConns=5000
- > fork=true
- > storageEngine=mmapv1
- > shardsvr=true
開啓3臺實例服務:
開啓前端路由模式,這裏不明白的能夠看看上面的組成圖:
顯示以下字符,開啓成功
2018-09-18T16:03:49.695+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 41001
child process started successfully, parent exiting
如今能夠進入 MongoDB 服務器
[root@localhost bin]# mongo
添加兩臺分片服務器:
mongos> sh.addShard("192.168.106.154:47017") ---(這裏注意把端口號寫正確)
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.106.154:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }
查看分片服務器狀態信息:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
寫入五萬條數據,等待測驗
mongos> for(var i=1;i<=50000;i++)db.school.insert({"id":i,"name":"tpm"+i})
WriteResult({ "nInserted" : 1 }) ----(利用 for 循環添加,只是爲了驗證後面分片存儲)
查看信息是否寫入,就看前五條便可,由於數據太多。
mongos> db.school.find().limit(5)
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce165"), "id" : 1, "name" : "tpm1" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce166"), "id" : 2, "name" : "tpm2" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce167"), "id" : 3, "name" : "tpm3" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce168"), "id" : 4, "name" : "tpm4" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce169"), "id" : 5, "name" : "tpm5" }
對 test 這個庫進行分片處理,默認寫入數據就是寫入 test
mongos> sh.enableSharding("test")
{ "ok" : 1 }
對集合創建索引
mongos> db.school.createIndex({"id":1}) ----(創建索引以 id 爲列)
{
"raw" : {
"192.168.106.154:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
對test.shcool這個數據庫中的這個school集合進行分片,指定索引爲 id:1
mongos> sh.shardCollection("test.school",{"id":1}) ----(開始分片)
{ "collectionsharded" : "test.school", "ok" : 1 }
查看分片狀態:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
5 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 6
shard0001 5 -----(兩個分片)
如下是把五萬條數據分片存儲{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0) { "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(3, 0) { "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0) { "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0) { "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0) { "id" : 23410 } -->> { "id" : 28092 } on : shard0000 Timestamp(6, 1) { "id" : 28092 } -->> { "id" : 32774 } on : shard0000 Timestamp(1, 6) { "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(1, 7) { "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8) { "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9) { "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10
如今來模擬,因爲大量的數據,致使空間不足,這時咱們須要添加分片服務器:
[root@localhost bin]# cp mongodb3.conf mongodb4.conf --(複製配置文件)
[root@localhost bin]# vim mongodb4.conf ---(作以下修改)
修改內容以下:
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
maxConns=5000
fork=true
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# mongod -f mongodb4.conf ---(啓動第4個實例)
[root@localhost bin]# mongo ----(進入mongo)
mongos> sh.addShard("192.168.106.154:47019")
{ "shardAdded" : "shard0002", "ok" : 1 } ---(再次添加一臺分片服務器)
再次查看狀態, 咱們會發現會自動從新分片到新的服務器中
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
8 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 4 ------(又加入一個分片服務器)
shard0001 4
shard0002 3
{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0002 Timestamp(9, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0002 Timestamp(7, 0)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0002 Timestamp(8, 0)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10)
結論:咱們能夠知道,從新添加分片服務器會讓數據進行從新分片,並不會影響什麼,同理,刪除一臺分片服務器,那麼數據同樣會從新重整數據,進行分片。這樣的話,咱們幾乎就不須要在作分片服務器的集羣,由於分片服務器原本就能夠添加多臺,不管是否掛掉都不會影響什麼。
還能夠給分片服務器貼上本身容易記住的標籤:
mongos> sh.addShardTag("shard0000","abc00")
mongos> sh.addShardTag("shard0001","abc01")
mongos> sh.addShardTag("shard0002","abc02")
能夠再次查看分片服務器:
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017", "tags" : [ "abc00" ] }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018", "tags" : [ "abc01" ] }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019", "tags" : [ "abc02" ] }
下圖是數據分片的截圖,讓效果更加直觀,重點會又標記:
MongoDB 數據庫安裝:https://blog.51cto.com/13746824/2174874
MongoDB 複製集 + 選舉原理:http://www.javashuo.com/article/p-epdqhvek-be.html
詳解 MySQL 高可用羣集,MMM搭建高可用:https://blog.51cto.com/13746824/2173073
Amoeba 代理 MySQL 主從複製 + 讀寫分離:http://www.javashuo.com/article/p-vqxkmtnv-gw.html
MongoDB 分片經過在多臺服務器上分割數據,使得數據庫系統能存儲和處理更多的數據
MongoDB 分片羣集主要以下三個組件:能夠參考文章第一張圖:Shard 分片服務器、Config Server 配置服務器、Routers 前端路由
從新添加分片服務器會讓數據進行從新分片,並不會影響什麼,同理,刪除一臺分片服務器,那麼數據同樣會從新重整數據,進行分片!