目录
1.配置docker加速器
2.修改服务器的dns
3.拉取docker官方的mysql镜像
4.MySQL主从配置
4.1创建mysql目录结构
4.2编写配置文件
4.2.1主库配置文件
4.2.2从库配置文件
4.2.2.1 MySQL3307的配置文件
4.2.2.2 MySQL3308的配置文件
4.3 MySQL初始化sql文件
4.4修改目录权限
5.运行mysql容器
6.配置主从同步
6.1master配置
6.2slave配置
7.检查主从是否成功
1.配置docker加速器
由于访问速度过慢,首先配置docker的加速器
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://hub-mirror.c.163.com/","https://docker.mirrors.ustc.edu.cn/","https://reg-mirror.qiniu.com"]
}
[root@localhost ~]# systemctl restart docker
这个文件本身并不存在,需要自己创建,这里配置了网易、科大、七牛云的加速器,可以自行查找各大加速器配置即可。
2.修改服务器的dns
通过修改服务器的dns实现加快主机解析
[root@localhost ~]# vim /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
search localdomain
nameserver 8.8.8.8
3.拉取docker官方的mysql镜像
[root@localhost ~]# docker pull mysql:5.7.44
5.7.44: Pulling from library/mysql
9ad776bc3934: Pull complete
a280ac4a8665: Pull complete
4047a3b08336: Pull complete
435611dd4999: Pull complete
f84f2572cb0b: Pull complete
ef893e58839b: Pull complete
42897f531783: Pull complete
8a8aad27e96b: Pull complete
6b2751f26202: Pull complete
b0e9b86ed64c: Pull complete
bfef93045c96: Pull complete
Digest: sha256:880063e8acda81825f0b946eff47c45235840480da03e71a22113ebafe166a3d
Status: Downloaded newer image for mysql:5.7.44
docker.io/library/mysql:5.7.44
4.MySQL主从配置
在本机写好一主两从的mysql配置文件
4.1创建mysql目录结构
my.cnf为数据库的配置文件
data 为存放数据库数据文件夹,没启动mysql之前为空
log 为mysql日志文件,没启动mysql之前为空
sql 为mysql的初始化sql文件,编写了一些sql语句
[root@localhost ~]# mkdir -p /usr/local/docker/{mysql_master_3306,mysql_slave_3307,mysql_slave_3308}/{conf,data,log,sql}
[root@localhost ~]# cd /usr/local/docker/
[root@localhost docker]# tree
.
├── mysql_master_3306
│ ├── conf
│ ├── data
│ ├── log
│ └── sql
├── mysql_slave_3307
│ ├── conf
│ ├── data
│ ├── log
│ └── sql
└── mysql_slave_3308
├── conf
├── data
├── log
└── sql
15 directories, 0 files
没有tree命令没关系,这里只是方便看目录结构,非必要
4.2编写配置文件
4.2.1主库配置文件
[root@localhost docker]# vim mysql_master_3306/conf/my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=1 # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql # 不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
sync_binlog = 1 # 确保 binlog 日志写入后与硬盘同步
binlog_checksum = none # 跳过现有的采用 checksum 的事件,mysql5.6.5 以后的版本中 binlog_checksum=crc32,而低版本都是 binlog_checksum=none
binlog_format = mixed # bin-log 日志文件格式,设置为 MIXED 可以防止主键重复。
[mysql]
default-character-set=utf8mb4
4.2.2从库配置文件
server-id是唯一的,不能重复,所以配置文件的server-id必须修改
4.2.2.1 MySQL3307的配置文件
[root@localhost docker]# vim mysql_slave_3307/conf/my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=2 # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql # 不同步 mysql 系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
slave-skip-errors = all # 跳过所有的错误错误,继续执行复制操作
[mysql]
default-character-set=utf8mb4
4.2.2.2 MySQL3308的配置文件
[root@localhost docker]# vim mysql-slave-3308/conf/my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=3 # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql # 不同步 mysql 系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
slave-skip-errors = all # 跳过所有的错误错误,继续执行复制操作
[mysql]
default-character-set=utf8mb4
4.3 MySQL初始化sql文件
[root@localhost docker]# vim mysql_master_3306/sql/init.sql
-- 创建数据库
DROP database IF EXISTS `masterSlaveDB`;
CREATE DATABASE `masterSlaveDB` default character set utf8mb4 collate utf8mb4_unicode_ci;
-- 切换数据库
USE masterSlaveDB;
-- 创建表
DROP TABLE IF EXISTS `masterSlaveTable` ;
CREATE TABLE `masterSlaveTable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`type` varchar(2) DEFAULT NULL COMMENT '生活用品类别:1. 家电类 2. 厨具',
`name` varchar(50) DEFAULT NULL COMMENT '生活用品名称',
`description` varchar(200) DEFAULT NULL COMMENT '生活用品描述',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='MySQL 主从同步测试表';
INSERT INTO masterSlaveTable ( type , name , description )
VALUES ('1','电饭煲','用来蒸饭'),('1','电热壶','用来烧水'),('1','空调','用来制冷或制热'),('2','菜刀','用来切菜'),('2','刨子','用来剥皮'),('2','打蛋器','用来搅拌鸡蛋');
[root@localhost docker]# cp mysql_master_3306/sql/init.sql mysql_slave_3307/sql/
[root@localhost docker]# cp mysql_master_3306/sql/init.sql mysql_slave_3308/sql/
4.4修改目录权限
设置每一个log目录的读写执行权限
[root@localhost docker]# cd /usr/local/docker/mysql_master_3306/
[root@localhost mysql_master_3306]# chmod -R 777 log/
[root@localhost mysql_master_3306]# cd ../mysql_slave_3307/
[root@localhost mysql_slave_3307]# chmod -R 777 log/
[root@localhost mysql_slave_3307]# cd ../mysql_slave_3308/
[root@localhost mysql_slave_3308]# chmod -R 777 log/
5.运行mysql容器
查看已经下载下来的mysql镜像,我使用的5.7.44版本的mysql
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.44 547b3c3c15a9 9 days ago 501MB
运行主mysql容器
[root@localhost mysql_slave_3308]# docker run -p 3306:3306 --name mysql-master-3306 -v /usr/local/docker/mysql_master_3306/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_master_3306/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_master_3306/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_master_3306/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.44
cf253a4712575c2d8b33535a4817b270f77696132f42d0e93dea6c5571b56918
运行两从mysql容器
[root@localhost ~]# docker run -p 3307:3306 --name mysql-slave-3307 -v /usr/local/docker/mysql_slave_3307/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3307/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3307/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3307/log/:/var/log/mysql/ --link mysql-master-3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.44
3b7b62ffb3e69fb21fbb2663ca0d5cc54d66e3ba16fc5ee944a3713dcce5aaf0
[root@localhost ~]# docker run -p 3308:3306 --name mysql-slave-3308 -v /usr/local/docker/mysql_slave_3308/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3308/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3308/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3308/log/:/var/log/mysql/ --link mysql-master-3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.44
4f0b293f3f62ce99b4484bdd812af4dc79333e3e33dd407b00e3ff7e59bd174f
查看容器的运行情况
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f0b293f3f62 mysql:5.7.44 "docker-entrypoint.s…" 36 seconds ago Up 35 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave-3308
3b7b62ffb3e6 mysql:5.7.44 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-slave-3307
cf253a471257 mysql:5.7.44 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-master-3306
6.配置主从同步
6.1master配置
进入master容器
[root@localhost docker]# docker exec -it mysql-master-3306 bash
bash-4.2# mysql -uroot -p123456
设置一个用于远程采集数据的用户
mysql> CREATE USER 'mysql'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'%';
Query OK, 0 rows affected (0.00 sec)
查看master的状态
mysql> show master status;
+---------------+----------+---------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+---------------+------------------+-------------------+
| binlog.000001 | 150 | masterSlaveDB | mysql | |
+---------------+----------+---------------+------------------+-------------------+
1 row in set (0.00 sec)
File和Position的值记录下来,等下需要用到。
6.2slave配置
两个从的操作相同这里就只做一次演示
进入slave容器,设置从库连接主库。
[root@localhost ~]# docker exec -it mysql-slave-3307 bash
bash-4.2# mysql -uroot -p123456
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='mysql-master-3306',master_user='mysql',master_password='123456',master_log_file='binlog.000001',master_log_pos=150;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
- master_host:主库服务器 ip 地址
- master_user:主库 MySQL 授权的用户名
- master_password:主库 MySQL授权用户mysql的 密码
- master_log_file:为上面查询的主库 File 值 -> binlog.000001
- master_log_pos:为上面查询的主库 Position 值 -> 150
7.检查主从是否成功
mysql> show slave status \G
以下两个状态为yes则证明实现了主从
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
接下来回到master主库查看数据库中的内容
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| masterSlaveDB |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use masterSlaveDB;
Database changed
mysql> show tables;
+-------------------------+
| Tables_in_masterSlaveDB |
+-------------------------+
| masterSlaveTable |
+-------------------------+
1 row in set (0.00 sec)
mysql> select * from masterSlaveTable;
+----+------+-----------+-----------------------+
| id | type | name | description |
+----+------+-----------+-----------------------+
| 1 | 1 | 电饭煲 | 用来蒸饭 |
| 2 | 1 | 电热壶 | 用来烧水 |
| 3 | 1 | 空调 | 用来制冷或制热 |
| 4 | 2 | 菜刀 | 用来切菜 |
| 5 | 2 | 刨子 | 用来剥皮 |
| 6 | 2 | 打蛋器 | 用来搅拌鸡蛋 |
+----+------+-----------+-----------------------+
6 rows in set (0.00 sec)
再回到从库查看一下数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| masterSlaveDB |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use masterSlaveDB;
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> show tables;
+-------------------------+
| Tables_in_masterSlaveDB |
+-------------------------+
| masterSlaveTable |
+-------------------------+
1 row in set (0.00 sec)
mysql> select * from masterSlaveTable;
+----+------+-----------+-----------------------+
| id | type | name | description |
+----+------+-----------+-----------------------+
| 1 | 1 | 电饭煲 | 用来蒸饭 |
| 2 | 1 | 电热壶 | 用来烧水 |
| 3 | 1 | 空调 | 用来制冷或制热 |
| 4 | 2 | 菜刀 | 用来切菜 |
| 5 | 2 | 刨子 | 用来剥皮 |
| 6 | 2 | 打蛋器 | 用来搅拌鸡蛋 |
+----+------+-----------+-----------------------+
6 rows in set (0.00 sec)
这里可以看到主从数据一致
我们去主库删除一条数据
mysql> delete from masterSlaveTable where id=6;
Query OK, 1 row affected (0.01 sec)
mysql> select * from masterSlaveTable;
+----+------+-----------+-----------------------+
| id | type | name | description |
+----+------+-----------+-----------------------+
| 1 | 1 | 电饭煲 | 用来蒸饭 |
| 2 | 1 | 电热壶 | 用来烧水 |
| 3 | 1 | 空调 | 用来制冷或制热 |
| 4 | 2 | 菜刀 | 用来切菜 |
| 5 | 2 | 刨子 | 用来剥皮 |
+----+------+-----------+-----------------------+
5 rows in set (0.01 sec)
回到从库再看看数据是否同步过来了
mysql> select * from masterSlaveTable;
+----+------+-----------+-----------------------+
| id | type | name | description |
+----+------+-----------+-----------------------+
| 1 | 1 | 电饭煲 | 用来蒸饭 |
| 2 | 1 | 电热壶 | 用来烧水 |
| 3 | 1 | 空调 | 用来制冷或制热 |
| 4 | 2 | 菜刀 | 用来切菜 |
| 5 | 2 | 刨子 | 用来剥皮 |
+----+------+-----------+-----------------------+
5 rows in set (0.00 sec)
我们可以看到数据也同步过来了。
这样主从同步就部署成功了。