PHPer 的微服务学习笔记-基于Docker的Mysql主从搭建(下)

年关将至,工作上也没什么大的安排。闲暇时间从一个PHP工程师的角度去学习一下微服务架构,毕竟谁都想进步嘛,哇哈哈


6 配置从库与主库的关系

ini 复制代码
CHANGE MASTER TO MASTER_HOST="172.17.0.2",MASTER_PORT=3306,MASTER_USER="copy",MASTER_PASSWORD="root",MASTER_LOG_FILE="mysql-bin.000001",MASTER_LOG_POS=747;

请注意上面的一些参数。

MASTER_HOST 这个参数是主库的ip地址。

在上面的位置查看,请注意。这个ip是自动分配的,会受容器启动顺序的先后影响。因为我是第一个创建的主容器,所以分配的是 2 .然后依次往后排。生产环境中这个ip是需要固定不变的,这就需要用的docker的网络,我还不会,所以就不整那么复杂了。

MASTER_PORT 这个参数是主库的端口

请注意,在创建主库的时候,我们是把 容器的 3306 映射到 宿主机的 3307端口上,也就是说,我在我的电脑上访问 3307 其实是转发到容器内部的 3306端口上的。因为从库是直接通过内部访问,所以这里设置的的 3306端口。切记。

MASTER_USER 主库设置的供从库使用的用户名 copy

MASTER_PASSWORD 主库设置的供从库使用的用户名的密码 admin123 👆上面设置的

MASTER_LOG_FILE binlog的那俩位置参数之一。

MASTER_LOG_POS binlog的那俩位置参数之一。

vbscript 复制代码
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.

运行出现这个错误,因为没重启,mysql配置文件还未生效。

ini 复制代码
CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_PORT=3306, MASTER_USER='copy', MASTER_PASSWORD='admin123', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

运行未报错的话代表执行成功。

sql 复制代码
start slave;
Query OK, 0 rows affected (0.01 sec)

开启slave

yaml 复制代码
SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: copy
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ...

查看命令运行。 \G 代表格式化输出。不写的话 输出会很乱,不好对应。 Slave_IO_Running: Yes Slave_SQL_Running: Yes。看到这俩都是 Yes,代表链接 配置成功。

容器中出现的一些日志还可以通过dockerd的logs面板中进行查看。

7 相同的方式再去配置另外的那一个从库。

yaml 复制代码
mysql> CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_PORT=3306, MASTER_USER='copy', MASTER_PASSWORD='admin123', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: copy
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

上面则代表成功。

8 测试数据 此时我们兴致冲冲的去主库中添加一些测试数据,观察数据同步情况。

可以发现,数据并没有同步。挠头,挠头,挠头。

此时查看从库的日志中出现这个日志。

arduino 复制代码
2024-02-05 13:46:17 2024-02-05T05:46:17.402955Z 3 [Note] Slave I/O thread for channel '': connected to master 'copy@172.17.0.2:3306',replication started in log 'mysql-bin.000002' at position 154

这大致是因为 重启了,主库的日志文件发生变化了。

我们把三个容器都重启。重新配置 bin log即可。

sql 复制代码
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000003 |      154 | testdb       | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)

可能到此,还是没有同步成功。那就需要你花点时间去调试咯。经过我1个小时的倒腾,我这里成功了。

相关推荐
来自旧金山的勇士41 分钟前
WSL->Ubunut安装Redis
后端
大葱白菜43 分钟前
Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
java·后端
大葱白菜44 分钟前
Java Map 集合详解:从基础语法到实战应用,彻底掌握键值对数据结构
java·后端
小猪乔治爱打球1 小时前
[Golang修仙之路] 算法专题:回溯(递归)
后端·面试
昵称为空C1 小时前
SpringBoot数据存储时区选择,符合国际化和特定时区方案
spring boot·后端
ldj20202 小时前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿2 小时前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
江南一点雨2 小时前
Tokenizer 和 BPE
后端
风象南2 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端
洛阳泰山2 小时前
Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
java·spring boot·后端·nacos