美文网首页
MySQL之主从复制

MySQL之主从复制

作者: 张磊_e325 | 来源:发表于2021-07-30 17:01 被阅读0次

    docker搭建mysql主从复制

    一、下载镜像

    docker pull mysql:5.7.32

    二、创建目录及配置文件

    $ mkdir /trs/mysql/
    $ cd /trs/mysql/
    $ mkdir master slave
    $ cd /trs/mysql/master
    $ mkdir data logs
    $ cd /trs/mysql/slave
    $ mkdir data logs
    
    # 进入mater目录创建配置文件 my.cnf
    $ vi my.cnf
    --------------------------------------
    [mysqld]
    # [必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配(每个mysql节点必须不一样)
    server-id=1
    # [必须]启用二进制日志
    log-bin=mysql-bin
    
    # 进入mater目录创建配置文件 my.cnf
    $ vi my.cnf
    --------------------------------------
    [mysqld]
    server-id=2
    log-bin=mysql-bin
    

    三、启动容器

    master

    sudo docker run -p 3316:3306 --name mysql_master \
    -v /trs/mysql/master:/etc/mysql \
    -v /trs/mysql/master/logs:/var/log/mysql \
    -v /trs/mysql/master/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:5.7.32
    

    slave

    sudo docker run -p 3317:3306 --name mysql_slave \
    -v /trs/mysql/slave:/etc/mysql \
    -v /trs/mysql/slave/logs:/var/log/mysql \
    -v /trs/mysql/slave/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:5.7.32
    

    查看结果

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                                     NAMES
    22c4c9e03476        mysql:5.7.32        "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds                    33060/tcp, 0.0.0.0:3317->3306/tcp         mysql_slave
    723646be27ef        mysql:5.7.32        "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes                    33060/tcp, 0.0.0.0:3316->3306/tcp         mysql_master
    

    四、授权

    因为从节点需要读取主节点的bin_log日志,所以要在主节点为从节点开放权限

    1、在master节点创建主从复制专用用户并赋权

    # 进入容器
    $ docker exec -it mysql_master bash 
    # 连接mysql
    root@723646be27ef:/# mysql -uroot -p123456
    # 创建rep用户,任意ip访问,密码:test@A123456
    mysql> create user 'rep'@'%' identified by 'test@A123456';
    # 授权rep权限
    mysql> grant replication slave,replication client on *.* to 'rep'@'%'; 
    

    2、在slave测试

    注意slave容器并不能直接连到宿主机,所以要通过docker0网桥转发,docker0虚拟网桥的默认ip是172.17.0.1

    如果使用172.17.0.1还是连不通,可以尝试关掉防火墙

    # 进入容器
    $ docker exec -it mysql_slave bash 
    # 连接mysql,连接上说明授权成功
    root@723646be27ef:/# mysql -h 172.17.0.1 -P 3316 -u'rep' -p'test@A123456'
    

    五、配置主从同步

    1、查看master节点当前bin-log日志的文件名及位置

    # 进入容器
    $ docker exec -it mysql_master bash 
    # 连接mysql
    root@723646be27ef:/# mysql -uroot -p123456
    # 查看bin-log
    mysql> show master status;
    

    到这里为止,主库千万不要再做任何操作,防止状态改变

    2、在slave节点配置主从复制

    # 进入容器
    $ docker exec -it mysql_slave bash 
    # 连接mysql
    root@723646be27ef:/# mysql -uroot -p123456
    # **配置主从同步**
    mysql> change master to
        master_host='172.17.0.1',
        master_port=3316,
        master_user='rep',
        master_password='test@A123456',
        master_log_file='mysql-bin.000004',
        master_log_pos=613;
    

    3、开始主从复制

    # 开始主从复制
    mysql> start slave;
    # 查看状态 以下两项都为Yes,说明成功。
    mysql> show slave status\G;
    -----------
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
    -----------
    

    4、(如果成功不需要)错误情况

    • connect:

    检查ip端口用户名密码是否正确

    ip是否能ping通,mysql是否允许远程链接等

    • no:

    检查bin-log 文件名或者位置是否正确

    状态失败后,执行stop slave;然后修改相应的配置后,重新start slave;

    六、测试

    在master上建表,查看从库是否出现同样的表

    在master上执行增删改查,查看从库是否执行相应的操作

    参考文章

    使用docker 实现MySQL主从同步/读写分离 - 西柚柠檬 - 博客园 (cnblogs.com)

    MySQL主从同步详解与配置 - 知乎 (zhihu.com)

    相关文章

      网友评论

          本文标题:MySQL之主从复制

          本文链接:https://www.haomeiwen.com/subject/vkrcvltx.html