美文网首页
docker实现mysql 主从复制

docker实现mysql 主从复制

作者: HELLO_浪 | 来源:发表于2023-05-24 16:41 被阅读0次

    前言

    1)、mysql主从复制用途
    • 实时灾备,用于故障切换
    • 读写分离,提供查询服务
    • 备份,避免影响业务
    2)、主从部署必要条件:
    • 主库开启binlog日志(设置log-bin参数)
    • 主从server-id不同
    • 从库服务器能连通主库

    利用docker实现mysql的主从复制,首先需要在服务器上安装好docker 及拉取相关mysql镜像:

    一、部署主从Mysql服务器

    在服务器创建两个目录 master 与 slave 分别对应主从数据库的data和conf ,目录结构如下


    1.png

    然后在master/conf/ 路径下创建 my.cnf 里面内容如下

    [mysqld]
    ## 同一局域网内注意要唯一
    server-id=1
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    secure_file_priv=/var/lib/mysql
    default_authentication_plugin=mysql_native_password  #设置密码规则
    max_connections=1000 #最大连接数设置 根据实际需要 自行调整
    

    在slave /conf/路径下 创建 my.cnf 内容如下

    [mysqld]
    ## 设置server_id,注意要唯一
    server-id=2
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    secure_file_priv=/var/lib/mysql
    default_authentication_plugin=mysql_native_password  #设置密码规则
    max_connections=1000 #最大连接数设置 根据实际需要 自行调整
    

    然后利用镜像分别启动两个容器,一个master 一个slave , master端口为3306,slave为3307 对应的root密码为123456,映射配置文件和数据存储目录到mysql
    启动 Master

    docker run --name master -p 3306:3306   -v "/root/home/mysql/master/conf/my.cnf":/etc/mysql/my.cnf  -v "/root/home/mysql/master/data":/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    

    启动Slave

    docker run --name slave -p 3307:3306   -v "/root/home/mysql/slave/conf/my.cnf":/etc/mysql/my.cnf  -v "/root/home/mysql/slave/data":/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    
    2.png

    \color{red}{注意:这里自己的端口3306、3307记得打开哟}

    启动完成后,分别测试下连接,发现都可以正常连接,接下来开始具体的主从配置


    3.png

    二、主从数据同步配置

    使用navicat连接 master数据库,进行slave账户创建及相关授权


    4.png
    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
     
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    

    在Master进入mysql,执行show master status;


    5.png

    回到linux服务器,执行命令查看master容器的ip地址


    6.png
    docker inspect --format={{.NetworkSettings.IPAddress}} master
    

    然后在slave数据库服务器中根据上面得到的信息执行命令,主要是

    master_log_filemaster_log_pos这两个参数需要根据上面 图5语句查出来的结果进行配置,IP分配的内部地址基本就是172.17.0.2,如果不是这个地址改为上述查询出来的地址即可。

    change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000006', master_log_pos= 1249, master_connect_retry=30,get_master_public_key=1;
    
    7.png
    • master_port: Master的端口号,指的是容器的端口号.
    • master_user:用于数据同步的用户
    • master_password:用于同步的用户的密码
    • master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
    • master_log_pos:从哪个Position开始读,即上文中提到的Position字段的值
    • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
    • get_master_public_key:在该用户在连接主库时自动获得主库的公钥

    查询下当前从服务器的状态
    show slave status \G;

    show slave status \G;
    

    由于navicat 不支持 \G格式化展示,所以我们进入slave从服务器内查看

    # 进入slave 的mysql命令界面
    docker exec -it slave mysql -uroot -p123456
     # 查询下当前从服务器的状态
    show slave status \G
    
    8.png

    可以看到这两个属性都为No
    设置从数据库开启主从服务

    start slave;
    

    如果中途报错,之类的,可以使用reset slave进行从服务器重置

    reset slave;
    
    9.png

    三、主从同步测试

    在主库中新建一个数据库


    10.png

    刷新从库


    11.png

    发现在主数据库添加的新库db0也被同步到从数据库上了,至此主从同步配置完成。

    过程中遇到的问题及相关命令

    1:如果遇到message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection异常只需在添加主库的语句中加上获取主库密钥即可get_master_public_key=1
    2:查看server_id :

    show variables like 'server_id';
    

    如果没有生效手动设置

    set global server_id=2;
    

    这里为什么会失效,多半是因为在启动mysql容器时映射路径配置错误

    相关文章

      网友评论

          本文标题:docker实现mysql 主从复制

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