准备工作:
工具: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
version: '3'services:master:image: mysql:8ports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.2slave1:image: mysql:8ports:- "3307:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.3slave2:image: mysql:8ports:- "3308:3306"environment:MYSQL_ROOT_PASSWORD: rootnetworks:mysql_network:ipv4_address: 172.20.0.4networks:mysql_network:ipam:config:- subnet: 172.20.0.0/16getway: 172.20.0.1
直接使用dockper-compose up -d,3个容器就启动好了。接下来就是配置环境,这里我们给每个容器手动分配的IP,方便后面的操作。
配置主从复制的方法
有很多种配置主从同步的方法,可以总结为如下的步骤:
1.在主服务器上,必须开启二进制日志机制和配置一个独立的ID
2.在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
3.在开始复制进程前,在主服务器上记录二进制文件的位置信息
4.如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
5.配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
Master配置
进入master容器,配置mysql
docker-compose exec master bash
分别执行下面两个命令安装下VIM,容器中没有安装。
# apt-get update# apt-get install vim -y
安装完成后执行 vim /etc/mysql/my.cnf 命令,编辑文件
[mysqld]log-bin=mysql-binserver-id=1
配置完成后,重取mysql服务,我这里采用的是重启容器 docker-compose restart master ,重启完成后,在master创建一个用于同步的账号。
创建用户的语法
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
- username:你将创建的用户名
- host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
- password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
mysql> create user 'slave'@'172.20.0.%' identified with mysql_native_password by '123456';Query OK, 0 rows affected (0.03 sec)
创建一个账号为 slave 密码为 123456 并且只运行 172.20.0 开通网段的主机能够访问。
授权slave账号拥有 replication slave 的权限。
授权语法:
GRANT privileges ON databasename.tablename TO 'username'@'host'
privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*
mysql> grant replication slave on *.* to 'slave'@'172.20.0.%';Query OK, 0 rows affected (0.03 sec)
最后刷新一下权限
mysql> flush privileges;Query OK, 0 rows affected (0.01 sec)
然后执行下面的语句获取二进制日志的信息
mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 853 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
Slave1配置
进入容器
docker-compose exec slave1 bash
同样如Master一样安装vim,并编辑my.cnf文件,server-id必须唯一
[mysqld]log-bin=mysql-binserver-id=2
然后重启服务。
登陆mysql,配置同步参数
CHANGE MASTER TOMASTER_HOST='172.20.0.2',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',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同步
mysql> start slave;
执行命令后,查看是否启动成功,可以通过 show slave status 命令查看如果 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes 表示设置成功。
Slave2配置
Slave2配置和Slave1基本相同,只有my.cnf文件中server-id不能相同。
[mysqld]log-bin=mysql-binserver-id=3
他操作都一样。后面操作省略。
验证
在master执行下面的语句
create database test_db;use test_db;create table book(id int auto_increment,name varchar(20),primary key ( `id` ));insert into book (name) values('MySQL5.7从入门到精通'),('MySQL8.0从入门到精通');
执行完后slave1和slave2上都创建了test_db数据库和book表
点击任意一个节点都可以看到里面的数据
到此主从复制配置就结束了
