一文了解MYSQL高可用

Mysql高可用

主从复制

一文了解MYSQL高可用

  • 互联网最开始就是一主一从服务器,读写分离用户请求,写操作进入主服务器,读操作进入从服务器;

  • 客户端向服务器发起操作命令,服务器接收到请求一边写入到本地数据库文件里面,一边往Binlog日志里面写记录;

  • Binlog只会记录更新操作,不会记录查询操作;

  • 客户端会启动一个线程会去Binlog获取数据,并同步到从服务的Relay Log文件中;

  • Relay Log 写入的顺序和Binlog写入的顺序保持一致;

  • 从服务器上面另外有一个线程去观察log新增的命名,并获取数据记录到本地数据库文件;

  • Binlog只同步DML(update、delete、insert语句),不同步DDL(drop、alert、create语句);

  • 如果新增DDL语句需要手动在主从服务器上执行,如果不在从服务器上执行,会导致数据不一致的情况;

一主多从

一文了解MYSQL高可用

  • 通过复制的方式把主服务器的写操作同步至从服务器;

  • 从服务器只提供读操作,不提供写操作,也就是从服务不能同步至主服务器;

  • 一般场景只有读操作,报表系统或者分析师系统有复杂的逻辑就可以连接从服务操作数据;

  • 一主多从可以分摊负载,用更多的从服务器,接收更多的请求,增强系统的并发能力;

  • 专机专用,不同的从服务器提供的不同的业务场景,而不会所有的场景都是一个入口,每一个系统都有自己的从服务器;

  • 便于冷备热备,由于服务器宕机,或者是主服务器的数据文件损害,从服务器还会保存数据,不会导致数据丢失;

主主复制

一文了解MYSQL高可用

  • 两台服务器都是主服务器,数据可以从A服务器数据同步至B服务器,也可以将B服务器数据同步至A服务器;

  • 主主复制不仅有Binlog还有Relay Log,做数据双向同步;任何一台数据新增数据的时候,都会同步到另外一台服务器;

  • 从一台服务器的Binlog同步至Relay Log进行数据写入,这种场景不会在记录到写数据库的Binlog;

  • 客户端只写主服务器A,不写主服务B;不是解决双写的问题,而是解决主服务器宕机,可以快速切换的另外一台主服务器;

  • 如果出现双写会导致数据冲突,包装事务的原子性和隔离性;

主主失效恢复

一文了解MYSQL高可用

  • 当主服务器失效的时候,另外一台主服务器依然可以提供数据服务;

  • 每一个主服务器会有自己的从服务器,主服务器A不仅需要向主服务器B同步数据,也需要跟主服务器A的从服务器同步数据;

  • 正常访问是会请求主服务器A,当主服务器A失效之后,写操作会被发送到主服务器B;

  • 如果主服务器A正常使用,则主服器B是备机;如果A宕机则主服务器B是主服务器,A恢复之后,A就是备机;

  • 复制只是增加了数据的读并发能力,没有增加写并发能力和存储能力;

  • 更新表结构会导致巨大的同步延迟;

分布式数据库

数据分片

硬编码数据分片

一文了解MYSQL高可用

  • 这个是目前最简单的一种解决办法,在应用程序中解决分片的问题;

  • 数据分散在服务器1和服务器2,可以根据用户id取模,如果是奇数则发送至服务器2,如果是偶数则发送服务器1;

  • 这种场景需要服务支持多数据源操作,根据id判断需要连接哪一个数据源,进行操作;

映射表外部存储

一文了解MYSQL高可用

  • 在外部单独存储一个数据映射表,比如用户id和服务器编号的映射关系;

  • 外部请求时,会根据id在映射表查找映射关系,并获取数据库服务器,然后进行操作;

  • 外部数据映射相比于硬编码更加灵活,可以维护不同的主键,比如用户id、账号、商品ID等;

  • 但是外部数据会新增一次多余的数据查找,这时就需要考虑缓存;大数据做映射表也增加的系统的复杂度;

分布式数据库中间件

mycat

一文了解MYSQL高可用

  • mycat是面向应用程序的中间件,由数据库中间件对数据进行路由;

  • 需要在mycat配置对应的路由规则,比如省份为wuhan的请求db1;

  • 数据分片和路由的功能由中间件mycat提供;

ShardingSphere

一文了解MYSQL高可用

  • 是一套开源的分布式数据库中间件解决方案组成的生态圈;

  • 提供标准化的数据分片、分布式事务和数据库治理功能;

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

  • 需要应用程序集成sharding插件,并需要自己实现分片规则;