PageAdmin数据库读写分离配置
PageAdmin 默认使用单库读写,当站点访问量上涨后,数据库往往先成为瓶颈。
数据库读写分离是把写操作和读操作分发到不同数据库服务器,从而提升整体吞吐量。
下面从零开始,一步步完成 PageAdmin 的读写分离配置,适合有一定 Linux 基础但没接触过主从复制的站长。
动手前的环境确认
开始前需要准备两台(或以上)MySQL 服务器,一台作为主库(写库),一台作为从库(读库)。
如果只有一台物理机,可以用两个 MySQL 实例,端口区分,但生产环境建议独立服务器。
确认以下条件:
- 主从服务器时间同步,建议启用 NTP。
- 主从 MySQL 版本一致,避免复制兼容问题。
- 主库开启 binlog,且 server-id 唯一。
- 从库能通过网络访问主库的 3306 端口。
- PageAdmin 使用 MySQL 数据库,并且你拥有数据库的 root 或等效权限。
本文以 MySQL 5.7 为例,其他版本命令可能略有差异,建议以官方文档为准。
搭建 MySQL 主从复制
读写分离的基础是主从复制,先让从库能实时同步主库数据。
主库配置
编辑主库配置文件 my.cnf(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 段添加:
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
保存后重启 MySQL:
systemctl restart mysqld
登录主库,创建用于复制的账号并授权:
CREATE USER 'repl'@'%' IDENTIFIED BY 'YourStrongPassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
查看主库状态,记录 File 和 Position 值:
SHOW MASTER STATUS;
从库配置
编辑从库配置文件,添加:
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
重启从库 MySQL。
然后在从库执行:
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='YourStrongPassword',
MASTER_LOG_FILE='记录的主库File值',
MASTER_LOG_POS=记录的主库Position值;
START SLAVE;
检查复制状态,确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes:
SHOW SLAVE STATUS\G
如果出现错误,检查网络、账号密码和防火墙。
修改 PageAdmin 数据库配置
PageAdmin 的数据库连接字符串通常在站点根目录的 web.config 或 appsettings.json 中。
不同版本位置可能不同,建议先搜索 connectionString。
方案一:利用连接字符串的读写分离
部分 PageAdmin 版本支持在连接字符串中指定多个服务器,但需要驱动支持。
更通用的做法是修改代码或使用中间件。
如果 PageAdmin 没有内置读写分离,可以尝试修改数据库连接字符串,让读操作走从库。
例如在 web.config 中:
但 PageAdmin 默认只读取一个连接字符串,所以需要进一步调整代码,让读操作使用 ReadConnection。
如果不想改代码,可以使用 MySQL 中间件(如 ProxySQL)来转发。
方案二:使用 MySQL Router 或 ProxySQL
对于不想改代码的用户,推荐使用 ProxySQL 或 MySQL Router 做透明读写分离。
以 ProxySQL 为例,在 PageAdmin 中仍然配置连接 ProxySQL 的地址,由 ProxySQL 根据 SQL 语句自动路由。
安装 ProxySQL 后,添加主从服务器,并配置查询规则:
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '主库IP', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '从库IP', 3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
然后设置读写分离规则,将 SELECT 语句发往 hostgroup 20(从库),其余发往 hostgroup 10(主库)。
具体规则可参考 ProxySQL 官方文档。
修改 PageAdmin 连接字符串指向 ProxySQL 的 IP 和端口(默认 6033),然后重启站点。
避坑指南
- 主从复制延迟:从库同步有延迟,如果对实时性要求高,可以在关键读操作后强制走主库。
- 从库只读:确保从库设置了
read-only,避免误写导致数据不一致。 - 连接字符串权限:用于复制的账号和 PageAdmin 使用的账号要分开,遵循最小权限原则。
- 防火墙:主从之间 3306 端口必须互通,云服务器安全组也要放行。
- PageAdmin 缓存:开启读写分离后,如果 PageAdmin 有缓存机制,注意缓存更新时机,避免读到旧数据。
验证读写分离是否生效
完成配置后,通过以下方法验证:
- 在 PageAdmin 后台发布一篇新文章,然后在前台刷新查看。如果文章立即显示,说明写库正常,读库可能也有同步(但可能有延迟)。
- 直接连接从库,查询刚发布的数据,确认是否已同步。
- 查看 ProxySQL 的统计信息,确认
SELECT语句被路由到从库。 - 使用
SHOW PROCESSLIST在主从库观察连接来源。
如果发现所有查询都走主库,检查 ProxySQL 规则或 PageAdmin 代码是否正确。
常见疑问
读写分离后,PageAdmin 后台登录异常怎么办?
后台登录涉及写操作(记录会话),确保登录请求走主库。检查 ProxySQL 规则是否将 INSERT/UPDATE 正确路由。
从库同步失败如何排查?
在从库执行 SHOW SLAVE STATUS\G,查看 Last_Error 字段。常见原因包括主库 binlog 被清理、账号权限不足、网络中断。
必须用 ProxySQL 吗?
不是。如果熟悉代码,可以直接修改 PageAdmin 的数据库访问层,在读取时使用从库连接。ProxySQL 适合不想改代码的场景。
读写分离能提升多少性能?
取决于读写比例和从库数量。通常读多写少的站点提升明显,但也要考虑主从延迟和架构复杂度。
按照以上步骤操作后,你的 PageAdmin 站点应该能承受更高的并发访问。
如果遇到问题,优先检查主从复制状态和路由规则。