Mongodb使用笔记-(一)Docker部署Mongodb副本集集群

Docker部署Mongodb副本集集群

文章目录

  • Docker部署Mongodb副本集集群
    • 1. Mongodb简介
    • 2. 使用背景
    • 3. 副本集搭建准备
      • 3.1. 创建测试虚拟机
      • 3.2. 编写ansible配置文件
      • 3.3. 编写ansible部署脚本
      • 3.4. 生成keyFile密钥文件
      • 3.5. 编写mongodb副本集设置脚本
      • 3.6. 编写mongodb用户创建脚本
      • 3.7. 编写docker安装编排脚本
    • 4. 通过ansible部署mongodb副本集
      • 4.1. 关闭所有服务器的selinux
      • 4.2. 部署mongodb副本集
      • 4.3. 安装验证

1. Mongodb简介

​ 目前常用的数据库主要分为两种:关系型数据库、非关系型数据库。其中关系型数据库常见的包括:Oracle、Mysql、PostgreSQL、SqlSever等,其主要特点就是大多数都遵循SQL(结构化查询语言,Structured Query Language)标准,针对结构化的数据支持比较好,十分注重数据操作的事务性、一致性。而非关系型数据库(NoSQL)特点则是非关系型数据支持比较好,多用于追求速度、高扩展性、多应用场景的项目。

​ 对于非关系型数据库主要包括以下四类:

  • 键值对存储(key-value)方式:以Redis为代表;

  • 列存储:以Hbase为代表;

  • 文档数据库存储:以Mongodb为代表;

  • 图形数据库存储:以InfoGrid为代表。

    Mongod是一个面向文档存储的数据库,其存储文档格式类似于JSON对象,其也可以实现高可用的分布式数据存储系统。同时,Mongodb支持多种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等。

2. 使用背景

​ 对于日志等大数据量且非关系型的数据,使用Mongodb进行存储较为合适。为了保证存储数据的安全性、高可用性,目前越来越多的系统开始采用分布式的方式部署。因此,此篇文章对Mongodb分布式方式进行简单的探讨。

​ Mongodb针对于分布式部署主要有三种方式:

  • 主从复制Master-Slaver:数据库集群、服务器中均需明确指定主节点,从节点可以对主节点的数据进行同步,如果主节点宕机,可以人工的使用从节点代替主节点,目前已不推荐使用。
  • 副本集Replica Set:存在一组存在相同数据的Mongodb实例,主mongodb接受所有的写操作,其他实例接受主实例的操作以保持数据的同步,同时主实例宕机后,其他实例可以自主选举新的主实例,这样就实现了数据库的安全性、高可用性。但是相对来说缺点就是数据的冗余。
  • 分片Sharding:为了更好的处理大数据,分片方式是将数据进行分开存储,不同的数据库保存不同的数据,所有的数据总和即为整个数据集。

​ 对于存储数据量较大的大型项目中,使用分片的方式可以很好的减少服务器的压力,将数据进行水平拆分,但是由于配置较为复杂,需要分片服务器(Shard Server)配置服务器(Config Server)路由服务器(Route Server)等多类服务器进行配合使用。所以针对较小型的项目,使用副本集方式即可实现数据的安全性、高可用性,此处主要对副本集进行使用。

3. 副本集搭建准备

​ 副本集主要包括三种节点:主节点、从节点、仲裁节点。其中主节点负责数据的读、写;从节点默认情况下不负责数据的读、写,但是可以通过设置的方式,设置从节点执行外部数据的读取;仲裁节点不负责数据的复制,只负责投票,所以不容易出现故障,这样可以增加有效投票,使得整个副本集投数票尽可能多的保证参与选举的节点数据大于副本集总节点数一半的数量,以保证主节点的正常选举。

​ 官方推荐MongoDB副本节点最少为3台, 建议副本集成员为奇数,最多12个副本节点,最多7个节点参与选举。限制副本节点的数量,主要是因为一个集群中过多的副本节点,增加了复制的成本,反而拖累了集群的整体性能。 太多的副本节点参与选举,也会增加选举的时间。而官方建议奇数的节点,是为了避免脑裂 的发生。

3.1. 创建测试虚拟机

​ 通过vagrant的方式创建三台虚拟机进行副本集的搭建演示。

虚拟机名称 IP mongodb类型
mongodb1 192.168.33.10 Primary
mongodb2 192.168.33.11 Secondary
mongodb3 192.168.33.12 Secondary

​ 通过vagrant init命令初始化虚拟机配置文件,以mongodb1虚拟机为例,其他虚拟机类似

Administrator@SUPERWONG D:\Vagrant\mongodb1
# vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

​ 修改虚拟机配置文件,此处已将与虚拟机配置文件所在目录同级的data目录映射到虚拟机中的/vagrant_data目录。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  # 端口映射
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # 设置私有网络固定IP
  config.vm.network "private_network", ip: "192.168.33.10"
  # 设置公有网络
  config.vm.network "public_network"

  # 共享目录
  config.vm.synced_folder "../data", "/vagrant_data"

  # 虚拟相关配置
  config.vm.provider "virtualbox" do |vb|
    # 不显示虚拟机图形界面
    vb.gui = false
    # 虚拟机内存
    vb.memory = "1024"
    # 虚拟机名称
    vb.name = "mongodb1"
  end

  # 虚拟机启动时执行命令
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

​ 通过vagrant up命令启动虚拟机。通过vagrant ssh命令登录虚拟机内部修改/etc/ssh/sshd_config配置文件,设置为允许密码登录,并通过service sshd restart重启ssh服务。设置完成之后既可以通过SSH类工具进行密码登录。

PasswordAuthentication yes

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第1张图片

​ 统一安装dockerdocker-composeansiblesshpass。通过ansible进行多服务器的环境部署,通过docker-compose进行docker容器的创建,sshpassansible进行ssh连接时的依赖包。其中ansiblesshpass只在mongodb1主机安装即可

[root@localhost ~]# yum install -y docker
[root@localhost ~]# service docker start
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y python-pip
[root@localhost ~]# pip install --upgrade pip -i https://pypi.doubanio.com/simple
[root@localhost ~]# pip install docker-compose -i https://pypi.doubanio.com/simple
[root@localhost ~]# pip install ansible -i https://pypi.doubanio.com/simple
[root@localhost ~]# yum install -y sshpass

​ 拉取官方mongodb的docker镜像。

[root@localhost ~]# docker pull mongo
Using default tag: latest
Trying to pull repository docker.io/library/mongo ... 
latest: Pulling from docker.io/library/mongo
35c102085707: Pull complete 
251f5509d51d: Pull complete 
8e829fe70a46: Pull complete 
6001e1789921: Pull complete 
62fb80b8f88c: Pull complete 
76be8dc9ea13: Pull complete 
c73353d62de1: Pull complete 
9dfe7c37b46c: Pull complete 
1fdf813927b6: Pull complete 
87b9bd03dc66: Pull complete 
24c524d289d7: Pull complete 
306b575ddfff: Pull complete 
ee1475733b36: Pull complete 
Digest: sha256:93c98ffc714faa1fa501297d35670a62835dbb7e62243cee0c491433ea523f30
Status: Downloaded newer image for docker.io/mongo:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/mongo     latest              cdc6740b66a7        2 weeks ago         361 MB

3.2. 编写ansible配置文件

Ansible的主要功能在与批量主机操作,为了便于便捷的使用其中的部分主机,可以在inventory file中将其分组命名,默认的inventory file为/etc/ansibel/hosts。此处只需要在mongodb1主机设置即可。

​ 通过[mongodb]设置分组信息,即其下方所有配置IP均为mongodb组中主机。[mongodb:vars]用于设置mongodb组中的公共参数(SSH登录时的用户名、密码)。

[mongodb]
192.168.33.10
192.168.33.11
192.168.33.12

[mongodb:vars]
ansible_user=root
ansible_ssh_pass=vagrant

​ 通过在mongodb1主机/vagrant_data/ansible目录下执行ansible mongodb -m ping命令,测试配置是否正确。

[root@localhost ansible]# ansible mongodb -m ping
192.168.33.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.33.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.33.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

3.3. 编写ansible部署脚本

​ 通过ansible可以进行多服务器环境搭建。首先在与虚拟机配置文件所在目录同级的data目录下创建mongodb_install.yml文件来设置ansible安装步骤,新建的文件会同时映射到虚拟机中的/vagrant_data目录下的mongodb_install.yml

​ 其中,需要说明的内容如下:

  1. 通过hosts: all设置作用于所有已配置的主机,配置文件为/etc/ansible/hosts
  2. 通过vars设置ansible部署过程中的环境变量,ansible脚本中通过双大括号{{}}方式引用;
  3. 通过tasks设置ansible部署的步骤;
  4. 通过file模块创建部署服务器上的BASE目录,上传文件会默认在与此配置文件同级的files目录中查找;
  5. 通过template模块上传模板文件到部署服务器,上传的模板文件会默认在与此配置文件同级的templates目录中查找;
  6. 通过copy模块上传文件到部署服务器,与template的区别在于template上传文件时,会对文件中的双大括号{{}}方式引用的参数进行自动填充;
  7. 通过command模块在部署服务器上执行shell命令,执行的命令中docker-compose -f docker-compose.yml down用于根据docker-compose.yml的配置清除所有已安装的docker容器,docker-compose -f docker-compose.yml up -d则是根据docker-compose.yml的配置创建docker容器,docker exec -it mongodb /bin/bash /opt/init-rs.sh用于执行docker容器的shell脚本;
  8. 通过groups.mongodb可以获取配置文件中mongodb组中的所有主机host信息,inventory_hostname用于获取ansible当前部署的服务器的host信息,而groups.mongodb.index(inventory_hostname)则获取当前部署主机在配置的mongodb组中的排列顺序,以0开始。即只有第一个配置的服务器才进行副本集配置,配置后其将会作为primary主机。
  9. 通过wait_for设置等到10秒后检测mongdb是否启动完成,因为在设置副本集后,mongodb进行初始化,初始化完成前创建用户信息,会提示not master非master主机错误。
---
- hosts: all
  user: root
  vars:
    # mongdb初始化管理员用户
    MONGO_INITDB_ROOT_USERNAME: "root"
    # mongdb初始化管理员用户密码
    MONGO_INITDB_ROOT_PASSWORD: "123456"
    # mongdb初始化数据库名称
    MONGO_INITDB_DATABASE: "admin"
    # mongdb普通用户
    MONGO_USER: test
    # mongdb普通用户密码
    MONGO_PWD: 123456
    # mongdb数据库名称
    MONGO_DATABASE: "replicaSetTest"
    # mongdb服务端口
    MONGO_PORT: "27017"
    # mongdb基础目录
    MONGO_BASE_DIR: "/opt/mongodb"
    # mongodb部署方式:single.单机、replication.主从、replicaSet.副本集、sharding.分片
    MONGO_DEPLOY_TYPE: "replicaSet"
    # mongodb 副本集名称
    MONGO_REPL_SET: replica-set-test
    # mongodb 密钥文件
    MONGO_KEY_FILE: /opt/keyfile/mongodb-keyfile
  tasks:
    - name: 创建BASE目录
      file:
        path: "{{ item }}"
        state: directory
      with_items:
        - "{{ MONGO_BASE_DIR }}/db"
        - "{{ MONGO_BASE_DIR }}/config"

    - name: 上传mongodb初始化脚本
      template:
        src: "{{ item }}"
        dest: "{{ MONGO_BASE_DIR }}/config/{{ item }}"
        mode: 0755
      with_items:
        - mongodb-init-rs.sh
        - mongodb-init-db.sh

    - name: 上传mongodb秘钥文件
      copy:
        src: mongodb-keyfile
        dest: "{{ MONGO_BASE_DIR }}/config/mongodb-keyfile"
        mode: 0600
        owner: "999"

    - name: 删除旧docker容器
      command: docker-compose -f docker-compose.yml down
      args:
        chdir: /tmp

    - name: 上传docker-compose配置文件
      template:
        src: docker-compose.yml
        dest: /tmp/docker-compose.yml

    - name: 创建docker容器
      command: docker-compose -f docker-compose.yml up -d
      args:
        chdir: /tmp

    - name: 等待5秒,检测mongo服务是否启动
      wait_for:
        port: 27017
        delay: 5
      when: "groups.mongodb.index(inventory_hostname) == 0"

    - name: 设置副本集配置
      command: docker exec -it mongodb /bin/bash /opt/init-rs.sh
      when: "groups.mongodb.index(inventory_hostname) == 0"

    - name: 等待10秒,等待副本集设置完成
      wait_for:
        port: 27017
        delay: 10
      when: "groups.mongodb.index(inventory_hostname) == 0"

    - name: 创建mongo用户信息
      command: docker exec -it mongodb /bin/bash /opt/init-db.sh
      when: "groups.mongodb.index(inventory_hostname) == 0"

3.4. 生成keyFile密钥文件

​ 在mongodb1主机/vagrant_data/ansible/files目录下通过openssl rand -base64 24 > mongodb-keyfile命令生成密钥文件mongodb-keyfile

3.5. 编写mongodb副本集设置脚本

​ 在mongodb1主机/vagrant_data/ansible/templates目录下创建mongodb-init-rs.sh用于docker容器创建后,通过rs.initiate命令设置副本集信息。其中用到了ansible中的jinja2模板语言,说明如下:

  1. "{{ MONGO_REPL_SET }}"是用于获取ansible全局参数MONGO_REPL_SET的值;
  2. {% for host in groups.mongodb -%}{% endfor %}for循环语句,即循环mongodb组中所有的主机host信息;
  3. {% if groups.mongodb.index(host)|int + 1 < groups.mongodb|length -%}{% else -%}{% endif -%}用于判断当前循环的主机是否为最后一个主机,如果为最后一个主机,则最后不加
#!/bin/bash

mongo <<-EOJS
    rs.initiate({
        _id:"{{ MONGO_REPL_SET }}", 
        members:[
            {% for host in groups.mongodb -%}
            {% if groups.mongodb.index(host)|int + 1 < groups.mongodb|length -%}
            { _id: {{ groups.mongodb.index(host) }}, host: "{{ host }}:{{ MONGO_PORT }}" }, 
            {% else -%}
            { _id: {{ groups.mongodb.index(host) }}, host: "{{ host }}:{{ MONGO_PORT }}" }
            {% endif -%}
            {% endfor %}

        ]
    });
EOJS

​ 模块转义(模板上传后自动转义)后的文件内容如下:

#!/bin/bash

mongo <<-EOJS
    rs.initiate({
        _id:"replica-set-test", 
        members:[
            { _id: 0, host: "192.168.33.10:27017" }, 
            { _id: 1, host: "192.168.33.11:27017" }, 
            { _id: 2, host: "192.168.33.12:27017" }
            
        ]
    });
EOJS

3.6. 编写mongodb用户创建脚本

​ 在mongodb1主机/vagrant_data/ansible/templates目录下创建mongodb-init-db.sh用于docker容器创建后通过db.createUser命令创建用户信息,其中也使用到了ansible中的jinja2模板语言。

#!/bin/bash

mongo {{ MONGO_INITDB_DATABASE }} <<-EOJS
    db.createUser({
        user: '{{ MONGO_INITDB_ROOT_USERNAME }}', 
        pwd: '{{ MONGO_INITDB_ROOT_PASSWORD }}', 
        roles: [{ role: 'root', db: '{{ MONGO_INITDB_DATABASE }}' }] 
    });
EOJS

mongo {{ MONGO_INITDB_DATABASE }} -u {{ MONGO_INITDB_ROOT_USERNAME }} -p {{ MONGO_INITDB_ROOT_PASSWORD }} <<-EOJS
use {{ MONGO_DATABASE }};
db.createUser({ 
    user: '{{ MONGO_USER }}', 
    pwd: '{{ MONGO_PWD }}', 
    roles: [{ role: 'readWrite', db: '{{ MONGO_DATABASE }}' }] 
});
EOJS

​ 模板转义(模板上传后自动转义)后文件内容如下:

#!/bin/bash

mongo admin <<-EOJS
    rs.status();
    db.createUser({
        user: 'root', 
        pwd: '123456', 
        roles: [{ role: 'root', db: 'admin' }] 
    });
EOJS

mongo admin -u root -p 123456 <<-EOJS
use replicaSetTest;
db.createUser({ 
    user: 'test', 
    pwd: '123456', 
    roles: [{ role: 'readWrite', db: 'replicaSetTest' }] 
});

3.7. 编写docker安装编排脚本

​ 在mongodb1主机/vagrant_data/ansible/templates目录下创建docker-compose.yaml文件,用于设置docker容器的安装编排。其中也使用到了ansible中的jinja2模板语言,只有mongodb组中的第一台主机映射了mongodb-init-rs.shmongodb-init-db.sh等副本集初始换脚本,因为从节点SECONDARY主机会自动同步主节点PRIMARY主机的操作。

​ 同时启动mongodb服务的命令中,通过--dbpath设置数据存放目录,--smallfiles设置以最小的方式初始化mongodb--replSet设置副本集名称(所有主从节点均为同一名称),--keyFile用于设置主从节点通讯时验证用的密钥文件,--auth设置需要密码验证。

version: '3.1'

services:
  {% if groups.mongodb.index(inventory_hostname) == 0 -%}
  mongo:
    image: docker.io/mongo
    container_name: mongodb
    restart: always
    ports:
      - {{ MONGO_PORT }}:27017
    volumes:
      - {{ MONGO_BASE_DIR }}/db:/data/db
      - {{ MONGO_BASE_DIR }}/config/mongodb-init-rs.sh:/opt/init-rs.sh
      - {{ MONGO_BASE_DIR }}/config/mongodb-init-db.sh:/opt/init-db.sh
      - {{ MONGO_BASE_DIR }}/config/mongodb-keyfile:{{ MONGO_KEY_FILE }}
      - /etc/localtime:/etc/localtime
    command:
      mongod --dbpath /data/db --smallfiles --replSet {{ MONGO_REPL_SET }} --keyFile {{ MONGO_KEY_FILE }} --auth
  {% else -%}
  mongodb:
    image: docker.io/mongo
    container_name: mongodb
    restart: always
    ports:
      - {{ MONGO_PORT }}:27017
    volumes:
      - {{ MONGO_BASE_DIR }}/db:/data/db
      - {{ MONGO_BASE_DIR }}/config/mongodb-keyfile:{{ MONGO_KEY_FILE }}
      - /etc/localtime:/etc/localtime
    command:
      mongod --dbpath /data/db --smallfiles --replSet {{ MONGO_REPL_SET }} --keyFile {{ MONGO_KEY_FILE }} --auth
  {% endif %}

​ 主节点模板转义(模板上传后自动转义)后文件内容如下:

version: '3.1'

services:
  mongo:
    image: docker.io/mongo
    container_name: mongodb
    restart: always
    ports:
      - 27017:27017
    volumes:
      - /opt/mongodb/db:/data/db
      - /opt/mongodb/config/mongodb-init-rs.sh:/opt/init-rs.sh
      - /opt/mongodb/config/mongodb-init-db.sh:/opt/init-db.sh
      - /opt/mongodb/config/mongodb-keyfile:/opt/keyfile/mongodb-keyfile
      - /etc/localtime:/etc/localtime
    command:
      mongod --dbpath /data/db --smallfiles --replSet replica-set-test --keyFile /opt/keyfile/mongodb-keyfile --auth

​ 从节点模板转义(模板上传后自动转义)后文件内容如下:

version: '3.1'

services:
  mongodb:
    image: docker.io/mongo
    container_name: mongodb
    restart: always
    ports:
      - 27017:27017
    volumes:
      - /opt/mongodb/db:/data/db
      - /opt/mongodb/config/mongodb-keyfile:/opt/keyfile/mongodb-keyfile
      - /etc/localtime:/etc/localtime
    command:
      mongod --dbpath /data/db --smallfiles --replSet replica-set-test --keyFile /opt/keyfile/mongodb-keyfile --auth

4. 通过ansible部署mongodb副本集

4.1. 关闭所有服务器的selinux

​ 若selinux服务处于开启状态,则docker容器中映射的共享目录会存在权限问题。

​ 临时关闭方法如下:

[root@localhost ansible]# getenforce
Enforcing
[root@localhost ansible]# setenforce 0
[root@localhost ansible]# getenforce
Permissive

​ 永久关闭方式如下,修改/etc/sysconfig/selinux配置文件中的SELINUX=enforcing参数修改为SELINUX=disabled

4.2. 部署mongodb副本集

​ 在mongodb1主机/vagrant_data/ansible目录下执行ansible-playbook mongodb_install.yml命令,进行多服务器同时部署。

[root@localhost ansible]# ansible-playbook mongodb_install.yml 

PLAY [all] ******************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
ok: [192.168.33.10]
ok: [192.168.33.11]
ok: [192.168.33.12]

TASK [创建BASE目录] *************************************************************************************************************************************************************************************************************************
ok: [192.168.33.10] => (item=/opt/mongodb/db)
ok: [192.168.33.11] => (item=/opt/mongodb/db)
ok: [192.168.33.12] => (item=/opt/mongodb/db)
ok: [192.168.33.10] => (item=/opt/mongodb/config)
ok: [192.168.33.11] => (item=/opt/mongodb/config)
ok: [192.168.33.12] => (item=/opt/mongodb/config)

TASK [上传mongodb初始化脚本] *******************************************************************************************************************************************************************************************************************
ok: [192.168.33.10] => (item=mongodb-init-rs.sh)
ok: [192.168.33.11] => (item=mongodb-init-rs.sh)
ok: [192.168.33.12] => (item=mongodb-init-rs.sh)
ok: [192.168.33.10] => (item=mongodb-init-db.sh)
ok: [192.168.33.11] => (item=mongodb-init-db.sh)
ok: [192.168.33.12] => (item=mongodb-init-db.sh)

TASK [上传mongodb秘钥文件] ********************************************************************************************************************************************************************************************************************
ok: [192.168.33.10]
ok: [192.168.33.11]
ok: [192.168.33.12]

TASK [删除旧docker容器] **********************************************************************************************************************************************************************************************************************
changed: [192.168.33.10]
changed: [192.168.33.12]
changed: [192.168.33.11]

TASK [上传docker-compose配置文件] *************************************************************************************************************************************************************************************************************
ok: [192.168.33.10]
ok: [192.168.33.11]
ok: [192.168.33.12]

TASK [创建docker容器] ***********************************************************************************************************************************************************************************************************************
changed: [192.168.33.10]
changed: [192.168.33.12]
changed: [192.168.33.11]

TASK [等待5秒,检测mongo服务是否启动] ***************************************************************************************************************************************************************************************************************
skipping: [192.168.33.11]
skipping: [192.168.33.12]
ok: [192.168.33.10]

TASK [设置副本集配置] **************************************************************************************************************************************************************************************************************************
skipping: [192.168.33.11]
skipping: [192.168.33.12]
changed: [192.168.33.10]

TASK [等待10秒,,等待副本集设置完成] *****************************************************************************************************************************************************************************************************************
skipping: [192.168.33.11]
skipping: [192.168.33.12]
ok: [192.168.33.10]

TASK [创建mongo用户信息] **********************************************************************************************************************************************************************************************************************
skipping: [192.168.33.11]
skipping: [192.168.33.12]
changed: [192.168.33.10]

PLAY RECAP ******************************************************************************************************************************************************************************************************************************
192.168.33.10              : ok=11   changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.33.11              : ok=7    changed=2    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
192.168.33.12              : ok=7    changed=2    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0 

4.3. 安装验证

​ 通过Robo 3T管理工具连接mongodb进行测试。

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第2张图片

​ 在192.168.33.10主节点创建一个集合,并插入一条数据。

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第3张图片

​ 其他两个从节点自动同步。

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第4张图片

​ 在主节点test集合中创建一个文档。

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第5张图片
Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第6张图片

​ 从节点已自动同步。

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第7张图片

Mongodb使用笔记-(一)Docker部署Mongodb副本集集群_第8张图片
​ 通过docker stop mongodb命令停止主节点mongdb服务。

[root@localhost ansible]# docker stop mongodb
mongodb
[root@localhost ansible]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
4673db8d361e        docker.io/mongo     "docker-entrypoint..."   22 minutes ago      Exited (0) 5 seconds ago                       mongodb

​ 从节点192.168.33.11已自动被选举为主节点。

[root@localhost ~]# docker exec -it mongodb mongo
MongoDB shell version v4.2.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("e0037f48-d93d-4796-b96e-19fbcd1125da") }
MongoDB server version: 4.2.0
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
replica-set-test:PRIMARY> 

​ 原主节点重启后,变成了从节点。

[root@localhost ansible]# docker start mongodb
mongodb
[root@localhost ansible]# docker exec -it mongodb mongo
MongoDB shell version v4.2.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("0c7af1af-94e2-43e3-b101-5d5eb966b567") }
MongoDB server version: 4.2.0
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
replica-set-test:SECONDARY> exit
bye

你可能感兴趣的:(mongodb)