前言: 一个健壮的web项目,数据库的备份容灾、并发能力是肯定要做的,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...
一、mysql主从复制
主从复制存在的问题
1. 主库宕机后,数据可能丢失;
2. 主从同步延迟。
MySQL数据库主从同步延迟产生原因
常见原因:
Master负载过高、Slave负载过高、网络延迟、机器性能太低、MySQL配置不合理。
解决数据丢失的问题
1、半同步复制
从MySQL5.5开始,MySQL已经支持半同步复制了,半同步复制介于异步复制和同步复制之间,主库在执行完事务后不立刻返回结果给客户端,需要等待至少一个从库接收到并写到relay log中才返回结果给客户端。
相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一个TCP/IP往返耗时的延迟。
2、主库配置sync_binlog=1,innodb_flush_log_at_trx_commit=1
sync_binlog的默认值是0,MySQL不会将binlog同步到磁盘,其值表示每写多少binlog同步一次磁盘。
innodb_flush_log_at_trx_commit = 1表示每一次事务提交或事务外的指令都需要把日志flush到磁盘。
注意:将以上两个值同时设置为1时,写入性能会受到一定限制,只有对数据安全性要求很高的场景才建议使用,比如涉及到钱的订单支付业务,而且系统I/O能力必须可以支撑!
解决从库复制延迟的问题
1、优化网络
2、升级Slave硬件配置
3、Slave调整参数,关闭binlog,修`改innodb_flush_log_at_trx_commit`参数值
4、升级MySQL版本到5.7,使用并行复制
5.在业务代码上如果对即时性要求高的要直接读取主数据库。
6.设一个key记录着一次写的数据,然后设置一个同步时间,如果在这个时间内,有一个读请求,看看对应的key有没有相关数据,有的话,说明数据近期发生过写事件,这样key的数据就继续读主库,否则就读从库
二、mysql集群和主从复制的区别
1.集群是分摊读写压力,多台服务器存储相同的数据,一台服务器挂了另一台可以顶上
2.主从复制是读写分离的前提条件
三、读写分离的原理
利用mysql的主从复制,一般主数据库用于读写,从数据库用于读,多台服务器都开启bin二进制日志,然后主服务器会把执行过的sql语句记录到bin日志中,之后从服务器读取这个bin日志,把该日志的内容保存到自己中继日志里面,从服务器再把中继日志中记录的sql语句同样的执行一遍。这样从服务器上的数据就和主服务器相同了。
在高并发的时候,两个数据库如何保证数据同步的延迟问题呢?
1、MySQL5.6以后,提供了基于GTID多开启多线程同步复制的方案,即每个库有一个单独的(sql thread) 进行同步复制,这将大大改善MySQL主从同步的数据延迟问题,配合Mycat分片,可以更好的将一个超级大表的数据同步的时延降低到最低。
2、增强方案:Mycat很完美的支持了galera for mysql集群模式。
galera for mysql集群这种方式,是牺牲了数据的写入速度,以换取最大程度的数据并发访问能力,类似Mycat里的全局表,并且保证了数据同时存在几个有效的副本
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。
多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。
读写分离到分表分库的历程(主库写请求过多时,考虑进行分表分库)
一个数据库的演进过程通常为在起初数据量不大,使用单个数据库节点就可以支持业务的读写访问。随着系统用户量的增加,数据库存储的数据量也随之增加,这个时候通常可以通过提升数据库主机的硬件来提升处理能力。
当提升硬件已经无法支撑访问量时,这个时候单台数据库同时处理读写请求会由于访问量过大而成为性能瓶颈。通常这个时候需要使用MySQL主从复制来实现读写分离,使用一个主库负责处理数据写请求,使用一个或多个从库处理读请求。
读写分离的架构通常适合于读多写少的应用场景,但是如果是写非常频繁的系统,如股票类在线交易系统,则由于读写分离架构中还是单个主库负责数据写入,故可能会存在性能瓶颈。
其次如果数据库数据量非常大,即使进行了读写分离,每个读写分离集群的每个节点需要保持大量数据,数据查询性能也会下降。同时主从复制也会由于需要复制大量的binlog而造成节点负载压力较大。
故如果由于数据库需要执行大量写请求而导致主库产生性能瓶颈,或者数据库存放的数据量太大导致查询性能下降和需要进行大量的binlog传输时,则需要考虑对数据库自身进行拆分,即采用分库分表的解决方案
注意:可以使用mycat实现读写分离,因为多个从数据库的读在mycat上通过配置可以得到有效的负载均衡
四、双机热备是什么?
双机热备的基础是数据库的主从复制,数据库是一主一丛,需要配置的。
双机热备,就是将上面的主从复制反着来一遍。这样就做到主可以复制从,从也可以复制主。达到两个mysql可以数据同步。
双机热备,当一台数据库挂了,可以很快的顶上去,并且数据也是同步的。
五、mycat是什么?
Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
两台版本一致的数据库,一台主(增删改)一台从(查),主从复制的原理是主数据库增删改写入二进制日志,从数据库获取主数据库的二进制日志进行二次执行。双机热备就是做两次不同方向的主从复制的配置,mysql直接配置相关就可以进行主从复制了。即主数据库也是从数据库,两个身份,主从复制的从数据库考虑多个,又要考虑负载均衡的问题。读写分离的话,因为考虑到延迟的问题,在业务代码上如果对即时性要求高的要直接读取主数据库。
对于业务逻辑上如何有效进行增删改查,有很多第三方的开源,有客户端的也有服务器端的,服务器端使用MySQL官方推荐的MySQL Router,基于MySQL Router可以实现读写分离,故障自动切换,负载均衡,连接池等功能**,更为强大的有MyCat**
mycat提供读写分离但不提供主从同步功能,主从同步应当自己去mysql配置,因为官方自带的效率最高,但是也存在延迟问题
mycat可以干什么?
1、单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
2、分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片,可以配置分表分库规则,按id等
3、多租户应用,每个应用一个库,但应用程序只连接 Mycat,从而不改造程序本身,实现多租户化
4、报表系统,借助于 Mycat 的分表能力,处理大规模报表的统计
5、替代 Hbase,分析大数据
6、作为海量数据实时查询的一种简单有效方案,比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果
Mycat是不是配置以后,就能完全解决分表分库和读写分离问题?
Mycat配合数据库本身的复制功能,可以解决读写分离的问题,但是针对分表分库的问题,不是完美的解决。或者说,至今为止,业界没有完美的解决方案。
分表分库写入能完美解决,但是,不能完美解决主要是联表查询的问题,Mycat支持两个表联表的查询,多余两个表的查询不支持。 其实,很多数据库中间件关于分表分库后查询的问题,都是需要自己实现的,而且节本都不支持联表查询,Mycat已经算做地非常先进了。
分表分库的后联表查询问题,大家通过合理数据库设计来避免。
mycat相关知识可参考博客:
1、MyCat分表分库的原理是什么
2、数据库读写分离、分表分库——用Mycat
3、mycat使用
结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)