小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于docker搭建mongodb副本集

 饅頭的人生 2018-04-02

什么是mognodb副本集

官網(wǎng)上這么描述

A replica set in MongoDB is a group of mongod processes that maintain the same data set. Replica sets provide redundancy and high availability, and are the basis for all production deployments. This section introduces replication in MongoDB as well as the components and architecture of replica sets. The section also provides tutorials for common tasks related to replica sets.

為什么需要副本集

  • 先看看為什么mongodb官方不推薦使用主從復(fù)制

    1. 主節(jié)點不可用之后,無法自動切換到從節(jié)點,無法確保業(yè)務(wù)訪問的不間斷性
    2. 所有的讀寫操作都是對主節(jié)點的,造成主節(jié)點的訪問壓力較大
  • 因此,使用副本集的意義在于

    1. 自動故障轉(zhuǎn)移
    2. 負載均衡和讀寫分離
  • 官方給出的特點: Redundancy and Data Availability

    Replication provides redundancy and increases data availability. With multiple copies of data on different database servers, replication provides a level of fault tolerance against the loss of a single database server.
    In some cases, replication can provide increased read capacity as clients can send read operations to different servers. Maintaining copies of data in different data centers can increase data locality and availability for distributed applications. You can also maintain additional copies for dedicated purposes, such as disaster recovery, reporting, or backup.

副本集復(fù)制原理

參考這個博客MongoDB 副本集的原理、搭建、應(yīng)用
副本集中數(shù)據(jù)同步過程:Primary節(jié)點寫入數(shù)據(jù),Secondary通過讀取Primary的oplog得到復(fù)制信息,開始復(fù)制數(shù)據(jù)并且將復(fù)制信息寫入到自己的oplog。如果某個操作失敗,則備份節(jié)點停止從當(dāng)前數(shù)據(jù)源復(fù)制數(shù)據(jù)。如果某個備份節(jié)點由于某些原因掛掉了,當(dāng)重新啟動后,就會自動從oplog的最后一個操作開始同步,同步完成后,將信息寫入自己的oplog,由于復(fù)制操作是先復(fù)制數(shù)據(jù),復(fù)制完成后再寫入oplog,有可能相同的操作會同步兩份,不過MongoDB在設(shè)計之初就考慮到這個問題,將oplog的同一個操作執(zhí)行多次,與執(zhí)行一次的效果是一樣的。簡單的說就是:

當(dāng)Primary節(jié)點完成數(shù)據(jù)操作后,Secondary會做出一系列的動作保證數(shù)據(jù)的同步:
1:檢查自己local庫的oplog.rs集合找出最近的時間戳。
2:檢查Primary節(jié)點local庫oplog.rs集合,找出大于此時間戳的記錄。
3:將找到的記錄插入到自己的oplog.rs集合中,并執(zhí)行這些操作。

副本集的同步和主從同步一樣,都是異步同步的過程,不同的是副本集有個自動故障轉(zhuǎn)移的功能。其原理是:slave端從primary端獲取日志,然后在自己身上完全順序的執(zhí)行日志所記錄的各種操作(該日志是不記錄查詢操作的),這個日志就是local數(shù)據(jù) 庫中的oplog.rs表,默認在64位機器上這個表是比較大的,占磁盤大小的5%,oplog.rs的大小可以在啟動參數(shù)中設(shè) 定:–oplogSize 1000,單位是M。

注意:在副本集的環(huán)境中,要是所有的Secondary都宕機了,只剩下Primary。最后Primary會變成Secondary,不能提供服務(wù)。

基于docker搭建最簡單的副本集

基本思路是這個

mongodb副本集

以下所有文件的項目地址在這里

配置docker環(huán)境

這里省略,我當(dāng)前的環(huán)境如下:
docker version

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Client:
 Version:	17.12.0-ce
 API version:	1.35
 Go version:	go1.9.2
 Git commit:	c97c6d6
 Built:	Wed Dec 27 20:10:14 2017
 OS/Arch:	linux/amd64

Server:
 Engine:
  Version:	17.12.0-ce
  API version:	1.35 (minimum version 1.12)
  Go version:	go1.9.2
  Git commit:	c97c6d6
  Built:	Wed Dec 27 20:12:46 2017
  OS/Arch:	linux/amd64
  Experimental:	false

docker-compose version

1
2
3
4
docker-compose version 1.10.0, build 4bd6f1a
docker-py version: 2.0.1
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

mongo, 用的版本較新,穩(wěn)定版是3.2

1
2
MongoDB shell version: 3.3.10
MongoDB server version: 3.3.10

編寫docker-compose.yml

一次性把所有事情做了,讓副本集直接可用

這里說明一下net參數(shù)的配置, 這是一個自建的網(wǎng)絡(luò),docker1.9之后的版本可以手動創(chuàng)建網(wǎng)絡(luò),詳情參考命令docker network create,我這里使用自定義的網(wǎng)絡(luò),主要的目的是讓容器可以通過container_name互聯(lián),也就是在這種網(wǎng)絡(luò)模式下,hosts是docker幫忙配置解析的,為什么要這么做呢?因為docker container的ip不是固定的,一旦down掉然后重啟,ip有可能會發(fā)生變化,但是hostname是不會變的。

docker-compose.yml中 awarecloud.com.cn/mongodb:latest 為docker tag后的本地化鏡像

修改為 mongo:latest即可拉取最新鏡像


version: '2'

services:
   mongo1:
     image: awarecloud.com.cn/mongodb:latest
     container_name: "mongo1"
     ports:
       - "30001:27017"
     volumes:
       - /opt/replset/mongo1:/data/db
     command: mongod --replSet yw_replset
     restart: "always"
     networks:
         mongo_replset:
               ipv4_address: 162.16.1.10

   mongo2:
     image: awarecloud.com.cn/mongodb:latest
     container_name: "mongo2"
     ports:
       - "30002:27017"
     volumes:
       - /opt/replset/mongo2:/data/db
     command: mongod --replSet yw_replset
     restart: "always"
     networks:
         mongo_replset:
               ipv4_address: 162.16.1.11
   mongo3:
     image: awarecloud.com.cn/mongodb:latest
     container_name: "mongo3"
     ports:
       - "30003:27017"
     volumes:
       - /opt/replset/mongo3:/data/db
     command: mongod --replSet yw_replset
     restart: "always"
     networks:
         mongo_replset:
               ipv4_address: 162.16.1.12

  #mongo-repl:
  #   image: replset-mongo-config
  #   container_name: mongo-repl
  #   links:
  #     - mongo1:mongo1
  #     - mongo2:mongo2
  #     - mongo3:mongo3
  #   networks:
  #       mongo_replset:
  #             ipv4_address: 162.16.1.13

networks:
    mongo_replset:
        driver: bridge
        driver_opts:
            com.docker.network.enable_ipv6: "false"
        ipam:
            driver: default
            config:
              - subnet: 162.16.1.0/24
                gateway: 162.16.1.1

啟動

執(zhí)行命令docker-compose up -d,復(fù)本集群就搭建完成了,連接mongo1,插入數(shù)據(jù),在mongo2中查詢,就可以看到了,默認SECONDARY不支持查詢操作,需要執(zhí)行命令rs.setSlaveOk(),然后執(zhí)行查詢,就沒問題了


replset.sh


  • #!/bin/bash

    MONGO_MASTER=162.16.1.10  #docker-compose.yml master-salver ip

    MONGO_SECONDARY=162.16.1.11,162.16.1.12

    MONGO_REPLSET_NAME=yw_replset    #mongo replset name

    mongo $MONGO_MASTER:27017/admin --eval "rs.initiate({\"_id\": \"$MONGO_REPLSET_NAME\", \"members\": [{\"_id\": 0, \"host\": \"$MONGO_MASTER:27017\"}]})"

    mongo $MONGO_MASTER:27017/admin --eval "rs.reconfig(rs.config(),{"force":false})"

    #mongo $MONGO_MASTER:27017/admin --eval "rs.reconfig(configuration, force)"

    hosts=$(echo $MONGO_SECONDARY | tr "," "\n")

    for hst in $hosts

    do

      mongo $MONGO_MASTER:27017 --eval "rs.add(\"$hst:27017\")";

    done

  • 執(zhí)行 sh replset.sh 初始化副本集相關(guān)信息

  • 查看副本集信息

  • mongo --host  192.168.10.158 --port 30003

  • rs.status()

  • 副本節(jié)點不支持查詢操作, db.getMongo().setSlaveOk() 當(dāng)前session有效

  • 查看復(fù)制的情況

    db.printSlaveReplicationInfo()

注意

上面有幾個點比較關(guān)鍵

  1. 讀寫分離的關(guān)鍵
    • 連接時候設(shè)置slaveOk: true,這樣才能從SECONDARY節(jié)點取數(shù)據(jù)
    • 連接時候設(shè)置readPreference: secondary,設(shè)定只能從SECONDARY節(jié)點取數(shù)據(jù)
  2. 怎么做負載均衡,自己的理解
    連接數(shù)據(jù)庫的時候,配置readPreference: nearest,實現(xiàn)負載均衡
  3. 自動故障轉(zhuǎn)移,mongodb副本集已經(jīng)幫我們做好了,docker stop mongo1關(guān)掉主節(jié)點,你會發(fā)現(xiàn)mongo2,或者是mongo3就會自動變成主節(jié)點,docker start mongo1,重新啟動mongo1,發(fā)現(xiàn)它會變?yōu)?code>SECONDARY節(jié)點,并自動同步這down掉期間寫入的數(shù)據(jù)

readPreference參數(shù)解釋

  • primary 默認參數(shù),只從主節(jié)點上進行讀取操作;
  • primaryPreferred 大部分從主節(jié)點上讀取數(shù)據(jù),只有主節(jié)點不可用時從secondary節(jié)點讀取數(shù)據(jù)。
  • secondary 只從secondary節(jié)點上進行讀取操作,存在的問題是secondary節(jié)點的數(shù)據(jù)會比primary節(jié)點數(shù)據(jù)“舊”。
  • secondaryPreferred 優(yōu)先從secondary節(jié)點進行讀取操作,secondary節(jié)點不可用時從主節(jié)點讀取數(shù)據(jù);
  • nearest 不管是主節(jié)點、secondary節(jié)點,從網(wǎng)絡(luò)延遲最低的節(jié)點上讀取數(shù)據(jù)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多