年关将至,工作上也没什么大的安排。闲暇时间从一个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个小时的倒腾,我这里成功了。