赞
踩
ps:啥叫做数据的分片?
我们以MySQL为例介绍一下主从复制。
MySQL 自带主从同步的功能,经过简单的配置就可以实现一个主库和几个从库之间的数据同步,部署和配置的方法
MySQL的主从复制是依赖于binlog的,也就是记录MySQL上的所有变化并以二进制式保存在磁盘上二进制日志文件。主从复制就是将binlog中的数据从主从传输到从库上,一般这个过程是异步的,即主库上的操作不会等待binlog同步的完成。
主从复制的过程是这样的:
在这个方案中,使用独立的log dump线程是一种异步的方式,可以避免对主库的主体更新流程产生影响,而从库在接受到信息后并不是写入从库的存储中,而是写入一个relay log。是避免写入从库实际存储会比较耗时,最终造成主库和从库延迟变长。
你会发现,基于性能的考虑,主库的写入流程并没有等待主从同步完成就会返回结果,那么在极端的情况下,比如说主库上binlog还没有来得及刷新到磁盘上就出现了磁盘损坏或者机器掉电,就会导致binlog的丢失,最终造成主从数据的不一致。不过,这种情况出现的概率很低,对于互联网项目来说是可以容忍的。
做了主从复制之后,我们就可以在写入时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行。同时,在读流量比较大的情况下,我们可以部署多个从库共同承担读流量,这就是”一主多从“部署方式。另外,从库也可以当作一个备库来使用,以避免主库故障导致数据丢失。
那么,是不是无限制的增加从库的数量就可以抵抗住大量的并发呢?不是。因为随着从库数量的增加,从库连接上来的IO线程比较多,主库也需要创建同样多的log dump线程来处理复制的请求,对于主库资源消耗比较高,同时受限于主库的网络带宽,所以在实际使用时,一般一个主库最多3~5个从库。
主从复制的缺陷:
但是我们应该怎么设计方案来容忍这个主从同步延迟呢?
这种问题其实没什么好的技术手段来解决,所以你看大的电商,它支付完成后是不会自动跳回到订单页的,它增加了一个无关紧要的“支付完成”页面,其实这个页面没有任何有效的信息,就是告诉你支付成功,然后再放一些广告什么的。你如果想再看刚刚支付完成的订单,需要手动点一下,这样就很好地规避了主从同步延迟的问题。也就是说需要手动刷新。
我们需要特别注意的,是那些数据更新后,立刻需要查询更新后的数据,然后再更新其他数据这种情况。比如说在购物车页面,如果用户修改了某个商品的数量,需要重新计算优惠和总价。更新了购物车的数据后,需要立即调用计价服务,这个时候如果计价服务去读购物车的从库,非常可能读到旧数据而导致计算的总价错误。对于这个例子,可以把“更新购物车、重新计算总价”这两个步骤合并成一个微服务,然后放在一个数据库事务中去,同一个事务中的查询操作也会被路由到主库,这样来规避主从不一致的问题。
对于这种主从延迟带来的数据不一致的问题,没有什么简单方便而且通用的技术方案可以解决,我们需要重新设计业务逻辑,尽量规避更新数据后立即去从库查询刚刚更新的数据。核心思想就是尽量不去从库中查询信息。
比如有个场景,在发微博的过程中会有些同步的操作,像是更新数据库的操作,也有一些异步的操作,比如说将微博的信息同步给审核系统,所以我们在更新完主库之后,会将微博的ID写入消息队列,再由队列处理机根据ID在从库中获取微博信息再发送给审核系统。此时如果主从数据库存在延迟,会导致再从库中获取不到微博信息,整个流程就会出现异常。
具体怎么做呢?
我们已经使用主从复制的技术将数据复制到了多个节点,也实现了数据库的读写分离。这时,对于数据库的使用方式发生了变化。以前只需要使用一个数据库地址就好了,现在需要使用一个主库地址和多个从库地址,并且需要区分写入操作和查询操作,复杂度提升了很多。
为了降低实现的复杂度,业界涌现了很多数据库中间件来解决数据库的访问问题,这些中间件可以分为两类。
当然,你可以纯手动方式分离持续的读写请求:
如果你配置了多个从库,推荐使用“HAProxy+Keepalived”,来给所有的从节点做一个高可用负载均衡方案,既可以避免某个从节点宕机导致业务可用率降低,也方便你后续随时扩容从库的实例数量。
其实,我们可以把主从复制引申为存储节点之间互相负责存储数据的技术,它可以实现数据的冗余,以达到备份和提升横向扩展能力的占用。在使用主从复制这个技术是,需要考虑如下问题:
如果你的方案种部署了多个从库,推荐用“HAProxy+Keepalived”来做这些从库的负载均衡和高可用,这个方案的好处是简单稳定而且足够灵活,不需要增加额外的服务器部署,便于维护并且不增加故障点。
我们采用的很多组件都会使用到这个技术,比如,Redis 也是通过主从复制实现读写分离;Elasticsearch 中存储的索引分片也可以被复制到多个节点中;写入到 HDFS 中文件也会被复制到多个 DataNode 中。只是不同的组件对于复制的一致性、延迟要求不同,采用的方案也不同。但是这种设计的思想是通用的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。