MySQL主从数据库原理及实现

MySQL主从数据库原理及实现

 

MySQL的主从同步架构是当前比较流行的一种数据库架构,利用MySQL的主从配置,可以实现读写分离,减轻主数据库的访问压力,提升网站性能。

 

 

主从原理:


 

1. Master记录二进制日志,在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

 

2. slave开始一个I/O线程,该线程在Master上建立一个普通链接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

 

3. SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

 

注意:

在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

 

 

主从配置

主机A: 192.168.1.100

从机B:192.168.1.101

 

1、先登录主机 A

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘backup’@’192.168.1.101‘ IDENTIFIED BY ‘123456’;

赋予从机权限,有多台丛机,就执行多次

backup是授权账号,123456是密码

 

2、 打开主机A的my.cnf,输入

server-id               = 1    #主机标示,整数

log_bin                 = /var/log/mysql/mysql-bin.log   #确保此文件可写

read-only              =0  #主机,读写都可以

binlog-do-db         =test   #需要备份数据,多个写多行

binlog-ignore-db    =mysql #不需要备份的数据库,多个写多行

 

3、打开从机B的my.cnf,输入

server-id               = 2

log_bin                 = /var/log/mysql/mysql-bin.log

master-host     =192.168.1.100

master-user     =backup

master-pass     =123456

master-port     =3306

master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差(秒)

replicate-do-db =test #只复制某个库

replicate-ignore-db=mysql #不复制某个库

 

4、同步数据库

不用太费事,只把主从库都启动即可自动同步,如果不嫌麻烦的话可以把主库的内容导出成SQL,然后在从库中运行一遍

 

5、先重启主机A的mysql,再重启从机B的mysql

 

6、验证

在主机A中,mysql>show master status\G;

在从机B中,mysql>show slave status\G;



 

Slave_IO_Running 和 Slave_SQL_Running, 必须都为 Yes 

 

 

 

添加新slave服务器

假如master已经运行很久了,想对新安装的slave进行数据同步,甚至它没有master的数据。

此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:

1. master的某个时刻的数据快照;

2. master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标;

3. master的二进制日志文件。

 

 

主从运维

 

1. 确保从库的两个线程都是正常运行的

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 如可监控和报警:

编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

 

 

2. 出现“log event entry exceeded max_allowed_pack”错误

如果在应用中使用大的BLOB列或CLOB列或者长字符串,那么在从服务器上回复时,可能会出现“log event entry exceeded max_allowed_pack”的错误,这是因为含有大文本的记录无法通过网络进行传输而导致的。

show variables LIKE '%max_all%'

Variable_name      Value   
------------------ ------- 
max_allowed_packet 1048576 

(1 row(s) affected)

 解决方法:

同时在my.ini或my.cnf文件里设置max_allowed_packet=16M,数据库重启之后该参数将有效

set @@global.max_allowed_packet=16777216;

 

 

 3. 多主复制时自增长冲突

大多数情况下使用一台主服务器对一台或者多台从服务器,但是在某些情况下可能会存在多个服务器配置为复制主服务器,使用auto_increment时应采取特殊步骤以防止键值冲突,否则插入时多个主服务器会试图使用相同的auto_increment值

 

解决方法:

在这里我们在A,B上加入参数,以实现奇偶插入 

 

A:my.cnf上加入参数 

auto_increment_offset = 1 

auto_increment_increment = 2 

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了 

 

B:my.cnf上加入参数 

auto_increment_offset = 2 

auto_increment_increment = 2 

这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

 

提示:

一般不建议使用双主或多主,因为这样会带来意想不到的冲突状况,就像SQLSERVER的对等复制,虽然有很多冲突检测措施。但是有时候冲突是不可预料的,出现冲突DBA要排查,维护成本较高,我们生产环境里是没有使用双主和多主,主要使用的是一主多从或一主一从

 

 

 

参考:

http://blog.csdn.net/hguisu/article/details/7325124/

http://369369.blog.51cto.com/319630/790921/

https://my.oschina.net/u/730579/blog/632790

http://www.cnblogs.com/xiao-yu/archive/2011/06/14/2080842.html

MySQL主从复制是一种常见的数据库备份方案,它通过将一个数据库实例(主服务器)的更新操作复制到其他一个或多个数据库实例(从服务器)上来实现数据的备份和同步。其原理如下: 1. 配置主服务器:在主服务器上开启二进制日志(binary log),二进制日志记录了所有对数据库的修改操作。通过配置参数,将二进制日志文件(binlog)保存到指定的位置。 2. 配置从服务器:在从服务器上配置主服务器的连接信息,并启动从服务器的复制进程。从服务器会连接到主服务器,并请求从指定位置开始读取主服务器的二进制日志。 3. 主服务器记录二进制日志:当主服务器接收到客户端的写操作请求时,它会先将操作记录到自己的二进制日志中,然后再执行该操作。 4. 从服务器读取二进制日志:从服务器会定期连接到主服务器,读取二进制日志中的更新操作,并将其应用到自己的数据库中。通过解析并执行二进制日志中的操作,从服务器保持与主服务器数据的一致性。 5. 复制过程中的同步机制:主从复制过程中,主服务器可以通过发送二进制日志事件给从服务器来保持数据同步。从服务器接收到这些事件后,会根据事件类型执行相应的操作,例如插入、更新或删除数据。 6. 从服务器的备份:由于从服务器是通过复制主服务器的操作来同步数据的,因此从服务器本身就是主服务器数据的备份。如果主服务器发生故障,可以将从服务器切换为主服务器,提供持续的数据服务。 需要注意的是,MySQL主从复制并不是实时的,因为从服务器需要定期连接主服务器来获取更新的二进制日志。因此,在配置主从复制时,需要根据业务需求和系统负载来选择合适的同步延迟和复制方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值