Mysql主从复制

背景

当所有的读写操作都集中在一台mysql服务器上时,会使得该台服务器负载增大,其次是,当数据全部集中到一台服务器上,且没有其他服务器做备份的话,一旦发生事故导致数据丢失,会带来巨大的损失。要想解决这两个问题,就引出了Mysql主从复制的功能,即将主服务器上的数据“备份”一份,放到从服务器上,然后让从服务器也承担一部分数据库功能,比如专门查询,这样既缓解了一个服务器的压力,又能存在备份。

框架图

image-20231207212310135

步骤

  • 主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程。
  • 从库的IO线程会读取主库的binlog日志,然后将读到的日志写入relaylog(中继日志)中
  • 从库的sql线程再读取relaylog然后复现日志中的sql操作,达成主从数据一致

操作

两台服务器,分别配置Mysql

比如:
主库: 192.168.138.100

从库: 192.168.138.101

配置主库

修改配置文件 /etc/my.conf

1
2
3
4
vim /etc/my.cnf
server-id=11
log-bin=mysql-bin #添加,主服务器开启二进制日志
binlog_format=mixed

然后重启服务:

1
systemctl restart mysqld

登录数据库,然后为从库分配一个身份

1
2
3
4
mysql -u root -p *** 
grant replication slave on *.* to '名字'@'%' identified by '123456 #给从服务器授权
flush privileges;
show master status; #查看用户状态

配置从库

1
2
3
4
vim /etc/my.cnf
server-id = 22 #修改,注意id与Master的不同,两个slave的id也要不同
relay-log=relay-log-bin #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index #定义中继日志文件的位置和名称,一般和relay-log在同一目录

重启服务,并登录,然后连接到主库

1
2
3
4
5
systemctl restart mysqld
mysql -u root -p***
change master to master_host='192.168.138.100',master_user='名字',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=604; #配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致
start slave; #启动同步,如有报错执行 reset
show slave status/G #查看 slave 状态