Docker部署Mongo集羣 一主兩從

環境:

1、準備一個linux服務器(我這邊是centos系統)
2、確保有docker和docker-compose環境


搭建流程

第一步(主要是配置mongo容器掛載的位置,生成一個認證文件,三個mongo共用)

// 1 登錄進自己的服務器 切到根目錄
cd /

// 2 創建docker 文件夾
mkdir docker

// 3 進入docker文件夾
cd docker

// 4 再創建一個momgo文件夾
mkdir momgo

// 5 進入mongo文件夾
cd mongo

// 6 在mongo文件夾下面分別創建三個文件夾 master,salve,arbiter
mkdir master
mkdir salve
mkdir arbiter

// 7 分別進入master,salve,arbiter文件夾,在每個文件夾下面都創建db和configdb文件夾
cd master
mkdir db
mkdir configdb
cd ..

cd salve
mkdir db
mkdir configdb
cd ..

cd arbiter
mkdir db
mkdir configdb
cd ..

// 8 生成認證文件並修改權限 注意這個路徑/root/docker/mongo,會生成一個keyfile0 文件
openssl rand -base64 100 > /root/docker/mongo/keyfile0 

// 9 授權一下
chmod 600 /root/docker/mongo/keyfile0

// 10 拷貝keyfile0到master,salve,arbiter三個文件夾下的configdb目錄
// 不熟悉命令的推薦一個圖形界面管理工具 WinSCP免費的,可以像windows一樣複製粘貼文件
cp keyfile0 ./master/configdb
cp keyfile0 ./salve/configdb
cp keyfile0 ./arbiter/configdb

// 11驗證權限 分別執行以下操作
chmod 600 /root/docker/mongo/master/configdb/keyfile0 
chmod 600 /root/docker/mongo/salve/configdb/keyfile0 
chmod 600 /root/docker/mongo/arbiter/configdb/keyfile0 


第二步

1、安裝portainer,成功後訪問服務器IP+9000端口會看到一個圖形界面
2、熟悉docker命令的就不需要了用找個了,直接把我下面stack文件裏的內容,分三個命令執行就行了,記得固定容器內部IP(portainer中的stack就是我們所說的docker-compose.yaml----個人理解)

// 這邊在百度隨便搜一下都有
 docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /mnt/docker/portainer:/data portainer/portainer

在這裏插入圖片描述

第三步

1、我這邊創建了一個stack,name隨便取,內容如下就不詳細介紹了,有問題可以私信討論
在這裏插入圖片描述

version: '2'
services:

  master:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    container_name: mongo-m
    ports:
      - 27017:27017
    volumes:
      - /root/docker/mongo/master/db/:/data/db
      - /root/docker/mongo/master/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.3
    
  salve:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root  
    container_name: mongo-s
    ports:
      - 27018:27017
    volumes:
      - /root/docker/mongo/salve/db/:/data/db
      - /root/docker/mongo/salve/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.4
    
  arbiter:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root  
    container_name: mongo-a
    ports:
      - 27019:27017
    volumes:
      - /root/docker/mongo/arbiter/db/:/data/db
      - /root/docker/mongo/arbiter/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.5
    
networks:
  mongo-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.24.0.0/16
          gateway: 172.24.0.1    
    


2、點一下 update the stack 按鈕 就可以了
在這裏插入圖片描述


3、docker ps 查看容器是否能正常啓動
在這裏插入圖片描述


4、進入主mongo容器

docker exec -it mongo-m mongo

在這裏插入圖片描述


5、配置集羣信息

// 四步分別執行
use admin

db.auth('root','root')

config = {
   
         _id:"mongoreplset", version:1, members:[{
   
         _id:0, host:"172.24.0.3:27017", priority:6},
 {
   
         _id:1, host:"172.24.0.4:27017", priority:3}, 
 {
   
         _id:2, host:"172.24.0.5:27017", priority:2}]}
 
rs.initiate(config)

// 看到下圖圈紅的地方 “ok”:1 纔算成功了
在這裏插入圖片描述


第四步 測試配置結果

1、向主mongo插入一條數據並查看

// 這邊相當於數據庫的名稱叫test
ues test
// 保存一條數據
db.users.insert({
   
          "usernmae": "測試", "age": 26}
// 查看結果
db.users.find()

在這裏插入圖片描述


2、我們在隨便進入一臺從mongo查看數據是否存在,一定要用admin先認證一下,因爲我們啓動容器的時候設置了密碼

docker exec -it mongo-s mongo
use admin
db.auth('root','root')

在這裏插入圖片描述


3、進入從mongo,進行數據查看的時候,會報以下錯誤,因爲mongo集羣默認是隻有主mongo有讀寫權限的

db.users.find()

錯誤如下:
在這裏插入圖片描述


4、解決辦法:

// 執行以下方法,再查詢,不過這邊的方法在下個版本好像是要被棄用了
rs.slaveOk();

5、成功在從機查看到數據
在這裏插入圖片描述


我在搭建過程中遇到的問題

1、配置config集羣的時候,網上的文章都是用的宿主機IP,所以我剛開始也是這麼做的,但是這邊會報錯,大概是連接超時或者ping不通之類的,所以我在docker-compose.yaml中是固定了三個容器的內部IP的


2、我在啓動容器的時候就給mongo配置了用戶名,密碼(root,root),遇到報錯關於authentication的,先執行以下兩步,再執行自己想做的操作

use admin
db.auth('root','root')

3、在從機中想查詢主機插入的數據是否存在遇到的問題,上述已經講過了,也給瞭解決方案


參考文獻:

https://blog.csdn.net/ma_jiang/article/details/95735300?utm_source=app

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章