1、MongoDB3.2基于副本集的分片集群搭建

在搭建分片之前,先了解下分片中各個(gè)角色的作用:

① 配置服務(wù)器。是一個(gè)獨(dú)立的mongod進(jìn)程,保存集群和分片的元數(shù)據(jù),即各分片包含了哪些數(shù)據(jù)的信息。最先開始建立,啟用日志功能。像啟動(dòng)普通的mongod一樣啟動(dòng)配置服務(wù)器,指定configsvr選項(xiàng)。不需要太多的空間和資源,配置服務(wù)器的1KB空間相當(dāng)于真是數(shù)據(jù)的200MB。保存的只是數(shù)據(jù)的分布表。當(dāng)服務(wù)不可用,則變成只讀,無法分塊、遷移數(shù)據(jù)。

② 路由服務(wù)器。即mongos,起到一個(gè)路由的功能,供程序連接。本身不保存數(shù)據(jù),在啟動(dòng)時(shí)從配置服務(wù)器加載集群信息,開啟mongos進(jìn)程需要知道配置服務(wù)器的地址,指定configdb選項(xiàng)。

③ 分片服務(wù)器。是一個(gè)獨(dú)立普通的mongod進(jìn)程,保存數(shù)據(jù)信息。可以是一個(gè)副本集也可以是單獨(dú)的一臺(tái)服務(wù)器。

七臺(tái)服務(wù)器,首先確定各個(gè)組件的數(shù)量。數(shù)據(jù)分片shard 5個(gè),mongos 2個(gè), config server 3個(gè),分片用五臺(tái)服務(wù)器單獨(dú)部署,mongos 和 config server 部署在兩臺(tái)服務(wù)器。且每個(gè)shard部署一個(gè)副本集(一主二從),config server部署副本集(一主二從)

MongoDB版本選擇:

選擇3.2版本

服務(wù)器信息

各主機(jī)需開放的端口、mongodb版本

看一下物理部署圖:?

注:

這里的A、B、C、D、E對(duì)應(yīng)ip為145、146、147、148、149的服務(wù)器

主機(jī)F【143】:部署一個(gè)mongos、一個(gè)config server

主機(jī)G【144】:部署一個(gè)mongos、兩個(gè)config server

這里的A、B、C、D、E對(duì)應(yīng)ip為145、146、147、148、149服務(wù)器

一、源碼安裝MongoDB

cd /usr/local

wget?https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.8.tgz

tar –zxvf mongodb-linux-x86_64-rhel70-3.2.8.tgz

mv mongodb-linux-x86_64-rhel70-3.2.8 ?mongodb

#由于安裝mongodb不需要編譯,所以解壓完之后編寫啟動(dòng)文件即可啟動(dòng)mongodb服務(wù)。將啟動(dòng)參數(shù)寫入啟動(dòng)文件會(huì)是一個(gè)很好的選擇

二、創(chuàng)建相應(yīng)目錄

主機(jī)A(127.0.0.145)

#建立shard1數(shù)據(jù)文件存放目錄

mkdir -p /data/shard1/data

#建立shard1日志文件存放目錄

mkdir -p /data/shard1/log

#建立shard2數(shù)據(jù)文件存放目錄

mkdir -p /data/shard2/data

#建立shard2日志文件存放目錄

mkdir -p /data/shard2/log

#建立shard3數(shù)據(jù)文件存放目錄

mkdir -p /data/shard3/data

#建立shard3日志文件存放目錄

mkdir -p /data/shard3/log

主機(jī)B、C、D、E創(chuàng)建方法一樣,只需需改數(shù)字即可

A:shard1、shard2、shard3

B:shard2、shard3、shard4

C:shard3、shard4、shard5

D:shard4、shard5、shard1

E:shard5、shard1、shard2

三、配置啟動(dòng)文件

A主機(jī)為例:

1、在目錄下? /usr/local/mongodb/shard_conf/? 新建三個(gè)文件shard1.conf、shard2.conf、shard3.conf

2、編寫配置信息

shard1.conf(#配置參數(shù)詳細(xì)信息請(qǐng)參考這里

shardsvr? ? = true

port ? ? ? ? ? = 22001

dbpath? ? ? = /data/shard1/data/

logpath? ? = /data/shard1/log/shard1.log

logappend? = true

fork ? ? ? ? ? ?= true

oplogSize? = 10240

replSet ? ? ?= shard1

pidfilepath = /data/shard1/shard1.pid

directoryperdb = true

shard2.conf

shardsvr? = true

port ? ? ? ? = 22002

dbpath? ? = /data/shard2/data/

logpath? = /data/shard2/log/shard2.log

logappend = true

fork? ? ? = true

oplogSize = 10240

replSet? = shard2

pidfilepath = /data/shard2/shard2.pid

directoryperdb? = true

shard3.conf

shardsvr? = true

port? ? ? = 22003

dbpath? ? = /data/shard3/data/

logpath? = /data/shard3/log/shard3.log

logappend = true

fork? ? ? = true

oplogSize = 10240

replSet? = shard3

pidfilepath = /data/shard3/shard3.pid

directoryperdb = true

主機(jī)B、C、D、E創(chuàng)建方法一樣,特別注意port、dbpath、logpath、replSet、pidfilepath的值,要不然你會(huì)遇到各種問題。

A安裝shard1的主,shard2的從,shard3的從

B安裝shard2的主,shard3的從,shard4的從

C安裝shard3的主,shard4的從,shard5的從

D安裝shard4的主,shard5的從,shard1的從

E安裝shard5的主,shard1的從,shard2的從

主機(jī)F【一個(gè)mongos 和 一個(gè)config server】

文件位置:/usr/local/mongodb/mongos/mongos.conf

文件內(nèi)容:

configdb? ? = zero/127.0.0.143:21000,127.0.0.144:21000,127.0.0.144:21001

port? ? ? ? = 20000

logpath? ? = /data/mongos/log/mongos.log

fork ? ? ? ? ? ?= true

logappend? = true

pidfilepath = /data/mongos/mongos.pid

文件位置:/usr/local/mongodb/config_server/config_server.conf

文件內(nèi)容:

dbpath? ? ? = /data/config_server/data

logpath? ? = /data/config_server/log/config.log

port? ? ? ? = 21000

logappend? = true

configsvr? = true

replSet? ? = zero

fork? ? ? ? = true

pidfilepath = /data/config_server/config_server.pid

主機(jī)G【一個(gè)mongos 和 兩個(gè)config server】

文件位置:/usr/local/mongodb/mongos/mongos.conf

文件內(nèi)容:

configdb? ? = zero/127.0.0.143:21000,127.0.0.144:21000,127.0.0.144:21001

port? ? ? ? = 20000

logpath? ? = /data/mongos/log/mongos.log

fork? ? ? ? = true

logappend? = true

pidfilepath = /data/mongos/mongos.pid

文件位置:/usr/local/mongodb/config_server/config_server_21000.conf

文件內(nèi)容:

dbpath? ? ? = /data/config_server_21000/data

logpath? ? = /data/config_server_21000/log/config.log

port? ? ? ? = 21000

logappend? = true

configsvr? = true

replSet? ? = zero

fork? ? ? ? = true

pidfilepath = /data/config_server_21000/config_server.pid

文件位置:/usr/local/mongodb/config_server/config_server_21001.conf

文件內(nèi)容:

dbpath? ? ? = /data/config_server_21001/data

logpath? ? = /data/config_server_21001/log/config.log

port? ? ? ? = 21001

logappend? = true

configsvr? = true

replSet? ? = zero

fork? ? ? ? = true

pidfilepath = /data/config_server_21001/config_server.pid

四、按順序開啟服務(wù)

1、開啟shard服務(wù)

A主機(jī)為例,B、C、D、E類似:

/usr/local/mongodb/bin/mongod ?-f ?/usr/local/mongodb/shard_conf/shard1.conf

/usr/local/mongodb/bin/mongod ?-f ?/usr/local/mongodb/shard_conf/shard2.conf

/usr/local/mongodb/bin/mongod ?-f ?/usr/local/mongodb/shard_conf/shard3.conf

2、開啟config server服務(wù)

F主機(jī)

/usr/local/mongodb/bin/mongod? -f? /usr/local/mongodb/config_server/config_server.conf

G主機(jī)

/usr/local/mongodb/bin/mongod? -f? /usr/local/mongodb/config_server/config_server_21000.conf

/usr/local/mongodb/bin/mongod? -f? /usr/local/mongodb/config_server/config_server_21001.conf

五、給shard和config server設(shè)置副本集

A主機(jī)為例(B、C、D、E、F類似注意members中ip地址不要搞錯(cuò)):

終端登錄A主機(jī)

/usr/local/mongodb/bin/mongo 127.0.0.145:22001

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

use admin

#定義副本集配置

config = { ? _id:"shard1", members:[

? ? ? ? ? ? ? ? ? ? ? ? ? ? {_id:0,host:"127.0.0.145:22001",priority:10},

? ? ? ? ? ? ? ? ? ? ? ? ? ? {_id:1,host:"127.0.0.149:22001",priority:5},

? ? ? ? ? ? ? ? ? ? ? ? ? ? {_id:2,host:"127.0.0.148:22001",priority:1}

? ? ? ? ? ? ? ? ? ? ?]

? ? ? ? ? ? ? ?}

#初始化副本集配置

rs.initiate(config)

六、開啟mongos服務(wù)

F主機(jī)

/usr/local/mongodb/bin/mongos? -f? /usr/local/mongodb/mongos/mongos.conf

G主機(jī)

/usr/local/mongodb/bin/mongos? -f? /usr/local/mongodb/mongos/mongos.conf

***********************************************************************************************************

目前搭建了mongodb配置服務(wù)器、路由服務(wù)器,各個(gè)分片服務(wù)器,

不過應(yīng)用程序連接到mongos路由服務(wù)器并不能使用分片機(jī)制,

還需要在程序里設(shè)置分片配置,讓分片生效。

***********************************************************************************************************

七、讓分片生效

登錄mongos服務(wù),F(xiàn)節(jié)點(diǎn)操作

#連接到mongos

/usr/local/mongodb/bin/mongo 127.0.0.143:20000

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

useadmin

#串聯(lián)路由服務(wù)器與分配副本集1

db.runCommand(

{

addshard:

"shard1/127.0.0.145:22001,127.0.0.149:22001,127.0.0.148:22001"

}

返回:{ "shardAdded": "shard1", "ok" : 1 },說明shard1生效

同理串聯(lián)路由服務(wù)器與分配副本集2,3,4,5一樣,注意addshard中ip的修改

#查看分片服務(wù)器的配置

db.runCommand( { listshards : 1} )

//。。。

***********************************************************************************************************

目前配置服務(wù)、路由服務(wù)、分片服務(wù)、副本集服務(wù)都已經(jīng)串聯(lián)起來了,

但我們的目的是希望插入數(shù)據(jù),數(shù)據(jù)能夠自動(dòng)分片,就差那么一點(diǎn)點(diǎn)。

連接在mongos上,準(zhǔn)備讓指定的數(shù)據(jù)庫(kù)、指定的集合分片生效。

***********************************************************************************************************

八、讓指定table分片生效并生成測(cè)試數(shù)據(jù)

#連接到mongos

/usr/local/mongodb/bin/mongo 127.0.0.143:20000

#一定是在admin數(shù)據(jù)下執(zhí)行

use admin

#指定test_db分片生效

db.runCommand( { enablesharding:"test_db"});

{ "ok" : 1 }

#指定數(shù)據(jù)庫(kù)里需要分片的集合和片鍵

db.runCommand( {shardcollection : "test_db.test_tab",key : {str: 'hashed'} } )

{ "collectionsharded": "test_db.test_tab", "ok" : 1 }

【注意:不要單獨(dú)在自增或時(shí)間戳的字段作為分片片鍵,否則數(shù)據(jù)分布不均勻,除非使用hashed,片鍵的選取請(qǐng)參考文章

【注意:片鍵所在字段強(qiáng)烈建議建立索引,所以建立如下索引】

use test_db

#建立索引

db.test_tab.ensureIndex({str: "hashed"})

#查看索引

db.test_tab.getIndexes()

#定義js函數(shù),產(chǎn)生字符串

function getStr(){

? ? var str ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

? ? var s = '';

? ? for(var i = 0; i < 5; i++){

? ? ? ? ? ? var rand = Math.floor(Math.random() *str.length);

? ? ? ? ? ? s += str.charAt(rand);

? ? ?}

? ? ?return s;

}

#插入測(cè)試數(shù)據(jù)

for (var i = 1; i <= 100000;i++){

? ? ? ? ? db.test_tab.insert({"str":getStr()})

}

#查看分片情況如下

db.test_tab.stats()

查看每個(gè)shard里面count字段即可,如果數(shù)據(jù)大小相差不大,則數(shù)據(jù)分片均衡

#查看分片狀態(tài)

sh.status()

九、總結(jié)

只要你理解了mongodb分片集群的核心,其實(shí)搭建起來還是挺簡(jiǎn)單的。不過這里需要注意的點(diǎn)還是挺多的,比如如果所有服務(wù)器時(shí)間相差太大集群搭建都會(huì)有問題;還有啟動(dòng)文件對(duì)應(yīng)的參數(shù);集群的安全等等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容