Centos7 MongoDB(分片+副本)集群搭建

相關(guān)概念

搭建集群之前需要了解幾個(gè)概念:路由枯饿,分片、副本集搔扁、配置服務(wù)器等蟋字。

  • mongos,數(shù)據(jù)庫集群請求的入口苛聘,所有的請求都通過mongos進(jìn)行協(xié)調(diào),不需要在應(yīng)用程序添加一個(gè)路由選擇器焰盗,mongos自己就是一個(gè)請求分發(fā)中心咒林,它負(fù)責(zé)把對應(yīng)的數(shù)據(jù)請求請求轉(zhuǎn)發(fā)到對應(yīng)的shard服務(wù)器上垫竞。在生產(chǎn)環(huán)境通常有多mongos作為請求的入口蛀序,防止其中一個(gè)掛掉所有的mongodb請求都沒有辦法操作。
  • shard活烙,分片(sharding)是指將數(shù)據(jù)庫拆分徐裸,將其分散在不同的機(jī)器上的過程。將數(shù)據(jù)分散到不同的機(jī)器上啸盏,不需要功能強(qiáng)大的服務(wù)器就可以存儲更多的數(shù)據(jù)和處理更大的負(fù)載重贺。基本思想就是將集合切成小塊回懦,這些塊分散到若干片里气笙,每個(gè)片只負(fù)責(zé)總數(shù)據(jù)的一部分,最后通過一個(gè)均衡器來對各個(gè)分片進(jìn)行均衡(數(shù)據(jù)遷移)怯晕。
  • replica set(副本集)潜圃,其實(shí)就是shard的備份谭期,防止shard掛掉之后數(shù)據(jù)丟失吧凉。復(fù)制提供了數(shù)據(jù)的冗余備份阀捅,并在多個(gè)服務(wù)器上存儲數(shù)據(jù)副本也搓,提高了數(shù)據(jù)的可用性傍妒, 并可以保證數(shù)據(jù)的安全性颤练。
  • 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)境通常有多個(gè) config server 配置服務(wù)器寥闪,因?yàn)樗鎯α朔制酚傻脑獢?shù)據(jù)疲憋,防止數(shù)據(jù)丟失缚柳!
  • 仲裁者(Arbiter)秋忙,是復(fù)制集中的一個(gè)MongoDB實(shí)例灰追,它并不保存數(shù)據(jù)弹澎。仲裁節(jié)點(diǎn)使用最小的資源并且不要求硬件設(shè)備苦蒿,不能將Arbiter部署在同一個(gè)數(shù)據(jù)集節(jié)點(diǎn)中刽肠,可以部署在其他應(yīng)用服務(wù)器或者監(jiān)視服務(wù)器中,也可部署在單獨(dú)的虛擬機(jī)中惫撰。為了確保復(fù)制集中有奇數(shù)的投票成員(包括primary)厨钻,需要添加仲裁節(jié)點(diǎn)做為投票坚嗜,否則primary不能運(yùn)行時(shí)不會自動切換primary苍蔬。

簡單了解之后,我們可以這樣總結(jié)一下俺猿,應(yīng)用請求mongos來操作mongodb的增刪改查押袍,配置服務(wù)器存儲數(shù)據(jù)庫元信息谊惭,并且和mongos做同步圈盔,數(shù)據(jù)最終存入在shard(分片)上驱敲,為了防止數(shù)據(jù)丟失同步在副本集中存儲了一份,仲裁在數(shù)據(jù)存儲到分片的時(shí)候決定存儲到哪個(gè)節(jié)點(diǎn)便锨。

服務(wù)器規(guī)劃

服務(wù)器(192.168.0.111) 服務(wù)器(192.168.0.112) 服務(wù)器(192.168.0.217) 端口
mongos mongos mongos 20000
config server config server config server 21000
shard server1 主節(jié)點(diǎn) shard server1 仲裁 shard server1 副節(jié)點(diǎn) 27001
shard server2 副節(jié)點(diǎn) shard server2 主節(jié)點(diǎn) shard server2 仲裁 27002
shard server3 仲裁 shard server3 副節(jié)點(diǎn) shard server3 主節(jié)點(diǎn) 27003

集群搭建

1、安裝mongodb
#下載
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz

#解壓
tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/

#進(jìn)去解壓位置
cd /usr/local/

#改名
mv mongodb-linux-x86_64-3.4.6  mongodb

#分別在機(jī)器上建立conf吱殉、mongos、config稿湿、shard1饺藤、shard2涕俗、shard3六個(gè)目錄再姑,(每臺服務(wù)器根據(jù)部署情況創(chuàng)建相關(guān)目錄)
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log   #因?yàn)閙ongos不存儲數(shù)據(jù)元镀,只需要建立日志文件目錄即可
mkdir -p /usr/local/mongodb/config/{data,log}
mkdir -p /usr/local/mongodb/shard{1,2,3}/{data,log}


#配置環(huán)境變量
vim /etc/profile
#內(nèi)容
export PATH=$PATH:/usr/local/mongodb/bin

#使立即生效
source /etc/profile
2凹联、config server配置服務(wù)器

mongodb3.4以后要求配置服務(wù)器也創(chuàng)建副本集蔽挠,不然集群搭建不成功澳淑。

vi /usr/local/mongodb/conf/config.conf

## 配置文件內(nèi)容
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true
 
bind_ip = 0.0.0.0
port = 21000
fork = true
 
#declare this is a config db of a cluster;
configsvr = true

#副本集名稱
replSet=configs
 
#設(shè)置最大連接數(shù)
maxConns=20000

啟動三臺服務(wù)器的config server

mongod -f /usr/local/mongodb/conf/config.conf

登錄任意一臺配置服務(wù)器杠巡,初始化配置副本集

#連接
mongo --port 21000
#config變量
config = {
...    _id : "configs",
...     members : [
...         {_id : 0, host : "192.168.0.111:21000" },
...         {_id : 1, host : "192.168.0.112:21000" },
...         {_id : 2, host : "192.168.0.217:21000" }
...     ]
... }

#初始化副本集
rs.initiate(config)

其中氢拥,"_id" : "configs"應(yīng)與配置文件中配置的 replSet(副本集名稱) 一致嫩海,"members" 中的 "host" 為三個(gè)節(jié)點(diǎn)的 ip 和 port

3叁怪、配置分片副本集(三臺機(jī)器)

3.1奕谭、設(shè)置第一個(gè)分片副本集

#編寫配置文件
vi /usr/local/mongodb/conf/shard1.conf

#配置文件內(nèi)容
#——————————————–
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true

bind_ip = 0.0.0.0
port = 27001
fork = true
 
#打開web監(jiān)控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard1
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設(shè)置最大連接數(shù)
maxConns=20000

啟動三臺服務(wù)器的shard1 server

mongod -f /usr/local/mongodb/conf/shard1.conf

登陸任意一臺服務(wù)器,初始化副本集

#登錄
mongo --port 27001

#使用admin數(shù)據(jù)庫
use admin

#定義副本集配置官册,第三個(gè)節(jié)點(diǎn)的 "arbiterOnly":true 代表其為仲裁節(jié)點(diǎn)混驰。
config = {
...    _id : "shard1",
...     members : [
...         {_id : 0, host : "192.168.0.111:27001" },
...         {_id : 1, host : "192.168.0.112:27001" , arbiterOnly: true },
...         {_id : 2, host : "192.168.0.217:27001" }
...     ]
... }

#初始化副本集配置
rs.initiate(config);

3.2栖榨、設(shè)置第二個(gè)分片副本集

#編寫配置文件
vi /usr/local/mongodb/conf/shard2.conf

#配置文件內(nèi)容
#——————————————–
pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true

bind_ip = 0.0.0.0
port = 27002
fork = true
 
#打開web監(jiān)控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard2
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設(shè)置最大連接數(shù)
maxConns=20000

啟動三臺服務(wù)器的shard2 server

mongod -f /usr/local/mongodb/conf/shard2.conf

登陸任意一臺服務(wù)器婴栽,初始化副本集

#登錄
mongo --port 27002

#使用admin數(shù)據(jù)庫
use admin

#定義副本集配置
config = {
...    _id : "shard2",
...     members : [
...         {_id : 0, host : "192.168.0.111:27002" },
...         {_id : 1, host : "192.168.0.112:27002" },
...         {_id : 2, host : "192.168.0.217:27002" , arbiterOnly: true }
...     ]
... }

#初始化副本集配置
rs.initiate(config);

3.3愚争、設(shè)置第三個(gè)分片副本集

#編寫配置文件
vi /usr/local/mongodb/conf/shard3.conf

#配置文件內(nèi)容
#——————————————–
pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true

bind_ip = 0.0.0.0
port = 27003
fork = true
 
#打開web監(jiān)控
httpinterface=true
rest=true
 
#副本集名稱
replSet=shard3
 
#declare this is a shard db of a cluster;
shardsvr = true
 
#設(shè)置最大連接數(shù)
maxConns=20000

啟動三臺服務(wù)器的shard3 server

mongod -f /usr/local/mongodb/conf/shard3.conf

登陸任意一臺服務(wù)器捅彻,初始化副本集

#登錄
mongo --port 27003

#使用admin數(shù)據(jù)庫
use admin

#定義副本集配置
config = {
...    _id : "shard3",
...     members : [
...         {_id : 0, host : "192.168.0.111:27003" , arbiterOnly: true },
...         {_id : 1, host : "192.168.0.112:27003" },
...         {_id : 2, host : "192.168.0.217:27003" }
...     ]
... }

#初始化副本集配置
rs.initiate(config);

如初始化副本集出現(xiàn)如下報(bào)錯(cuò):
解決方案:仲裁不能再同一臺服務(wù)器上換下就可以。

> config = { _id : "shard3", members : [{_id : 0, host : "192.168.0.111:27003" , arbiterOnly: true },{_id : 1, host : "192.168.0.112:27003" },{_id : 2, host : "192.168.0.217:27003" }]}
{
        "_id" : "shard3",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "192.168.0.111:27003",
                        "arbiterOnly" : true
                },
                {
                        "_id" : 1,
                        "host" : "192.168.0.112:27003"
                },
                {
                        "_id" : 2,
                        "host" : "192.168.0.217:27003"
                }
        ]
}
> rs.initiate(config);
{
        "ok" : 0,
        "errmsg" : "This node, 192.168.0.111:27003, with _id 0 is not electable under the new configuration version 1 for replica set shard3",
        "code" : 93,
        "codeName" : "InvalidReplicaSetConfig"
}
4缭裆、配置路由服務(wù)器 mongos

先啟動配置服務(wù)器和分片服務(wù)器,后啟動路由實(shí)例啟動路由實(shí)例:(三臺機(jī)器)

vi /usr/local/mongodb/conf/mongos.conf
#內(nèi)容
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true

bind_ip = 0.0.0.0
port = 20000
fork = true

#監(jiān)聽的配置服務(wù)器,只能有1個(gè)或者3個(gè) configs為配置服務(wù)器的副本集名字
configdb = configs/192.168.0.111:21000,192.168.0.112:21000,192.168.0.217:21000
 
#設(shè)置最大連接數(shù)
maxConns=20000

啟動三臺服務(wù)器的mongos server

mongos -f /usr/local/mongodb/conf/mongos.conf
5澈驼、啟用分片

目前搭建了mongodb配置服務(wù)器缝其、路由服務(wù)器内边,各個(gè)分片服務(wù)器假残,不過應(yīng)用程序連接到mongos路由服務(wù)器并不能使用分片機(jī)制辉懒,還需要在程序里設(shè)置分片配置谍失,讓分片生效。

#登陸任意一臺mongos
mongo --port 20000
#使用admin數(shù)據(jù)庫
use  admin
#串聯(lián)路由服務(wù)器與分配副本集
sh.addShard("shard1/192.168.0.111:27001,192.168.0.112:27001,192.168.0.217:27001")
sh.addShard("shard2/192.168.0.111:27002,192.168.0.112:27002,192.168.0.217:27002")
sh.addShard("shard3/192.168.0.111:27003,192.168.0.112:27003,192.168.0.217:27003")
#查看集群狀態(tài)
sh.status()
6、分片測試

目前配置服務(wù)线罕、路由服務(wù)钞楼、分片服務(wù)询件、副本集服務(wù)都已經(jīng)串聯(lián)起來了宛琅,但我們的目的是希望插入數(shù)據(jù)逗旁,數(shù)據(jù)能夠自動分片痢艺。連接在mongos上色建,準(zhǔn)備讓指定的數(shù)據(jù)庫箕戳、指定的集合分片生效陵吸。

#指定testdb庫分片生效
db.runCommand( { enablesharding :"testdb"});
#指定數(shù)據(jù)庫里需要分片的集合(testdb.table1)和片鍵(以索引作為分片的鍵值進(jìn)行分片)
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
#登錄
mongo --port 20000

#使用testdb
use  testdb;

#插入測試數(shù)據(jù)
for (var i = 1; i <= 100000; i++) db.table1.save({id:i,"test1":"testval1"});

#查看分片情況如下壮虫,部分無關(guān)信息省掉了
db.table1.stats();
                "shard1" : {
                        "ns" : "testdb.table1",
                        "size" : 54,
                        "count" : 1,
                        "avgObjSize" : 54,
                        "storageSize" : 16384,
                        "capped" : false,
                        "wiredTiger" : {
                                "metadata" : {
                                        "formatVersion" : 1
                                }
                "shard2" : {
                        "ns" : "testdb.table1",
                        "size" : 972,
                        "count" : 18,
                        "avgObjSize" : 54,
                        "storageSize" : 16384,
                        "capped" : false,
                        "wiredTiger" : {
                                "metadata" : {
                                        "formatVersion" : 1
                                }
                "shard3" : {
                        "ns" : "testdb.table1",
                        "size" : 5398974,
                        "count" : 99981,
                        "avgObjSize" : 54,
                        "storageSize" : 1716224,
                        "capped" : false,
                        "wiredTiger" : {
                                "metadata" : {
                                        "formatVersion" : 1
                                }


可以看到數(shù)據(jù)分到3個(gè)分片,各自分片數(shù)量為: shard1 “count” : 1徐伐,shard2 “count” : 18办素,shard3 “count” : 99981性穿。已經(jīng)成功了季二!
#查看集群的狀態(tài)
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5dd20dcb4e1701b7accb3d02")
}
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.0.111:27001,192.168.0.217:27001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.0.111:27002,192.168.0.112:27002",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.0.111:27003,192.168.0.217:27003",  "state" : 1 }
  active mongoses:
        "3.4.6" : 2
        "3.4.0" : 1
 autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
                Balancer lock taken at Mon Nov 18 2019 11:19:40 GMT+0800 (CST) by ConfigServer:Balancer
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                2 : Success
  databases:
        {  "_id" : "testdb",  "primary" : "shard3",  "partitioned" : true }
                testdb.table1
                        shard key: { "id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1  1
                                shard2  1
                                shard3  1
                        { "id" : { "$minKey" : 1 } } -->> { "id" : 2 } on : shard1 Timestamp(2, 0) 
                        { "id" : 2 } -->> { "id" : 20 } on : shard2 Timestamp(3, 0) 
                        { "id" : 20 } -->> { "id" : { "$maxKey" : 1 } } on : shard3 Timestamp(3, 1) 
7桑嘶、添加分片成員
#創(chuàng)建好分片副本節(jié)點(diǎn)后躬充,隨機(jī)登錄一臺mongos
mongo --port 20000

#添加分片
sh.addShard("shard1/192.168.3.23:10001,192.168.3.24:10002")

參考:https://www.cnblogs.com/ityouknow/p/7344005.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末以政,一起剝皮案震驚了整個(gè)濱河市盈蛮,隨后出現(xiàn)的幾起案子抖誉,更是在濱河造成了極大的恐慌衰倦,老刑警劉巖我磁,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叛溢,居然都是意外死亡厢蒜,警方通過查閱死者的電腦和手機(jī)斑鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固以,“玉大人,你說我怎么就攤上這事篙螟”槁裕” “怎么了绪杏?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蕾久,是天一觀的道長。 經(jīng)常有香客問我辖佣,道長杯拐,這世上最難降的妖魔是什么朗兵? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任余掖,我火速辦了婚禮,結(jié)果婚禮上冗美,老公的妹妹穿的比我還像新娘粉洼。我一直安慰自己属韧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哲戚,像睡著了一般顺少。 火紅的嫁衣襯著肌膚如雪脆炎。 梳的紋絲不亂的頭發(fā)上氓辣,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天喇潘,我揣著相機(jī)與錄音颖低,去河邊找鬼忱屑。 笑死莺戒,一個(gè)胖子當(dāng)著我的面吹牛话浇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼用踩,長吁一口氣:“原來是場噩夢啊……” “哼脐彩!你這毒婦竟也來了惠奸?” 一聲冷哼從身側(cè)響起梗掰,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓬蝶,沒想到半個(gè)月后著摔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傅是,到底是詐尸還是另有隱情,我是刑警寧澤书闸,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響现柠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望于樟。 院中可真熱鬧迂曲,春花似錦关霸、人聲如沸佳遣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫俺。三九已至狼纬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柠贤。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工臼勉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膏蚓,地道東北人剧董。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓黑界,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胳搞。 傳聞我的和親對象是個(gè)殘疾皇子卸例,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345