目录

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)

我们可以看到数据也同步过来了。

这样主从同步就部署成功了。