准备工作:

工具:docker+docker-compose
mysql: 8.0
准备了3个节点:master(172.20.0.2)、slave1(172.20.0.3)、slave2(172.20.0.4)

下面是docker-compose.yml文件,配置的静态IP

  1. version: '3'
  2. services:
  3. master:
  4. image: mysql:8
  5. ports:
  6. - "3306:3306"
  7. environment:
  8. MYSQL_ROOT_PASSWORD: root
  9. networks:
  10. mysql_network:
  11. ipv4_address: 172.20.0.2
  12. slave1:
  13. image: mysql:8
  14. ports:
  15. - "3307:3306"
  16. environment:
  17. MYSQL_ROOT_PASSWORD: root
  18. networks:
  19. mysql_network:
  20. ipv4_address: 172.20.0.3
  21. slave2:
  22. image: mysql:8
  23. ports:
  24. - "3308:3306"
  25. environment:
  26. MYSQL_ROOT_PASSWORD: root
  27. networks:
  28. mysql_network:
  29. ipv4_address: 172.20.0.4
  30. networks:
  31. mysql_network:
  32. ipam:
  33. config:
  34. - subnet: 172.20.0.0/16
  35. getway: 172.20.0.1

直接使用dockper-compose up -d,3个容器就启动好了。接下来就是配置环境,这里我们给每个容器手动分配的IP,方便后面的操作。

配置主从复制的方法

有很多种配置主从同步的方法,可以总结为如下的步骤:
1.在主服务器上,必须开启二进制日志机制和配置一个独立的ID
2.在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
3.在开始复制进程前,在主服务器上记录二进制文件的位置信息
4.如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
5.配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

Master配置

进入master容器,配置mysql

  1. docker-compose exec master bash

分别执行下面两个命令安装下VIM,容器中没有安装。

  1. # apt-get update
  2. # apt-get install vim -y

安装完成后执行 vim /etc/mysql/my.cnf 命令,编辑文件

  1. [mysqld]
  2. log-bin=mysql-bin
  3. server-id=1

配置完成后,重取mysql服务,我这里采用的是重启容器 docker-compose restart master ,重启完成后,在master创建一个用于同步的账号。

创建用户的语法

  1. CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • username:你将创建的用户名
  • host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
  • password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
  1. mysql> create user 'slave'@'172.20.0.%' identified with mysql_native_password by '123456';
  2. Query OK, 0 rows affected (0.03 sec)

创建一个账号为 slave 密码为 123456 并且只运行 172.20.0 开通网段的主机能够访问。

授权slave账号拥有 replication slave 的权限。

授权语法:

  1. GRANT privileges ON databasename.tablename TO 'username'@'host'

privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*

  1. mysql> grant replication slave on *.* to 'slave'@'172.20.0.%';
  2. Query OK, 0 rows affected (0.03 sec)

最后刷新一下权限

  1. mysql> flush privileges;
  2. Query OK, 0 rows affected (0.01 sec)

然后执行下面的语句获取二进制日志的信息

  1. mysql> show master status;
  2. +------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | mysql-bin.000001 | 853 | | | |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)

Slave1配置

进入容器

  1. docker-compose exec slave1 bash

同样如Master一样安装vim,并编辑my.cnf文件,server-id必须唯一

  1. [mysqld]
  2. log-bin=mysql-bin
  3. server-id=2

然后重启服务。

登陆mysql,配置同步参数

  1. CHANGE MASTER TO
  2. MASTER_HOST='172.20.0.2',
  3. MASTER_USER='slave',
  4. MASTER_PASSWORD='123456',
  5. MASTER_LOG_FILE='mysql-bin.000001',
  6. MASTER_LOG_POS=853;
  • MASTER_HOST:主节点地址
  • MASTER_USER:同步账号
  • MASTER_PASSWORD:同步密码
  • MASTER_LOG_FILE:起始binlog文件
  • MASTER_LOG_POS:起始位置

MASTER_LOG_FILE和MASTER_LOG_POS这个是前面主节点通过 show master status 查询出来的。

可配置的参数记不住了,可以通过 show slave stuats 进行查看。

配置好后,就需要启动slave同步

  1. mysql> start slave;

执行命令后,查看是否启动成功,可以通过 show slave status 命令查看如果 Slave_IO_RunningSlave_SQL_Running 都为 Yes 表示设置成功。
image.png

Slave2配置

Slave2配置和Slave1基本相同,只有my.cnf文件中server-id不能相同。

  1. [mysqld]
  2. log-bin=mysql-bin
  3. server-id=3

他操作都一样。后面操作省略。

验证

在master执行下面的语句

  1. create database test_db;
  2. use test_db;
  3. create table book
  4. (
  5. id int auto_increment,
  6. name varchar(20),
  7. primary key ( `id` )
  8. );
  9. insert into book (name) values
  10. ('MySQL5.7从入门到精通'),
  11. ('MySQL8.0从入门到精通');

执行完后slave1和slave2上都创建了test_db数据库和book表
image.png

点击任意一个节点都可以看到里面的数据
image.png

到此主从复制配置就结束了