docker搭建mysql8:latest主从配置教程
docker搭建mysql8:latest主从配置教程
准备工作
踩了比较多的坑,现在统一一下教程吼
随便拉取一个mysql的最新版docker pull mysql
[root@VM-12-2-centos conf]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 412b8cc72e4a 2 weeks ago 531MB
创建一个主从的容器卷路径,自己创建吼,我这里已经创建好了
[root@VM-12-2-centos yama-docker-data]# pwd
/root/yama-docker-data
然后二话不说,先跑一个主mysql,一个从mysql
- mysql-master
docker run -d -p 3311:3306 --privileged=true -v /root/yama-docker-data/mysql-master/log:/var/log/mysql -v /root/yama-docker-data/mysql-master/data:/var/lib/mysql -v /root/yama-docker-data/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql
- mysql-slave
docker run -d -p 3312:3306 --privileged=true -v /root/yama-docker-data/mysql-slave/log:/var/log/mysql -v /root/yama-docker-data/mysql-slave/data:/var/lib/mysql -v /root/yama-docker-data/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql
然后顺手看看docker ps
[root@VM-12-2-centos yama-docker-data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79cf8759f059 mysql "docker-entrypoint.s…" About an hour ago Up 16 minutes 33060/tcp, 0.0.0.0:3312->3306/tcp, :::3312->3306/tcp mysql-slave
ac98f7873ef6 mysql "docker-entrypoint.s…" About an hour ago Up 13 minutes 33060/tcp, 0.0.0.0:3311->3306/tcp, :::3311->3306/tcp mysql-master
跑起来了吼,那就开始配置
- mysql-master
[root@VM-12-2-centos conf]# pwd
/root/yama-docker-data/mysql-master/conf
vim my.conf
,保存下面的内容
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
server-id=11
log-bin=mysql-bin
read-only=0
[client]
这个部分是 MySQL 客户端的默认选项设置。在这里,我们设置客户端默认使用 UTF-8 字符集。default_character_set=utf8
这个选项指定了 MySQL 客户端连接的默认字符集为 UTF-8。[mysqld]
这个部分是 MySQL 服务器的选项设置。在这里,我们设置服务器默认使用 UTF-8 字符集。collation_server=utf8_general_ci
这个选项指定了服务器默认的排序规则为utf8_general_ci
。这个排序规则可以确保处理 UTF-8 字符集时的正确性。character_set_server=utf8
这个选项指定了 MySQL 服务器默认使用的字符集为 UTF-8。server-id=11
这个选项指定了 MySQL 服务器的 ID,用于主从复制中的唯一标识。这个值必须在所有 MySQL 服务器中都是独一无二的。log-bin=mysql-bin
这个选项启用 MySQL 的二进制日志功能,并指定日志文件名为mysql-bin
。二进制日志记录数据库中所有更改,以便在主从复制中传输更改到从服务器。read-only=0
这个选项指定了 MySQL 服务器是否为只读模式。如果该值为 1,则服务器处于只读模式,禁止执行任何写操作。在这里,我们将它的值设置为 0,表示服务器不是只读模式。
- mysql-slave
[root@VM-12-2-centos conf]# pwd
/root/yama-docker-data/mysql-slave/conf
vim my.conf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
server-id=2
log-bin=mysql-bin
read-only=1
⚠️⚠️:主从的server-id的值不一样就行
现在开始重启两个容器
docker restart mysql-master mysql-slave
实践阶段
然后开两个窗口,分别进入容器内部(不会开的就默认的一个就行,问题不大)
- mysql-master
docker exec -it mysql-master bash
mysql -uroot -p
输入密码(按照上面的来的话,密码为123456)
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave@123';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave@123';
这个命令创建了一个名为slave
的 MySQL 用户,并且该用户可以从任何主机访问数据库(因为%
符号表示允许从任意 IP 地址登录)。mysql_native_password
是 MySQL 数据库默认的身份验证插件,它使用基于密码的身份验证。'slave@123'
表示该用户的登录密码为slave@123
。GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
这个命令将slave
用户授予了执行主从复制所需的权限。GRANT REPLICATION SLAVE ON *.*
表示赋予了slave
用户在所有数据库和表上进行主从复制操作的权限。TO 'slave'@'%'
意味着该权限赋予给了刚刚创建的slave
用户并且可以从任何主机访问数据库。
然后查看状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 668 | | | |
+------------------+----------+--------------+------------------+-------------------+
到这里的master差不多配置完毕
- mysql-slave
docker exec -it mysql-master bash
mysql -uroot -p
输入密码(按照上面的来的话,密码为123456)
然后
CHANGE MASTER TO MASTER_HOST = '10.0.12.2',
MASTER_PORT = 3311,
MASTER_USER = 'slave',
MASTER_PASSWORD = 'slave@123',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 668;
CHANGE MASTER TO
这个命令用于更改从服务器的主服务器连接设置。MASTER_HOST = '10.0.12.2'
这个选项指定了主服务器的 IP 地址,即 10.0.12.2。MASTER_PORT = 3311
这个选项指定了主服务器的端口号,即 3311。该端口号必须与主服务器上的 MySQL 日志文件保持一致。MASTER_USER = 'slave'
这个选项指定了用于主从复制的 MySQL 用户名,即slave
。MASTER_PASSWORD = 'slave@123'
这个选项指定了用于主从复制的 MySQL 用户密码,即slave@123
。MASTER_LOG_FILE = 'mysql-bin.000001'
这个选项指定了在主服务器上存储二进制日志文件的名称,即mysql-bin.000001
。这是主服务器上最后写入的二进制日志文件的名称。MASTER_LOG_POS = 668
这个选项指定了从哪个二进制日志文件位置开始执行 SQL 语句。668
表示位于mysql-bin.000001
文件中的第 668 个字节处。从这个位置开始的所有 SQL 命令都将被复制到从服务器中。
这里说一下这个MASTER_HOST,这个地址,在服务器中使用ifconfig查看,不是docker的ip地址(反正我的是不行的,试过辣),是eth0:的ip地址,在服务器的控制台也可以看到,就是内网ip地址
回到正题,接着来start slave;
然后查看slave状态show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: **********
Master_User: slave
Master_Port: 3311
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 981
Relay_Log_File: 79cf8759f059-relay-bin.000003
Relay_Log_Pos: 1197
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
要确保
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
都是yes,否则你就重新配置哦,先输入stop slave ,然后reset slave; 然后上面的一长串CHANGE MASTER TO MASTER_HOST =… MASTER_LOG_POS = 668;就开始重新配置
测试阶段
最后开始测试阶段辣
- mysql-master
create database db01;
use db01;
create table tb_user(
id int(11) primary key not null auto_increment,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null,'Tom', '1'),(null,'Trigger','0'),(null,'Dawn','1');
- mysql-slave
mysql> use db01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> select * from tb_user;
+----+---------+------+
| id | name | sex |
+----+---------+------+
| 1 | Tom | 1 |
| 2 | Trigger | 0 |
| 3 | Dawn | 1 |
+----+---------+------+
3 rows in set (0.07 sec)
至此,完成辣,其实过程并不难,但是在个人实践的时候,出现了一些问题,比如mysql的版本问题会导致主从配置的一些小区别,在找MASTER_HOST的地址的时候,一直没有弄好,弄好了server-id又出幺蛾子(最开始配置的时候写的是不一样,但是报错却说是一样的 淦)
到这里 你就完成了简单的一主一从的mysql配置,你真的是泰裤辣!