MongoDB 分片叢集搭建

賀子_DBA時代發表於2019-12-19
環境介紹:
10.9.21.178
10.9.21.179
10.9.21.114
MongoDB sharding簡介三種角色介紹:
1.資料分片(Shards)
用來儲存資料,保證資料的高可用性和一致性。可以是一個單獨的mongod例項,也可以是
一個副本集。在生產環境下Shard一般是一個Replica Set,以防止該資料片的單點故障。
可以將所有shard的副本集放在一個伺服器多個mongodb例項中。
sharding的每個node的database中的集合可以是分片也可以不分片,每個db都有一個
primary shard,未分片的集合就是存在其各自的primary shard中的。
2.查詢路由 mongos(Query Routers)
路由就是mongos的例項,客戶端直接連線mongos,由mongos把讀寫請求路由到指定的
Shard上去。mongos第一次啟動或者關掉重啟就會從 config server載入配置資訊,以後如
果配置伺服器資訊變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos就能繼續
準確路由。一個Sharding叢集,可以有一個mongos,也可以為每個App Server配置一
個mongos以減輕路由壓力,注意這裡的mongos並不需要配置為rs,因為只是個路由,並不儲存資料,配置多個mongos的意思是配置多個單獨的mongos例項。理論上可以部署無數個mongos路由,但是要考慮到config server的壓力!
3.配置伺服器(Config servers)
儲存叢集的後設資料(metadata),包含各個Shard的路由規則。3.2版本以後config server可以配置為副本集,3.4以後config server必須配置為副本集。生產上建議config server的rs至少要有3個副本整合員。
整體規劃:
其中mongos 的如下(生產上需要建立多個mongos,然後藉助haproxy 或者lvs做高可用):
10.9.21.114   27022
其中config server的副本集架構如下:
10.9.21.178   27018
10.9.21.179   27018
10.9.21.114   27018
分片節點(3個分片節點,都是副本集架構):
分片1 (副本集)
10.9.21.178   27019
10.9.21.179   27019
10.9.21.114   27019
分片2 (副本集)
10.9.21.178   27020
10.9.21.179   27020
10.9.21.114   27020
分片3 (副本集)
10.9.21.178   27021
10.9.21.179   27021
10.9.21.114   27021
具體搭建過程:
一:目錄建立:
1.關於分片節點的目錄,注意需要在114和178以及179都要建立!
1)關於27021分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27021/log
2)關於27020分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27020/log
3)關於27019分片
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/db
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/config
mkdir -p /data/mongodb/mongodb_sharding/mongodb/27019/log
2.關於mongos的相關目錄建立:
mkdir -p /data/mongodb/mongodb_sharding/mongos/config
mkdir -p /data/mongodb/mongodb_sharding/mongos/db
mkdir -p /data/mongodb/mongodb_sharding/mongos/log
3.關於config  server的相關目錄的建立:
mkdir -p /data/mongodb/mongodb_sharding/config_server/db
mkdir -p /data/mongodb/mongodb_sharding/config_server/log
mkdir -p /data/mongodb/mongodb_sharding/config_server/config
4.修改目錄的陣列
chown -R mongod.mongod /data/mongodb/mongodb_sharding/
5.建立安裝mongodb軟體的目錄:
mkdir -p  /usr/bin/percona_mongodb
chown  mongod.mongo   /usr/bin/percona_mongodb
二:下載mongodb的安裝包;
我這裡採用了percona的版本,我選擇了使用.tar.gz包,解壓就能用!
多例項安裝的時候,建議使用.tar.gz包,清晰明瞭,個人感覺
MongoDB 分片叢集搭建
將下載好的安裝包上傳到伺服器上,然後解壓,移動到你想安裝mongodb軟體的目錄,我這裡選擇了
/data/mongodb/mongodb_sharding/software/(自定義目錄), 具體如下操作:
tar  -xf percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz
[root@beijing-fuli-hadoop-04 mongodb]# ll
total 119428
drwxrwxr-x 3 root root      4096 Sep  2 09:13 percona-server-mongodb-4.0.12-6
-rw-r--r-- 1 root root 122286692 Dec 10 11:52 percona-server-mongodb-4.0.12-6-centos6-x86_64.tar.gz
[root@beijing-fuli-hadoop-04 mongodb]#  cd  percona-server-mongodb-4.0.12-6
[root@beijing-fuli-hadoop-04 mongodb]#mv  bin  /data/mongodb/mongodb_sharding/software/
三:修改配置檔案
一定注意配置項和具體值之間需要有空格例如:clusterRole: shardsvr
冒號和shardsvr之間需要有空格,不能設定成clusterRole:shardsvr !
報錯:Error parsing YAML config file: yaml-cpp: error at line 18, column 4: end of map not found
1.修改分片節點的配置檔案
如下檔案是27019的分片節點的mongodb的配置檔案
mongod.conf
然後依次copy對應的別的埠的對應目錄下,並且修改相關內容
cp  mongod.conf   /data/mongodb/mongodb_sharding/mongodb/27020/
cp  mongod.conf   /data/mongodb/mongodb_sharding/mongodb/27021/
需要修改1.埠,2.副本集的名字,3.相關目錄,因為我的都是以(ip+埠)來區分的,所以可以直接批次替換:
sed -i 's/27019/27020/g' /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf
sed -i 's/27019/27021/g' /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf
然後copy到各個機器對應目錄下:
scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf   mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf   mongod@10.9.21.179`pwd`

scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf   mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf   mongod@10.9.21.179`pwd`

scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf   mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf   mongod@10.9.21.179`pwd`
2.修改config server的配置檔案,它與mongodbf副本集的區別是 clusterRole: configsvr和replSetName:configserver27018,同時修改路徑和埠號;
mongod.conf
然後依次scp到別的機器上的特定目錄下
scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf   mongod@10.9.21.178`pwd`
scp /data/mongodb/mongodb_sharding/config_server/config/mongod.conf     mongod@10.9.21.179`pwd`
3.修改mongos的配置檔案:
mongod.conf
四:生成秘鑰檔案
注意這個mongodb.key檔案需要copy到mongodb mongos 以及config server的對應目錄中,並且許可權需要保證為600!我的這次安裝percona mongodb 4.0版本需要先不開啟驗證,也就是你可以在你搭建好整個架構後再生成key檔案!
[root@beijing-fuli-hadoop-02 mongodb]# openssl   rand -base64 756 >/data/mongodb/config/mongodb.key
需要保證mongodb.key的許可權為 600,否則啟動會報錯:
permissions on /export/mongodb/keyfile are too open
這是因為mongo key檔案許可權過大造成的 !
具體關於file key的相關操作如下(只演示了21.114機器上的操作):
1.生成file key
[mongod@beijing-fuli-hadoop-04 config]$ openssl   rand -base64 756 >/data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key
2.複製file key到mongodb的27020和27021對應目錄下:
cp  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key  /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key
cp  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key  /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key
3.複製file key到mongos的對應目錄下:
cp  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key  /data/mongodb/mongodb_sharding/mongos/config/mongodb.key
4.複製file key到config server的對應目錄下:
cp  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key   /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
5.修改檔案的許可權:
chmod 600  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key
chmod 600  /data/mongodb/mongodb_sharding/mongodb/27020/config/mongodb.key
chmod 600  /data/mongodb/mongodb_sharding/mongodb/27021/config/mongodb.key
chmod 600  /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
chmod 600  /data/mongodb/mongodb_sharding/mongos/config/mongodb.key
6.把file key傳給其餘機器;
scp  mongodb.key mongod@10.9.21.179:`pwd`
scp  mongodb.key mongod@10.9.21.178:`pwd`
然後再在21.178和21.179上的操作和之前21.114上一樣;
五:啟動服務:
啟動之前最好先註釋安全驗證相關的引數,mongod、mongos、以及config server都註釋掉,最後搭建成功再把註釋去掉
5.1:啟動mongodb例項(在在21.144和178以及179都啟動來之後然後再啟動config server)
這裡我的shard節點是副本集的結構,所以需要初始化成副本集!
/data/mongodb/mongodb_sharding/software/bin/mongod -f  /data/mongodb/mongodb_sharding/mongodb/27019/config/mongod.conf
/data/mongodb/mongodb_sharding/software/bin/mongod -f  /data/mongodb/mongodb_sharding/mongodb/27020/config/mongod.conf
/data/mongodb/mongodb_sharding/software/bin/mongod -f  /data/mongodb/mongodb_sharding/mongodb/27021/config/mongod.conf
注意: percona 4.0.12 的版本需要首先把安全的引數註釋,否則你會報錯:
requires authentication而無法進行任何操作 !新版本的MongoDB 服務端開啟安全檢查之前,至少需要有一個管理員賬號,admin 資料庫中的使用者都被視為管理員,percona 3.4版本以及社
區版本的4.0版本就不需要保證有一個管理員賬號就可以初始化成功!
#security:
#   keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
#   authorization: enabled
初始化成副本集(先啟動的就是主節點)如下是三個副本集節點的初始化命令:
rs.initiate({_id:'s1092111427019',members: [{ _id: 0 , host: "10.9.21.178:27019"},{ _id: 1 , host: "10.9.21.179:27019"},{ _id: 2 , host: "10.9.21.114:27019"}]})
rs.initiate({_id:'s1092111427020',members: [{ _id: 0 , host: "10.9.21.178:27020"},{ _id: 1 , host: "10.9.21.179:27020"},{ _id: 2 , host: "10.9.21.114:27020"}]})
rs.initiate({_id:'s1092111427021',members: [{ _id: 0 , host: "10.9.21.178:27021"},{ _id: 1 , host: "10.9.21.179:27021"},{ _id: 2 , host: "10.9.21.114:27021"}]})
建立管理員賬號:
use  admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.2:啟動config server 副本集例項:
/data/mongodb/mongodb_sharding/software/bin/mongod -f  /data/mongodb/mongodb_sharding/config_server/config/mongod.conf
初始化副本集,也需要先關閉安全驗證相關的引數!
rs.initiate({_id:'configserver27018',members: [{ _id: 0 , host: "10.9.21.178:27018"},{ _id: 1 , host: "10.9.21.179:27018"},{ _id: 2 , host: "10.9.21.114:27018"}]})
5.3:啟動mongos 例項,並新增分片節點:
/data/mongodb/mongodb_sharding/software/bin/mongos -f /data/mongodb/mongodb_sharding/mongos/config/mongod.conf
5.3.1.登入mongos
/data/mongodb/mongodb_sharding/software/bin/mongo --port=27017 --host=10.9.21.114
5.3.2 新增副本集分片:
sh.addShard('s1092111427019/10.9.21.114:27019,10.9.21.179:27019,10.9.21.178:27019')
sh.addShard('s1092111427020/10.9.21.114:27020,10.9.21.179:27020,10.9.21.178:27020')
sh.addShard('s1092111427021/10.9.21.114:27021,10.9.21.179:27021,10.9.21.178:27021')
5.3.3 建立管理員賬號:
use  admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.3.4最後把所有的shard、config server、以及mongos配置中都開啟驗證,也就是把註釋去掉
然後啟動服務:
security:
  keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
  authorization: enabled
六:操作驗證:
建立庫 liuhe
mongos> use liuhe
switched to db liuhe
資料庫啟動分片,這樣才能對資料庫liuhe下的集合做分片!
mongos> sh.enableSharding("liuhe");
檢視分片狀態:可以看到liuhe這個庫的主分片是 s1092111427021,當你建立的沒有分片的集合的時候,就會建立到s1092111427021分片上!注意:主分片與副本集中的主節點不同:主分片指的是組成分片的整個副本集(當然如果你的分片是個單點的那麼他就是單個的mongodb)。而副本集中的主節點是指副本集中能夠處理寫請求的單臺伺服器
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5df6063235d6298affb1bc49")
}
shards:
{  "_id" : "s1092111427019",  "host" : "s1092111427019/10.9.21.114:27019,10.9.21.178:27019,10.9.21.179:27019",  "state" : 1 }
{  "_id" : "s1092111427020",  "host" : "s1092111427020/10.9.21.114:27020,10.9.21.178:27020,10.9.21.179:27020",  "state" : 1 }
{  "_id" : "s1092111427021",  "host" : "s1092111427021/10.9.21.114:27021,10.9.21.178:27021,10.9.21.179:27021",  "state" : 1 }
active mongoses:
"4.0.12-6" : 1
autosplit:
Currently enabled: yes
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:
{  "_id" : "config",  "primary" : "config",  "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
s1092111427019  1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : s1092111427019 Timestamp(1, 0)
{  "_id" : "he",  "primary" : "s1092111427021",  "partitioned" : true,  "version" : {  "uuid" : UUID("3e8f2fda-d08c-43be-a0ab-0e2031afc183"),  "lastMod" : 1 } }
 {  "_id" : "liuhe",  "primary" : "s1092111427021",  "partitioned" : true,  "version" : {  "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"),  "lastMod" : 1 } }
{  "_id" : "liuwenhe",  "primary" : "s1092111427020",  "partitioned" : true,  "version" : {  "uuid" : UUID("af30c5bd-9389-482f-95f9-fbb0438baa21"),  "lastMod" : 1 } }
建立集合並開啟分片過程:
1.建立資料庫,直接use 即可,沒有的話,如果你建立集合了,他就自動建立了!
use liuwenhe
2.插入資料,如果hezi集合不存在,則自動建立
for (var i = 0; i < 100; i++) {     db.hezi.insert({name: i}); }
3.為hezi集合的id列新增索引,因為如果要以name列作為分片鍵,需要有索引;
如果集合是空的,可以不建立索引直接進行下一步的分片,會自動建立索引;如果集合不為空,必須為分片建建立索引才行!,如果你要以hash規則分片,需要先建立hash索引!
mongos> db.hezi.createIndex({"name":1})
mongos> db.hh.createIndex({name:'hashed'});  建立hash索引
4.為資料庫開啟分片:
mongos> sh.enableSharding("liuwenhe");
5.開啟集合hezi的分片!
1:升序,-1降序,hashed:雜湊分佈
sh.shardCollection("liuwenhe.hezi",{name:1})                        ----基於值的分片
sh.shardCollection("liuwenhe.hezi", { "name" : "hashed" })    ----hash規則分片
6.檢視集合是否開啟分片:
mongos> db.hezi.stats().sharded
true
7.sh.status() 檢視分片的資訊:
可以看到liuhe庫的主分片是s1092111427021,然後liuhe.hezi這個集合的分片鍵是name列升序,liuhe.hezi這個集合目前就1個chunk,在s1092111427021節點上,所以這個時候你去別的節點,例如s1092111427020上看,是沒有這個庫和這個集合的,當你向liuhe.hezi插入資料,直到觸發發生chunk遷移之後,這時候在別的分片才會有可能有這個集合!
mongos>sh.status()
{  "_id" : "liuwehehe",  "primary" : "s1092111427021",  "partitioned" : true,  "version" : {  "uuid" : UUID("46373baa-3f93-42c3-a7fd-51225ef00636"),  "lastMod" : 1 } }
liuwenhe.hezi
shard key: { "name" : 1 }
unique: true
balancing: true
chunks:
s1092111427021  1
{ "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : s1092111427021 Timestamp(1, 0)
8.當資料超過1個chunk之後,均勻分佈在多個節點上,如下所示:
不斷插入資料,直到觸發chunk遷移:
for (var i = 0; i < 1000000000000000; i++) {     db.hezi.insert({name: i}); }
不斷檢視分片叢集狀態:
mongos>sh.status()
liuwenhe.hezi
shard key: { "name" : 1 }
unique: false
balancing: true
chunks:
s1092111427019  20
s1092111427020  19
s1092111427021  20
至此生產標準的分片架構搭建完畢。。。。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2669567/,如需轉載,請註明出處,否則將追究法律責任。

相關文章