zoukankan      html  css  js  c++  java
  • Docker 版ansible galera集群

    1. 部署galera集群

           利用四台主机cicd、node1、node2、node3来搭建galera集群。

    1> 上传压缩包至cicd,解压得到ansible配置文件

    [root@cicd ~]# ls
    anaconda-ks.cfg  ansible-galera.tar.gz 
    [root@cicd ~]# tar zxf ansible-galera.tar.gz
    [root@cicd ~]# ls
    anaconda-ks.cfg  ansible-galera  ansible-galera.tar.gz
    [root@cicd ~]# cd ansible-galera/
    [root@cicd ansible-galera]# ls
    bin  delete.yml  hosts  install.yml  roles

    2> 安装ansible

    [root@cicd ~]# mount /dev/cdrom  /mnt
    mount: /dev/sr0 is write-protected, mounting read-only
    [root@cicd ~]# yum install ansible -y

    3> 清空ansible目录文件,将解压得到的文件复制到ansible目录下

    [root@cicd ~]# cd /etc/ansible/
    [root@cicd ansible]# ls
    ansible.cfg  hosts  roles
    [root@cicd ansible]# rm -rf *
    [root@cicd ansible]# ls
    [root@cicd ansible]# mv /root/ansible-galera/* .
    [root@cicd ansible]# ls
    bin  delete.yml  hosts  install.yml  roles

    4> 集群进行域名解析,使每个节点都能静态解析。

    [root@cicd ansible]# vim /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.16.95 cicd
    192.168.16.96 node1
    192.168.16.98 node2
    192.168.16.99 node3
    [root@cicd ansible]# scp /etc/hosts 192.168.16.96:/etc/hosts
    [root@cicd ansible]# scp /etc/hosts 192.168.16.98:/etc/hosts
    [root@cicd ansible]# scp /etc/hosts 192.168.16.99:/etc/hosts

    5> 在部署节点设置无秘钥登录

    [root@cicd ansible]# ssh-keygen
    [root@cicd ansible]# ssh-copy-id node1
    [root@cicd ansible]# ssh-copy-id node2
    [root@cicd ansible]# ssh-copy-id node3
    [root@cicd ansible]# ssh-copy-id cicd

    6> bin目录用来存放配置文件以及镜像、安装脚本,因此要将配置文件、镜像和安装版本放在该目录下。

    [root@cicd ansible]# ls
    bin  delete.yml  hosts  install.yml  roles
    [root@cicd ansible]# cd bin
    [root@cicd bin]# ls
    VERSION.md
    [root@cicd bin]# cd
    [root@cicd ~]# ls
    anaconda-ks.cfg  ansible-galera  ansible-galera.tar.gz  galera.tar.gz
    [root@cicd ~]# tar zxf galera.tar.gz 
    [root@cicd ~]# ls
    anaconda-ks.cfg  ansible-galera.tar.gz  galera.tar.gz
    ansible-galera   config.tar.gz          mariadb-galera.ta
    [root@cicd ~]# mv config.tar.gz mariadb-galera.tar /etc/ansible/bin/
    [root@cicd ~]# cd /etc/ansible/bin/
    [root@cicd bin]# ls
    config.tar.gz  mariadb-galera.tar  VERSION.md

    7> 在四台机器上部署docker

    [root@cicd ~]# wget http://download2.yunwei.edu/shell/docker.tar.gz
    [root@cicd ~]# tar zxf  docker.tar.gz
    [root@cicd ~]# cd docker
    [root@cicd docker]# bash docker.sh

    四台均部署。

     8> 编辑配置文件hosts

    [root@cicd ~]# cd /etc/ansible
    [root@cicd ansible]# ls
    bin  delete.yml  hosts  install.yml  roles
    [root@cicd ansible]# vim  hosts
    [all]                               #集群节点
    192.168.16.96
    192.168.16.98
    192.168.16.99
    
    [master]                            #主节点
    192.168.16.96
    
    [slave1]                            #从节点
    192.168.16.98
    
    [slave2]                            #从节点
    192.168.16.99
    
    [all:vars]                           #变量
    #定义集群ip
    master="192.168.16.96"
    slave1="192.168.16.98"
    slave2="192.168.16.99"
    #部署目录,即 ansible 工作目录
    base_dir="/etc/ansible"
    #默认软件安装目录
    opt_dir="/opt"

    9> 执行yml文件,部署ansible集群,得到docker-galera集群

    [root@cicd ~]# cd /etc/ansible/
    [root@cicd ansible]# ls
    bin  delete.yml  hosts  install.yml  roles
    [root@cicd ansible]# ansible-playbook install.yml

    10> 查看容器即数据库结果,验证是否安装成功。

    [root@node1 ~]# docker ps -a
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    10cda5ecde16        panubo/mariadb-galera   "/galera-entrypoint.…"   5 minutes ago       Up 5 minutes                            galera1
    [root@node2 ~]# docker ps -a
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    bc1dca8dea63        panubo/mariadb-galera   "/galera-entrypoint.…"   6 minutes ago       Up 34 seconds                           galera2
    [root@node3 ~]# docker ps -a
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    fd542150b5cc        panubo/mariadb-galera   "/galera-entrypoint.…"   7 minutes ago       Up 22 seconds                           galera3
    
    [root@node1 ~]# docker exec -it 10cda5ecde16  /bin/bash
    root@node1:/# mysql -uroot -p123
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
    
    [root@node2 opt]# docker ps
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    9abff0435fa2        panubo/mariadb-galera   "/galera-entrypoint.…"   2 hours ago         Up 2 hours                              galera2
    [root@node2 opt]# docker exec -it 9abff0435fa2 /bin/bash
    root@node2:/# mysql -uroot -p123
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 4
    Server version: 10.1.32-MariaDB-1~jessie mariadb.org binary distribution
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
    
    [root@node3 opt]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@node3 opt]# docker ps
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    26b3b9dee6ea        panubo/mariadb-galera   "/galera-entrypoint.…"   2 hours ago         Up 2 hours                              galera3
    [root@node3 opt]# docker exec -it 26b3b9dee6ea /bin/bash
    root@node3:/# mysql -uroot -p123;
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 4
    Server version: 10.1.32-MariaDB-1~jessie mariadb.org binary distribution
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
    1 row in set (0.01 sec)

    11> 各文件内容

    [root@node ansible]# cat install.yml
    - hosts:
      - all
      roles:
      - ready
    - hosts: - master roles: - master - hosts: - slave1 roles: - slave1 - hosts: - slave2 roles: - slave2
    对应的main.yml文件在目录roles下面 [root@node ansible]# cd roles [root@node roles]# ls master ready slave1 slave2 [root@node ansible]# cd roles [root@node roles]# ls master ready slave1 slave2 [root@node roles]# cd master
    / [root@node master]# ls tasks [root@node master]# cd tasks/ [root@node tasks]# ls main.yml [root@node tasks]# cat main.yml #部署wsrep进程mariadb-master - name: 启动wsrep进程 shell: "cd {{ opt_dir }}/mariadb/ && sh master.sh" [root@node tasks]# cd /etc/ansible/roles/ready/ [root@node ready]# ls tasks templates [root@node ready]# cd tasks/ [root@node tasks]# ls main.yml [root@node tasks]# cat main.yml #准备工作目录: - name: prepare some dirs file: name={{ item }} state=directory mode=0755 with_items: - "{{ opt_dir }}/mariadb" ## ---------下载 配置文件及镜像 ----------- - name: download configfile and iamge copy: src={{ base_dir }}/bin/{{ item }} dest={{ opt_dir }}/mariadb/{{ item }} mode=0755 with_items: - mariadb-galera.tar - config.tar.gz #解压配置文件 - name: 解压config shell: "tar zxf {{ opt_dir }}/mariadb/config.tar.gz -C {{ opt_dir }}/mariadb/" #导入mariadb-galera镜像 - name: 导入mariadb-galera shell: "cd {{ opt_dir }}/mariadb/ && docker load -i mariadb-galera.tar" ## ---------分发 脚本文件 ----------- - name: download configfile and iamge template: src={{ item }} dest={{ opt_dir }}/mariadb/{{ item }} mode=0755 with_items: - master.sh - slave1.sh - slave2.sh [root@node roles]# ls master ready slave1 slave2 [root@node roles]# cd ready/ [root@node ready]# ls tasks templates [root@node ready]# cd templates/ [root@node templates]# ls master.sh slave1.sh slave2.sh [root@node templates]# cat master.sh docker run -d --net host --name galera1 -e WSREP_NODE_ADDRESS={{ master }} -e WSREP_CLUSTER_ADDRESS=gcomm://{{ master }}:4567,{{ slave1 }}:4567,{{ slave2 }}:4567 -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -p 4567:4567/udp -p 4567-4568:4567-4568 -p 4444:4444 -v /opt/mariadb/config/mysql:/etc/mysql -v /opt/mariadb/config/data:/var/lib/mysql:Z --restart=always panubo/mariadb-galera mysqld --wsrep-new-cluster [root@node templates]# cat slave1.sh docker run -d --net host --name galera2 -e WSREP_NODE_ADDRESS={{ slave1 }} -e WSREP_CLUSTER_ADDRESS=gcomm://{{ master }}:4567,{{ slave1 }}:4567,{{ slave2 }}:4567 -p 3306:3306 -p 4567:4567/udp -p 4567-4568:4567-4568 -p 4444:4444 -v /opt/mariadb/config/mysql:/etc/mysql -v /opt/mariadb/config/data:/var/lib/mysql:Z --restart=always panubo/mariadb-galera mysqld [root@node templates]# cat slave2.sh docker run -d --net host --name galera3 -e WSREP_NODE_ADDRESS={{ slave2 }} -e WSREP_CLUSTER_ADDRESS=gcomm://{{ master }}:4567,{{ slave1 }}:4567,{{ slave2 }}:4567 -p 3306:3306 -p 4567:4567/udp -p 4567-4568:4567-4568 -p 4444:4444 -v /opt/mariadb/config/mysql:/etc/mysql -v /opt/mariadb/config/data:/var/lib/mysql:Z --restart=always panubo/mariadb-galera mysqld [root@node roles]# cd slave1 [root@node slave1]# ls tasks [root@node slave1]# cd tasks/ [root@node tasks]# ls main.yml [root@node tasks]# cat main.yml #部署wsrep进程mariadb-master - name: 启动salve进程 shell: "cd {{ opt_dir }}/mariadb/ && sh slave1.sh" [root@node tasks]# cat main.yml #部署wsrep进程mariadb-master - name: 启动salve进程 shell: "cd {{ opt_dir }}/mariadb/ && sh slave2.sh" [root@node tasks]#

    11> 删除部署的docker-galance

    删除该集群用/etc/ansible/delete.yum文件

    文件内容
    [root@node ansible]# cat delete.yml
    - hosts:
      - master
      tasks:
      - name: stop mariadb-galera-docker
        shell: "docker stop galera1 && docker rm galera1"
     
    - hosts:
      - slave1
      tasks:
      - name: stop mariadb-galera-docker
        shell: "docker stop galera2 && docker rm galera2"
    
    - hosts:
      - slave2
      tasks:
      - name: stop mariadb-galera-docker
        shell: "docker stop galera3 && docker rm galera3"
    
    - hosts:
      - all
      tasks:
    #清理文件及镜像
      - name: 清理目录和文件
        file: name={{ opt_dir }}/mariadb state=absent
      - name: rm image
    shell: "docker rmi 75feb1db734a"
    
    执行删除
    [root@node ansible]# ansible-playbook delete.yml

    2. 集群故障恢复

    1> 集群中某slave节点down机,重启该节点后重启docker容器即可;

    [root@node ~]# mysql -h 192.168.16.96 -uroot -p123   #-h:指定节点数据库登录
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 4
    Server version: 10.1.32-MariaDB-1~jessie mariadb.org binary distribution
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
    
    模拟节点node3 down机
    [root@node3 ~]# powerof
     
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 2     |
    +--------------------+-------+
     
    再将节点重新启动,查看数据库
    Last login: Wed Jul 17 04:57:57 2019 from 192.168.16.95
    [root@node3 ~]#
     
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+

    2> 集群中master节点down机,因为master节点已经切换重启该master节点后master-docker容器不能正常启动,需要将原先master-docker容器删除,再以非wrster方式启动一个普通容器;

    [root@node1 ~]# shutdown -h now
     
    MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 2     |
    +--------------------+-------+
     
    重启node1
    Last login: Wed Jul 17 04:57:41 2019 from 192.168.16.95
    [root@node1 ~]#
    [root@node1 ~]# docker ps -a    #由于被抢占了master,一直处于重启状态
    CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                          PORTS               NAMES
    e919dd79cb44        panubo/mariadb-galera               "/galera-entrypoint.…"   34 minutes ago      Restarting (1) 11 seconds ago                       galera1
    
    MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 2     |
    +--------------------+-------+
    
    
    将该容器删除,然后再以普通容器的方式启动
    [root@node1 ~]# docker stop e919dd79cb44
    e919dd79cb44
    [root@node1 ~]# docker rm  e919dd79cb44
    e919dd79cb44
    修改从节点启动脚本,以普通容器形式启动
    [root@node1 opt]# cd
    [root@node1 ~]# cd /opt/mariadb/
    [root@node1 mariadb]# ls
    config  config.tar.gz  mariadb-galera.tar  master.sh  slave1.sh  slave2.sh
    [root@node1 mariadb]# vim slave1.sh
    docker run -d --net host --name galera1 
    -e WSREP_NODE_ADDRESS=192.168.16.96 
    -e WSREP_CLUSTER_ADDRESS=gcomm://192.168.16.96:4567,192.168.16.98:4567,192.168.16.99:4567 
    -p 3306:3306 
    -p 4567:4567/udp 
    -p 4567-4568:4567-4568 
    -p 4444:4444 
    -v /opt/mariadb/config/mysql:/etc/mysql 
    -v /opt/mariadb/config/data:/var/lib/mysql:Z 
    --restart=always 
    panubo/mariadb-galera mysqld
    
    [root@node1 mariadb]# docker run -d --net host --name galera1 
    > -e WSREP_NODE_ADDRESS=192.168.16.96 
    > -e WSREP_CLUSTER_ADDRESS=gcomm://192.168.16.96:4567,192.168.16.98:4567,192.168.16.99:4567 
    > -p 3306:3306 
    > -p 4567:4567/udp 
    > -p 4567-4568:4567-4568 
    > -p 4444:4444 
    > -v /opt/mariadb/config/mysql:/etc/mysql 
    > -v /opt/mariadb/config/data:/var/lib/mysql:Z 
    > --restart=always 
    > panubo/mariadb-galera mysqld
    WARNING: Published ports are discarded when using host network mode
    354383d0d45ee204e1cf5b9f5f0196216ea68a8df3b61a5618eb0cb1abe90e7b      #重启成功
    "slave1.sh" 11L, 383C written                                   
    [root@node1 mariadb]# docker ps
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    354383d0d45e        panubo/mariadb-galera   "/galera-entrypoint.…"   10 minutes ago      Up 10 minutes                           galera1
    
    MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+

    3> 集群全部意外down机(如断电),强制找一台节点作为master节点,将/opt/mariadb/data目录中的文件grastate.dat文件的safe_to_bootstrap:0改为1,之后在该节点启动wsrap进程的docker。

    模拟三个节点down
    [root@node ~]# ansible all -m shell -a 'shutdown -h now'
    192.168.16.96 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh: Shared connection to 192.168.16.96 closed.",
        "unreachable": true
    }
    192.168.16.99 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh: Shared connection to 192.168.16.99 closed.",
        "unreachable": true
    }
    192.168.16.98 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh: Shared connection to 192.168.16.98 closed.",
        "unreachable": true
    }
    
    再将三个节点开机
    Last login: Wed Jul 17 05:53:07 2019 from 192.168.16.95
    [root@node1 ~]#
    Last login: Wed Jul 17 05:52:33 2019 from 192.168.16.95
    [root@node2 ~]#
    Last login: Wed Jul 17 05:53:06 2019 from 192.168.16.95
    [root@node3 ~]#
    
    无法登陆数据库
    [root@node ~]# mysql -h 192.168.16.99 -uroot -p123     
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.16.99' (111)
    [root@node ~]# mysql -h 192.168.16.98 -uroot -p123      
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.16.99' (111)
    [root@node ~]# mysql -h 192.168.16.96-uroot -p123     
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.16.99' (111)
    
    但是各节点容器是启动的
    [root@node ~]# ansible all -m shell -a 'docker ps'
    192.168.16.96 | CHANGED | rc=0 >>
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    354383d0d45e        panubo/mariadb-galera   "/galera-entrypoint.…"   18 minutes ago      Up 20 seconds                           galera1
    192.168.16.99 | CHANGED | rc=0 >>
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    57f1d19388c2        panubo/mariadb-galera   "/galera-entrypoint.…"   About an hour ago   Up 21 seconds                           galera3
    192.168.16.98 | CHANGED | rc=0 >>
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    e96ee6196980        panubo/mariadb-galera   "/galera-entrypoint.…"   About an hour ago   Up 16 seconds                           galera2
    
    修改文件grastate.dat
    [root@node1 ~]# cd /opt/mariadb/config/data/
    [root@node1 data]# ls
    aria_log.00000001  grastate.dat  ib_logfile1        performance_schema
    aria_log_control   ibdata1       multi-master.info
    galera.cache       ib_logfile0   mysql
    [root@node1 data]# vim grastate.dat
    # GALERA saved state
    version: 2.1
    uuid:    8c85e11d-f45d-11e8-8ed7-dbc6d595b08d
    seqno:   -1
    safe_to_bootstrap: 1
    
    删除galera1容器,由于做了映射。并不会删除数据库
    [root@node1 data]# docker stop 354383d0d45e
    354383d0d45e
    [root@node1 data]# docker rm 354383d0d45e 
    354383d0d45e
    
    执行master.sh脚本,人为启动mode1为master
    [root@node1 ~]# cd /opt/mariadb/
    [root@node1 mariadb]# ls
    config  config.tar.gz  mariadb-galera.tar  master.sh  slave1.sh  slave2.sh
    [root@node1 mariadb]# bash master.sh
    WARNING: Published ports are discarded when using host network mode
    2c9900b470a429484e1e959d9d4b4ab4bbfbd0238abaf67214c82cdf7388f404
    [root@node1 mariadb]# docker ps
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
    2c9900b470a4        panubo/mariadb-galera   "/galera-entrypoint.…"   23 seconds ago      Up 23 seconds                           galera1
    
    查看数据库,其他两节点自动加入
    [root@node ~]# mysql -h 192.168.16.96 -uroot -p123
    MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
  • 相关阅读:
    [Give a try | Multithreading]The Practical Guide to Multithreading
    [SOLID]The Principles of OOD
    Mixing Native and Managed Types in C++
    [转载]关于大型软件重构的一些想法
    Mixed mode programming is the absolute power of C++/CLI
    Sample: Mixing Unmanaged C++, C++/CLI, and C# code
    添加删除虚函数带来的问题及解决办法
    如何阅读code base的组内讨论的总结
    如何快速定位一个函数的返回点(c/c++ Only)
    DirextX Training笔记
  • 原文地址:https://www.cnblogs.com/ajunyu/p/11215112.html
Copyright © 2011-2022 走看看