最近公司的某個項(xiàng)目活躍越來越高诊赊,數(shù)據(jù)越來越多。目前考慮做mongodb的分片集群府瞄,雖然我只是個無關(guān)緊要的小菜鳥碧磅,這類工作肯定是老大去完成的,輪不到我去想如何做遵馆,但是還是要去主動學(xué)習(xí)一下的鲸郊,
參考
- [1] 博客園shyuwu的文章
首先先簡單了解一下分片集群的架構(gòu)以及各個部分的作用
mongos,數(shù)據(jù)庫集群請求的入口货邓,所有的請求都通過mongos進(jìn)行協(xié)調(diào)秆撮,不需要在應(yīng)用程序添加一個路由選擇器,mongos自己就是一個請求分發(fā)中心换况,它負(fù)責(zé)把對應(yīng)的數(shù)據(jù)請求請求轉(zhuǎn)發(fā)到對應(yīng)的shard服務(wù)器上职辨。在生產(chǎn)環(huán)境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作戈二。
config server舒裤,顧名思義為配置服務(wù)器,存儲所有數(shù)據(jù)庫元信息(路由觉吭、分片)的配置腾供。mongos本身沒有物理存儲分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存里鲜滩,配置服務(wù)器則實(shí)際存儲這些數(shù)據(jù)台腥。mongos第一次啟動或者關(guān)掉重啟就會從 config server 加載配置信息,以后如果配置服務(wù)器信息變化會通知到所有的 mongos 更新自己的狀態(tài)绒北,這樣 mongos 就能繼續(xù)準(zhǔn)確路由。在生產(chǎn)環(huán)境通常有多個 config server 配置服務(wù)器察署,因?yàn)樗鎯α朔制酚傻脑獢?shù)據(jù)闷游,防止數(shù)據(jù)丟失!
shard贴汪,分片(sharding)是指將數(shù)據(jù)庫拆分脐往,將其分散在不同的機(jī)器上的過程。將數(shù)據(jù)分散到不同的機(jī)器上扳埂,不需要功能強(qiáng)大的服務(wù)器就可以存儲更多的數(shù)據(jù)和處理更大的負(fù)載业簿。基本思想就是將集合切成小塊阳懂,這些塊分散到若干片里梅尤,每個片只負(fù)責(zé)總數(shù)據(jù)的一部分柜思,最后通過一個均衡器來對各個分片進(jìn)行均衡(數(shù)據(jù)遷移)。
replica set巷燥,中文翻譯副本集赡盘,其實(shí)就是shard的備份,防止shard掛掉之后數(shù)據(jù)丟失缰揪。復(fù)制提供了數(shù)據(jù)的冗余備份陨享,并在多個服務(wù)器上存儲數(shù)據(jù)副本,提高了數(shù)據(jù)的可用性钝腺, 并可以保證數(shù)據(jù)的安全性抛姑。
第一步先準(zhǔn)備好3臺機(jī)器注明:我的內(nèi)網(wǎng)地址分別為172.24.148.200,172.24.148.201艳狐,172.24.148.202
安裝mongodb
我用的centos定硝,安裝的是4.0.9版本的mongodb
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz // 下載mongodb
tar -zxvf mongodb-linux-x86_64-4.0.9.tgz // 解壓mongodb
mv mongodb-linux-x86_64-4.0.9/ /usr/local/mongodb // 移到自己覺得合適的位置
mkdir -p /data/db // 創(chuàng)建數(shù)據(jù)庫存放目錄
mkdir -p /data/config // 創(chuàng)建配置節(jié)點(diǎn)目錄
mkdir -p /data/mongos // 創(chuàng)建mongos節(jié)點(diǎn)的數(shù)據(jù)存放目錄(其中一臺機(jī)器創(chuàng)建就好)
創(chuàng)建keyfile文件,用來分片集群的驗(yàn)證
openssl rand -base64 666 > /usr/local/mongodb/mongodb-keyfile
chmod 600 /usr/local/mongodb/mongodb-keyfile // 該key的權(quán)限必須是600僵驰;也可改為400
在/data/db/目錄創(chuàng)建第一個分片副本集的配置文件mongodb.conf
cd /data/db
vim mongodb.conf
把以下配置寫進(jìn)mongodb.conf并保存注明:需要注意的是副本集名稱喷斋,三臺機(jī)器的配置文件必須一樣
# 端口
port = 27017
# 數(shù)據(jù)目錄
dbpath = /data/db/
# 日志路徑
logpath = /data/db/mongo.log
# 日志輸出方式
logappend = true
# 允許所有ip訪問 建議配置成 bind_ip=localhost,172.21.148.200(內(nèi)網(wǎng)地址,每個配置文件不一樣)蒜茴,避免這個分片副本集直接暴露到外網(wǎng)
bind_ip = 0.0.0.0
# 副本集名稱
replSet = gdtest
# 后臺啟動
fork = true
# 開啟驗(yàn)證
auth = true
# 驗(yàn)證所需的keyfile文件
keyFile = /usr/local/mongodb/mongodb-keyfile
啟動mongodb注意:三臺機(jī)器都要啟動
mongod --config ./mongodb.conf // 注意這是在/data/db/目錄下執(zhí)行的
初始化第一個分片的副本集星爪,mongdb本身提供了api去執(zhí)行
- 進(jìn)入其中一臺mongodb
mongo --port 27017 // 進(jìn)入其中一臺機(jī)器的mongodb
- 初始化第一個分片副本集
var rsconf = { // 定義初始化的設(shè)置
_id:'config',
members: [
{
_id:3,
host:'172.24.148.202:27017'
},
{
_id:2,
host:'172.24.148.201:27017'
},
{
_id:1,
host:'172.24.148.200:27017'
}
]
}
rs.initiate(rsconf); // 初始化 當(dāng)看到ok字段的值為1事,就代表成功了
以上就創(chuàng)建好了第一個分片的副本集了粉私,但是目前還不能稱之為分片集群顽腾,只能稱為為副本集(或者復(fù)制集),因?yàn)槲覀冞€缺少配置服務(wù)器副本集和mogos的代理服務(wù)诺核,下面我們和上面同樣的順序(注明:不同的操作目錄)
來創(chuàng)建配置服務(wù)器的副本集抄肖。
在/data/db/目錄創(chuàng)建第一個分片副本集的配置文件config.conf
cd /data/config
vim config.conf
把以下配置寫進(jìn)config.conf并保存
port = 27019
dbpath = /data/config/
logpath = /data/config/mongod.log
fork = true
logappend = true
bind_ip = 0.0.0.0
replSet = config // 三臺的配置服務(wù)節(jié)點(diǎn)的副本集名稱必須一樣,我這里用了config
configsvr = true // 注意這里必須注明這個節(jié)點(diǎn)是配置服務(wù)節(jié)點(diǎn)
wiredTigerCacheSizeGB = 1 //我的機(jī)器配置較低窖杀,所以這里設(shè)置小一點(diǎn)
auth = true
keyFile = /usr/local/mongodb/mongodb-keyfile
啟動配置節(jié)點(diǎn) 注意:3臺機(jī)器都要啟動
mongod --config ./config.conf
初始化配置節(jié)點(diǎn)副本集
var rsconf = { // 定義初始化的設(shè)置
_id:'config',
members: [
{
_id:3,
host:'172.24.148.202:27017'
},
{
_id:2,
host:'172.24.148.201:27017'
},
{
_id:1,
host:'172.24.148.200:27017'
}
]
}
rs.initiate(rsconf); // 初始化 當(dāng)看到ok字段的值為1事漓摩,就代表成功了
以上3臺配置節(jié)點(diǎn)的副本集就搭建好了,目前還差最后一步入客,起一個mongos路由服務(wù)進(jìn)程,
mongos進(jìn)程起一個就可以了(你也可以起兩個或這多個做備用)管毙,在創(chuàng)建了 /data/mongos/目錄的機(jī)器上運(yùn)行mongos路由服務(wù)
把一下配置寫進(jìn) /data/mongos/mongos.conf文件
port = 27009
fork = true
logpath = /data/mongos/mongos.log
bind_ip = 0.0.0.0
# 3臺配置服務(wù)器節(jié)點(diǎn)的地址和端口
configdb = config/172.24.148.201:27019,172.24.148.202:27019,172.24.148.202:27019
keyFile = /usr/local/mongodb/mongodb-keyfile
運(yùn)行mongos服務(wù)
mongos --config ./mongos.conf
進(jìn)入mongos服務(wù)把一開始創(chuàng)建的第一個分片集群加上
mongo --port 27009
sh.addShard("gdtest/172.24.148.201:27017,172.24.148.202:27017,172.24.148.202:27017")
以上所有步驟執(zhí)行成功就成功創(chuàng)建了只有一個分片的mongodb分片集群啦,但是目前應(yīng)用程序連接到mongos路由服務(wù)器并不能使用分片機(jī)制桌硫,還需要在程序里設(shè)置分片配置夭咬,讓分片生效。
##use到admin庫下執(zhí)行铆隘,否則會報(bào)錯
mongos>use admin
switched to db admin
mongos> sh.enableSharding("test") // 激活分片
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1555544056, 6258),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1555544056, 6258)
}
mongos> sh.shardCollection("test.persons", { _id: 1}) // 我這里是用_id去做片建卓舵,如果用其它字段當(dāng)片建,必須先建索引
{
"collectionsharded" : "test.persons",
"collectionUUID" : UUID("da124f00-1ddd-445d-8bb9-d443a4b113ac"),
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1555544056, 6427),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1555544056, 6427)
}