使用 proxysql 做透明的 mysql 读写分离代理
输入“/”快速插入
使用 proxysql 做透明的
mysql
读写分离代理
飞书用户7858
2023年5月28日创建
1.
背景
在家里的主机部署了一套 seafile,使用的是 docker 数据库,数据完全在本地,平时访问数据非常快,感受不到任何延迟。
但考虑到容灾,即偶发的家里停电、停网,需要做到异地备份 &异地访问。所以非常需要将数据库迁移出本地。而我之前在腾讯云购买了一个
mysql
数据库实例,可以考虑使用公有云 mysql,本地的 seafile 仅是一个逻辑层,可以做到快速迁移。
上述方案实施后,我发现本地访问 seafile 有肉眼可见的延迟,切换页面后有 1-2 秒的延迟。需要再次升级架构。
2.
目标
为
mysql
数据库搭建主从分离架构,做到本地访问的加速。
3.
技术方案选择
简单搜索了一下数据库主从方案的实现,有在业务层区分
mysql
实例,有 mysql 官方的 mysql router,以及 java spring 的插件,还有 proxysql。
3.1 业务层区分实例
顾名思义,就是写业务代码的时候,连接两个数据库实例。在
orm
层如果识别是读请求,就用从库;否则用主库。这种适合从头开发一个业务的时候使用,没有中间的数据库转发,效率会高一些(具体高多少没有实测过)。
对于 seafile 这种
开源软件
来说,不可能再修改代码区分读写实例了。
3.2
mysql
router
这个是
mysql
官方的方案,但之前看某篇文章说是要区分端口来访问的(文章后来找不到了),就没继续深入研究。
3.3 java 数据库中间件
显然在 spring boot 项目中有用,在 seafile 这种
开源软件
中无法使用。
3.4 proxysql
看到这个
c++
写的中间件比较符合要求,能够提供一个端口供业务访问,自己能区分出读写,并转发到不同的实例上。
缺点:
1.
在 ubuntu 下无法直接用
apt
安装
2.
需要在 proxysql 中新建用户,而且这些用户需要和主从库中的用户名和密码完全相同
整体的方案如下:
整个方案分为三个部分:
1.
主从同步的设置
2.
读写分离的配置
3.
透明访问
第三步的透明访问是依靠配置来实现的。比如主库的端口是 3306,那么 proxysql 的端口只能设置为 3306,需要各方面配置完全和主库一致才能做到透明访问。所以从库的端口只能设置为 3307。
另外使用 openwrt 的
dns
服务器将本地的数据库域名请求解析到 proxysql 的
ip
。这样在本地 seafile 故障时,可以快速在
公网
部署一套 seafile 逻辑层,由于公网域名会解析到
mysql
主库上,无需修改任何 seafile 配置。
4.
实施过程
4.1 主从同步的设置
4.1.1 备份主库
SQL
mysqldump -u root -h your_ip -P your_port -p --all-databases > backdb.sql
4.1.2 恢复数据到从库
新建一个从库实例,docker-compose.yml 如下: