MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MongoDB副本集与自动化运维工具的集成

2021-09-053.5k 阅读

MongoDB 副本集基础

副本集概念

MongoDB 副本集是一组 MongoDB 实例,其中一个为主节点(primary),其余为从节点(secondary)。主节点负责处理所有的写操作,从节点则复制主节点的数据。这种架构提供了数据冗余、高可用性以及灾难恢复能力。当主节点发生故障时,副本集中的从节点会通过选举机制选出一个新的主节点,确保服务的连续性。

副本集工作原理

  1. 写操作:客户端的写请求首先被发送到主节点。主节点在成功写入数据后,会将操作日志(oplog)发送给所有的从节点。从节点通过应用这些操作日志来保持与主节点数据的一致性。
  2. 读操作:客户端的读请求默认会被发送到主节点。然而,为了分担主节点的负载,也可以配置客户端将读请求发送到从节点。从节点会根据自身的数据副本响应读请求。
  3. 选举机制:当主节点发生故障时,副本集内的从节点会发起选举。选举过程基于节点的优先级、日志的完整性等因素。优先级最高且数据最完整的从节点会被选举为新的主节点。

搭建副本集示例

  1. 创建数据目录
    mkdir -p /data/mongodb/replicaSet/node1/data
    mkdir -p /data/mongodb/replicaSet/node2/data
    mkdir -p /data/mongodb/replicaSet/node3/data
    
  2. 启动 MongoDB 实例
    • node1
    mongod --port 27017 --dbpath /data/mongodb/replicaSet/node1/data --replSet rs0
    
    • node2
    mongod --port 27018 --dbpath /data/mongodb/replicaSet/node2/data --replSet rs0
    
    • node3
    mongod --port 27019 --dbpath /data/mongodb/replicaSet/node3/data --replSet rs0
    
  3. 初始化副本集
    mongo --port 27017
    rs.initiate({
        _id: "rs0",
        members: [
            { _id: 0, host: "localhost:27017" },
            { _id: 1, host: "localhost:27018" },
            { _id: 2, host: "localhost:27019" }
        ]
    })
    

自动化运维工具概述

常见自动化运维工具

  1. Ansible:Ansible 是一个简单而强大的自动化运维工具,基于 SSH 协议工作,无需在被管理节点安装额外的代理软件。它使用 YAML 语言编写 playbook,通过定义任务、角色等实现对服务器的配置管理、应用部署等操作。
  2. Chef:Chef 是一个基于 Ruby 的自动化运维工具,它通过客户端 - 服务器架构工作。服务器端存储配置信息和菜谱(cookbook),客户端安装在被管理节点,定期向服务器请求最新的配置并应用。
  3. Puppet:Puppet 也是一个客户端 - 服务器架构的自动化运维工具,使用 Puppet 语言编写配置文件。它主要用于系统配置管理,确保服务器的配置始终符合预期。

自动化运维工具的优势

  1. 提高效率:自动化运维工具可以批量执行任务,大大减少了人工操作的时间和工作量。例如,使用 Ansible 可以在几分钟内完成对数百台服务器的软件安装和配置。
  2. 保证一致性:通过定义标准化的配置文件,自动化运维工具可以确保所有服务器的配置一致。这有助于减少因配置差异导致的故障和安全问题。
  3. 便于管理和维护:配置文件可以版本控制,方便跟踪配置的变化。同时,自动化运维工具提供了详细的日志记录,便于故障排查和审计。

MongoDB 副本集与 Ansible 的集成

Ansible 安装与配置

  1. 安装 Ansible:在控制节点上,根据操作系统类型安装 Ansible。以 Ubuntu 为例:
    sudo apt - get update
    sudo apt - get install ansible
    
  2. 配置 Ansible:编辑 Ansible 的配置文件 /etc/ansible/ansible.cfg,可以设置一些全局参数,如 inventory 文件路径等。
  3. 创建 inventory 文件:定义需要管理的 MongoDB 节点。例如,创建 mongodb_inventory 文件:
    [mongodb_nodes]
    node1 ansible_host = 192.168.1.100 ansible_user = ubuntu
    node2 ansible_host = 192.168.1.101 ansible_user = ubuntu
    node3 ansible_host = 192.168.1.102 ansible_user = ubuntu
    

使用 Ansible 部署 MongoDB 副本集

  1. 编写 playbook:创建 deploy_mongodb_replica_set.yml 文件:
    ---
    - name: Deploy MongoDB Replica Set
      hosts: mongodb_nodes
      become: true
    
      tasks:
        - name: Update apt cache
          apt: update_cache = yes
    
        - name: Install MongoDB
          apt:
            name: mongodb - org
            state: present
    
        - name: Create data directory
          file:
            path: /data/mongodb/replicaSet/{{ inventory_hostname }}/data
            state: directory
            owner: mongodb
            group: mongodb
            mode: 0755
    
        - name: Configure MongoDB
          template:
            src: mongod.conf.j2
            dest: /etc/mongod.conf
          notify:
            - Restart MongoDB
    
        - name: Start MongoDB
          service:
            name: mongod
            state: started
            enabled: yes
    
    handlers:
      - name: Restart MongoDB
        service:
          name: mongod
          state: restarted
    
  2. 创建模板文件:创建 mongod.conf.j2 模板文件:
    systemLog:
      destination: file
      path: /var/log/mongodb/mongod.log
      logAppend: true
    storage:
      dbPath: /data/mongodb/replicaSet/{{ inventory_hostname }}/data
    net:
      port: 27017
      bindIp: 0.0.0.0
    replication:
      replSetName: rs0
    
  3. 运行 playbook
    ansible - playbook - i mongodb_inventory deploy_mongodb_replica_set.yml
    

使用 Ansible 管理 MongoDB 副本集

  1. 添加节点:在 inventory 文件中添加新节点,然后编写一个新的 playbook 来配置新节点并将其加入副本集。例如,add_node_to_replica_set.yml
    ---
    - name: Add Node to MongoDB Replica Set
      hosts: new_mongodb_node
      become: true
    
      tasks:
        - name: Update apt cache
          apt: update_cache = yes
    
        - name: Install MongoDB
          apt:
            name: mongodb - org
            state: present
    
        - name: Create data directory
          file:
            path: /data/mongodb/replicaSet/{{ inventory_hostname }}/data
            state: directory
            owner: mongodb
            group: mongodb
            mode: 0755
    
        - name: Configure MongoDB
          template:
            src: mongod.conf.j2
            dest: /etc/mongod.conf
          notify:
            - Restart MongoDB
    
        - name: Start MongoDB
          service:
            name: mongod
            state: started
            enabled: yes
    
        - name: Add node to replica set
          mongo:
            login_user: admin
            login_password: password
            authentication_database: admin
            replica_set: rs0
            add_host: "{{ inventory_hostname }}:27017"
    handlers:
      - name: Restart MongoDB
        service:
          name: mongod
          state: restarted
    
  2. 移除节点:编写 playbook 来停止节点的 MongoDB 服务,删除相关数据目录,并从副本集中移除节点。例如,remove_node_from_replica_set.yml
    ---
    - name: Remove Node from MongoDB Replica Set
      hosts: node_to_remove
      become: true
    
      tasks:
        - name: Stop MongoDB
          service:
            name: mongod
            state: stopped
    
        - name: Remove data directory
          file:
            path: /data/mongodb/replicaSet/{{ inventory_hostname }}/data
            state: absent
    
        - name: Remove node from replica set
          mongo:
            login_user: admin
            login_password: password
            authentication_database: admin
            replica_set: rs0
            remove_host: "{{ inventory_hostname }}:27017"
    

MongoDB 副本集与 Chef 的集成

Chef 安装与配置

  1. 安装 Chef Server:在服务器端安装 Chef Server。以 Ubuntu 为例:
    curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chef - server - core
    
    安装完成后,初始化 Chef Server:
    chef - server - setup
    
  2. 安装 Chef Workstation:在控制节点上安装 Chef Workstation:
    curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chef - workstation
    
  3. 注册节点:在每个 MongoDB 节点上安装 Chef Client,并注册到 Chef Server:
    curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chef - client
    knife bootstrap <node_ip> - x ubuntu - P <password> --sudo
    

使用 Chef 部署 MongoDB 副本集

  1. 创建 cookbook:使用 chef generate cookbook mongodb_replica_set 命令创建一个新的 cookbook。
  2. 编写 recipes:在 mongodb_replica_set/recipes/default.rb 中编写安装和配置 MongoDB 的代码:
    package 'mongodb - org' do
      action :install
    end
    
    directory '/data/mongodb/replicaSet/{{ node['hostname'] }}/data' do
      owner'mongodb'
      group'mongodb'
      mode '0755'
      action :create
    end
    
    template '/etc/mongod.conf' do
      source'mongod.conf.erb'
      variables(
        :replica_set_name => 'rs0'
      )
      notifies :restart,'service[mongod]'
    end
    
    service'mongod' do
      action [:enable, :start]
    end
    
  3. 创建模板文件:在 mongodb_replica_set/templates/default/mongod.conf.erb 中创建模板:
    systemLog:
      destination: file
      path: /var/log/mongodb/mongod.log
      logAppend: true
    storage:
      dbPath: /data/mongodb/replicaSet/<%= node['hostname'] %>/data
    net:
      port: 27017
      bindIp: 0.0.0.0
    replication:
      replSetName: <%= @replica_set_name %>
    
  4. 上传 cookbook 并运行
    knife cookbook upload mongodb_replica_set
    knife node run_list add <node_name> 'recipe[mongodb_replica_set]'
    

使用 Chef 管理 MongoDB 副本集

  1. 添加节点:在新节点上安装 Chef Client 并注册到 Chef Server。然后在 mongodb_replica_set/recipes/add_node.rb 中编写添加节点的代码:
    require 'chef/mixin/shell_out'
    
    execute 'add_node_to_replica_set' do
      command "mongo --eval 'rs.add(\"#{node['hostname']}:27017\")' --authenticationDatabase admin - u admin - p password"
      action :run
    end
    
    上传 cookbook 并在新节点上运行:
    knife cookbook upload mongodb_replica_set
    knife node run_list add <new_node_name> 'recipe[mongodb_replica_set::add_node]'
    
  2. 移除节点:在 mongodb_replica_set/recipes/remove_node.rb 中编写移除节点的代码:
    require 'chef/mixin/shell_out'
    
    execute'remove_node_from_replica_set' do
      command "mongo --eval 'rs.remove(\"#{node['hostname']}:27017\")' --authenticationDatabase admin - u admin - p password"
      action :run
    end
    
    service'mongod' do
      action [:disable, :stop]
    end
    
    directory '/data/mongodb/replicaSet/{{ node['hostname'] }}/data' do
      action :delete
    end
    
    上传 cookbook 并在要移除的节点上运行:
    knife cookbook upload mongodb_replica_set
    knife node run_list add <node_to_remove_name> 'recipe[mongodb_replica_set::remove_node]'
    

MongoDB 副本集与 Puppet 的集成

Puppet 安装与配置

  1. 安装 Puppet Server:在服务器端安装 Puppet Server。以 CentOS 为例:
    rpm - Uvh https://yum.puppetlabs.com/puppetlabs - release - el - 7.noarch.rpm
    yum install puppetserver
    systemctl start puppetserver
    systemctl enable puppetserver
    
  2. 安装 Puppet Agent:在每个 MongoDB 节点上安装 Puppet Agent:
    rpm - Uvh https://yum.puppetlabs.com/puppetlabs - release - el - 7.noarch.rpm
    yum install puppet - agent
    puppet agent --server=puppet.example.com --enable
    
  3. 配置 Puppet Server:编辑 Puppet Server 的配置文件 /etc/puppetlabs/puppet/puppet.conf,设置相关参数,如证书颁发等。

使用 Puppet 部署 MongoDB 副本集

  1. 创建 module:使用 puppet module generate company - name - mongodb_replica_set 命令创建一个新的 module。
  2. 编写 manifests:在 mongodb_replica_set/manifests/init.pp 中编写安装和配置 MongoDB 的代码:
    class mongodb_replica_set {
      package { 'mongodb - org':
        ensure => present,
      }
    
      file { '/data/mongodb/replicaSet/${::fqdn}/data':
        ensure => directory,
        owner =>'mongodb',
        group =>'mongodb',
        mode => '0755',
      }
    
      file { '/etc/mongod.conf':
        ensure => file,
        source => 'puppet:///modules/mongodb_replica_set/mongod.conf',
        notify => Service['mongod'],
      }
    
      service { 'mongod':
        ensure => running,
        enable => true,
      }
    }
    
  3. 创建模板文件:在 mongodb_replica_set/files/mongod.conf 中创建模板:
    systemLog:
      destination: file
      path: /var/log/mongodb/mongod.log
      logAppend: true
    storage:
      dbPath: /data/mongodb/replicaSet/${::fqdn}/data
    net:
      port: 27017
      bindIp: 0.0.0.0
    replication:
      replSetName: rs0
    
  4. 应用配置:在 Puppet Server 上,将节点添加到相应的节点组,并应用配置:
    puppet node classify <node_name> --classes mongodb_replica_set
    

使用 Puppet 管理 MongoDB 副本集

  1. 添加节点:在新节点上安装 Puppet Agent 并注册到 Puppet Server。然后在 mongodb_replica_set/manifests/add_node.pp 中编写添加节点的代码:
    class mongodb_replica_set::add_node {
      exec { 'add_node_to_replica_set':
        command => "mongo --eval 'rs.add(\"${::fqdn}:27017\")' --authenticationDatabase admin - u admin - p password",
        path => '/usr/bin:/bin',
      }
    }
    
    在 Puppet Server 上,将新节点添加到相应的节点组并应用配置:
    puppet node classify <new_node_name> --classes mongodb_replica_set::add_node
    
  2. 移除节点:在 mongodb_replica_set/manifests/remove_node.pp 中编写移除节点的代码:
    class mongodb_replica_set::remove_node {
      exec { 'remove_node_from_replica_set':
        command => "mongo --eval 'rs.remove(\"${::fqdn}:27017\")' --authenticationDatabase admin - u admin - p password",
        path => '/usr/bin:/bin',
      }
    
      service { 'mongod':
        ensure => stopped,
        enable => false,
      }
    
      file { '/data/mongodb/replicaSet/${::fqdn}/data':
        ensure => absent,
      }
    }
    
    在 Puppet Server 上,将要移除的节点添加到相应的节点组并应用配置:
    puppet node classify <node_to_remove_name> --classes mongodb_replica_set::remove_node
    

集成中的注意事项

网络配置

  1. 端口开放:确保 MongoDB 节点之间以及自动化运维工具控制节点与 MongoDB 节点之间的网络端口开放。例如,MongoDB 默认使用 27017 端口,Ansible 使用 SSH 端口(默认为 22),需要在防火墙中开放这些端口。
  2. 域名解析:如果使用主机名进行配置,确保所有节点之间的域名解析正常。可以通过配置 /etc/hosts 文件或者使用 DNS 服务器来实现。

安全配置

  1. 认证机制:在集成过程中,要妥善处理 MongoDB 的认证机制。无论是使用 Ansible、Chef 还是 Puppet,都需要在相关的配置文件中正确设置 MongoDB 的用户名、密码和认证数据库。
  2. 加密传输:对于敏感数据的传输,如自动化运维工具与 MongoDB 节点之间的通信,考虑使用加密协议。例如,Ansible 可以通过 SSH 密钥认证和加密传输;Chef 和 Puppet 可以配置 SSL 证书来加密通信。

版本兼容性

  1. MongoDB 版本:不同版本的 MongoDB 在配置和功能上可能存在差异。在选择自动化运维工具集成方案时,要确保其与所使用的 MongoDB 版本兼容。
  2. 自动化运维工具版本:同样,不同版本的自动化运维工具在语法和功能上也有所不同。要根据实际需求和环境选择合适的版本,并关注官方文档的更新。

故障处理与监控

  1. 故障处理:在集成过程中,要考虑到可能出现的故障情况,如节点故障、网络故障等。自动化运维工具应该具备一定的故障恢复能力,例如 Ansible 可以通过重试机制处理临时的网络故障。
  2. 监控:集成完成后,需要建立有效的监控机制。可以使用 MongoDB 自带的监控工具,如 mongostatmongotop,也可以结合第三方监控工具,如 Prometheus + Grafana 来实时监控 MongoDB 副本集的状态和性能指标。