婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Docker 搭建集群MongoDB的實現步驟

Docker 搭建集群MongoDB的實現步驟

熱門標簽:江蘇自動外呼系統一般多少錢 信貸電銷機器人系統 400 電話 申請費用 山東電信外呼系統靠譜嗎 長沙回撥外呼系統 鸚鵡螺號航海地圖標注時間 ai電話機器人營銷 比較穩定的外呼系統 云南云電銷機器人招商

前言

由于公司業務需要,我們打算自己搭建 MongoDB 的服務,因為 MongoDB 的云數據庫好貴,我們這次采用副本集的方式來搭建集群,三臺服務器,一主、一副、一仲裁

基本概念

Replica Set 副本集:一個副本集就是一組 MongoDB 實例組成的集群,由一個主(Primary)服務器和多個備份(Secondary)服務器構成

  • 主節點(master):主節點接收所有寫入操作。主節點將對其數據集所做的所有更改記錄到其 oplog。
  • 副節點(secondary):復制主節點的 oplog 并將操作應用到其數據集,如果主節點不可用,一個合格的副節點將被選為新的主節點。
  • 仲裁節點(arbiter):負載選舉,當主節點不可用,它將從副節點中選一個作為主節點。

Sharding 分片:

Master-slave 主備

  • MongoDB 4.0 以上版本運行時提示:[main] Master/slave replication is no longer supported,也就是 MongoDB 4.0 后不在支持主從復制

一、環境準備

使用 CentOS 7.6 64bit 系統,安裝 Docker、Docker-compose、Docker-Swarm

二、生成 KeyFile

  • MongoDB 使用 KeyFile 認證,副本集中的每個 MongoDB 實例使用 KeyFile 內容作為認證其他成員的共享密碼。MongoDB 實例只有擁有正確的 KeyFile 才可以加入副本集。
  • keyFile 的內容必須是 6 到 1024 個字符的長度,且副本集所有成員的 KeyFile 內容必須相同。
  • 有一點要注意是的:在 UNIX 系統中,KeyFile 必須沒有組權限或完全權限(也就是權限要設置成 X00 的形式)。Windows 系統中,keyFile 權限沒有被檢查。
  • 可以使用任意方法生成 keyFile。例如,如下操作使用 openssl 生成復雜的隨機的 1024 個字符串。然后使用 chmod 修改文件權限,只給文件擁有者提供讀權限。
  • 這是 MongoDB 官方推薦 keyFile 的生成方式:
# 400權限是要保證安全性,否則mongod啟動會報錯
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

二、創建跨主機網絡

搭建集群我們肯定是跨主機通訊,要搭建 Overlay Network 網絡,我們就要用到 Docker Swarm 這個工具了。Docker Swarm 是 Docker 內置的集群工具,它能夠幫助我們更輕松地將服務部署到 Docker daemon 的集群之中。

既然要將 Docker 加入到集群,我們就必須先有一個集群,我們在任意一個 Docker 實例上都可以通過 docker swarm init 來初始化集群。

$ sudo docker swarm init

Swarm initialized: current node (t4ydh2o5mwp5io2netepcauyl) is now a manager.

To add a worker to this swarm, run the following command:

  docker swarm join --token SWMTKN-1-4dvxvx4n7magy5zh0g0de0xoues9azekw308jlv6hlvqwpriwy-cb43z26n5jbadk024tx0cqz5r 192.168.1.5:2377

在集群初始化后,這個 Docker 實例就自動成為了集群的管理節點,而其他 Docker 實例可以通過運行這里所打印的 docker swarm join 命令來加入集群。

加入到集群的節點默認為普通節點,如果要以管理節點的身份加入到集群中,我們可以通過 docker swarm join-token 命令來獲得管理節點的加入命令。

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:

  docker swarm join --token SWMTKN-1-60am9y6axwot0angn1e5inxrpzrj5d6aa91gx72f8et94wztm1-7lz0dth35wywekjd1qn30jtes 192.168.1.5:2377

我們通過這些命令來建立用于我們服務開發的 Docker 集群,并將相關開發同事的 Docker 加入到這個集群里,就完成了搭建跨主機網絡的第一步。

建立跨主機網絡

接下來,我們就通過 docker network create 命令來建立 Overlay 網絡。

$ sudo docker network create --driver overlay --attachable mongodbs

在創建 Overlay 網絡時,我們要加入 --attachable 選項以便不同機器上的 Docker 容器能夠正常使用到它。

在創建了這個網絡之后,我們可以在任何一個加入到集群的 Docker 實例上使用 docker network ls 查看一下其下的網絡列表。我們會發現這個網絡定義已經同步到了所有集群中的節點上。

$ sudo docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
## ......
y89bt74ld9l8    mongodbs        overlay       swarm
## ......

接下來我們要修改 Docker Compose 的定義,讓它使用這個我們已經定義好的網絡,而不是再重新創建網絡。

我們只需要在 Docker Compose 配置文件的網絡定義部分,將網絡的 external 屬性設置為 true,就可以讓 Docker Compose 將其建立的容器都連接到這個不屬于 Docker Compose 的項目上了。

networks:
 mesh:
  external: true

通過這個實現,我們在開發中就使整個服務都處于一個可以使用別名映射網絡中,避免了要對不同功能聯調時切換服務 IP 的煩瑣流程。在這種結構下,我們只需要讓我們開發的 Docker 退出和加入不同的集群,就能馬上做到切換不同聯調項目。

二、編寫 docker-compose 文件

主節點

version: "3"
services: 
 master:
  image: mongo:4.1
  container_name: master
  environment:
   MONGO_INITDB_ROOT_USERNAME: root
   MONGO_INITDB_ROOT_PASSWORD: 123456
   TZ: "Asia/Shanghai"
  volumes:
   # 掛載 MongoDB 數據目錄
   - "/data/docker/mongodb/data/mongo:/data/db:rw"
   # 掛載 KeyFile
   - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
  ports:
   - "27018:27017"
  networks:
   - mongodbs
  command:
   # 密碼
   --auth
   # 副本集名稱
   --replSet testSet 
   --oplogSize 128
   --keyFile /data/mongodb.key
# Swarm 跨主機網絡網絡
networks:
 mongodbs:
  external: true

副節點

version: "3"
services: 
secondary:
 image: mongo:4.1
 container_name: secondary
 environment:
  MONGO_INITDB_ROOT_USERNAME: root
  MONGO_INITDB_ROOT_PASSWORD: 123456
  TZ: "Asia/Shanghai"
 volumes:
  - "/data/docker/mongodb/data/mongo:/data/db:rw"
  - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
 ports:
  - "27018:27017"
 networks:
  - mongodbs
 command:
  --auth
  --replSet testSet 
  --oplogSize 128
  --keyFile /data/mongodb.key
networks:
mongodbs:
 external: true

仲裁節點,因為仲裁節點不需要存儲數據,他只是用來當主節點掛掉后選舉新的主節點,所以不需要密碼、映射端口等操作

version: "3"
services:
arbiter:
 image: mongo:4.1
 container_name: arbiter
 restart: always
 volumes:
  - "/data/docker/mongodb/data/mongo:/data/db:rw"
  - "/data/docker/mongodb/data/mongo_key:/mongo:rw"
 networks:
  - mongodbs
 command:
  mongod --replSet testSet --smallfiles --oplogSize 128
networks:
mongodbs:
 external: true

三、啟動容器

接下來我們分別在三臺服務器中使用容器編排啟動容器

docker-compose up -d

四、配置副本集

進入主節點容器內部

docker exec -it master mongo

在 mongo shell 里執行:

> rs.initiate()
{
   "info2" : "no configuration specified. Using a default configuration for the set",
   "me" : "7abd89794aa7:27017",
   "ok" : 1
}

繼續執行:

testSet:SECONDARY> rs.add('secondary:27017')
{
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562800, 1),
       "signature" : {
           "hash" : BinData(0,"wrxMUIX/0bEyLgCVoQqdLvH59T0="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599562800, 1)
}

繼續執行,其中 true 表示這個節點是仲裁節點

testSet:PRIMARY> rs.add('arbiter:27017',true)
{
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562838, 1),
       "signature" : {
           "hash" : BinData(0,"p9ub49lLD8ij8nkxpfu2l/AvRRY="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599562838, 1)
}

查看配置

testSet:PRIMARY> rs.conf()
{
   "_id" : "testSet",
   "version" : 3,
   "protocolVersion" : NumberLong(1),
   "writeConcernMajorityJournalDefault" : true,
   "members" : [
       {
           "_id" : 0,
           "host" : "7abd89794aa7:27017",
           "arbiterOnly" : false,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 1,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       },
       {
           "_id" : 1,
           "host" : "secondary:27017",
           "arbiterOnly" : false,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 1,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       },
       {
           "_id" : 2,
           "host" : "arbiter:27017",
           "arbiterOnly" : true,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 0,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       }
   ],
   "settings" : {
       "chainingAllowed" : true,
       "heartbeatIntervalMillis" : 2000,
       "heartbeatTimeoutSecs" : 10,
       "electionTimeoutMillis" : 10000,
       "catchUpTimeoutMillis" : -1,
       "catchUpTakeoverDelayMillis" : 30000,
       "getLastErrorModes" : {

       },
       "getLastErrorDefaults" : {
           "w" : 1,
           "wtimeout" : 0
       },
       "replicaSetId" : ObjectId("5f576426fe90ef2dd8cd2700")
   }
}

查看狀態

testSet:PRIMARY> rs.status()
{
   "set" : "testSet",
   "date" : ISODate("2020-09-08T11:45:12.096Z"),
   "myState" : 1,
   "term" : NumberLong(1),
   "syncingTo" : "",
   "syncSourceHost" : "",
   "syncSourceId" : -1,
   "heartbeatIntervalMillis" : NumberLong(2000),
   "optimes" : {
       "lastCommittedOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "lastCommittedWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "readConcernMajorityOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "readConcernMajorityWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "appliedOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "durableOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "lastAppliedWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "lastDurableWallTime" : ISODate("2020-09-08T11:45:02.775Z")
   },
   "lastStableRecoveryTimestamp" : Timestamp(1599565492, 1),
   "lastStableCheckpointTimestamp" : Timestamp(1599565492, 1),
   "members" : [
       {
           "_id" : 0,
           "name" : "7abd89794aa7:27017",
           "ip" : "10.0.1.41",
           "health" : 1,
           "state" : 1,
           "stateStr" : "PRIMARY",
           "uptime" : 2784,
           "optime" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDate" : ISODate("2020-09-08T11:45:02Z"),
           "syncingTo" : "",
           "syncSourceHost" : "",
           "syncSourceId" : -1,
           "infoMessage" : "",
           "electionTime" : Timestamp(1599562790, 2),
           "electionDate" : ISODate("2020-09-08T10:59:50Z"),
           "configVersion" : 3,
           "self" : true,
           "lastHeartbeatMessage" : ""
       },
       {
           "_id" : 1,
           "name" : "secondary:27017",
           "ip" : "10.0.1.233",
           "health" : 1,
           "state" : 2,
           "stateStr" : "SECONDARY",
           "uptime" : 2711,
           "optime" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDurable" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDate" : ISODate("2020-09-08T11:45:02Z"),
           "optimeDurableDate" : ISODate("2020-09-08T11:45:02Z"),
           "lastHeartbeat" : ISODate("2020-09-08T11:45:11.494Z"),
           "lastHeartbeatRecv" : ISODate("2020-09-08T11:45:11.475Z"),
           "pingMs" : NumberLong(0),
           "lastHeartbeatMessage" : "",
           "syncingTo" : "7abd89794aa7:27017",
           "syncSourceHost" : "7abd89794aa7:27017",
           "syncSourceId" : 0,
           "infoMessage" : "",
           "configVersion" : 3
       },
       {
           "_id" : 2,
           "name" : "arbiter:27017",
           "ip" : null,
           "health" : 0,
           "state" : 8,
           "stateStr" : "(not reachable/healthy)",
           "uptime" : 0,
           "lastHeartbeat" : ISODate("2020-09-08T11:45:10.463Z"),
           "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
           "pingMs" : NumberLong(0),
           "lastHeartbeatMessage" : "Error connecting to arbiter:27017 :: caused by :: Could not find address for arbiter SocketException: Host not found (authoritative)",
           "syncingTo" : "",
           "syncSourceHost" : "",
           "syncSourceId" : -1,
           "infoMessage" : "",
           "configVersion" : -1
       }
   ],
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599565502, 1),
       "signature" : {
           "hash" : BinData(0,"7/ei+8UrhlpIny9zKeWuAFpn46c="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599565502, 1)
}

五、驗證 MongoDB 可用性

先進入主節點服務器添加一條數據

docker exec -it master mongo
use admin
db.auth('root', '123456')
use test
db.test.insert({name:"muyang",age:20})

在來副節點服務器查看是否已經同步了這條數據

[root@linux secondary] docker exec -it secondary mongo
testSet:SECONDARY> use admin
testSet:SECONDARY> db.auth('root', '123456')
testSet:SECONDARY> use test
testSet:SECONDARY> db.test.find()
2020-09-08T19:03:02.295+0800 E QUERY  [js] uncaught exception: Error: listCollections failed: {
   "operationTime" : Timestamp(1599562972, 1),
   "ok" : 0,
   "errmsg" : "not master and slaveOk=false",
   "code" : 13435,
   "codeName" : "NotMasterNoSlaveOk",
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562972, 1),
       "signature" : {
           "hash" : BinData(0,"mhsrpGHRl7qZg2QOjyS3RbBb/Yc="),
           "keyId" : NumberLong("6870069879538450434")
       }
   }
} :
testSet:SECONDARY> rs.slaveOk()
testSet:SECONDARY> db.users.find()
{ "_id" : ObjectId("5f5764b1f909544b783696c2"), "name" : "muyang", "age" : 20 }

在 secondary 查詢時報如下錯誤:

not master and slaveok=false

這是正常的,因為 secondary 是不允許讀寫的,如果非要解決,方法如下:

testSet:SECONDARY> rs.slaveOk()

 到此這篇關于Docker 搭建集群MongoDB的實現步驟的文章就介紹到這了,更多相關Docker 搭建集群MongoDB內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

標簽:拉薩 齊齊哈爾 烏海 衡陽 運城 澳門 亳州 嘉興

巨人網絡通訊聲明:本文標題《Docker 搭建集群MongoDB的實現步驟》,本文關鍵詞  Docker,搭建,集群,MongoDB,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Docker 搭建集群MongoDB的實現步驟》相關的同類信息!
  • 本頁收集關于Docker 搭建集群MongoDB的實現步驟的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品美日韩| 亚洲成人av中文| 成人夜色视频网站在线观看| 精品在线一区二区| 激情六月婷婷久久| 国产呦精品一区二区三区网站| 蜜桃在线一区二区三区| 国产一区二区三区在线观看免费| 日韩午夜中文字幕| 久久久久一区二区三区四区| 中文字幕欧美一区| 亚洲福利国产精品| 韩国视频一区二区| 精品噜噜噜噜久久久久久久久试看 | 欧美另类videos死尸| 91精品国产色综合久久不卡蜜臀 | 久久精品一区二区三区av| 亚洲男人的天堂av| 蜜桃免费网站一区二区三区| 日韩午夜电影在线观看| 顶级嫩模精品视频在线看| 在线观看中文字幕不卡| 久久久久久一二三区| 99在线精品观看| 精品国产免费一区二区三区香蕉| 亚洲精品视频自拍| 蜜乳av一区二区三区| 精品处破学生在线二十三| 97se亚洲国产综合自在线| 久久综合九色综合97婷婷| 日韩中文字幕亚洲一区二区va在线| 久热成人在线视频| 777精品伊人久久久久大香线蕉| 国产精品女人毛片| 欧美日韩国产中文| 亚洲综合免费观看高清在线观看| 成人国产免费视频| 久久影视一区二区| 欧美影视一区二区三区| 亚洲欧洲精品天堂一级| 3751色影院一区二区三区| 成人黄页毛片网站| 久久99精品久久久久久国产越南| 亚洲激情自拍偷拍| 欧美激情一区二区三区四区| 成人涩涩免费视频| 麻豆国产精品一区二区三区| 亚洲欧美经典视频| 国产午夜亚洲精品羞羞网站| 日韩欧美一二区| 免费的成人av| 精品国产乱码久久久久久图片| 色婷婷av久久久久久久| 国产精品久久久久影院老司| 99综合影院在线| 国产成人精品亚洲日本在线桃色| 久久日一线二线三线suv| 欧美精品在欧美一区二区少妇| 91视频www| 亚洲一区电影777| 国产精品网站导航| 久久久久久夜精品精品免费| 日韩视频国产视频| 日韩视频在线观看一区二区| 欧美高清视频www夜色资源网| 一本到三区不卡视频| 91浏览器入口在线观看| 懂色一区二区三区免费观看| 国产乱妇无码大片在线观看| 一区二区在线观看免费| 中文字幕一区二区三区不卡在线 | 欧美日韩成人一区二区| av福利精品导航| 91蜜桃婷婷狠狠久久综合9色| av不卡免费电影| 91国模大尺度私拍在线视频| 老司机精品视频一区二区三区| 亚洲一区在线免费观看| 一个色妞综合视频在线观看| 精品国产成人系列| 欧美变态tickle挠乳网站| 久久综合九色综合欧美亚洲| 国产亚洲一区二区三区在线观看| 国产女主播一区| 欧美理论电影在线| 日韩一本二本av| 久久久久一区二区三区四区| 亚洲欧洲一区二区三区| 亚洲美女精品一区| 日本成人在线网站| 一区二区三区毛片| 蜜桃在线一区二区三区| 国产精华液一区二区三区| av高清不卡在线| 欧美一区二区三区在线视频 | 成人免费在线播放视频| 亚洲一区二区三区视频在线播放| 日韩国产欧美在线视频| 老司机精品视频导航| 成人激情图片网| 欧美日韩国产在线播放网站| 久久精品在线观看| 三级亚洲高清视频| youjizz久久| 日韩欧美中文字幕精品| 国产精品久久久久一区| 日欧美一区二区| 91在线观看下载| 日韩一区二区三区免费看| 国产精品视频一二三| 久国产精品韩国三级视频| 色综合久久66| 中文字幕国产一区二区| 日本不卡一区二区三区| 色综合色狠狠天天综合色| 久久综合久色欧美综合狠狠| 亚洲成人激情av| 色老综合老女人久久久| 国产精品传媒视频| 粉嫩av一区二区三区粉嫩 | 国产精品毛片久久久久久| 青青草原综合久久大伊人精品优势| 91在线无精精品入口| 国产人久久人人人人爽| 久久99精品国产91久久来源| 51精品视频一区二区三区| 有码一区二区三区| 色婷婷综合久久久| 亚洲色图在线视频| 亚洲高清久久久| 99久久精品免费看| 中文字幕日韩一区二区| 成人精品视频一区| 亚洲国产精品二十页| 国产成人免费视频 | 欧美一卡在线观看| 视频一区二区不卡| 91精品国产综合久久久久久久久久| 亚洲蜜臀av乱码久久精品| 色综合久久久久久久| 专区另类欧美日韩| 99国产欧美久久久精品| 亚洲视频一二三| 日本黄色一区二区| 亚洲高清不卡在线| 欧美日韩精品一区二区三区蜜桃 | 国产亚洲精品aa| 国产一区999| 国产精品美女久久福利网站| 成人晚上爱看视频| 亚洲免费观看高清完整版在线观看熊| 99精品视频一区二区三区| 亚洲激情第一区| 欧美三级中文字| 国产日韩欧美在线一区| 国产一区二区三区电影在线观看| 久久久99精品免费观看| av一区二区三区在线| 亚洲电影第三页| 欧美本精品男人aⅴ天堂| 国产成人亚洲综合色影视| 亚洲日本在线天堂| 91精品在线免费| 国产激情偷乱视频一区二区三区| 国产精品久久看| 欧美日韩另类一区| 国产一区二区三区日韩| 最新高清无码专区| 日韩一级完整毛片| 99国产精品久久久久久久久久| 亚洲图片欧美色图| 国产日韩欧美a| 欧美日韩色综合| 国产电影一区在线| 午夜精品免费在线| 色哟哟一区二区在线观看 | 国产精品视频观看| 欧美日韩国产系列| 成人一区二区三区在线观看| 亚洲午夜久久久久久久久久久 | 成人av电影在线播放| 伊人一区二区三区| 久久久久久久av麻豆果冻| 91久久国产最好的精华液| 韩国v欧美v亚洲v日本v| 亚洲电影激情视频网站| 中文字幕一区二区三区在线不卡| 日韩欧美在线不卡| 欧美三级日韩三级国产三级| 成人自拍视频在线| 麻豆成人久久精品二区三区红| 亚洲激情综合网| 国产精品久久久久久久久快鸭| 日韩欧美在线一区二区三区| 色噜噜狠狠色综合欧洲selulu| 国产一区二区三区精品欧美日韩一区二区三区 | 国产最新精品精品你懂的| 亚洲国产日韩a在线播放| 中文字幕一区二区三区不卡在线 | 日韩欧美电影在线|