数据库的集群架构都不陌生了,最熟悉也是应用最广泛的就是咱们熟知的主从,今天大概的回味下:
主从复制
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
从架构图中我们可以分析,在大并发量较大的情况下,会出现主从复制延迟这种问题,如何解决?目前已经有了比较成熟的方案。
主从复制原理图:
步骤1: 所有数据更新都会被主库记录到主库的二进制日志。
步骤2: 与此同时从库的IO线程会从主库上读取二进制日志,写入到从库的中继日志上。
步骤3: 从库的SQL线程读取中继日志上的内容来更新从库。
造成延迟的原因
1、并发较大的情况下,master产生的DDL和DML数量大于salve的可接受数。从库的Slave_SQL_Running是单线程作业,不能并发执行,所以当主库的TPS并发较高时,就容易产生延迟。
2、slave将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争用,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。
<DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL >
复制
如何解决?
1、减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行
2、主库写对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以将sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率
3、使用比主库更好的硬件设备作为slave
4、使用mysql5.7 参看 《MySQL 5.7 并行复制实现原理与调优》
5、分库分表 http://www.cnblogs.com/hackxhao/p/5496254.html
这两篇文章写的很好,需要好好拜读!!
pdf获取链接:http://pan.baidu.com/s/1pLwRf4n