使用Docker搭建Mysql主从备份

搭建一主二从的mysql拓扑。其中先搭建新的master和一台slave;然后在master新增数据,再模拟从已有数据的master中搭建新的一台slave。

创建Master

  1. 拉取镜像
    $ docker pull mysql
    
  2. 创建myql数据目录和配置文件
    $ cd /your/path
    
    $ mkdir -p mysql-master/data  #用于挂载mysql数据目录
    $ touch mysql-master/my.cnf  # 用户挂载mysql配置文件
    
    $ mkdir -p mysql-slave/data  
    $ touch mysql-slave/my.cnf  
    
    $ mkdir -p mysql-slave1/data  
    $ touch mysql-slave1/my.cnf 
    
  3. 修改配置文件my.cnf
    $ vi /your/path/mysql-master/my.cnf 
    
    [mysqld]
    server-id=1  #主从集群中唯一
    log-bin=mysql-bin
    user=mysql
    relay-log=slave-relay-bin
    log-error=/var/lib/mysql/error.log
    
  4. 启动容器
    $ docker run --name mysql-master -p 3307:3306 -p 33070:33060 \
        -v /Users/yangweixin/Workspace/data/docker/mysql-master/data:/var/lib/mysql \
    	-v /Users/yangweixin/Workspace/data/docker/mysql-master/my.cnf:/etc/mysql/my.cnf \
    	-e MYSQL_ROOT_PASSWORD=1234567890  \
    	-d mysql
    
  5. 检查容器
    $ docker ps -a
    
  6. 创建从机账号
    进入容器
    $ docker exec -it mysql-master bash
    
    +----------------+---------+------------------------+----------------+--------------+---------------------------+-------------+
    |  CONTAINER ID  |   IMAGE |    COMMAND             |    CREATED     |    STATUS    |           PORTS           |   		NAMES     |
    +-----------------------------------------------------------------------------------------------------------------------------+
    | 04e4c05ff3f9   |   mysql | "docker-entrypoint.s…" |  1 minutes ago | Up 1 minutes |  0.0.0.0:3307-	>3306/tcp,  |mysql-master++
    |                |         |                        |                |              |  0.0.0.0:33070+>33060/tcp |             |
    +----------------+---------+------------------------+----------------+--------------+---------------------------+-------------+
    
    进入数据库
    root@04e4c05ff3f9:/# mysql -u root -p
    
    创建从用户并赋予权限
    mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '1234567890';
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    mysql> flush privileges;
    
    至此,master创建完毕。
  7. 查看master属性,以备后用
    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 | 73       |              |                  |
    +------------------+----------+--------------+------------------+
    
  8. 查看容器ip,在物理机上执行
    $ docker inspect mysql-master --format='{{.NetworkSettings.IPAddress}}'
    172.17.0.2
    

从新Master创建Slave

  1. 修改配置文件
    $ vi /your/path/mysql-slave/my.cnf 
    server-id=10  # 集群所有mysql服务中唯一
    log-bin=mysql-bin
    user=mysql
    relay-log=slave-relay-bin
    log-error=/var/lib/mysql/error.log
    
  2. 启动容器
    $ docker run --name mysql-slave -p 3308:3306 -p 33080:33060 \
        -v /Users/yangweixin/Workspace/data/docker/mysql-slave/data:/var/lib/mysql \
    	-v /Users/yangweixin/Workspace/data/docker/mysql-slave/my.cnf:/etc/mysql/my.cnf \
    	-e MYSQL_ROOT_PASSWORD=1234567890  \
    	-d mysql
    
  3. 检查容器
    master
  4. 配置slave,连接master
    进入容器
    $ docker exec -it mysql-slave bash
    
    进入mysql
    root@8c6cba7418c9:/# mysql -u root -p
    mysql> 
    
    配置master连接
    mysql> CHANGE MASTER TO
    ->     MASTER_HOST='172.17.0.2',   
    ->     MASTER_USER='slave',	
    ->     MASTER_PASSWORD='1234567890',	
    ->     MASTER_LOG_FILE='mysql-bin.000001',	
    ->     MASTER_LOG_POS=73;	
    
  5. 启动slave
    mysql> start slave;
    
  6. 观察slave是否启动成功
    mysql> show slave status;
    +--------------------+---------------------+------------------+-------------------+
    |   Slave_IO_Runing  |  Slave_Sql_Runing   |  Last_IO_Error   |  Last_Sql_Error   |
    +---------------------------------------------------------------------------------+
    |        Yes         |        Yes          |        0         |                   |
    +--------------------+---------------------+------------------+-------------------+
    
    当前两者为Yes时,slave启动成功;否则后两个字段会有具体错误信息。
    slave启动成功后,在master新建库、表、行,然后在slave上确认是否同步创建。

从已有数据的Master上创建Slave1

  1. 备份master已有数据
    进入master容器

    $ docker exec -it mysql-master bash
    

    备份数据

    root@04e4c05ff3f9:/# mysqldump --all-databases --master-data=2 -u root -p > /tmp/dbdump.db
    

    –master-data:默认等于1,将dump起始(change master to)binlog点和pos值写到结果中,等于2是将change master to写到结果中并注释。

  2. master备份文件拷贝到物理机

    $docker cp mysql-master:/tmp/dbdump.db /tmp/
    
  3. 查看备份的坐标

    $ head -30 /tmp/dbdump.db
    
    ...
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=39586;
    ...
    

    记住MASTER_LOG_FILEMASTER_LOG_POS这两个值。

  4. 修改slave1配置

    $ vi /your/path/mysql-slave1/my.cnf 
    server-id=11  # 集群所有mysql服务中唯一
    log-bin=mysql-bin
    user=mysql
    relay-log=slave-relay-bin
    log-error=/var/lib/mysql/error.log
    
  5. 启动容器

    $ docker run --name mysql-slave1 -p 3309:3306 -p 33090:33060 \
        -v /Users/yangweixin/Workspace/data/docker/mysql-slave1/data:/var/lib/mysql \
    	-v /Users/yangweixin/Workspace/data/docker/mysql-slave1/my.cnf:/etc/mysql/my.cnf \
    	-e MYSQL_ROOT_PASSWORD=1234567890  \
    	-d mysql
    
  6. 检查容器是否启动

  7. 拷贝master备份到slave1

    $ docker cp /tmp/dbdump.db mysql-slave1:/tmp/
    
  8. 进入slave1,导入备份数据

    $ docker exec -it mysql-slave1 bash
    root@66a8fd04cd47:/# mysql -u root -p  < /tmp/dbdump.db
    
  9. 确认备份数据已导入
    登录 slave1数据库,确认再上一步中插入的数据是否存在。

  10. 配置连接master
    进入mysql

    root@66a8fd04cd47:/# mysql -u root -p
    mysql> 
    

    配置连接

    mysql> CHANGE MASTER TO
    ->     MASTER_HOST='172.17.0.2',   
    ->     MASTER_USER='slave',	
    ->     MASTER_PASSWORD='1234567890',	
    ->     MASTER_LOG_FILE='mysql-bin.000001',	
    ->     MASTER_LOG_POS=39586;	
    

    MASTER_LOG_FILEMASTER_LOG_POS这两个值就是在备份中读取的值。

  11. 启动slave模式

    mysql> start slave;
    
  12. 观察slave是否启动成功

    mysql> show slave status;
    

至此,slave1也配置完成

最终验证

master中插入数据,验证slaveslave1是否同步插入了数据。

完结

发布了19 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/doStruggle/article/details/94738922
今日推荐