溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mongodb 分片集群搭建

發(fā)布時(shí)間:2020-08-04 19:06:18 來(lái)源:ITPUB博客 閱讀:244 作者:賀子_DBA時(shí)代 欄目:關(guān)系型數(shù)據(jù)庫(kù)
環(huán)境介紹:
10.9.21.178
10.9.21.179
10.9.21.114
MongoDB sharding簡(jiǎn)介三種角色介紹:
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/
mongodb 分片集群搭建 mongodb 分片集群搭建
將下載好的安裝包上傳到服務(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的配置文件
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);
mongodb 分片集群搭建
然后依次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的配置文件:
mongodb 分片集群搭建
四:生成秘鑰文件
注意這個(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)搭建完畢。。。。
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI