mongodb 分片集群搭建
環(huán)境介紹:
10.9.21.178
10.9.21.179
10.9.21.114
1.數(shù)據(jù)分片(Shards)
用來(lái)保存數(shù)據(jù),保證數(shù)據(jù)的高可用性和一致性??梢允且粋€(gè)單獨(dú)的mongod實(shí)例,也可以是
一個(gè)副本集。在生產(chǎn)環(huán)境下Shard一般是一個(gè)Replica Set,以防止該數(shù)據(jù)片的單點(diǎn)故障。
可以將所有shard的副本集放在一個(gè)
服務(wù)器多個(gè)mongodb實(shí)例中。
sharding的每個(gè)node的database中的集合可以是分片也可以不分片,每個(gè)db都有一個(gè)
primary shard,未分片的集合就是存在其各自的primary shard中的。
2.查詢(xún)路由 mongos(Query Routers)
路由就是mongos的實(shí)例,客戶(hù)端直接連接mongos,由mongos把讀寫(xiě)請(qǐng)求路由到指定的
Shard上去。mongos第一次啟動(dòng)或者關(guān)掉重啟就會(huì)從 config server加載配置信息,以后如
果配置服務(wù)器信息變化會(huì)通知到所有的 mongos 更新自己的狀態(tài),這樣 mongos就能繼續(xù)
準(zhǔn)確路由。一個(gè)Sharding集群,可以有一個(gè)mongos,也可以為每個(gè)App Server配置一
個(gè)mongos以減輕路由壓力,注意這里的mongos并不需要配置為rs,因?yàn)橹皇莻€(gè)路由,并不存儲(chǔ)數(shù)據(jù),配置多個(gè)mongos的意思是配置多個(gè)單獨(dú)的mongos實(shí)例。理論上可以部署無(wú)數(shù)個(gè)mongos路由,但是要考慮到config server的壓力!
3.配置服務(wù)器(Config servers)
保存集群的元數(shù)據(jù)(metadata),包含各個(gè)Shard的路由規(guī)則。3.2版本以后config server可以配置為副本集,3.4以后config server必須配置為副本集。生產(chǎn)上建議config server的rs至少要有3個(gè)副本集成員。
整體規(guī)劃:
其中mongos 的如下(生產(chǎn)上需要?jiǎng)?chuàng)建多個(gè)mongos,然后借助haproxy 或者lvs做高可用):
10.9.21.114 27022
其中config server的副本集架構(gòu)如下:
10.9.21.178 27018
10.9.21.179 27018
10.9.21.114 27018
分片節(jié)點(diǎn)(3個(gè)分片節(jié)點(diǎn),都是副本集架構(gòu)):
分片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
具體搭建過(guò)程:
一:目錄創(chuàng)建:
1.關(guān)于分片節(jié)點(diǎn)的目錄,注意需要在114和178以及179都要?jiǎng)?chuàng)建!
1)關(guān)于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)關(guān)于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)關(guān)于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.關(guān)于mongos的相關(guān)目錄創(chuàng)建:
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.關(guān)于config server的相關(guān)目錄的創(chuàng)建:
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.修改目錄的數(shù)組
chown -R mongod.mongod /data/mongodb/mongodb_sharding/
5.創(chuàng)建安裝mongodb軟件的目錄:
mkdir -p /usr/bin/percona_mongodb
chown mongod.mongo /usr/bin/percona_mongodb
二:下載mongodb的安裝包;
我這里采用了percona的版本,我選擇了使用.tar.gz包,解壓就能用!
多實(shí)例安裝的時(shí)候,建議使用.tar.gz包,清晰明了,個(gè)人感覺(jué)
https://www.percona.com/downloads/percona-server-mongodb-4.0/LATEST/
將下載好的安裝包上傳到服務(wù)器上,然后解壓,移動(dòng)到你想安裝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/
三:修改配置文件
一定注意配置項(xiàng)和具體值之間需要有空格例如:clusterRole: shardsvr
冒號(hào)和shardsvr之間需要有空格,不能設(shè)置成clusterRole:shardsvr !
報(bào)錯(cuò):Error parsing YAML config file: yaml-cpp: error at line 18, column 4: end of map not found
1.修改分片節(jié)點(diǎn)的配置文件
如下文件是27019的分片節(jié)點(diǎn)的mongodb的配置文件
然后依次copy對(duì)應(yīng)的別的端口的對(duì)應(yīng)目錄下,并且修改相關(guān)內(nèi)容
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27020/
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27021/
需要修改1.端口,2.副本集的名字,3.相關(guān)目錄,因?yàn)槲业亩际且?ip+端口)來(lái)區(qū)分的,所以可以直接批量替換:
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到各個(gè)機(jī)器對(duì)應(yīng)目錄下:
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副本集的區(qū)別是 clusterRole: configsvr和replSetName:configserver27018,同時(shí)修改路徑和端口號(hào);
然后依次scp到別的機(jī)器上的特定目錄下
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的配置文件:
四:生成秘鑰文件
注意這個(gè)mongodb.key文件需要copy到mongodb mongos 以及config server的對(duì)應(yīng)目錄中,并且權(quán)限需要保證為600!我的這次安裝percona mongodb 4.0版本需要先不開(kāi)啟驗(yàn)證,也就是你可以在你搭建好整個(gè)架構(gòu)后再生成key文件!
[root@beijing-fuli-hadoop-02 mongodb]# openssl rand -base64 756 >/data/mongodb/config/mongodb.key
需要保證mongodb.key的權(quán)限為 600,否則啟動(dòng)會(huì)報(bào)錯(cuò):
permissions on /export/mongodb/keyfile are too open
這是因?yàn)閙ongo key文件權(quán)限過(guò)大造成的 !
具體關(guān)于file key的相關(guān)操作如下(只演示了21.114機(jī)器上的操作):
1.生成file key
[mongod@beijing-fuli-hadoop-04 config]$ openssl rand -base64 756 >/data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key
2.復(fù)制file key到mongodb的27020和27021對(duì)應(yīng)目錄下:
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.復(fù)制file key到mongos的對(duì)應(yīng)目錄下:
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/mongos/config/mongodb.key
4.復(fù)制file key到config server的對(duì)應(yīng)目錄下:
cp /data/mongodb/mongodb_sharding/mongodb/27019/config/mongodb.key /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
5.修改文件的權(quán)限:
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傳給其余機(jī)器;
scp mongodb.key mongod@10.9.21.179:`pwd`
scp mongodb.key mongod@10.9.21.178:`pwd`
然后再在21.178和21.179上的操作和之前21.114上一樣;
五:啟動(dòng)服務(wù):
啟動(dòng)之前最好先注釋安全驗(yàn)證相關(guān)的參數(shù),mongod、mongos、以及config server都注釋掉,最后搭建成功再把注釋去掉
5.1:啟動(dòng)mongodb實(shí)例(在在21.144和178以及179都啟動(dòng)來(lái)之后然后再啟動(dòng)config server)
這里我的shard節(jié)點(diǎn)是副本集的結(jié)構(gòu),所以需要初始化成副本集!
/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 的版本需要首先把安全的參數(shù)注釋?zhuān)駝t你會(huì)報(bào)錯(cuò):
requires authentication而無(wú)法進(jìn)行任何操作
!新版本的MongoDB 服務(wù)端開(kāi)啟安全檢查之前,至少需要有一個(gè)管理員賬號(hào),admin 數(shù)據(jù)庫(kù)中的用戶(hù)都被視為管理員,percona 3.4版本以及社
區(qū)版本的4.0版本就不需要保證有一個(gè)管理員賬號(hào)就可以初始化成功!
#security:
# keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
# authorization: enabled
初始化成副本集(先啟動(dòng)的就是主節(jié)點(diǎn))如下是三個(gè)副本集節(jié)點(diǎn)的初始化命令:
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"}]})
創(chuàng)建管理員賬號(hào):
use admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.2:啟動(dòng)config server 副本集實(shí)例:
/data/mongodb/mongodb_sharding/software/bin/mongod -f /data/mongodb/mongodb_sharding/config_server/config/mongod.conf
初始化副本集,也需要先關(guān)閉安全驗(yàn)證相關(guān)的參數(shù)!
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:?jiǎn)?dòng)mongos 實(shí)例,并添加分片節(jié)點(diǎn):
/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 創(chuàng)建管理員賬號(hào):
use admin
db.createUser(
{
user: "liuwenhe",
pwd: "liuwenhe",
roles: [ { role: "root", db: "admin" } ]
}
)
5.3.4最后把所有的shard、config server、以及mongos配置中都開(kāi)啟驗(yàn)證,也就是把注釋去掉
然后啟動(dòng)服務(wù):
security:
keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
authorization: enabled
六:操作驗(yàn)證:
創(chuàng)建庫(kù) liuhe
mongos> use liuhe
switched to db liuhe
數(shù)據(jù)庫(kù)啟動(dòng)分片,這樣才能對(duì)數(shù)據(jù)庫(kù)liuhe下的集合做分片!
mongos> sh.enableSharding("liuhe");
查看分片狀態(tài):可以看到liuhe這個(gè)庫(kù)的主分片是
s1092111427021,當(dāng)你創(chuàng)建的沒(méi)有分片的集合的時(shí)候,就會(huì)創(chuàng)建到s1092111427021分片上!注意:主分片與副本集中的主節(jié)點(diǎn)不同:主分片指的是組成分片的整個(gè)副本集(當(dāng)然如果你的分片是個(gè)單點(diǎn)的那么他就是單個(gè)的mongodb)。而副本集中的主節(jié)點(diǎn)是指副本集中能夠處理寫(xiě)請(qǐng)求的單臺(tái)服務(wù)器
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 } }
創(chuàng)建集合并開(kāi)啟分片過(guò)程:
1.創(chuàng)建數(shù)據(jù)庫(kù),直接use 即可,沒(méi)有的話,如果你創(chuàng)建集合了,他就自動(dòng)創(chuàng)建了!
use liuwenhe
2.插入數(shù)據(jù),如果hezi集合不存在,則自動(dòng)創(chuàng)建
for (var i = 0; i < 100; i++) { db.hezi.insert({name: i}); }
3.為hezi集合的id列添加索引,因?yàn)槿绻詎ame列作為分片鍵,需要有索引;
如果集合是空的,可以不創(chuàng)建索引直接進(jìn)行下一步的分片,會(huì)自動(dòng)創(chuàng)建索引;如果集合不為空,必須為分片建創(chuàng)建索引才行!,如果你要以hash規(guī)則分片,需要先創(chuàng)建hash索引!
mongos> db.hezi.createIndex({"name":1})
mongos> db.hh.createIndex({name:'hashed'}); 創(chuàng)建hash索引
4.為數(shù)據(jù)庫(kù)開(kāi)啟分片:
mongos> sh.enableSharding("liuwenhe");
5.開(kāi)啟集合hezi的分片!
1:升序,-1降序,hashed:哈希分布
sh.shardCollection("liuwenhe.hezi",{name:1}) ----基于值的分片
sh.shardCollection("liuwenhe.hezi", { "name" : "hashed" }) ----hash規(guī)則分片
6.查看集合是否開(kāi)啟分片:
mongos> db.hezi.stats().sharded
true
7.sh.status() 查看分片的信息:
可以看到liuhe庫(kù)的主分片是s1092111427021,然后liuhe.hezi這個(gè)集合的分片鍵是name列升序,liuhe.hezi這個(gè)集合目前就1個(gè)chunk,在s1092111427021節(jié)點(diǎn)上,所以這個(gè)時(shí)候你去別的節(jié)點(diǎn),例如s1092111427020上看,是沒(méi)有這個(gè)庫(kù)和這個(gè)集合的,當(dāng)你向liuhe.hezi插入數(shù)據(jù),直到觸發(fā)發(fā)生chunk遷移之后,這時(shí)候在別的分片才會(huì)有可能有這個(gè)集合!
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.當(dāng)數(shù)據(jù)超過(guò)1個(gè)chunk之后,均勻分布在多個(gè)節(jié)點(diǎn)上,如下所示:
不斷插入數(shù)據(jù),直到觸發(fā)chunk遷移:
for (var i = 0; i < 1000000000000000; i++) { db.hezi.insert({name: i}); }
不斷查看分片集群狀態(tài):
mongos>sh.status()
liuwenhe.hezi
shard key: { "name" : 1 }
unique: false
balancing: true
chunks:
s1092111427019 20
s1092111427020 19
s1092111427021 20
至此生產(chǎn)標(biāo)準(zhǔn)的分片架構(gòu)搭建完畢。。。。