• 基于Docker Compose搭建mysql主从复制(1主2从)


    系统环境 * 3

    Ubuntu 16.04  

    mysql 8.0.12

    docker 18.06.1-ce

    docker-compose 1.23.0-rc3

    *3 ==> PS  ###我用的是虚拟机, 所以起了3个虚拟机,分配 IP如下###

          主IP :192.168.100.100

          从IP :192.168.100.101、192.168.100.102

    #开始

    ##安装Docker、docker-compose环境

    参考这篇博文  https://blog.csdn.net/diligent_lee/article/details/79098302

    #操作注意事项:

    1、如果你是windows上面用虚拟机去模拟的话,通过操作编写文件的时候,要保存为liunx格式的文本。

    2、一些目录可能需要执行的权限,建议chmod +x 你的目录及其文件。我操作的时候,3个虚拟机上面的文件目录都是一样的,为了方便。

    操作的目录文件结构如下

    ----------------------------------------------------------------

    (1)conf里面放mysql的配置文件

    ----------------------------------------------------------------

    (2)data用于挂载mysql的数据目录

    ----------------------------------------------------------------

    (3)docker里面我要接下来要创建的Dockerfile文件

    ##制作Dockerfile文件

    主从的配置文件一样

    FROM mysql
    MAINTAINER <caicai xx@qq.com>
    EXPOSE 3306
    CMD ["mysqld"]

    保存文件名为Dockerfile。接着在同级目录下执行脚本如下:

    docker build -t test/mysql:1.0 .

    注意后面有个空格和.符号。  

    test/mysql:1.0 表示保存为的docker镜像名称

    执行完之后,查看本地的镜像文件。

     

    ##编写mysql的配置文件my.cnf

    主 192.168.100.100 配置文件如下

    [mysqld]
    
    # By default we only accept connections from localhost
    bind-address="192.168.100.100"
    report_host="192.168.100.100"
    
    #Mysql服务的唯一编号 每个mysql服务Id需唯一
    server-id=1
    
    #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
    character-set-server = utf8mb4
    
    #数据库字符集对应一些排序等规则,注意要和character-set-server对应
    collation-server = utf8mb4_general_ci
    
    #设置client连接mysql时的字符集,防止乱码
    init_connect=‘SET NAMES utf8mb4‘
    
    #是否对sql语句大小写敏感,1表示不敏感
    lower_case_table_names = 1
    
    ##################主从复制设置##################
    gtid_mode=ON
    enforce_gtid_consistency=ON
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    binlog_checksum=NONE
    log_slave_updates=ON
    binlog_format=ROW
    log-bin=mysql-bin
    log-bin-index=mysql-bin.index
    
    #设置加密方式
    default_authentication_plugin=mysql_native_password
    
    #group replication
    transaction_write_set_extraction=XXHASH64
    loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    loose-group_replication_start_on_boot=off
    loose-group_replication_local_address ="192.168.100.100:33061"
    loose-group_replication_group_seeds= "192.168.100.100:33061,192.168.100.101:33061,192.168.100.102:33061"
    loose-group_replication_bootstrap_group= off
    loose-group_replication_single_primary_mode=FALSE
    loose-group_replication_enforce_update_everywhere_checks= TRUE

    因为我们等下做的是1主2从,所以这里还需要从的2个配置文件,共3个。不同的地方就是红色的地方。

    192.168.100.100为2个从的IP,替换下,还有就是
    主的server-id=1,从的设置为2、3就好了。

    ##编写docker-compose文件

    version: '2'
    services:
      mysql:
        container_name: mysql
        network_mode: "host"
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
        image: test/mysql:1.0
        restart: unless-stopped
        volumes:
          - "/usr/test/mysql/data:/var/lib/mysql"
          - "/usr/test/mysql/conf:/etc/mysql/conf.d"

    上面脚本其实很简单,就是设置mysql密码为123456,然后挂载了2个目录,data是mysql的数据文件目录,conf是mysql的配置文件目录,为了mysql启动的时候加载my.cnf

    3台主机,依次启动容器

    进入我的/usr/test/mysql根目录,执行docker-compose up -d

    可以看到我们的mysql容器已经起来了。然后看下刚才挂载的data目录,是不是有东西。

    不放心,再检查下容器服务

    说明,mysql服务已经起来了。ps:这里我就不查看日志什么的,即便出错了。篇幅有限。偷懒:)

    说了一大堆,下面才是重点 [由于我本地验证成功过了,所以下面就没有截图了,直接贴脚本]

    1、设置mysql主从复制

    (1) 配置master

    进入msater的mysql容器,输入命令

    docker exec -it mysql /bin/bash  #mysql表示我刚才docker-compose里面设置的容器名称

    登录mysql 控制台,帐号root 密码123456

    mysql -uroot -p123456
    

    创建用于主从复制的用户,并授权所有。(网上教程说,只需要同步的权限就可以,但是我操作的时候会发现一大堆同步日志错误,各种没权限等,有没有大侠指明原因出在哪里)

    SET SQL_LOG_BIN =0;
    CREATE USER 'rpl_user'@'%' IDENTIFIED BY '123456';
    grant all privileges on *.* to 'rpl_user'@'%';
    #GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%' ;
    SET SQL_LOG_BIN =1;
    CHANGE MASTER TO MASTER_USER ='rpl_user', MASTER_PASSWORD ='123456' FOR CHANNEL 'group_replication_recovery';
    FLUSH PRIVILEGES;
    
    INSTALL PLUGIN group_replication SONAME 'group_replication.so';     #安装Group Replication plugin
    SHOW PLUGINS;
    
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    

    锁库,不让数据再进行写入动作,这个命令在结束终端会话的时候会自动解锁

    FLUSH TABLES WITH READ LOCK;

    重置下master状态,这点有争议,其他教程是先查询master状态,show master status; 然后在通过制定日志位置去同步。

    reset master;
    

    (2)配置slave

    同样进入mysql控制台,然后

    #从节点
    reset master;
    SET SQL_LOG_BIN =0;
    CREATE USER 'rpl_user'@'%' IDENTIFIED BY '123456';
    grant all privileges on *.* to 'rpl_user'@'%';
    #GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%' ;
    SET SQL_LOG_BIN =1;
    CHANGE MASTER TO MASTER_USER ='rpl_user', MASTER_PASSWORD ='123456' FOR CHANNEL 'group_replication_recovery';
    FLUSH PRIVILEGES;
    
    INSTALL PLUGIN group_replication SONAME 'group_replication.so';     #安装Group Replication plugin
    #SHOW PLUGINS;
    
    CHANGE MASTER TO
    MASTER_HOST='192.168.100.100',
    MASTER_USER='rpl_user',
    MASTER_PASSWORD='123456',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=0;
    
    START GROUP_REPLICATION;
    start slave;
    

     于是乎,差不多整个过程就是这样了。可能会遇到一些异常,只能一个一个踩坑解决了,主要是开头注意事项的那些吧。比如server_id一样、同步用户的权限不足、slave上同步的日志异常。

    参考文章:https://blog.csdn.net/wang_jingj/article/details/53931237

    http://www.cnblogs.com/xinysu/p/6674832.html

    https://www.jianshu.com/p/fed36ba15b01

    https://blog.csdn.net/boling_cavalry/article/details/79747488

    https://blog.csdn.net/wang_jingj/article/details/53931237

  • 相关阅读:
    工作量单位-人月、人日、人时 详解
    PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数详解
    常用的Mysql数据库操作语句大全
    Linux服务器,PHP的10大安全配置实践
    PHP如何获取二个日期的相差天数?
    常见HTTP状态码列表
    PHP中静态(static)调用非静态方法详解
    PHP引用(&)初探:函数的引用返回
    PHP的大括号(花括号{})使用详解
    详解JavaScript中的Url编码/解码,表单提交中网址编码
  • 原文地址:https://www.cnblogs.com/contraII/p/9851393.html
Copyright © 2020-2023  润新知