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

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


适宜人群

  • 想学习微服务的php小白
  • 不会docker的php小白
  • 闲着无聊的php小白

为什么需要mysql主从复制

如同程序开发一样,一个大项目中,一个工程师干不过来了,所以就分成了前后端工程师。一个数据库忙不过来了,所以就需要多个数据库。

主从复制原理

多个mysql数据库的数据都存相同的数据,主库只负责 增加、编辑、删除操作。从库只负责查询操作。主从复制就是为了保证多个数据库的数据相同。通过读取主库的bin_log,子库中的进程去同步数据。

主从复制解决的问题

  • 单台MySQL服务器出现瓶颈
  • 数据库的备份
  • 写数据的锁表,导致查询业务受影响 所以就分开,各司其职

主从服务的具体实现步骤(以Docker为例)

1 安装Docker 我的电脑上是windows。此处省略

2 docker中安装三个MySQL 具体命令是

ini 复制代码
docker run --name mysql_master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run --name mysql_slave1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run --name mysql_slave2 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

配置了三台mysql,其中一台主服务器,2台从服务器。-p 为端口映射,把docker的端口映射到了本地相对应的端口 -e MYSQL_ROOT_PASSWORD 这个是mysql的密码 -d 为后台运行。

请注意:在正常生产环境中,mysql的数据文件、配置文件、日志等等其实应该保存在宿主机的。这样当容器没了的时候数据不会丢失,只是在后面追加更多参数而已。这里只是进行学习,所以这些数据并没有提取出来。

3 修改主服务器配置

这里因为我对docker命令不是那么的熟,而且linux命令也没那么会pia pia pia,所以这些修改我都是在图形界面中完成。

选择 files 然后找到 etc/my.cnf文件 右击进行编辑操作。

添加下方的配置项

ini 复制代码
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT

其中 server-id必须唯一 log-bin 配置参数 为开启 bin_log的意思。保存以后重启容器。 此时通过容器的命令行去查看 bin_log的开启情况。testdb就是你将来想要同步的那个数据库名字。

复制代码
mysql -uroot -proot

登录到mysql

sql 复制代码
show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

上方value中为 ON则代表 binlog开启成功。

4 配置主库的可访问账号,供从库拉取数据。

sql 复制代码
flush privileges;
CREATE USER 'copy'@'%' IDENTIFIED WITH mysql_native_password BY 'admin123';
GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';

第一条命令是刷新啥,我也不是很清楚。 第二条命令是创建一个用户 用户名是 copy,后面的 admin123为密码【从库拉取数据的时候需要配置】 第三条命令是赋予权限。

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

显示binlog信息。其中,file position。两个参数为日志的位置,是从库配置时候需要用到的参数信息。

完成上述配置,则主库的配置成功。重启一下即可。

5 修改从库的配置信息 使用上面修改主库配置信息的方法,修改从库的配置信息。

ini 复制代码
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
ini 复制代码
#从服务器唯一ID
server-id=3
#启用中继日志
relay-log=mysql-relay

上面是两个从库的配置,server-id是唯一的。

相关推荐
噢,我明白了14 小时前
java中唯一键和幂等键的应用
java·后端
GreenTea14 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
考虑考虑14 小时前
synchronized字符串常量
java·后端·java ee
颜进强15 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
GetcharZp16 小时前
定位不再一个个吐坐标:英伟达 LocateAnything 上手全攻略
后端
郑州光合科技余经理17 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
我叫黑大帅17 小时前
Go日志库工程选型与逃逸分析评测报告
后端·面试·go
IT_陈寒19 小时前
JavaScript闭包的这个坑,我居然今天才爬出来
前端·人工智能·后端
Thneonl19 小时前
消息队列选型决策树:RabbitMQ vs Kafka vs Redis Streams
后端·架构