雨云 MySQL 主从复制与读写分离实战:给数据库上一份并发保险

在雨云云服务器上把 MySQL 拆成主库写、从库读,并发上去了,还多了一份实时备份
发布于
4

单库迟早会遇到瓶颈

前面我们在雨云云服务器上装好了 MySQL,单库跑业务没问题。但当读请求(列表、详情、统计)远多于写请求时,所有查询都压在同一台机器上,CPU 和连接数很快到顶。最经典的优化就是主从复制 + 读写分离:一台主库负责写,一到多台从库负责读,读流量被分流出去,主库压力立刻降下来,顺带还多了份实时备份。

一、架构与准备

最少两台雨云云服务器:一台主库(master)、一台从库(slave),配置 2 核 2G 起步,数据量大再加从库。机器放同一私有网络(参考内网互联那篇),主从之间走内网同步,免费又低延迟。购买走 雨云专属入口 jiyueip.com/link/5617 填优惠码 admin01 五折;用了国内节点对外提供数据库相关服务要按规定备案。

二、主库开启 binlog

主库改 /etc/mysql/mysql.conf.d/mysqld.cnf:

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW

重启 sudo systemctl restart mysql。然后建一个专用于复制的账号:

CREATE USER 'repl'@'从库内网IP' IDENTIFIED BY '强密码';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库内网IP';
FLUSH PRIVILEGES;

导出当前数据给从库:mysqldump -u root -p –single-transaction –master-data=2 appdb > appdb.sql,记下其中的 binlog 位置。

三、从库接入主库

从库也设 server-id = 2,导入主库数据后执行:

CHANGE MASTER TO
  MASTER_HOST='主库内网IP',
  MASTER_USER='repl',
  MASTER_PASSWORD='强密码',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=XXX;
START SLAVE;

看 SHOW SLAVE STATUSG,Slave_IO_Running 和 Slave_SQL_Running 都是 Yes 就成功了。之后主库写入,从库会自动同步。

四、应用层读写分离

p

数据库层只负责同步,读写分离要在应用里做。比如在代码里配两个数据源:写操作走主库连接,读操作走从库连接;或用 ShardingSphere、ProxySQL 这类中间件统一路由。简单场景手动分两个连接字符串最直观。

五、常见故障排查

现象 可能原因
Slave_IO_Running: No 主从网络不通、复制账号密码错、server-id 冲突
Slave_SQL_Running: No 从库执行中继日志出错(如主键冲突),需查 Last_Error
同步延迟大 主库写太猛或從库性能差,可加从库或优化大事务

合规使用提醒

主从复制仅用于你合法业务的数据库高可用与性能优化。数据库中若含用户个人信息,须遵守《个人信息保护法》,主从库均须做好访问控制与加密存储,复制账号权限应最小化,不得用于未授权数据流转。

常见问题(FAQ)

主从复制会丢数据吗?
异步复制下主库宕机可能有极少未同步数据。对一致性要求高的业务可改用半同步复制(主库等至少一个从库收到才返回),或把关键写操作走主库并加确认。
从库能当备份用吗?
能,从库是主库的实时副本,算一份额外保险。但注意逻辑错误(如误删表)也会同步过去,所以物理备份(mysqldump/快照)仍不能省。
读写分离一定要中间件吗?
不一定。简单项目在代码里配两个数据源(写走主、读走从)就能分;规模大了再用 ProxySQL、ShardingSphere 这类中间件做统一路由和负载。
加从库会影响主库性能吗?
主库要把 binlog 发给从库,有一点网络与磁盘开销,但通常很小。关键别让从库和主库抢同一台机器资源,分开部署才合理。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600