如下图所示:上述方案,乍一看似乎没什么问题了,但仔细分析,还是有可能导致缓存数据的不一致。例如,在更新请求加分布式锁之前,恰好有一个查询请求获取分布式锁,而此时是没有锁的,所以它可以继续更新缓存。但就在他更新缓存之前,线程 block 了,此时更新请求来了,加了分布式锁,并删除了缓存。当更新请求完成操作后,查询请求的线程活过来了,此时它再执行更新缓存,就把脏数据写到缓存中了。发现没有?主要的问题症结就在于“删除缓存”和“更新缓存”发生了并发冲突,只要将它们互斥,就能解决问题。如下图所示:实施了缓存方案后,经统计,缓存命中率 90%+,极大缓解了 ES 的压力,会员系统整体性能得到了很大提升。| Redis 双中心多集群架构接下来,我们看一下如何保障 Redis 集群的高可用。如下图所示: 关于 Redis 集群的高可用,我们采用了双中心多集群的模式。在机房 A 和机房 B 各部署一套 Redis 集群。更新缓存数据时,双写,只有两个机房的 Redis 集群都写成功了,才返回成功。查询缓存数据时,机房内就近查询,降低延时。这样,即使机房 A 整体故障,机房 B 还能提供完整的会员服务。高可用会员主库方案上述讲到,全平台会员的绑定关系数据存在 ES,而会员的注册明细数据存在关系型数据库。最早,会员使用的数据库是 SqlServer,直到有一天,DBA 找到我们说,单台 SqlServer 数据库已经存储了十多亿的会员数据,服务器已达到物理极限,不能再扩展了。按照现在的增长趋势,过不了多久,整个 SqlServer 数据库就崩了。你想想,那是一种什么样的灾难场景:会员数据库崩了,会员系统就崩了;会员系统崩了,全公司所有业务线就崩了。想想就不寒而栗,酸爽无比,为此我们立刻开启了迁移 DB 的工作。| MySQL 双中心 Partition 集群方案经过调研,我们选择了双中心分库分表的 MySQL 集群方案,如下图所示:会员一共有十多亿的数据,我们把会员主库分了 1000 多个分片,平分到每个分片大概百万的量级,足够使用了。MySQL 集群采用 1 主 3 从的架构,主库放在机房 A,从库放在机房 B,两个机房之间通过专线同步数据,延迟在 1 毫秒内。会员系统通过 DBRoute 读写数据,写数据都路由到 master 节点所在的机房 A,读数据都路由到本地机房,就近访问,减少网络延迟。这样,采用双中心的 MySQL 集群架构,极大提高了可用性,即使机房 A 整体都崩了,还可以将机房 B 的 Slave 升级为 Master,继续提供服务。
上述方案,乍一看似乎没什么问题了,但仔细分析,还是有可能导致缓存数据的不一致。
例如,在更新请求加分布式锁之前,恰好有一个查询请求获取分布式锁,而此时是没有锁的,所以它可以继续更新缓存。
但就在他更新缓存之前,线程 block 了,此时更新请求来了,加了分布式锁,并删除了缓存。当更新请求完成操作后,查询请求的线程活过来了,此时它再执行更新缓存,就把脏数据写到缓存中了。
发现没有?主要的问题症结就在于“删除缓存”和“更新缓存”发生了并发冲突,只要将它们互斥,就能解决问题。
实施了缓存方案后,经统计,缓存命中率 90%+,极大缓解了 ES 的压力,会员系统整体性能得到了很大提升。
接下来,我们看一下如何保障 Redis 集群的高可用。
关于 Redis 集群的高可用,我们采用了双中心多集群的模式。在机房 A 和机房 B 各部署一套 Redis 集群。
更新缓存数据时,双写,只有两个机房的 Redis 集群都写成功了,才返回成功。查询缓存数据时,机房内就近查询,降低延时。这样,即使机房 A 整体故障,机房 B 还能提供完整的会员服务。
高可用会员主库方案
上述讲到,全平台会员的绑定关系数据存在 ES,而会员的注册明细数据存在关系型数据库。
最早,会员使用的数据库是 SqlServer,直到有一天,DBA 找到我们说,单台 SqlServer 数据库已经存储了十多亿的会员数据,服务器已达到物理极限,不能再扩展了。按照现在的增长趋势,过不了多久,整个 SqlServer 数据库就崩了。
你想想,那是一种什么样的灾难场景:会员数据库崩了,会员系统就崩了;会员系统崩了,全公司所有业务线就崩了。想想就不寒而栗,酸爽无比,为此我们立刻开启了迁移 DB 的工作。
会员一共有十多亿的数据,我们把会员主库分了 1000 多个分片,平分到每个分片大概百万的量级,足够使用了。
MySQL 集群采用 1 主 3 从的架构,主库放在机房 A,从库放在机房 B,两个机房之间通过专线同步数据,延迟在 1 毫秒内。
会员系统通过 DBRoute 读写数据,写数据都路由到 master 节点所在的机房 A,读数据都路由到本地机房,就近访问,减少网络延迟。
这样,采用双中心的 MySQL 集群架构,极大提高了可用性,即使机房 A 整体都崩了,还可以将机房 B 的 Slave 升级为 Master,继续提供服务。
服务热线
1391-024-6332