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个小时的倒腾,我这里成功了。

相关推荐
Victor3567 分钟前
MySQL(131)如何解决MySQL CPU使用率过高问题?
后端
深栈解码10 分钟前
第二章:Class文件解剖:字节码的二进制密码
java·后端
error_cn12 分钟前
finger命令输出格式解析
后端
Victor35613 分钟前
MySQL(132)如何调整MySQL内存使用?
后端
武子康15 分钟前
大数据-38 Redis 分布式缓存 详细介绍 缓存、读写、旁路、穿透模式
大数据·redis·后端
TeamDev19 分钟前
从 JavaFX WebView 迁移至 JxBrowser
java·后端·webview
麦兜*19 分钟前
【SpringBoot 】Spring Boot OAuth2 六大安全隐患深度分析报告,包含渗透测试复现、漏洞原理、风险等级及完整修复方案
java·jvm·spring boot·后端·spring·系统架构
寻月隐君21 分钟前
Rust 错误处理终极指南:从 panic! 到 Result 的优雅之道
后端·rust·github
AI转型之路25 分钟前
Dify 实现长文档自定义切片:高效处理大规模文档的智能解决方案
后端
南雨北斗1 小时前
VSCODE进行代码格式化的方法
后端