MongoDB集群部署

# mongodb版本
3.2.16

機器規(guī)劃

192.168.0.94    Mongo01
192.168.0.97    Mongo02
192.168.0.98    Mongo03

角色分配

host            mongos      config-server       shard1              shard2              shard3  
Mongo01         27017       27018               27001               27002               27003(仲裁)
Mongo02         27017       27018               27001               27002(仲裁)       27003
Mongo03         27017       27018               27001(仲裁)       27002               27003

添加hosts蠢箩,以及三臺機器相互信任

關(guān)閉防火墻

    vi /etc/selinux/config
    將SELINUX=enforcing改為SELINUX=disabled
    systemctl stop firewalld.service
    systemctl disable firewalld.service 

下載mongodb軟件并安裝

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.16.tgz
    tar -xzvf mongodb-linux-x86_64-3.2.16.tgz -C /usr/local
    cd /usr/local
    mv mongodb-linux-x86_64-3.2.16  mongodb
    vi /etc/profile
    在最后添加:
    export MONGODB_HOME=/usr/local/mongodb
    export PATH=$MONGODB_HOME/bin:$PATH
    source /etc/profile

分別在每臺機器建立conf虑润、mongos瓢对、config靠胜、shard1、shard2饮醇、shard3六個目錄它抱,因為mongos不存儲數(shù)據(jù),只需要建立日志文件目錄即可

    mkdir -p /usr/local/mongodb/conf
    mkdir -p /usr/local/mongodb/mongos/log
    mkdir -p /usr/local/mongodb/config/data
    mkdir -p /usr/local/mongodb/config/log
    mkdir -p /usr/local/mongodb/shard1/data
    mkdir -p /usr/local/mongodb/shard1/log
    mkdir -p /usr/local/mongodb/shard2/data
    mkdir -p /usr/local/mongodb/shard2/log
    mkdir -p /usr/local/mongodb/shard3/data
    mkdir -p /usr/local/mongodb/shard3/log

集群部署

復(fù)制集

1 配置服務(wù)器部署朴艰,三臺都要操作(復(fù)制集)
    vi /$MONGODB_HOME/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 = 27018
    fork = true 
    configsvr = true
    #副本集名稱
    replSet=mongo 
    #設(shè)置最大連接數(shù)
    maxConns=20000
2 啟動三臺機器的config server
    [root@mongo01 conf]# mongod -f config.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 1064
    child process started successfully, parent exiting
3 登錄到任意一臺观蓄,初始化副本集
[root@mongo01 conf]# mongo --port=27018
#定義個變量
    config = {//
    _id : "mongo",//
    members :[//
        {_id :1,host : "mongo01:27018"},//
        {_id :2,host : "mongo02:27018"},//
        {_id :3,host : "mongo03:27018"}//
    ]//
}
#初始化
> rs.initiate(config)
#_id:“mongo” ? 需要與config.conf中 replSet 的值一致
#members 中的host為對應(yīng)每個節(jié)點的hostname+端口
查看狀態(tài)顯示為一主兩從:
            mongo:SECONDARY>  rs.status()
    {
            "set" : "mongo",
            "date" : ISODate("2019-05-23T03:00:58.643Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "configsvr" : true,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "members" : [
                    {
                            "_id" : 1,
                            "name" : "mongo01:27018",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1977,
                            "optime" : {
                                    "ts" : Timestamp(1558580277, 2),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2019-05-23T02:57:57Z"),
                            "electionTime" : Timestamp(1558580277, 1),
                            "electionDate" : ISODate("2019-05-23T02:57:57Z"),
                            "configVersion" : 1,
                            "self" : true
                    },
                    {
                            "_id" : 2,
                            "name" : "mongo02:27018",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 192,
                            "optime" : {
                                    "ts" : Timestamp(1558580277, 2),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2019-05-23T02:57:57Z"),
                            "lastHeartbeat" : ISODate("2019-05-23T03:00:57.292Z"),
                            "lastHeartbeatRecv" : ISODate("2019-05-23T03:00:57.356Z"),
                            "pingMs" : NumberLong(0),
                            "syncingTo" : "mongo01:27018",
                            "configVersion" : 1
                    },
                    {
                            "_id" : 3,
                            "name" : "mongo03:27018",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 192,
                            "optime" : {
                                    "ts" : Timestamp(1558580277, 2),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2019-05-23T02:57:57Z"),
                            "lastHeartbeat" : ISODate("2019-05-23T03:00:57.302Z"),
                            "lastHeartbeatRecv" : ISODate("2019-05-23T03:00:57.356Z"),
                            "pingMs" : NumberLong(0),
                            "syncingTo" : "mongo01:27018",
                            "configVersion" : 1
                    }
            ],
            "ok" : 1
    }
# kill掉PRIMARY節(jié)點的config-server服務(wù)
[root@mongo001 mongodb]# ps -ef |grep mongo
root      1257     1  2 11:11 ?        00:00:01 bin/mongod -f conf/config.conf
root      1360  1228  0 11:12 pts/0    00:00:00 grep --color=auto mongo
[root@mongo001 mongodb]# kill -9 1257
[root@mongo001 mongodb]# ps -ef |grep mongo
root      1362  1228  0 11:12 pts/0    00:00:00 grep --color=auto mongo
此時原先的PRIMARY節(jié)點狀態(tài)變?yōu)?stateStr" : "(not reachable/healthy)",
原先兩個SECONDARY節(jié)點將自動選舉出一個為PRIMARY節(jié)點,此時集群變?yōu)橐恢饕粡囊粧鞝顟B(tài)
將001節(jié)點config-server服務(wù)再次起來祠墅,改節(jié)點自動變?yōu)镾ECONDARY節(jié)點

分片集

1 配置分片副本集(三臺)
    設(shè)置第一個分片集(shard1)
        vi $MONGODB_HOME/conf/shar1.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          
        #副本集名稱
        replSet=shard1
        shardsvr = true      
        #設(shè)置最大連接數(shù)
        maxConns=20000
2 啟動三臺機器shard1服務(wù)
    [root@mongo01 mongodb]# bin/mongod -f conf/shard1.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 1303
    child process started successfully, parent exiting
3 登錄任意一臺服務(wù)器侮穿,初始化副本集
    [root@mongo01 conf]# mongo --port=27001
    #定義副本集配置,"arbiterOnly":true 代表其為仲裁節(jié)點毁嗦。按照之前規(guī)劃shard1的003為仲裁節(jié)點
        >config = {//
        _id : "shard1",//
        members :[//
            {_id :1,host : "mongo01:27001"},//
            {_id :2,host : "mongo02:27001"},//
            {_id :3,host : "mongo03:27001",arbiterOnly: true}//
        ]//
    }
    #初始化副本集
        > rs.initiate(config)
        { "ok" : 1 }
    #查看分片1狀態(tài)亲茅,01為主,02為從狗准,03為仲裁:
        shard1:SECONDARY> rs.status()
{
        "set" : "shard1",
        "date" : ISODate("2019-05-23T05:38:59.247Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 1,
                        "name" : "mongo01:27001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 6306,
                        "optime" : {
                                "ts" : Timestamp(1558589850, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2019-05-23T05:37:30Z"),
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1558589849, 1),
                        "electionDate" : ISODate("2019-05-23T05:37:29Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "mongo02:27001",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 101,
                        "optime" : {
                                "ts" : Timestamp(1558589850, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2019-05-23T05:37:30Z"),
                        "lastHeartbeat" : ISODate("2019-05-23T05:38:57.359Z"),
                        "lastHeartbeatRecv" : ISODate("2019-05-23T05:38:59.174Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "mongo01:27001",
                        "configVersion" : 1
                },
                {
                        "_id" : 3,
                        "name" : "mongo03:27001",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 101,
                        "lastHeartbeat" : ISODate("2019-05-23T05:38:57.371Z"),
                        "lastHeartbeatRecv" : ISODate("2019-05-23T05:38:55.160Z"),
                        "pingMs" : NumberLong(0),
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}
    # 如上配置shard2和shard3
        shard2:
    >config = {//
        _id : "shard2",//
        members :[//
            {_id :1,host : "mongo01:27002"},//
            {_id :2,host : "mongo02:27002",arbiterOnly: true},//
            {_id :3,host : "mongo03:27002"}//
        ]//
    }
    > rs.initiate(config)
    { "ok" : 1 }
    # 查看節(jié)點狀態(tài):02為仲裁節(jié)點
    shard2:PRIMARY> rs.status()
    
        shard3:
    >config = {//
        _id : "shard3",//
        members :[//
            {_id :1,host : "mongo01:27003",arbiterOnly: true},//
            {_id :2,host : "mongo02:27003"},//
            {_id :3,host : "mongo03:27003"}//
        ]//
    }
    > rs.initiate(config)
    { "ok" : 1 }    

由于mongo01要被設(shè)置為仲裁節(jié)點克锣,此時需要換到mongo02或者03上執(zhí)行上述操作

配置路由服務(wù)mongos(三臺)

    vi mongos.conf
    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 = 27017
    fork = true
    #監(jiān)聽的配置服務(wù)器,config-server mongo為配置服務(wù)器的副本集名字
    configdb = mongo/mongo01:27018,mongo02:27018,mongo03:27018
    #設(shè)置最大連接數(shù)
    maxConns=20000

啟動mongos服務(wù)

    [root@mongo01 conf]# mongos -f mongos.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 1687
    child process started successfully, parent exiting
此時搭建了mongodb配置服務(wù)器、路由服務(wù)器腔长,各個分片服務(wù)器袭祟,不過應(yīng)用程序連接到mongos路由服務(wù)器并不能使用分片機制,還需要在程序里設(shè)置分片配置捞附,讓分片生效巾乳。登錄到任意一臺機器mongos
    [root@mongo01 mongodb]# mongo --port=27017
    mongos> use admin
    #串聯(lián)路由服務(wù)器與分配副本集
    mongos> sh.addShard("shard1/mongo01:27001,mongo01:27001,mongo01:27001")
    mongos> sh.addShard("shard2/mongo01:27002,mongo01:27002,mongo01:27002")
    mongos> sh.addShard("shard3/mongo01:27003,mongo01:27003,mongo01:27003")   
    #查看分片狀態(tài)
    mongos> sh.status()
        --- Sharding Status --- 
      sharding version: {
            "_id" : 1,
            "minCompatibleVersion" : 5,
            "currentVersion" : 6,
            "clusterId" : ObjectId("5ce63adad79f94274c1e5793")
    }
      shards:
            {  "_id" : "shard1",  "host" : "shard1/mongo01:27001,mongo02:27001" }
            {  "_id" : "shard2",  "host" : "shard2/mongo01:27002,mongo03:27002" }
            {  "_id" : "shard3",  "host" : "shard3/mongo02:27003,mongo03:27003" }
      active mongoses:
            "3.2.16" : 3
      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:
實現(xiàn)分片功能
設(shè)置分片chunk大小,設(shè)置塊大小為 1M 是方便實驗鸟召,不然需要插入海量數(shù)據(jù)
mongos> use config
switched to db config
mongos> db.settings.save({_id:"chunksize",value:1})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
測試:讓指定的數(shù)據(jù)庫想鹰、指定的集合分片生效。
mongos> use admin
switched to db admin
mongos> db.runCommand({enablesharding : "testdb"});
mongos> db.runCommand({shardcollection :"testdb.test1",key:{id:1}})

db.runCommand({shardcollection :"xdo-import.importTask",key:{id:1}})

mongos> use testdb
mongos> for (var i = 1; i <= 100000; i++) db.test1.save({id:i,"test11":"testvalll"})
WriteResult({ "nInserted" : 1 })

三臺服務(wù)器的都在寫數(shù)據(jù)药版,應(yīng)該實現(xiàn)了分布式
查看分片狀態(tài)

db.test1.stats();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辑舷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子槽片,更是在濱河造成了極大的恐慌何缓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件还栓,死亡現(xiàn)場離奇詭異碌廓,居然都是意外死亡,警方通過查閱死者的電腦和手機剩盒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門谷婆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事纪挎∑谄叮” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵异袄,是天一觀的道長通砍。 經(jīng)常有香客問我,道長烤蜕,這世上最難降的妖魔是什么封孙? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮讽营,結(jié)果婚禮上虎忌,老公的妹妹穿的比我還像新娘。我一直安慰自己橱鹏,他們只是感情好呐籽,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚀瘸,像睡著了一般狡蝶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮勃,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天贪惹,我揣著相機與錄音,去河邊找鬼寂嘉。 笑死奏瞬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泉孩。 我是一名探鬼主播硼端,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寓搬!你這毒婦竟也來了珍昨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤句喷,失蹤者是張志新(化名)和其女友劉穎镣典,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唾琼,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡兄春,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锡溯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶舆。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡哑姚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芜茵,到底是詐尸還是另有隱情叙量,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布夕晓,位于F島的核電站,受9級特大地震影響悠咱,放射性物質(zhì)發(fā)生泄漏蒸辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一躬贡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眼坏,春花似錦、人聲如沸宰译。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯第。三九已至,卻和暖如春缀拭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛛淋。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褐荷,地道東北人勾效。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像叛甫,于是被迫代替她去往敵國和親葵第。 傳聞我的和親對象是個殘疾皇子合溺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 本人博客同步發(fā)表膛腐,排版更佳本文主要介紹MongoDB集群部署的過程鼎俘,對于其中涉及的組件概念,不做解釋贸伐。 服務(wù)器規(guī)劃...
    峰巢閱讀 1,817評論 0 7
  • 來自公眾號:馬哥Linux運維作者:趙峰峰 mongodb是最常用的nosql數(shù)據(jù)庫,在數(shù)據(jù)庫排名中已經(jīng)上升到了前...
    碼農(nóng)小光閱讀 482評論 0 2
  • 數(shù)據(jù)副本 MongoDB中的一組副本是一群mongod進程捉邢,這些進程維護同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性宠进,...
    宇哥聊AI閱讀 577評論 1 11
  • 高可用性即HA(High Availability)指的是通過盡量縮短因日常維護操作(計劃)和突發(fā)的系統(tǒng)崩潰(非計...
    小波同學(xué)閱讀 21,115評論 6 54
  • 數(shù)據(jù)副本 MongoDB中的一組副本是一群mongod進程藐翎,這些進程維護同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性吝镣,...
    大蟒傳奇閱讀 2,695評論 4 16