您好,登錄后才能下訂單哦!
(1)高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力;
(2)大的查詢量會將單機的CPU耗盡;
(3)大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到鍵盤IO上
MongoDB分片技術是使用多個服務器存儲數據的方法,以支持巨大的數據存儲和對數據的操作。當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。
用于存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障
mongod實例,存儲了整個 分片群集的配置信息,其中包括 chunk信息。
客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用
比如,當插入一條數據時,應用只需要訪問存儲這條數據的分片
當MongoDB單點數據庫服務器存儲和性能成為瓶頸,或者需要部署大型應用以充分利用內存時,可以使用分片技術
下面介紹如何在一臺CentOS7系統的物理服務器上部署一個簡單結構的MongoDB分片集群 。
1臺路由實例(端口 27017)
1臺配置實例(端口 37017)
2臺分片實例(端口 47017, 47018)
https://pan.baidu.com/s/1bZXJDBrn9qxBF6r6IF_aLQ
yum install openssl-devel -y
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir /data/logs
touch /data/logs/mongodb{1,2,3,4}.log
chmod -R 777 /data/logs/*.log
ulimit -n 25000 #最大文件 數
ulimit -u 25000 #最大進程數
sysctl -w vm.zone_reclaim_mode=0 #永久設置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defragln -s /usr/local/mongodb/bin/* /usr/bin/ #方便服務管理
cd /usr/local/mongodb/bin/
vim mongodb1.conf
port=37017 #指定服務端口
dbpath=/data/mongodb/mongodb1 #數據存儲目錄
logpath=/data/logs/mongodb1.log #日志文件
logappend=true #使用追加方式寫日志
fork=true #后臺運行
maxConns=5000 #設定最大同時連接數,默認為2000
storageEngine=mmapv1 #指定存儲引擎為內存映射文件
configsvr=true #配置服務
[root@localhost bin]# mongod -f mongodb1.conf #啟動配置服務器
about to fork child process, waiting until server is ready for connections.
forked process: 12594
child process started successfully, parent exiting
[root@localhost bin]# mongo --port 37017 #進入服務
MongoDB shell version: 3.2.1
connecting to: 127.0.0.1:37017/test
Server has startup warnings:
2018-09-15T04:39:24.967+0800 I STORAGE [initandlisten]
2018-09-15T04:39:24.967+0800 I STORAGE [initandlisten] ** WARNING: Readahead for /data/mongodb1 is set to 4096KB
2018-09-15T04:39:24.967+0800 I STORAGE [initandlisten] ** We suggest setting it to 256KB (512 sectors) or less
2018-09-15T04:39:24.967+0800 I STORAGE [initandlisten] ** http://dochub.mongodb.org/core/readahead
2018-09-15T04:39:25.828+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-09-15T04:39:25.828+0800 I CONTROL [initandlisten]
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten]
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten]
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-09-15T04:39:25.829+0800 I CONTROL [initandlisten]
configsvr>
vim mongodb2.conf
port=47017
dbpath=/data/mongodb/mongodb2
logpath=/data/logs/mongodb2.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
vim mongodb3.conf
port=47018
dbpath=/data/mongodb/mongodb3
logpath=/data/logs/mongodb3.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# mongod -f mongodb2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 12810
child process started successfully, parent exiting
[root@localhost bin]# mongod -f mongodb3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 12825
child process started successfully, parent exiting
[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.30.55:37017 --chunkSize 1
2018-09-15T05:03:06.217+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: 12934
child process started successfully, parent exiting
[root@localhost bin]# mongo #進入路由實例
MongoDB shell version: 3.2.1
connecting to: test
Server has startup warnings:
2018-09-15T16:00:19.746+0800 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
2018-09-15T16:00:19.746+0800 I CONTROL [main]
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards: #shards下為空,沒有分片服務器
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> sh.addShard("192.168.30.55:47017")
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.30.55:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.30.55:47017" }
{ "_id" : "shard0001", "host" : "192.168.30.55: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> show dbs
config 0.031GB
mongos> use school #進入并創建數據庫school
switched to db school
mongos> for (var i=1;i<=50000;i++)db.info.insert({"id":i,"name":"tom"+i}) #創建集合info,并使用循環插入50000條數據WriteResult({ "nInserted" : 1 })
mongos> sh.enableSharding("school")
{ "ok" : 1 }
mongos> db.info.createIndex({"id":1})
{
"raw" : {
"192.168.30.55:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
使用sh.shardCollection("school.info",{"id":1})命令對集合info進行分片
mongos> sh.shardCollection("school.info",{"id":1})
{ "collectionsharded" : "school.info", "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.30.55:47017" } #兩個分片服務器信息
{ "_id" : "shard0001", "host" : "192.168.30.55: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" : "school", "primary" : "shard0000", "partitioned" : true } #數據庫school的分片信息
school.info
shard key: { "id" : 1 }
unique: false
balancing: true
chunks: #可以看到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)
mongos> sh.addShardTag("shard0000","abc01")
mongos> sh.addShardTag("shard0001","abc02")mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.30.55:47017", "tags" : [ "abc01" ] }
{ "_id" : "shard0001", "host" : "192.168.30.55:47018", "tags" : [ "abc02" ] }
[root@localhost bin]# cp mongodb3.conf mongodb4.conf
[root@localhost bin]# vim mongodb4.conf
port=47019
logpath=/data/logs/mongodb4.log
dbpath=/data/mongodb4
fork=true
logappend=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# mongod -f mongodb4.conf
about to fork child process, waiting until server is ready for connections.
forked process: 52634
child process started successfully, parent exiting
[root@localhost bin]# mongo
MongoDB shell version: 3.2.1
connecting to: test
Server has startup warnings:
2018-09-15T16:00:19.746+0800 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
2018-09-15T16:00:19.746+0800 I CONTROL [main]
mongos> sh.addShard("192.168.30.55:47019") #添加分片服務器
{ "shardAdded" : "shard0002", "ok" : 1 }
mongos> sh.status() #查看分片服務信息
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.30.55:47017" }
{ "_id" : "shard0001", "host" : "192.168.30.55:47018" }
{ "_id" : "shard0002", "host" : "192.168.30.55: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" : "school", "primary" : "shard0000", "partitioned" : true }
school.info
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> use admin # 注:在admin db下執行命令。
switched to db admin
mongos> db.runCommand({"removeshard":"192.168.30.55:47019"})
{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "shard0002",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [ ],
"ok" : 1
}
mongos> db.runCommand({"removeshard":"192.168.30.55:47019"})
{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "shard0002",
"ok" : 1
}
“注意:該命令至少執行兩次才能成功刪除,執行到state為completed才真正刪除,否則就是沒有刪除成功,該分片處于"draining" : true狀態,該狀態下不但該分片沒有刪除成功,而且還影響接下來刪除其他分片操作,遇到該狀態再執行一次removeshard即可,最好就是刪除分片時一直重復執行刪除命令,直到state為completed
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5b9cbc14b4c77895df796bac")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.30.55:47017" }
{ "_id" : "shard0001", "host" : "192.168.30.55: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:
11 : Success
databases:
{ "_id" : "school", "primary" : "shard0000", "partitioned" : true }
school.info
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 6
shard0001 5
{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0000 Timestamp(10, 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 : shard0001 Timestamp(11, 0)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0000 Timestamp(12, 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)
mongo --port 37017
configsvr> use config
configsvr> show collections
....
collections
chunks
databases
....configsvr> db.chunks.findOne()
configsvr> db.collections.find()
configsvr> db.databases.find()
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。