数据库主从复制:让数据更安全、更快

你有没有遇到过这种情况:公司网站突然访问变慢,客服一查,原来是数据被大量查询压垮了。或者更糟,数据库服务器宕机,用户注册不了,订单也下不了。这时候,如果只靠一台数据库撑着,问题可就大了。

什么是数据库主从复制

简单说,主从复制就是让一台数据库(主库)的数据,自动同步到另一台或多台数据库(从库)上。主库负责写操作,比如新增、修改、删除;从库则主要负责读数据。这样一来,读写压力就被分开了。

就像一家火锅店,老板(主库)管收钱、记账、进货,而服务员(从库)拿着副账本给客人查消费记录。就算老板临时忙不过来,服务员也能应付大部分查询需求。

工作原理其实不复杂

以 MySQL 为例,主库会把所有更改数据的操作记录下来,存在一个叫“二进制日志”(binlog)的文件里。从库连上主库,说自己:“我上次同步到第100条了,接下来给我后面的。” 主库就从第101条开始发,从库一条条执行,数据就跟上了。

这个过程是异步的,也就是说从库可能比主库慢一点点,但对大多数业务来说,延迟几秒完全能接受。

配置示例

假设我们有两台服务器,主库 IP 是 192.168.1.10,从库是 192.168.1.11。

先在主库开启 binlog,修改配置文件 my.cnf:

server-id = 1
log-bin = mysql-bin
binlog-format = ROW

重启主库后,创建一个供从库连接的账号:

CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';

接着在从库配置,指向主库:

server-id = 2
relay-log = mysql-relay-bin
log-slave-updates = 1

然后在从库执行连接命令:

CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 107;

START SLAVE;

运行完,从库就开始同步了。用 SHOW SLAVE STATUS\G 能查看同步状态,重点关注 Slave_IO_RunningSlave_SQL_Running 是否都为 Yes。

不只是分担压力

主从复制的好处不止是读写分离。从库可以当作备份使用,万一主库挂了,能快速顶上去。也可以拿从库做数据分析,跑报表,避免影响线上业务。

有些团队还会用从库做版本升级前的测试,先把数据同步过去,验证新程序能不能正常读取。

需要注意的地方

从库不是万能的。如果主库误删了一张表,binlog 里也记录了这条命令,从库照样会执行。所以重要操作还是得加防护,不能全靠复制机制兜底。

另外,网络不稳定时,从库可能卡住,需要手动干预恢复。定期检查同步延迟是运维的基本功。

现在很多云数据库默认支持主从架构,开通时勾一下就行。但对于自建服务的团队,理解这套机制怎么运作,出问题时才能快速定位。