keepalive切换时redis的长连接和短连接的影响-2018-1-3

一、redis的VIP结构

VIP地址:172.15.7.244(默认绑定在172.15.7.3机器)

1)172.15.7.3:安装haproxy、keepalive服务,master节点,正常提供服务,权重因子为90,间隔2秒检测一次haproxy进程,若失败,则权重因子减20

2)172.15.7.9:安装haproxy、keeplaive服务,backup节点,3正常时候不提供服务,权重因子为80,间隔2秒检测一次haproxy进程,若失败,则权重因子减20

3)haproxy、supervisord、keepalive 都是由systemd来单独管理的。

二、操作 172.15.7.3 机器

1、修改/lib/systemd/system/supervisord.service文件,增加如下参数:

    LimitCORE=infinity

    LimitNOFILE=655360

    LimitNPROC=131072

2、通过重启supervisord进程

    命令:sudo systemctl restart supervisord

3、产生的问题

    1)keepalived的vip切换

        172.15.7.3(主):2017.12.25 22:45:42秒,VIP地址从网卡删除;2017.12.25 22:45:51秒,VIP地址绑定网卡;

        172.15.7.9(备):2017.12.25 22:45:43秒,VIP地址绑定网卡;2017.12.25 22:45:48秒,VIP地址从网卡删除;

    2)由于VIP切换,导致应用连接redis的VIP地址产生如下错误:   

File "/usr/lib/python2.7/site-packages/redis/client.py", line 578, in execute_command
connection.send_command(args)
File "/usr/lib/python2.7/site-packages/redis/connection.py", line 563, in send_command
self.send_packed_command(self.pack_command(
args))
File "/usr/lib/python2.7/site-packages/redis/connection.py", line 538, in send_packed_command
self.connect()
File "/usr/lib/python2.7/site-packages/redis/connection.py", line 442, in connect
raise ConnectionError(self._error_message(e))
ConnectionError: Error connecting to 172.17.9.244:6379. timed out.

三、重启supervisord造成keepalive的VIP切换问题分析

在测试机器上搭建了supervisord的环境,并部署了hammal应用,重现了线上的问题。新写个脚本,利用tornado创建1400个进程,同样能复现问题;把keepalive的check脚本的间隔由2秒修改1秒,复现问题的几率非常大。从测试的效果可以得出一些结论:

1)supervisord管理的进程数较多时,通过systemctl stop supervisord,会造成ps的命令执行时间变长,测试中有时都超过1秒(也有可能造成系统其他命令执行时间变长);

2)通过supervisordctl stop 任务,关闭任务大概要16-20秒,而通过systemd stop supervisord,大概在3秒就可以关闭。查看supervisord关闭进程源码,关闭进程时会double check进程的关闭结果,所以可能会慢,作者也增加了注释;

3)supervisord中没有任何进程,或者只有几十个进程,不会重现问题;

4)把keepalive的check时间间隔修改为1秒,无论是否修改/lib/systemd/system/supervisord.service的参数,都能重现问题;

5)supervisord.service中只能使用fork模式,而不能使用simple模式;使用simple模式,supervisord启动后进程会自动退出;

6)在执行systemctl stop supervisord时,通过strace -p $pid,没有发现执行特别慢的system call;

7)systemd管理supervisord时,若supervisord中的进程数较多时(如大于635个进程),通过systemd重启supervisord可能造成系统指令变慢,如ps;

疑问:为什么在supervisord管理进程较多时,systemctl stop supervisord命令会造成系统ps命令变慢,还没有找到根本原因,以后使用过程中需要注意。

四、VIP切换时,应用连接redis的vip报time out问题分析

1、VIP出现问题时,gb后端业务有binserver和executor两类服务连接VIP地址,结构如下:
1.jpg
2、分析VIP出现问题时的日志

    1)长连接的binserver没有受到影响,只在2017.12.25 22:45:50秒出现一个timeout reading from socket的错误,没有其他错误;

    2)e1机器:只在2017.12.25 22:45:42秒,48秒和49秒,出现3个“ConnectionError: Error connecting to 172.17.9.244:6379\. timed out.”

错误,其他时间段没有错误。而修改host中的VIP地址映射的时间是在: 22:52:10秒时修改的(当时看到e2机器出现好多连接redis的time out错,第一解决办法是修改两台机器的hosts的VIP映射)。

    3)e2机器:从2017.12.25 22:45:42开始出现“ConnectionError: Error connecting to 172.17.9.244:6379\. timed out.”,持续到 2017.12.25 22:51:34秒,持续近6分钟,修改hosts的VIP映射时间为:2017.12.25 22:51:17秒;

3、在本地搭建VIP环境,与线上环境一致,测试VIP的长连接和短连接在VIP发生切换时可能会出现什么问题。

4、VIP切换时长连接会出现:

    1)先报"ConnectionError: Error 111 connecting to test_redis_vip:16379\. Connection refused”错,接着是报“ConnectionError: Error connecting to test_redis_vip:16379\. timed out.”错

    2)过几秒钟后,自动重新建立连接,访问VIP正常

5、VIP切换时短连接会出现:

    1)只会出现“ConnectionError: Error connecting to :16379\. timed out.”错      

6、测试产生“Connection refused” 和 “ConnectionError timed out“的错误

    1)Connection refused错:是访问的VIP地址存在,只是该机器没有开放所访问的port

    2)“ConnectionError: Error connecting to test_redis_vip:16379\. timed out.”错:是没有找到VIP的地址,连接redis时给的地址找不到时会报这个错

3、分析得出的一些结论

1)VIP切换时,无论redis是长连接还是短连接,都会出现”ConnectionError xxx timed out“的错误,VIP做不到完美的切换主备服务,需要服务能够容忍短暂的超时;

2)从上面的日志来看,VIP第一次从7.3切换到7.9后,接着VIP又从7.9切换到7.3,executor的e1机器连接正常,e2机器从第一次切换时就连接不上redis的VIP。e2机器与e1机器的不同处在于:e2机器比e1机器多一些python任务。(本地搭建环境没有重现该错误)

3)结合测试造成”timed out“的错误的实验,可以判断出当时e2机器是无法找到VIP的地址,VIP切换时会发送VIP的arp报文,看起来像是e1机器更新了arp cache,e2机器没有arp cache。现在e1和e2机器的arp cache中VIP地址是一样的,也可以连接上VIP。

4)结合12.27号下午17点18分,出现专网回调greenbay的gw地址时,返回的http状态码为404,后通过执行arp广播vip地址解决(此时VIP没有发生切换,在两台VIP机器上可以ping通VIP地址,在第三台机器上ping不通VIP地址)。两个案例结合来看,VIP在使用过程中,需要使用第三台机器来检测VIP地址。

五、一些想法

1、keepalived通过ps -ef haproxy|wc -l 来定时check,现在是间隔2秒检测一次,检测一次失败就切换VIP,这个策略不太合适,需要调整;

2、keepalive的check间隔需要调整的稍微大一些,比如4秒,2次check失败之后再执行VIP;

3、VIP切换到新的机器节点后,即使原来的机器haproxy服务已经恢复,也不执行切换,VIP直接在该机器上提供服务,除非人为手动执行切换或该节点出现问题;

4、keepalive没有记录日志的问题,没有找到具体的原因(很难重现,只有在第一次安装keepalive第一次启动时可能重现),在部署keepalive环境时,部署完成后,执行start-stop-start操作,同时通过log命令检测日志是否能正确记录;

5、keepalive需要提供第三台机器来检测VIP地址是否有效,无效时需要执行相关的arp操作;

6、keepalive切换会有短暂的无法提供服务时间,需要服务能够容忍这段时间;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350