• 基于Docker的MySQL主从复制环境搭建


    本机版本信息:

    CentOS 7.6.1810  64bit

    Docker 19.03.10

    Mysql 8.0.20

    参考链接:https://www.cnblogs.com/djj123/p/11289043.html

    一、Docker下载与安装

    Docker 运行在 CentOS 7 以上,要求系统为64位、系统内核版本为 3.10 以上。

    Docker 从 17.03 版本之后分为 CECommunity Edition: 社区版) 和 EE(Enterprise Edition: 企业版),安装CE版本就可以。

    (较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,需要卸载它们以及相关的依赖项。

    1、安装所需的软件包

    yum install -y  yum-utils  device-mapper-persistent-data  lvm2

     

     

    2、设置软件源仓库

    在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

     

     

    更新 yum 缓存: yum makecache fast

    3、 安装docker

    yum -y install docker-ce

     

     

    4、查看版本

    docker version

     

     

    5、启动docker

    systemctl start docker

     

     

    二、创建镜像

    拉取 MySQL 镜像

    docker pull mysql

     

     

    格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    tag默认最新版本,也就是latest

    创建mysql主从文件

    1、创建 master(主) 和 slave(从) 两个文件夹

    mkdir /usr/mysql/master

    mkdir /usr/mysql/slave

     

     

     

    2、在 master 和 slave 文件夹下 创建 Dockerfile 内容为:

    FROM mysql
    COPY my.cnf /etc/mysql/
    EXPOSE 3306
    CMD ["mysqld"]

    3、在 master 和slave文件夹下 创建 my.cnf

    master/my.cnf 内容:
    [mysqld]
    log-bin=mysql-bin //[必须]启用二进制日志
    server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配

    slave/my.cnf 内容:
    [mysqld]
    log-bin = mysql-bin
    server-id = 2
    log-slave-updates = 1
    read-only = 1

    4、在 master 和slave文件夹下 创建data 目录用来保存数据文件的目录

    创建镜像

    切换到 master 目录下构建 mysql-master 镜像

    docker build -t master/mysql .

    (命令最后有个.,不要忘记,代表当前目录)

     

    然后切换到 slave 目录下构建 mysql-slave 镜像

    docker build -t slave/mysql .

    (命令最后有个.,不要忘记,代表当前目录)

    -t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径

    看是否创建成功:docker images

     三、创建及运行容器

    安装完成后,我们可以使用以下命令来运行 mysql 容器:

    1、创建mysql-master容器并运行:

    docker run -p 5116:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/master/data:/var/lib/mysql-files -d master/mysql

    2、创建mysql-slave容器并运行

    docker run -p 5117:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/slave/data:/var/lib/mysql-files -d slave/mysql

    3、查看运行的容器:docker ps

    4、打开两个终端,分别进入mysql

    (1)master 终端执行

    docker exec -it mysql-master bash
    mysql -uroot -p


    输入密码 mysql 进入到 mysql 环境

    (2)slave 终端执行

    docker exec -it mysql-slave bash
    mysql -uroot -p

    四、进行权限设置 

    1、master下,创建用户

    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

    2、给用户赋予连接权限(REPLICATION CLIENT)和复制权限(REPLICATION SLAVE)

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slave'@'%';

     3、执行show master status;

     

     

     

     

     File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

    4、进入从库mysql下,执行

    change master to master_host='XXX.XXX.XXX.XXX', master_user='slave', master_password='123456', master_port=5116, master_log_file='mysql-bin.000003', master_log_pos= 712;

    5、查看主从同步状态

    正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。

    6、开启主从复制过程,

    start slave;

    然后再次查询主从同步状态show slave status G;

     

    五、测试主从连接

    1、登录master终端

    create database test;
    show databases;
    use test;
    create table stu(id int(3), name char(10));

    2、登录slave终端

    show databases;
    use test;
    select * from stu;

    六、排查错误,重建主从关系

    实际上,进入mysql时,通过 show slave status G;  查看Error状态已经报错:

    Last_IO_Error: error connecting to master 'slave@119.3.25.253:5116' - retry-time: 60 retries: 6 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

    原因:

    MySQL8.0默认指定使用需要SSL的身份验证插件caching_sha2_password,而我们在创建同步复制账号时候没有指定REQUIRE SSL。为了降低这件事情的复杂性,我们选择了社区的解决方法,选择绕过SSL插件的验证,改为mysql_native_password验证来做同步复制。

    查看加密方式:

    use mysql;

    select user,host,plugin,authentication_string from user G;

    解决办法:

    1、取消主从关系

    从库mysql下执行:

    停止主从同步: stop  slave;  

    去除关联ip:    change master to master_host=' ';

    查看状态信息:show slave statusG;

    2、重建slave用户

    drop user  slave;

    CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slave'@'%';

    FLUSH PRIVILEGES;

    3、重建主从关系

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

    创建主从关系: change master to master_host='XXX.XXX.XXX.XXX', master_user='slave', master_password='123456', master_port=5116, master_log_file='mysql-bin.000004', master_log_pos= 1390;

    查询主从同步状态  show slave status G;

    开启主从复制过程 start slave

  • 相关阅读:
    CGLib实现不同类中同名不同类型属性复制
    stream 伪复用实现
    年终盘点 | 2020年,国内私有云正式进入3.0时代
    高危端口135,137,138,139,445,1025,2475,3127,6129,3389,593
    在jsp引入js失败,提示404
    安全漏洞扫描
    Go 实现的文件行数统计工具
    .NET Core 获取域名 DNS 解析记录
    .NET Core 操作 Windows 注册表
    .NET MongoDb BsonDocument 序列化
  • 原文地址:https://www.cnblogs.com/chen117/p/12990310.html
Copyright © 2020-2023  润新知