docker 下的 mysql主从

本篇打算创建一个 1主2从的 mysql主从,3个docker容器

  • 首先创建文件夹
    master, slave1, slave2

  • 然后在各个文件夹里创建mysql 的配置文件
    mysql 的配置文件在 /etc/mysql/my.conf
    所以我们在 各个文件夹内创建配置文件

D:.                
├─master           
│  └─conf          
│          my.cnf  
├─slave1           
│  └─conf          
│          my.cnf  
└─slave2           
    └─conf         
            my.cnf 
  • 由于我们使用docker默认的mysql镜像,是最新版的9.0,密码插件使用的是caching_sha2_password,这个可能会给我我们带来困扰,所以我们在配置文件里面加入
    default_authentication_plugin=mysql_native_password

  • 相对应我们的docker 语句就变成了
    docker run --name some-mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql

  • 连接完配置文件后,就要挂载对应的datadir, 相对应 我们的docker语句就变成了
    docker run --name master-mysql -v D:\my-project\docker-mysql\master\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql

进入 master-mysql 实例
docker exec -it master-mysql bash
进入后 连接进入mysql 创建库先放入一些数据,

 ~:mysql -uroto -proot
 mysql> create database newplan DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
    -> ;
Query OK, 1 row affected, 2 warnings (0.03 sec)utf8_general_ci;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| newplan            |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

  • 假设我们现在已经有了数据,开始配置主从
  • 首先我们是在一个docker 宿主的情况下配置主从,所以我们要先设置一个网络环境
    docker network create mysql_net 让我们的mysql 实例都在这一个网络环境下运行
    所以我们的 docker 命令就要进行适当修改
    docker run --name master-mysql -v D:\my-project\docker-mysql\master\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\master\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --network mysql_net --network-alias network_master_mysql -d mysql

  • 网络设置完毕后 开始着手配置主从首先修改我们主机的my.cnf 加入几条配置
log-bin=mysql-bin
server-id=1
binlog-do-db=newplan
  • 重启主机容器
    docker restart master-mysql
  • 进入主机mysql
    docker exec -it master-mysql bahs
    mysql -uroot -proot
  • 设置一个用户便于从库登录
CREATE USER 'leven'@'localhost' IDENTIFIED BY 'Leven';#创建用户
GRANT REPLICATION SLAVE ON *.* TO 'leven'@'localhost';#授权
flush privileges; 
  • 查看当前主机master状态(记住 File 和 Position)
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |    10622 | newplan      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)                                                              

到此主库的配置基本完毕


  • 修改从库my.cnf 加入server-id=2
  • 创建从机容器
    docker run --name slave1-mysql -v D:\my-project\docker-mysql\slave1\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\slave1\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --network mysql_net --network-alias network_slave1_mysql -d mysql 注意修改对应别名以及端口
  • 登录从机mysql
docker exec -it slave1-mysql bash
mysql -uroot -proot
  • 执行同步SQL设置语句
    CHANGE MASTER TO MASTER_HOST='network_master_mysql',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=10622; master_host 是我们network 的别名,master_log和master_log_pos是我们主机状态里面的
  • 启动同步进程
    start slave;
  • 查看同步状态
    show slave status \G
  • 如果碰到错误需要跳过
stop slave;
set global sql_slave_skip_counter=1;
start slave;

参考资料:
https://blog.csdn.net/m0_37890289/article/details/80087003
https://store.docker.com/images/mysql
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/

你可能感兴趣的:(docker 下的 mysql主从)