日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【超详细】手把手教你搭建MongoDB集群搭建

發(fā)布時間:2023/12/31 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【超详细】手把手教你搭建MongoDB集群搭建 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MongoDB集群搭建

MongoDB集群簡介

mongodb 集群搭建的方式有三種:

  • 主從備份(Master - Slave)模式,或者叫主從復(fù)制模式。
  • 副本集(Replica Set)模式
  • 分片(Sharding)模式
  • 其中,第一種方式基本沒什么意義,官方也不推薦這種方式搭建。另外兩種分別就是副本集和分片的方式。

    Mongo分片高可用集群搭建

    概述

    ? 為解決mongodb在replica set每個從節(jié)點上面的數(shù)據(jù)庫均是對數(shù)據(jù)庫的全量拷貝,從節(jié)點壓力在高并發(fā)大數(shù)據(jù)量的場景下存在很大挑戰(zhàn),同時考慮到后期mongodb集群的在數(shù)據(jù)壓力巨大時的擴(kuò)展性,應(yīng)對海量數(shù)據(jù)引出了分片機制。

    什么是分片

    ? 分片是將數(shù)據(jù)庫進(jìn)行拆分,將其分散在不同的機器上的過程,無需功能強大的服務(wù)器就可以存儲更多的數(shù)據(jù),處理更大的負(fù)載,在總數(shù)據(jù)中,將集合切成小塊,將這些塊分散到若干片中,每個片只負(fù)載總數(shù)據(jù)的一部分,通過一個知道數(shù)據(jù)與分片對應(yīng)關(guān)系的組件mongos的路由進(jìn)程進(jìn)行操作。

    基礎(chǔ)組件

    其利用到了四個組件:mongos,config server,shard,replica set

    mongos

    ? 數(shù)據(jù)庫集群請求的入口,所有請求需要經(jīng)過mongos進(jìn)行協(xié)調(diào),無需在應(yīng)用層面利用程序來進(jìn)行路由選擇,mongos其自身是一個請求分發(fā)中心,負(fù)責(zé)將外部的請求分發(fā)到對應(yīng)的shard服務(wù)器上,mongos作為統(tǒng)一的請求入口,為防止mongos單節(jié)點故障,一般需要對其做HA(高可用,Highly Available縮寫)。

    config server

    ? 配置服務(wù)器,存儲所有數(shù)據(jù)庫元數(shù)據(jù)(分片,路由)的配置。mongos本身沒有物理存儲分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存中來讀取數(shù)據(jù),mongos在第一次啟動或后期重啟時候,就會從config server中加載配置信息,如果配置服務(wù)器信息發(fā)生更新會通知所有的mongos來更新自己的狀態(tài),從而保證準(zhǔn)確的請求路由,生產(chǎn)環(huán)境中通常也需要多個config server,防止配置文件存在單節(jié)點丟失問題。

    shard

    ? 在傳統(tǒng)意義上來講,如果存在海量數(shù)據(jù),單臺服務(wù)器存儲1T壓力非常大,考慮到數(shù)據(jù)庫的硬盤,網(wǎng)絡(luò)IO,還有CPU,內(nèi)存的瓶頸,如果多臺進(jìn)行分?jǐn)?T的數(shù)據(jù),到每臺上就是可估量的較小數(shù)據(jù),在mongodb集群只要設(shè)置好分片規(guī)則,通過mongos操作數(shù)據(jù)庫,就可以自動把對應(yīng)的操作請求轉(zhuǎn)發(fā)到對應(yīng)的后端分片服務(wù)器上。

    replica set

    ? 在總體mongodb集群架構(gòu)中,對應(yīng)的分片節(jié)點,如果單臺機器下線,對應(yīng)整個集群的數(shù)據(jù)就會出現(xiàn)部分缺失,這是不能發(fā)生的,因此對于shard節(jié)點需要replica set來保證數(shù)據(jù)的可靠性,生產(chǎn)環(huán)境通常為2個副本+1個仲裁。

    整體架構(gòu)

    整體架構(gòu)涉及到15個節(jié)點,我們這里使用Docker容器進(jìn)行部署

    那么我們先來總結(jié)一下我們搭建一個高可用集群需要多少個Mongo

    • mongos: 3臺

    • configserver : 3臺

    • shard : 3片; 每個分片由三個節(jié)點構(gòu)成

    容器部署情況
    角色端口暴漏端口描述角色
    config-server127017配置節(jié)點1
    config-server227017配置節(jié)點2
    config-server327017配置節(jié)點3
    mongos-server12701730001路由節(jié)點1
    mongos-server22701730002路由節(jié)點2
    mongos-server32701730003路由節(jié)點3
    shard1-server127017分片1節(jié)點1Primary
    shard1-server227017分片1節(jié)點2Secondry
    shard1-server327017分片1節(jié)點3Arbiter
    shard2-server127017分片2節(jié)點1Primary
    shard2-server227017分片2節(jié)點2Secondry
    shard2-server327017分片2節(jié)點3Arbiter
    shard3-server127017分片3節(jié)點1Primary
    shard3-server227017分片3節(jié)點2Secondry
    shard3-server327017分片3節(jié)點3Arbiter
    整體架構(gòu)預(yù)覽

    基礎(chǔ)環(huán)境準(zhǔn)備

    安裝Docker

    本次使用Docker環(huán)境進(jìn)行搭建,需要提前準(zhǔn)備好Docker環(huán)境

    創(chuàng)建Docker網(wǎng)絡(luò)

    因為需要使用Docker搭建MongoDB集群,所以先創(chuàng)建Docker網(wǎng)絡(luò)

    docker network create mongo-cluster docker network ls

    搭建ConfigServer副本集

    我們先來搭建ConfigServer的副本集,這里面涉及到三個節(jié)點,我們需要創(chuàng)建配置文件以及啟動容器

    創(chuàng)建掛載目錄

    我們需要創(chuàng)建對應(yīng)的掛載目錄來存儲配置文件以及日志文件

    # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/config-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/config-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}

    創(chuàng)建密鑰文件

    因為我們知道搭建的話一定要高可用,而且一定要權(quán)限,這里mongo之間通信采用秘鑰文件,所以我們先進(jìn)行生成密鑰文件

    # 創(chuàng)建密鑰文件 openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key # 設(shè)置 chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key

    創(chuàng)建配置文件

    因為由多個容器,配置文件是一樣的,我們只需要創(chuàng)建一個配置文件,其他的容器統(tǒng)一讀取該配置文件即可

    echo " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: configsvr #副本集名稱 sharding:clusterRole: configsvr # 集群角色,這里配置的角色是配置節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/config-server/conf/mongo.conf

    啟動容器
    啟動config-server1
    docker run --name config-server1 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/config-server:/data/configdb \ -v /tmp/mongo-cluster/config-server/data/1:/data/db \ -v /tmp/mongo-cluster/config-server/logs/1:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動config-server2
    docker run --name config-server2 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/config-server:/data/configdb \ -v /tmp/mongo-cluster/config-server/data/2:/data/db \ -v /tmp/mongo-cluster/config-server/logs/2:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動config-server3
    docker run --name config-server3 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/config-server:/data/configdb \ -v /tmp/mongo-cluster/config-server/data/3:/data/db \ -v /tmp/mongo-cluster/config-server/logs/3:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    初始化config-server
    登錄容器

    進(jìn)入第一臺容器

    docker exec -it config-server1 bash mongo -port 27017

    執(zhí)行命令

    執(zhí)行以下命令進(jìn)行MongoDB容器的初始化

    rs.initiate({_id: "configsvr",members: [{ _id : 1, host : "config-server1:27017" },{ _id : 2, host : "config-server2:27017" },{ _id : 3, host : "config-server3:27017" }]} )

    如果出現(xiàn)OK表示MongoDB配置服務(wù)器已經(jīng)初始化成功

    創(chuàng)建用戶

    因為我們需要對用戶進(jìn)行權(quán)限管理,我們需要創(chuàng)建用戶,這里為了演示,我們創(chuàng)建超級用戶 權(quán)限是root

    use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

    這樣就在MongoDB的admin數(shù)據(jù)庫添加了一個用戶名為root 密碼是root的用戶

    搭建Shard分片組

    由于mongos是客戶端,所以我們先搭建好config以及shard之后再搭建mongos。

    創(chuàng)建掛載目錄

    我們先創(chuàng)建掛載目錄

    # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}

    搭建shard1分片組

    在同一臺服務(wù)器上初始化一組分片

    創(chuàng)建密鑰文件

    因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件復(fù)制過來

    cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/

    配置配置文件

    因為有多個容器,配置文件是一樣的,我們只需要創(chuàng)建一個配置文件,其他的容器統(tǒng)一讀取該配置文件即可

    echo " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard1 #復(fù)制集名稱是 shardsvr sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard1-server/conf/mongo.conf

    啟動shard1-server1
    docker run --name shard1-server1 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard1-server:/data/configdb \ -v /tmp/mongo-cluster/shard1-server/data/1:/data/db \ -v /tmp/mongo-cluster/shard1-server/logs/1:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard1-server2
    docker run --name shard1-server2 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard1-server:/data/configdb \ -v /tmp/mongo-cluster/shard1-server/data/2:/data/db \ -v /tmp/mongo-cluster/shard1-server/logs/2:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard1-server3
    docker run --name shard1-server3 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard1-server:/data/configdb \ -v /tmp/mongo-cluster/shard1-server/data/3:/data/db \ -v /tmp/mongo-cluster/shard1-server/logs/3:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    初始化shard1分片組

    并且制定第三個副本集為仲裁節(jié)點

    docker exec -it shard1-server1 bin/bashmongo -port 27017

    登錄后進(jìn)行初始化節(jié)點,這里面arbiterOnly:true是設(shè)置為仲裁節(jié)點

    #進(jìn)行副本集配置 rs.initiate({_id : "shard1",members: [{ _id : 0, host : "shard1-server1:27017" },{ _id : 1, host : "shard1-server2:27017" },{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }]} );

    顯示OK即副本集創(chuàng)建成功

    創(chuàng)建用戶

    因為我們需要對用戶進(jìn)行權(quán)限管理,我們需要創(chuàng)建用戶,這里為了演示,我們創(chuàng)建超級用戶 權(quán)限是root

    use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

    查看節(jié)點信息
    rs.isMaster()

    搭建shard2分片組
    創(chuàng)建密鑰文件

    因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件復(fù)制過來

    cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/

    配置配置文件

    因為有多個容器,配置文件是一樣的,我們只需要創(chuàng)建一個配置文件,其他的容器統(tǒng)一讀取該配置文件即可

    echo " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard2 #復(fù)制集名稱是 shard2 sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard2-server/conf/mongo.conf

    啟動shard2-server1
    docker run --name shard2-server1 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard2-server:/data/configdb \ -v /tmp/mongo-cluster/shard2-server/data/1:/data/db \ -v /tmp/mongo-cluster/shard2-server/logs/1:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard2-server2
    docker run --name shard2-server2 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard2-server:/data/configdb \ -v /tmp/mongo-cluster/shard2-server/data/2:/data/db \ -v /tmp/mongo-cluster/shard2-server/logs/2:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard2-server3
    docker run --name shard2-server3 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard2-server:/data/configdb \ -v /tmp/mongo-cluster/shard2-server/data/3:/data/db \ -v /tmp/mongo-cluster/shard2-server/logs/3:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    初始化shard2分片組

    登錄節(jié)點后進(jìn)行初始化分片2

    docker exec -it shard2-server1 bin/bashmongo -port 27017

    執(zhí)行下面的命令進(jìn)行初始化分片2,arbiterOnly:true參數(shù)是設(shè)置為仲裁節(jié)點

    #進(jìn)行副本集配置 rs.initiate({_id : "shard2",members: [{ _id : 0, host : "shard2-server1:27017" },{ _id : 1, host : "shard2-server2:27017" },{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }]} );

    返回ok就表示

    創(chuàng)建用戶

    因為我們需要對用戶進(jìn)行權(quán)限管理,我們需要創(chuàng)建用戶,這里為了演示,我們創(chuàng)建超級用戶 權(quán)限是root

    use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

    搭建shard3分片組
    創(chuàng)建密鑰文件

    因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件復(fù)制過來

    cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/

    配置配置文件

    因為有多個容器,配置文件是一樣的,我們只需要創(chuàng)建一個配置文件,其他的容器統(tǒng)一讀取該配置文件即可

    echo " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard3 #復(fù)制集名稱是 shard3 sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard3-server/conf/mongo.conf

    啟動shard3-server1
    docker run --name shard3-server1 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard3-server:/data/configdb \ -v /tmp/mongo-cluster/shard3-server/data/1:/data/db \ -v /tmp/mongo-cluster/shard3-server/logs/1:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard3-server2
    docker run --name shard3-server2 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard3-server:/data/configdb \ -v /tmp/mongo-cluster/shard3-server/data/2:/data/db \ -v /tmp/mongo-cluster/shard3-server/logs/2:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動shard3-server3
    docker run --name shard3-server3 -d \ --net=mongo-cluster \ --privileged=true \ -v /tmp/mongo-cluster/shard3-server:/data/configdb \ -v /tmp/mongo-cluster/shard3-server/data/3:/data/db \ -v /tmp/mongo-cluster/shard3-server/logs/3:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    初始化shard3分片組

    登錄節(jié)點后進(jìn)行初始化分片2

    docker exec -it shard3-server1 bin/bashmongo -port 27017

    執(zhí)行下面的命令進(jìn)行初始化分片3,arbiterOnly:true參數(shù)是設(shè)置為仲裁節(jié)點

    #進(jìn)行副本集配置 rs.initiate({_id : "shard3",members: [{ _id : 0, host : "shard3-server1:27017" },{ _id : 1, host : "shard3-server2:27017" },{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }]} );

    創(chuàng)建用戶

    因為我們需要對用戶進(jìn)行權(quán)限管理,我們需要創(chuàng)建用戶,這里為了演示,我們創(chuàng)建超級用戶 權(quán)限是root

    use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

    搭建Mongos

    mongos負(fù)責(zé)查詢與數(shù)據(jù)寫入的路由,是實例訪問的統(tǒng)一入口,是一個無狀態(tài)的節(jié)點,每一個節(jié)點都可以從config-server節(jié)點獲取到配置信息

    創(chuàng)建掛載目錄

    我們需要創(chuàng)建對應(yīng)的掛載目錄來存儲配置文件以及日志文件

    # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}

    創(chuàng)建密鑰文件

    因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件復(fù)制過來

    cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/

    創(chuàng)建配置文件

    因為有多個容器,配置文件是一樣的,我們只需要創(chuàng)建一個配置文件,其他的容器統(tǒng)一讀取該配置文件即可,因為Mongos只負(fù)責(zé)路由,就不需要數(shù)據(jù)文件了,并且mongos服務(wù)是不負(fù)責(zé)認(rèn)證的,需要將authorization配置項刪除

    echo " # 日志文件 systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip # 配置分片,這里面配置的是需要讀取的配置節(jié)點的信息 sharding:configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017 security:keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/mongos-server/conf/mongo.conf

    啟動mongos集群
    啟動mongos1
    docker run --name mongos-server1 -d \ -p 30001:27017 \ --net=mongo-cluster \ --privileged=true \ --entrypoint "mongos" \ -v /tmp/mongo-cluster/mongos-server:/data/configdb \ -v /tmp/mongo-cluster/mongos-server/logs/1:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動mongos2
    docker run --name mongos-server2 -d \ -p 30002:27017 \ --net=mongo-cluster \ --privileged=true \ --entrypoint "mongos" \ -v /tmp/mongo-cluster/mongos-server:/data/configdb \ -v /tmp/mongo-cluster/mongos-server/logs/2:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    啟動mongos3
    docker run --name mongos-server3 -d \ -p 30003:27017 \ --net=mongo-cluster \ --privileged=true \ --entrypoint "mongos" \ -v /tmp/mongo-cluster/mongos-server:/data/configdb \ -v /tmp/mongo-cluster/mongos-server/logs/3:/data/logs \ mongo --config /data/configdb/conf/mongo.conf

    配置mongos-server1

    因為mongos是無中心的配置,所有需要每一臺都需要進(jìn)行分片配置

    進(jìn)入容器
    docker exec -it mongos-server1 /bin/bash mongo -port 27017

    登錄Mongos

    使用前面設(shè)置的root用戶密碼

    use admin; db.auth("root","root");

    配置分片

    進(jìn)行配置分片信息

    sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

    配置mongos-server2

    因為mongos是無中心的配置,所有需要每一臺都需要進(jìn)行分片配置

    進(jìn)入容器
    docker exec -it mongos-server2 /bin/bash mongo -port 27017

    登錄Mongos

    使用前面設(shè)置的root用戶密碼

    use admin; db.auth("root","root");

    配置分片

    進(jìn)行配置分片信息

    sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

    配置mongos-server3

    因為mongos是無中心的配置,所有需要每一臺都需要進(jìn)行分片配置

    進(jìn)入容器
    docker exec -it mongos-server3 /bin/bash mongo -port 27017

    登錄Mongos

    使用前面設(shè)置的root用戶密碼

    use admin; db.auth("root","root");

    配置分片

    進(jìn)行配置分片信息

    sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

    Docker-compose方式搭建

    環(huán)境準(zhǔn)備

    初始化目錄腳本
    # 創(chuàng)建config-server 目錄 # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/config-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/config-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}# 創(chuàng)建shard-server 目錄 # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}# 創(chuàng)建mongos-server 目錄 # 創(chuàng)建配置文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/conf # 創(chuàng)建數(shù)據(jù)文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3} # 創(chuàng)建日志文件目錄 mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}

    生成密鑰文件
    # 創(chuàng)建密鑰文件 openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key # 設(shè)置 chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.keycp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/

    創(chuàng)建配置文件
    echo " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: configsvr #副本集名稱 sharding:clusterRole: configsvr # 集群角色,這里配置的角色是配置節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/config-server/conf/mongo.confecho " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard1 #復(fù)制集名稱是 shardsvr sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard1-server/conf/mongo.confecho " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard2 #復(fù)制集名稱是 shard2 sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard2-server/conf/mongo.confecho " # 日志文件 storage:# mongod 進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對 mongod 進(jìn)程有效dbPath: /data/db systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號 # bindIp: 127.0.0.1 #綁定ip replication:replSetName: shard3 #復(fù)制集名稱是 shard3 sharding:clusterRole: shardsvr # 集群角色,這里配置的角色是分片節(jié)點 security:authorization: enabled #是否開啟認(rèn)證keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/shard3-server/conf/mongo.confecho " # 日志文件 systemLog:destination: filelogAppend: truepath: /data/logs/mongo.log# 網(wǎng)絡(luò)設(shè)置 net:port: 27017 #端口號bindIp: 0.0.0.0 #綁定ip # 配置分片,這里面配置的是需要讀取的配置節(jié)點的信息 sharding:configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017 security:keyFile: /data/configdb/conf/mongo.key #keyFile路徑 " > /tmp/mongo-cluster/mongos-server/conf/mongo.conf

    啟動服務(wù)

    docker-compos配置文件

    使用docker-compos方式啟動Docker容器

    version: '2' services:config-server1:image: mongocontainer_name: config-server1privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/config-server:/data/configdb- /tmp/mongo-cluster/config-server/data/1:/data/db- /tmp/mongo-cluster/config-server/logs/1:/data/logsconfig-server2:image: mongocontainer_name: config-server2privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/config-server:/data/configdb- /tmp/mongo-cluster/config-server/data/2:/data/db- /tmp/mongo-cluster/config-server/logs/2:/data/logsconfig-server3:image: mongocontainer_name: config-server3privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/config-server:/data/configdb- /tmp/mongo-cluster/config-server/data/3:/data/db- /tmp/mongo-cluster/config-server/logs/3:/data/logsshard1-server1:image: mongocontainer_name: shard1-server1privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard1-server:/data/configdb- /tmp/mongo-cluster/shard1-server/data/1:/data/db- /tmp/mongo-cluster/shard1-server/logs/1:/data/logsshard1-server2:image: mongocontainer_name: shard1-server2privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard1-server:/data/configdb- /tmp/mongo-cluster/shard1-server/data/2:/data/db- /tmp/mongo-cluster/shard1-server/logs/2:/data/logsshard1-server3:image: mongocontainer_name: shard1-server3privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard1-server:/data/configdb- /tmp/mongo-cluster/shard1-server/data/3:/data/db- /tmp/mongo-cluster/shard1-server/logs/3:/data/logsshard2-server1:image: mongocontainer_name: shard2-server1privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard2-server:/data/configdb- /tmp/mongo-cluster/shard2-server/data/1:/data/db- /tmp/mongo-cluster/shard2-server/logs/1:/data/logsshard2-server2:image: mongocontainer_name: shard2-server2privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard2-server:/data/configdb- /tmp/mongo-cluster/shard2-server/data/2:/data/db- /tmp/mongo-cluster/shard2-server/logs/2:/data/logsshard2-server3:image: mongocontainer_name: shard2-server3privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard2-server:/data/configdb- /tmp/mongo-cluster/shard2-server/data/3:/data/db- /tmp/mongo-cluster/shard2-server/logs/3:/data/logsshard3-server1:image: mongocontainer_name: shard3-server1privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard3-server:/data/configdb- /tmp/mongo-cluster/shard3-server/data/1:/data/db- /tmp/mongo-cluster/shard3-server/logs/1:/data/logsshard3-server2:image: mongocontainer_name: shard3-server2privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard3-server:/data/configdb- /tmp/mongo-cluster/shard3-server/data/2:/data/db- /tmp/mongo-cluster/shard3-server/logs/2:/data/logsshard3-server3:image: mongocontainer_name: shard3-server3privileged: truenetworks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confvolumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/shard3-server:/data/configdb- /tmp/mongo-cluster/shard3-server/data/3:/data/db- /tmp/mongo-cluster/shard3-server/logs/3:/data/logsmongos-server1:image: mongocontainer_name: mongos-server1privileged: trueentrypoint: "mongos"networks:- mongo-cluster-networkcommand: --config /data/configdb/conf/mongo.confports:- "30001:27017"volumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/mongos-server:/data/configdb- /tmp/mongo-cluster/mongos-server/logs/1:/data/logscommand: --config /data/configdb/conf/mongo.confmongos-server2:image: mongocontainer_name: mongos-server2privileged: trueentrypoint: "mongos"networks:- mongo-cluster-networkports:- "30002:27017"volumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/mongos-server:/data/configdb- /tmp/mongo-cluster/mongos-server/logs/2:/data/logscommand: --config /data/configdb/conf/mongo.confmongos-server3:image: mongocontainer_name: mongos-server3privileged: trueentrypoint: "mongos"networks:- mongo-cluster-networkports:- "30003:27017"volumes:- /etc/localtime:/etc/localtime- /tmp/mongo-cluster/mongos-server:/data/configdb- /tmp/mongo-cluster/mongos-server/logs/3:/data/logscommand: --config /data/configdb/conf/mongo.confnetworks:mongo-cluster-network:driver: bridge
    啟動服務(wù)
    docker-compose up -d

    初始化文件

    執(zhí)行下面腳本進(jìn)行容器初始化

    docker exec -it config-server1 bash mongo -port 27017 rs.initiate({_id: "configsvr",members: [{ _id : 1, host : "config-server1:27017" },{ _id : 2, host : "config-server2:27017" },{ _id : 3, host : "config-server3:27017" }]} ) use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) db.auth("root","root") db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec -it shard1-server1 bin/bash mongo -port 27017 #進(jìn)行副本集配置 rs.initiate({_id : "shard1",members: [{ _id : 0, host : "shard1-server1:27017" },{ _id : 1, host : "shard1-server2:27017" },{ _id : 2, host : "shard1-server3:27017",arbiterOnly:true }]} ); use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) db.auth("root","root") db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec -it shard2-server1 bin/bash mongo -port 27017 #進(jìn)行副本集配置 rs.initiate({_id : "shard2",members: [{ _id : 0, host : "shard2-server1:27017" },{ _id : 1, host : "shard2-server2:27017" },{ _id : 2, host : "shard2-server3:27017",arbiterOnly:true }]} ); use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) db.auth("root","root") db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec -it shard3-server1 bin/bash mongo -port 27017 #進(jìn)行副本集配置 rs.initiate({_id : "shard3",members: [{ _id : 0, host : "shard3-server1:27017" },{ _id : 1, host : "shard3-server2:27017" },{ _id : 2, host : "shard3-server3:27017",arbiterOnly:true }]} ); use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) db.auth("root","root") db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
    初始化分片
    docker exec -it mongos-server1 /bin/bash mongo -port 27017 use admin; db.auth("root","root"); sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")docker exec -it mongos-server2 /bin/bash mongo -port 27017 use admin; db.auth("root","root"); sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")docker exec -it mongos-server3 /bin/bash mongo -port 27017 use admin; db.auth("root","root"); sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017") sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017") sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

    專注Java技術(shù)干貨分享,歡迎志同道合的小伙伴,一起交流學(xué)習(xí)

    總結(jié)

    以上是生活随笔為你收集整理的【超详细】手把手教你搭建MongoDB集群搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。