文章

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
  1. [client] 这个部分是 MySQL 客户端的默认选项设置。在这里,我们设置客户端默认使用 UTF-8 字符集。
  2. default_character_set=utf8 这个选项指定了 MySQL 客户端连接的默认字符集为 UTF-8。
  3. [mysqld] 这个部分是 MySQL 服务器的选项设置。在这里,我们设置服务器默认使用 UTF-8 字符集。
  4. collation_server=utf8_general_ci 这个选项指定了服务器默认的排序规则为 utf8_general_ci。这个排序规则可以确保处理 UTF-8 字符集时的正确性。
  5. character_set_server=utf8 这个选项指定了 MySQL 服务器默认使用的字符集为 UTF-8。
  6. server-id=11 这个选项指定了 MySQL 服务器的 ID,用于主从复制中的唯一标识。这个值必须在所有 MySQL 服务器中都是独一无二的。
  7. log-bin=mysql-bin 这个选项启用 MySQL 的二进制日志功能,并指定日志文件名为 mysql-bin。二进制日志记录数据库中所有更改,以便在主从复制中传输更改到从服务器。
  8. 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'@'%';
  1. CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave@123'; 这个命令创建了一个名为 slave 的 MySQL 用户,并且该用户可以从任何主机访问数据库(因为 % 符号表示允许从任意 IP 地址登录)。mysql_native_password 是 MySQL 数据库默认的身份验证插件,它使用基于密码的身份验证。 'slave@123' 表示该用户的登录密码为 slave@123
  2. 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;
  1. CHANGE MASTER TO 这个命令用于更改从服务器的主服务器连接设置。
  2. MASTER_HOST = '10.0.12.2' 这个选项指定了主服务器的 IP 地址,即 10.0.12.2。
  3. MASTER_PORT = 3311 这个选项指定了主服务器的端口号,即 3311。该端口号必须与主服务器上的 MySQL 日志文件保持一致。
  4. MASTER_USER = 'slave' 这个选项指定了用于主从复制的 MySQL 用户名,即 slave
  5. MASTER_PASSWORD = 'slave@123' 这个选项指定了用于主从复制的 MySQL 用户密码,即 slave@123
  6. MASTER_LOG_FILE = 'mysql-bin.000001' 这个选项指定了在主服务器上存储二进制日志文件的名称,即 mysql-bin.000001。这是主服务器上最后写入的二进制日志文件的名称。
  7. 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配置,你真的是泰裤辣!

License:  CC BY 4.0 test