美文网首页
docker mysql 主从复制

docker mysql 主从复制

作者: 海盗船长_coco | 来源:发表于2020-06-03 09:21 被阅读0次

    基本原理

    image.png

    MySQL 复制过程分成三步:
    1、master 将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
    2、slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);
    3、slave 重做中继日志中的事件,将改变应用到自己的数据库中。
    MySQL 复制是异步的且串行化的。

    复制的基本原则

    (1)每个 slave 只有一个 master。
    (2)每个 slave 只能有一个唯一的服务器 ID。
    (3)每个 master 可以有多个 salve。

    一主一从常见配置

    默认已经安装了docker,如果没有安装dockers可参考docker安装

    1、拉取镜像,以mysql 5.7版本为例。

    docker pull mysql:5.7
    

    2、创建主机。

    -p 进行端口映射 --name 起名字 -v 进行目录挂载 -d 后台运行 --privileged用于外部文件挂载的安全限制 -e的作用是指定容器内的环境变量,这里是设置mysql的密码

    docker run -p 3339:3306 --name mysql-master \
    -v /mydata/mysql-master/log:/var/log/mysql \
    -v/mydata/mysql-master/data:/var/lib/mysql \
    -v /mydata/mysql-master/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --privileged=true \
    -d mysql:5.7
    

    3、创建从机

    docker run -p 3340:3306 --name mysql-slave \
    -v /mydata/mysql-slave/log:/var/log/mysql \
    -v/mydata/mysql-slave/data:/var/lib/mysql \
    -v /mydata/mysql-slave/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --privileged=true \
    -d mysql:5.7
    

    在linux上分别创建了主机和从机的挂载目录


    image.png

    4、docker ps检查容器是否已经启动

    image.png

    5、配置文件修改

    由于docker创建的myql下没有my.cnf文件,所以需要先创建my.cnf文件

    cd /mydata/mysql-master/conf
    touch my.cnf
    vim my.cnf
    

    对主机的my.cnf进行修改

    1. 主服务器唯一ID
    2. 启用二进制日志
      其他部分是对数据库的字符集设置。
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    init_connect='SET collation connection=utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    #同一局域网内注意要唯一
    server-id=1
    #开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    

    同样需要对从机的my.cnf配置文件进行修改

    cd /mydata/mysql-slave/conf
    touch my.cnf
    vim my.cnf
    

    从机的my.cnf,【必须】从服务器唯一ID

    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    init_connect='SET collation connection=utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    #设置server_id,注意要唯一
    server-id=2  
    #开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    #relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    

    6、分别重启主机和从机

    docker restart mysql-master
    docker restart mysql-slave
    

    并docker ps检查容器是否启动,如果没有启动,绝大多数原因是配置文件中存在错误。

    7、在主机上创建用户并授权slave

    登录主机容器的mysql

    docker exec -it mysql-master mysql -u root -p
    Enter password: 
    

    创建用户名为slave,密码为123456的用户。并授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

    mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    

    8、查看master状态,记录下file和position的值(关键)

    mysql> show master status;
    
    image.png

    执行完此步骤后不要再操作主服务器 MYSQL,防止主服务器状态值变化。

    9、新建会话查看主机mysql容器的ip地址

    docker inspect mysql-master
    
    image.png

    10、在新建的会话中登录从机,保证复制的file和position值相同

    docker exec -it mysql-slave mysql -u root -p
    Enter password: 
    

    根据自身情况,修改IP地址,master_log_file和master_log_pos。保证其与第8步中的值相同。

    mysql> change master to master_host='172.18.0.4', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 769;
    

    从机开启复制功能

    mysql> start slave;
    

    查看status

    mysql> show slave status\G
    

    若能看到这两个值都为Yes则表明主从复制功能已实现。


    image.png

    11、测试一下

    返回到主机的会话中,创建数据库,表并插入数据。

    mysql> create database testdb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use testdb;
    Database changed
    mysql> create table dog(id int not null,name varchar(20));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into dog(id,name) values(1,'coco');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from dog;
    +----+------+
    | id | name |
    +----+------+
    |  1 | coco |
    +----+------+
    1 row in set (0.00 sec)
    

    在从机中进行查询

    mysql> use testdb;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from dog;
    +----+------+
    | id | name |
    +----+------+
    |  1 | coco |
    +----+------+
    1 row in set (0.00 sec)
    

    看来一切都按预期的运行,那么mysql的主从复制就配置好了
    如果从机想要停止主从复制功能,这样主机新增,修改的数据,从机也不会进行复制了。

    mysql> stop slave;
    

    参考博客

    https://www.cnblogs.com/songwenjie/p/9371422.html

    相关文章

      网友评论

          本文标题:docker mysql 主从复制

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