MongoDB集羣

目的:使用三個docker虛擬容器建立mongoDB集羣mongodb

一、拉取鏡像

可配置阿里雲的鏡像加速器docker

> sudo mkdir -p /etc/docker
> sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://test.mirror.aliyuncs.com"]
}
EOF
> sudo systemctl daemon-reload
> sudo systemctl restart docker

二、建立docker-compose文件

注意,docker-compost的文件名須要是docker-compost.yml數據庫

這裏採用的mongo4.0的鏡像,每一個容器最大內存限制爲4Gjson

version: '2'
services:
  db0:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db0:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27018:27017"
    command: mongod --replSet rs0
    links:
      - db1
      - db2
      
  db1:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db1:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27019:27017"
    command: mongod --replSet rs0
    
  db2:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db2:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27020:27017"
    command: mongod --replSet rs0

三、建立容器

在docker-compost.yml的相同路徑下,執行docker-compose up -d,這樣使用docker ps就能夠看到有三個容器啓動,選擇一個容器進入docker exec -it containerid bashbash

  • 執行mongo
> use admin
> config = {
      "_id" : "rs0",
      "members" : [
          {
              "_id" : 0,
              "host" : "192.168.1.44:27018",
              "priority":2 # 爲權重
          },
          {
              "_id" : 1,
              "host" : "192.168.1.44:27019"
          },
          {
              "_id" : 2,
              "host" : "192.168.1.44:27020"
          }
      ]
  }
  
> rs.initiate(config)

此時能夠使用rs.status()查看集羣信息,rs.isMaster()查看當前節點是不是主節點服務器

  • 建立用戶函數

    要操做哪一個庫,就在哪一個庫下建立用戶post

    use admin
    
    - db.createUser({user: 'user', pwd: 'pwd', roles: [{role:'root', db: 'admin'}]})
    • role
    1. 數據庫用戶角色:read、readWrite;
    2. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
    3. 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    4. 備份恢復角色:backup、restore;
    5. 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超級用戶角色:root
      // 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
    7. 內部角色:__system

    刪除用戶db.dropUser('username')阿里雲

    查看用戶show usersspa

    read:容許用戶讀取指定數據庫
    readWrite:容許用戶讀寫指定數據庫
    dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
    userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
    clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
    readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
    readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
    userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限
    dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
    root:只在admin數據庫中可用。超級帳號,超級權限
  • openssl rand -base64 725 > /data/common/mongodb-keyfile生成密鑰,長度大小要求在6-1024之間

  • 配置權限,更改全部者和所屬組

    chmod 600 mongodb-keyfile

    chown 999:999 mongodb-keyfile

    注:docker容器的所屬組爲999

四、配置登陸

從新配置docker-compose.yml

version: '2'
services:
  db0:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db0:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27018:27017"
    command: mongod --replSet rs0 --auth --keyFile /data/common/mongodb-keyfile
    links:
      - db1
      - db2
      
  db1:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db1:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27019:27017"
    command: mongod --replSet rs0 --auth --keyFile /data/common/mongodb-keyfile
    
  db2:
    image: mongo:4.0
    restart: always 
    mem_limit: 4G
    volumes:
      - /workspace/mongo-alpha/db2:/data/db
      - /workspace/mongo-alpha/common:/data/common
    environment:
      TZ: Asia/Shanghai
    ports:
      - "27020:27017"
    command: mongod --replSet rs0 --auth --keyFile /data/common/mongodb-keyfile

不加--auth ,數據庫就能夠不經過密碼登陸,當忘記密碼時,能夠使用。

此時要先將容器中止,docker-compose stop,再使用docker-compose up 新建並啓動鏡像

五、鏈接

mongodb://用戶名:密碼@集羣1,集羣2,集羣3/要操做的數據庫?authSource=用戶具備的權限庫&replicaSet=分片名

mongodb://user:pwd@192.168.1.44:27018,192.168.1.44:27019,192.168.1.44:27020/data?authSource=admin&replicaSet=rs0

這是在admin庫下建立的一個root權限的用戶,authsource爲admin,要操做data表,分片名爲rs0

附:數據備份與還原

  • 備份

    mongodump -h $DB_HOST -u $DB_USER -p $DB_PASS --authenticationDatabase admin -d $DB_NAME -o $OP_DIR --forceTableScan

    mongodump -h dbhost -d dbname -o dbdirectory
    -h:MongDB所在服務器地址,例如:127.0.0.1,固然也能夠指定端口號:127.0.0.1:27017
    -d:須要備份的數據庫實例,例如:test
    -o:備份的數據存放位置,例如:/root/data/dump,固然該目錄須要提早創建,在備份完成後,系統自動在dump目錄下創建一個test目錄,這個目錄裏面存放該數據庫實例的備份數據。

    -u 用戶名

    -p 密碼

    --authenticationDatabase 登陸的用戶驗證的數據庫

    --forceTableScan 不使用任何索引的狀況下掃描數據

  • 還原

    mongorestore -u xx-p xx --authenticationDatabase admin -d data .

    mongorestore 默認是追加, 能夠加--drop清空後恢復

  • 附:

    --batchSize=num 能夠選擇每次操做的文檔數量,來限制mongo操做時使用的內存大小

--gzip
可選的。適用於mongodump > = 3.2,啓用備份文件的內聯壓縮。

--oplog 在備份過程當中,保留oplog,能夠在恢復數據的時候進行操做重現,保證在備份過程當中新的操做也能夠被保留

任何replset成員都須要!此參數使「mongodump」在備份過程當中捕獲oplog更改日誌,以保持一致的時間點。

恢復:mongorestore -u xx-p xx --authenticationDatabase admin . --oplogReplay

它的實際做用是在導出的同時生成一個oplog.bson文件,存放在你開始進行dump到dump結束之間全部的oplog。用圖形來講明下oplog.bson的覆蓋範圍:
mongodump_oplog

注意:mongodump時,--oplog只能在master節點(主從結構)或者副本集的成員中執行。也就是說,mongodump --oplog不能在主從結構的slave上執行

相關文章
相關標籤/搜索