啥,你居然不知道MySQL主从复制,那还不赶紧来补一补

936 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

MySQL主从复制可以说在实际的生产应用都会有一套主从机制来保证业务数据的稳定,防止出现故障导致生产事故。 在了解主从复制原理之前,先带大家手把手完成MySQL主从配置,知己知彼,方能百战百胜,Let's go....

主从 服务器配置

第一步,主服务器配置

  1. 首先设置my.cnf配置文件

这一步就是要启用bnlog日志,并且设置全局唯一server id


# vim /etc/my.cnf

[mysqld]  

server_id=51           //server_id

log-bin=master51        //日志名

:wq

  1. 然后进行用户授权

授权指定从服务器复制数据的权限,用户名自定义、客户端地址使用% 或 只指定 从服务器的地址 都可以、只给复制数据的权限即可。

#mysql -uroot -p

mysql> grant  replication slave on .  to repluser@"%" identified  by"123qqq...A";

mysql>quit;

第二步从服务器配置

配置my.cnf文件

指定server_id,不能与主服务器相同


# vim /etc/my.cnf

[mysqld]  

server_id=52          //server_id

:wq

  1. 指定主服务器信息

数据库管理员root本机登录,指定主服务器信息,其中日志文件名和偏移量 写allbak.sql文件记录的。

# mysql -uroot –p密码     //管理员root 本机登录

mysql> show slave status;  //查看状态信息,还不是从服务器

Empty set (0.00 sec)

mysql> change   master  to //指定主服务器   

-> master_host=“192.168.4.51”,                 //主服务器ip地址 

-> master_user=“repluser”,                        //主服务器授权用户 

-> master_password=“123qqq…A”,            //主服务器授权用户密码   

-> master_log_file=“master51-bin.000001”,//主服务器日志文件   

-> master_log_pos=441;                  //主服务器日志偏移量

  1. 开启主从复制命令

start slave

经过上面的一顿骚操作,主从就搭好了,当然一般在公司基本都是会有专门的人负责MySQL服务的搭建,但作为当代最优秀的程序员,还需要自己动手实现一波,实践是检验真理的唯一标准。

主从复制原理

MySQL主从复制是指数据可以从一个MySQL服务器主节点复制到一个或多个从节点。

MySQL默认采用异步复制方式,从节点可以复制主数据库中所有数据库或者特定的数据库,或者特定的表。

MySQL主从复制主要用途

进行读写分离,主库负责写入,从库负责读取

数据实时备份,当系统某个节点发送故障,可以方便故障切换。

架构扩展:随着系统中业务访问量增大,如果单机部署数据库,就会导致I/O访问频率过高。通过主从复制,增加多个数据存储节点,将负载分布在多个节点,降低磁盘IO方法频率,提高单台机器IO性能。

MySQL主从形式

  • 一主一从,一主多从

  • 多主一从:多主一从可以将多个mysql数据库备份到一台存储性能比较好的服务器上

  • 双主复制:双主复制,也就是互做主从复制,每个master即是master,也是另外一台服务器的slave.

  • 级联复制:部分slave的数据同步不连接主节点,而是连接从节点。其他从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响。

复制如何工作

  • 在主库中会把数据记录到二进制文件(bin log )中

  • 从库将主库上的日志复制到自己的中继日志(Relay Log)中

  • 备库读取中继日志中的事件,将其重放到备库数据之上。

image.png

image.png 通过图可以看打主从复制的工作流程

连接主库,主库会分配dump 线程和从库 IO线程通信

从库IO线程请求新日志,主库dump线程接收请求,截取二进制日志,返回给从库 IO线程

从库IO将binlog最终写入到 relay log中,并将读取到的bin log文件名和位置存并更新到Master.info文件中,一边下一次读取的时候能够清楚的告诉主节点我需要从哪个位置开始往后复制。

SQL线程读取relay.info,获取上次执行到的位置点

SQL线程向后执行新的relay-log,再次更新realy.info

主从复制方式

主从复制有三种方式:基于SQL语句的复制,基于行的复制,混合模式复制

基于SQL语句复制,就是复制sql语句在bin log中,mysql 5.1.4 及之前的版本都是使用的这种复制格式。优点是只需要记录会修改数据的sql语句到binlog中,减少了binlog日志量,节约I/0,提高性能。

基于行的复制,是mysql 主节点将sql语句分解为基于行更改的语句并记录在bin log中,也就是只记录哪条数据被修改,修改成什么样。优点是不会出现某些特定情况下的存储过程、或者函数、或者trigger的调用或者触发无法被正确复制的问题。缺点是会产生大量的日志。

混合模式复制是以上两种复制模式的混合,对于一般的复制使用记录sql语句的方式,对于sql语句模式无法复制的操作则使用行模式来保存,mysql会根据执行的sql语句选择日志保存方式。

主从复制get到了没,如果还意犹未尽的话,就关注小蛋吧,持续输出干货,奥利给