zoukankan      html  css  js  c++  java
  • docker搭建MySQL主从集群

    关于MySQL主从模式,如果我们直接在本机上搭建的话,是没法搭建的,只能借助于虚拟机,但有的时候我们又需要搭建一个主从集群,以便于进行一些功能性的测试。这个时候我们就可以尝试使用docker,借助于docker的容器化技术,我们只需要创建两个MySQL容器,并且占用主机的两个端口即可,对主机没有其他额外的影响。这种方式非常的轻量,而且也容易复制。本文则主要讲解如何通过docker来搭建MySQL集群。

    1. 环境准备

    在搭建主从集群之前,我们需要在本机上安装一个docker服务器,具体的安装步骤读者可参见docker的官网https://www.docker.com/下载服务安装。安装完成之后,执行如下命令能正常显示则说明安装成功了:

    $ docker --version
    Docker version 18.09.0, build 4d60db4

    2. 主从集群搭建

    2.1 master服务器准备

    在安装完docker之后,我们首先执行如下命令运行一个master容器:

    docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-master

    在执行上述命令之后,docker首先会检测本地有没有目标镜像,即xiaochunping/mysql-master,如果没有,则会下载该镜像,然后根据配置的参数运行该镜像。上述命令中各个参数的含义如下:

    • --name指定运行之后的容器的名称为mysql-master
    • --privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;
    • -v指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的;
    • -p表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口;
    • -e表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码;
    • -d参数指定了当前容器是在后台运行。

    在master容器启动完成之后,我们通过docker ps命令即可看到这个运行的容器:

    CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    fa4afaeb24c4        xiaochunping/mysql-master   "docker-entrypoint.s…"   12 days ago         Up About an hour    0.0.0.0:3306->3306/tcp                           mysql-master

    可以看到,master容器已经正常启动了,然后我们需要进入到该容器内部,对master节点进行一定的配置。可以通过如下命令进入该容器:

    # 通过容器id方式,这里的id就是上面docker ps中展示的id
    docker exec -it fa4afaeb24c4 /bin/bash
    # 通过容器名称方式,这里的名称就是创建容器时指定的名称,也就是mysql-master
    docker exec -it mysql-master /bin/bash

    进入容器后,我们需要连接其MySQL服务:

    # 这里的密码就是最开始创建容器时指定的密码
    mysql -uroot -proot

    然后我们需要为从服务器创建一个可以用来master服务器的账户,也就是创建一个专门用来复制binlog的账号,并且赋予该账号复制权限,其命令如下:

    grant replication slave on *.* to 'test'@'%' identified by '123456';
    flush privileges;

    这里的grant replication slave是一个命令格式,表示赋予后面的账户以复制的权限,这样slave节点就能够获取到master节点对数据的更新。上述命令中创建的账户的用户名为test,密码为123456。接着我们需要查看master节点的binlog状态:

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000014 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    这里需要记住这个File和Position属性的值,因为下面在配置slave的时候需要用到。

    2.2 slave服务器准备

    对于从容器的使用,其启动命令与master容器非常相似,但也有一些小小的区别:

    docker run --name mysql-slave --privileged=true -v /home/mysql/slave-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-slave

    从容器启动与主容器启动参数主要有一下两点:

    • 所映射的宿主机的端口号不能与master容器相同,因为其已经被master容器占用;
    • 必须加上--link参数,其后指定了当前容器所要连接的容器,mysql-master表示所要连接的容器的名称,master表示为该容器起的一个别名,通俗来讲,就是slave容器通过这两个名称都可以访问到master容器。这么做的原因在于,如果master与slave不在同一个docker network中,那么这两个容器相互之间是没法访问的。注意这一点非常重要,之前本人按照网上的搭建方式搭建主从服务器一直无法成功,主要就是因为他们一直没有提到要设置这个参数。

    在启动从容器之后,我们还是需要进入到从容器,并且连接上MySQL服务:

    docker exec -it mysql-slave /bin/bash
    mysql -uroot -proot

    连接上MySQL服务器之后,我们就需要切换当前服务的状态,使其能够连接上master服务器,并且复制其数据:

    change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000014', master_log_pos=154, master_connect_retry=30;

    上述命令中,各个参数的含义其实比较好理解,主要就是指定master服务的域名(也就是我们前面link时使用的别名)、用户名、密码、端口,以及master节点的binlog文件和log的position。这里的binlog文件和log的position就是前面我们show master status;命令的执行结果,读者朋友需要与本机的实际结果一致。最后我们需要开启主从复制:

    start slave;

    开启完成之后,我们可以通过如下命令查看从服务器的连接状态:

    mysql> show slave statusG;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: master
                      Master_User: test
                      Master_Port: 3306
                    Connect_Retry: 30
                  Master_Log_File: mysql-bin.000014
              Read_Master_Log_Pos: 154
                   Relay_Log_File: 6774ae81bc25-relay-bin.000034
                    Relay_Log_Pos: 367
            Relay_Master_Log_File: mysql-bin.000014
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                             ....
                 Master_Server_Id: 1
                      Master_UUID: 8976b929-bc8b-11e9-bab3-0242ac110005
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind:
                             ....
    1 row in set (0.00 sec)

    这里只要看到两个参数Slave_IO_RunningSlave_SQL_Running都为true,则表示复制是正常进行的,到这里我们的主从结构也就搭建完成了。

    3. 测试主从服务

    测试主从服务比较简单,只需要在master服务器上执行相关的命令,然后检查slave服务器上是否存在相应的更新即可。我们可以在master节点上执行如下命令,创建一个数据库和表,然后插入一条数据:

    mysql> create database test;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> use test;
    Database changed
    
    mysql> create table t_user(id bigint, name varchar(255));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into t_user(id, name) value (1, 'Mary');
    Query OK, 1 row affected (0.01 sec)

    然后我们连接上从数据库,查看其上是否有相关的更新:

    mysql> select * from test.t_user;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | Mary |
    +------+------+
    1 row in set (0.00 sec)

    可以看到,从服务器上确实同步了相关的数据,这也进一步验证了我们搭建的主从服务器是OK的。

    4. 小结

    本文主要讲解了如何通过docker运行两个MySQL容器,并且详细介绍了如何将两个容器连接起来,以及如何配置主从数据库架构模式。

  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/zwjphp/p/14902865.html
Copyright © 2011-2022 走看看