Redis 经典案例分析:消失的连接

一、写在前面的话

Redis作为如今托管平台最重要的服务之一,几乎OMG所有的线上业务多多少都在使用Redis,那么其稳定性和维护的高效性必然成为我们所关注的一个重要的问题,在【Redis经典案例分析】这一专题中,我将与大家一起学习关于Redis维护的相关内容,把真是业务环境中遇到的维护问题与大家分享,共同积累Redis维护的经验,提高托管平台Redis服务的高效和可靠性。

二、案例分析

1、案例的由来

A是最早接入托管Redis平台的业务,其使用的旧的Redis服务机制(下图左),故存在无法多IDC自动同步数据和监控项不完善的一系列痛点,其数据只能依靠多地复写的方式,保证各个IDC内数据的一致性,各IDC间数据不要进行严格的一致性校验,容易造成数据一致性出错的现象。

在新的Redis服务机制中(上图右),通过改造同步机制,实现了多IDC自动同步的机制(理论上支持任何一地写入,自动多IDC同步),使得业务在写入数据时只需要单点写,多地自动通过内置的同步自己进行同步和校验,严格的保证了数据一致性。

2、出现的问题

正常来说当我们迁移一地以后,会先确定数据的一致性,接着进行其他两地的自动同步,但是在进行A业务从旧架构到新架构改造过程中,当我们迁移完成一地之后,进行验证时,业务反馈其数据出现了不一致的现象,即写入的部分数据,无法获取的情况。

三、思路和方法

简单来说,问题就是在迁移完之后的架构中数据的同步出现了问题。下面来我们一起来一步一步的排查下这个问题:

1、自查---迁移操作出错?

可以检查下再执行搬迁操作时候的操作流程是否出错,其中特别注意在手动slaveof数据的时候各“”格子“的一一对应关系是否有错。

2、同步机制---机制有BUG?

检查一下是否迁移后的业务可以正常的进行多地IDC同步。方法如下:

①首先分别在深圳、上海、天津的proxy中get一个key,确认其不存在(value值为nil);

②接着在深圳的proxys上set这个key value;

③分别在上海和天津两地的proxy上get刚刚写入的key,如果均可以得到正确的value值,即说明其同步机制并没有问题。

3、中间件---名字服务配置和解析?

①配置问题

在ons.webdev.com中查看名字服务(读名字、写名字)的关联IP是否已经修改,删除旧IP(或是权重为0),添加新IP。【IP数量较多时需要仔细更改和核对,避免重蹈我的覆辙,一眼花,漏改了一个,结果就悲剧了,现在心情极度低落】

②解析问题

关于解析名字服务的问题,这里就介绍两种常见的方式:

a. 第一种(只能检查名字服务本身在IP的配置同步上出现问题):

zkname 名字

由于名字下IP过多,这个命令时随机返回IP,应该大量多次的执行该命令,查看解析出的IP地址是否是配置过的IP,是否会出现已经删除或者不属于该业务的IP。

b. 第二种(可以同时检查业务使用的解析逻辑)

在旧业务上添加扩几个新的proxy(为了减小对业务的影响,数量应与原先的proxy一致),通过调整原先所有的proxy的权重(调整为0),观察业务此时的数据是否能保证一致性。

4、业务源头---使用不规范?

①是否有长链接【这一步应该最排查】

在旧业务机器上(为了保险起见,防止原先业务直接连接redis的IP,在proxy和redis上均检查),通过netstat -anp | grep 端口 ,查看一下是否还有长链接,如果有,那么很有可能不同步的问题是由于业务此时还是用其链接将数据写在旧的机器上,造成新机器中没有此数据。

②业务写入不规范

当你排查完操作流程、同步机制的问题以后,如果还是无法解决,那么此时就不要太难为自己了,很可能问题压根就出现在业务的写入逻辑或者代码逻辑上。

正常来说当我们迁移一地以后,会先确定数据的一致性,的业务逻辑如下:

此时正常情况,当业务向已经迁移的”深圳“写入数据时,是不存在数据不一致的现象,但如果业务的写入流程是下图这样,就会出现问题了。此时业务写入的数据由一部分将写到“上海“和“天津”中,这样就造成了数据的不一致。

         

四、经验分享

由于开发使用读写名字的不定性,为了防止这一种虽然看似简单,但却隐藏的十分好的原因,同时又因为在没确定数据一致性的情况下,不能轻易配置自动多IDC同步,那么在验证一地数据一致性的时候切记,可以先将原先的读名字中其他地方的IP权重调为0,然后进行数据一致性校验。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2830
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7026
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2767
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5408
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

5858
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5218
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2916
来自专栏魂祭心

原 canvas绘制clock

5074
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3005
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3278

扫码关注云+社区