環(huán)境介紹:
10.9.21.178
10.9.21.179
10.9.21.114
MongoDB sharding簡介三種角色介紹:
1.數(shù)據(jù)分片(Shards)
用來保存數(shù)據(jù),保證數(shù)據(jù)的高可用性和一致性??梢允且粋€單獨的mongod實例,也可以是
一個副本集。在生產(chǎn)環(huán)境下Shard一般是一個Replica Set,以防止該數(shù)據(jù)片的單點故障。
可以將所有shard的副本集放在一個
服務器多個mongodb實例中。
sharding的每個node的database中的集合可以是分片也可以不分片,每個db都有一個
primary shard,未分片的集合就是存在其各自的primary shard中的。
2.查詢路由 mongos(Query Routers)
路由就是mongos的實例,客戶端直接連接mongos,由mongos把讀寫請求路由到指定的
Shard上去。mongos第一次啟動或者關掉重啟就會從 config server加載配置信息,以后如
果配置服務器信息變化會通知到所有的 mongos 更新自己的狀態(tài),這樣 mongos就能繼續(xù)
準確路由。一個Sharding集群,可以有一個mongos,也可以為每個App Server配置一
個mongos以減輕路由壓力,注意這里的mongos并不需要配置為rs,因為只是個路由,并不存儲數(shù)據(jù),配置多個mongos的意思是配置多個單獨的mongos實例。理論上可以部署無數(shù)個mongos路由,但是要考慮到config server的壓力!
3.配置服務器(Config servers)
保存集群的元數(shù)據(jù)(metadata),包含各個Shard的路由規(guī)則。3.2版本以后config server可以配置為副本集,3.4以后config server必須配置為副本集。生產(chǎn)上建議config server的rs至少要有3個副本集成員。
整體規(guī)劃:
其中mongos 的如下(生產(chǎn)上需要創(chuàng)建多個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
分片節(jié)點(3個分片節(jié)點,都是副本集架構):
分片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
具體搭建過程:
一:目錄創(chuàng)建:
1.關于分片節(jié)點的目錄,注意需要在114和178以及179都要創(chuàng)建!
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的相關目錄創(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.關于config server的相關目錄的創(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包,解壓就能用!
多實例安裝的時候,建議使用.tar.gz包,清晰明了,個人感覺
https://www.percona.com/downloads/percona-server-mongodb-4.0/LATEST/
將下載好的安裝包上傳到服務器上,然后解壓,移動到你想安裝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.修改分片節(jié)點的配置文件
如下文件是27019的分片節(jié)點的mongodb的配置文件
然后依次copy對應的別的端口的對應目錄下,并且修改相關內(nèi)容
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27020/
cp mongod.conf /data/mongodb/mongodb_sharding/mongodb/27021/
需要修改1.端口,2.副本集的名字,3.相關目錄,因為我的都是以(ip+端口)來區(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到各個機器對應目錄下:
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,同時修改路徑和端口號;
然后依次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的配置文件:
四:生成秘鑰文件
注意這個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上一樣;
五:啟動服務:
啟動之前最好先注釋安全驗證相關的參數(shù),mongod、mongos、以及config server都注釋掉,最后搭建成功再把注釋去掉
5.1:啟動mongodb實例(在在21.144和178以及179都啟動來之后然后再啟動config server)
這里我的shard節(jié)點是副本集的結構,所以需要初始化成副本集!
/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ù)注釋,否則你會報錯:
requires authentication而無法進行任何操作
!新版本的MongoDB 服務端開啟安全檢查之前,至少需要有一個管理員賬號,admin 數(shù)據(jù)庫中的用戶都被視為管理員,percona 3.4版本以及社
區(qū)版本的4.0版本就不需要保證有一個管理員賬號就可以初始化成功!
#security:
# keyFile: /data/mongodb/mongodb_sharding/config_server/config/mongodb.key
# authorization: enabled
初始化成副本集(先啟動的就是主節(jié)點)如下是三個副本集節(jié)點的初始化命令:
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)建管理員賬號:
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
初始化副本集,也需要先關閉安全驗證相關的參數(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:啟動mongos 實例,并添加分片節(jié)點:
/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)建管理員賬號:
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
六:操作驗證:
創(chuàng)建庫 liuhe
mongos> use liuhe
switched to db liuhe
數(shù)據(jù)庫啟動分片,這樣才能對數(shù)據(jù)庫liuhe下的集合做分片!
mongos> sh.enableSharding("liuhe");
查看分片狀態(tài):可以看到liuhe這個庫的主分片是
s1092111427021,當你創(chuàng)建的沒有分片的集合的時候,就會創(chuàng)建到s1092111427021分片上!注意:主分片與副本集中的主節(jié)點不同:主分片指的是組成分片的整個副本集(當然如果你的分片是個單點的那么他就是單個的mongodb)。而副本集中的主節(jié)點是指副本集中能夠處理寫請求的單臺服務器
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)建集合并開啟分片過程:
1.創(chuàng)建數(shù)據(jù)庫,直接use 即可,沒有的話,如果你創(chuàng)建集合了,他就自動創(chuàng)建了!
use liuwenhe
2.插入數(shù)據(jù),如果hezi集合不存在,則自動創(chuàng)建
for (var i = 0; i < 100; i++) { db.hezi.insert({name: i}); }
3.為hezi集合的id列添加索引,因為如果要以name列作為分片鍵,需要有索引;
如果集合是空的,可以不創(chuà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ù)庫開啟分片:
mongos> sh.enableSharding("liuwenhe");
5.開啟集合hezi的分片!
1:升序,-1降序,hashed:哈希分布
sh.shardCollection("liuwenhe.hezi",{name:1}) ----基于值的分片
sh.shardCollection("liuwenhe.hezi", { "name" : "hashed" }) ----hash規(guī)則分片
6.查看集合是否開啟分片:
mongos> db.hezi.stats().sharded
true
7.sh.status() 查看分片的信息:
可以看到liuhe庫的主分片是s1092111427021,然后liuhe.hezi這個集合的分片鍵是name列升序,liuhe.hezi這個集合目前就1個chunk,在s1092111427021節(jié)點上,所以這個時候你去別的節(jié)點,例如s1092111427020上看,是沒有這個庫和這個集合的,當你向liuhe.hezi插入數(shù)據(jù),直到觸發(fā)發(fā)生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.當數(shù)據(jù)超過1個chunk之后,均勻分布在多個節(jié)點上,如下所示:
不斷插入數(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)標準的分片架構搭建完畢。。。。
新聞名稱:mongodb分片集群搭建
轉載注明:
http://weahome.cn/article/pedepi.html