TiDB故障处理之让人迷惑的Region is Unavailable

背景

最近某集群扩容了一批物理机,其中 TiKV 节点有6台机器12个实例,同时调整了 label 设置增加了一层机柜级容灾。因为前期做了比较充分的准备工作,到了变更窗口只等着执行scale-out就行,操作过程也很顺利,很快就把所有节点都扩进去了,检查完各实例的运行状态,确保region已经开始正常调度,就放心去睡觉了(半夜变更,结束时凌晨1点左右)。

第二天一大早还在上班路上,业务方反馈数据库有部分SQL报错Region is Unavailable,怀疑新扩容的 TiKV 节点出了问题,火速赶到公司开始排查。

此时内心os,打工人1024不加班的小小心愿要破灭了。。🤣

故障现象

业务方反馈的报错信息如下:

Weixin Image_20231030211323.png

其实Region is Unavailable不算什么疑难杂症,从过往经验来判断基本是 TiKV 节点的原因,从字面意思上看就是region在某段时间内不可用,可能的因素有:

  • region leader在调度中,或者无法选举出leader(会有内部backoff)

  • tikv实例繁忙被限流,同步可能会有 TiKV server is busy报错

  • tikv实例故障挂掉了,同步可能会有 TiKV server is timeout报错

  • 其他tikv未知问题或bug等

前三种基本能覆盖90%以上的场景,所以我一开始还是从tikv着手排查。

但是让人迷惑的是,各种分析下来最后发现和tikv没有关系,这就是最有意思的点。🙈

好戏开始。

排查过程

首先检查前一天晚上扩容的12个tikv实例运行状态,分析监控和日志并未发现有异常现象,无重启,各节点负载也很低不存在性能瓶颈。

接着怀疑是偶发性报错,因为region还处于调度中(到这里感觉到了调度不太正常,比预期中的要慢),偶发性还是有可能的,另外通过监控面板failed query OPM发现tikv:9005报错码只是零星出现,也不排除这种可能性。

验证方式:从dashboard日志搜索中找出具体报错的SQL,直接用报错码搜索即可:

企业微信截图_20231024115854.png

把SQL拿出来尝试手动执行,发现也报同样的错,多次执行效果一样。于是怀疑这张表的region有副本丢失,打算用show table regions看下这张表的region分布,发现了一个奇怪的报错:

企业微信截图_20231024114525.png

从报错信息看,在执行show table regions的时候tidb server去请求了pd的一个API,这个API是作用是查询region id为xxx的详细信息,但是无法访问pd节点。跟着报错信息,我去检查了这个pd节点的状态,发现没有任何异常,服务正常运行未发生过重启。

接着我进去pd-ctl用报错的region id查询region信息,也能够正常返回,确认pd节点正常。

退出客户端,手动执行curl API,报错依旧,telnet测试报错pd实例,无法连接,然后把三个pd都telnet了一遍,发现只有这一个pd无法访问,异常诡异,初步怀疑网络有问题。

但是扩容前网络环境都检查过都是联通状态,而且都在同一个网段中,不应该有网络故障。

接着转头去看那个连接不上的pd节点日志,跟踪了一段时间发现绝大部分都是region调度的信息,但是一点一点翻发现中间偶尔出现operator timeout的字样,认真把日志读了几遍总算看清楚了它说的啥,大意就是在两个store之间mv peer超时(应该是10min)失败了:

企业微信截图_20231024114813.png

期间并没有发现pd自身运行异常问题,回想起前面的调度慢,猜测应该和这个现象有关,貌似和Region is Unavailable有一点点沾边了,但还不能完全解释过去,继续怀疑网络。

吐槽:给个WARN日志是不是好点

接着命令行登录原有的tidb实例,再次执行报错的SQL和show table regions,神奇的事情发生了,均能够正常返回。再换另一台新扩的tidb节点执行,报错依旧。

到这里基本判定是新扩进来的tidb实例有问题,此时距离故障出现超过2小时,业务方开始着急了,无奈之下只能把新扩的tidb实例从负载均衡中剔除临时绕过,详细原因进一步排查。

重新梳理了一下思路,我们都知道正常select查询和show table regions都需要从pd获取表的region分布信息,这个请求是从被连接的tidb server上发起的,现在奇怪的地方是新扩容的tidb server无法访问pd,原有的可以访问,那说明极有可能是新节点被限制访问了。

登录pd节点查看防火墙状态,是关闭状态,进一步检查发现iptables服务开启,查看配置规则后虎躯一震:

企业微信截图_20231024120329.png

这简直是在不亚于在代码里下毒啊,所有tidb集群相关的通信端口全都显式地做了限制,只允许原集群的5台机器访问,做了也不算啥,偏偏有的做有的不做,这就有点坑了。。。而且这台机器上还部署了2个tikv实例,那前面operator timeout也说的通了。

至此复盘一下问题:原集群某些节点设置iptables规则,限制集群外的节点无法与tidb内部服务通信,新扩容的机器并不知道有这个限制,导致新扩容的tidb server无法从pd获取region信息,连接到新tidb server的会话无法读到region,抛出Region is Unavailable报错。同时该节点上的tikv实例无法与新扩容的tikv实例通信,导致region调度受影响,直观感受是调度非常慢。

回过头再看,还好故障比较简答,1024算是保住了。

解决方案

经过各方沟通,得知iptables是为了解决早期某安全漏扫问题设置,现在也没办法直接关掉。那么解决办法就只有一条路,把新扩容的所有机器ip都加到iptables白名单里即可,顺便也检查了原有的5台机器iptables设置情况,该加的都加上。

vi /etc/iptables.rules
systemctl restart iptables

调整完毕后重新用客户端登录新扩容的tidb server执行SQL,发现一切都恢复正常了。

同时region迁移也明显加速,修改前:

企业微信截图_20231030225918.png

修改后:

企业微信截图_20231024113845.png

企业微信截图_20231024115104.png

企业微信截图_20231024115135.png

总结

看似一个简单的操作就解决了问题,实际背后隐藏了很多工作在里面,碰到问题不可怕,重要的是要有清晰的思路,综合运用自己的经验。

就像有个故事里说的,知道在哪画线比会画线更值钱,troubleshooting就是核心竞争力。

文章转载自:balahoho

原文链接:https://www.cnblogs.com/hohoa/p/17932468.html

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307091.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lumerical------按键中断程序执行

Lumerical------中断程序执行 引言正文 引言 在 Lumerical 中,很多时候我们需要通过 sweep 的方式来获取我们想要的结果,然而,有时候当我们运行程序后发现书写的脚本有问题时,我们想要强行终止程序的执行,该怎么办呢&…

C#中的Attribute详解(上)

C#中的Attribute详解(上) 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多…

【QT】QStringListModel类的应用介绍

目录 1 概述 2 QStringListModel常用方法 3 使用QStringListModel的步骤 4 QStringListModel的使用 4.1 Model/View结构对象和组件初始化 4.2 编辑、添加、删除项的操作 4.3 以文本显示数据模型的内容 4.4 其他功能 1 概述 QStringListModel用于处理字符串列表的数据模型…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网,根据自己环境下载go安装包,我这里为Windows 2.双击安装包,一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】,点击…

2024年第四届电气、电子与信息工程国际会议(ISEEIE 2024) | Ei&Scopus双检索

会议简介 Brief Introduction 2024年第四届电气、电子与信息工程国际会议(ISEEIE 2024) 会议时间:2024年9月26日-28日 召开地点:英国莱斯特(Leicester, UK) 大会官网:www.iseeie.org 2024年第四届电气、电子与信息工程…

器件的静态特性

器件的静态特性 静态特性(伏安特性) 1.器件在导通或关断的状态下,其电压与电流对应关系。 2.静态过程体现器件最基本的电压与电流稳态特性。 动态特性(开关特性) 1.器件在开或关过程中,其电压、电流随时…

7.7复原IP地址(LC93-M)

算法: 根据题意 有效的 IP 地址 : (1)由四个整数构成 (2)每个整数位于 0 到 255 之间 (3)每个整数不能含有前导 0,如011、021等,但是可以有单独的一个“…

使用Jenkins和单个模板部署多个Kubernetes组件

前言 在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个YAML模板文件(.tpl)来部署多个类似的…

Android Studio 如何实现软件英文变中文教程

目录 前言 一、确认版本号 二、下载汉化包 三、汉化包安装 四、如何实现中英文切换 五、更多资源 前言 Android Studio是一款功能强大的集成开发环境(IDE),用于开发Android应用程序。默认情况下,Android Studio的界面和…

使用云渲染节省成本与提升渲染速度的秘诀

我们在提交效果图到云渲染平台时,有时会因为各种原因,如不小心设置错了参数,导致渲染时间变长,渲染费用增加。这不仅增加了项目的成本,还可能影响到整个项目的进度。面对这一问题,炫云提供了小光子、保守优…

【数据结构和算法】---二叉树(2)--堆的实现和应用

目录 一、堆的概念及结构二、堆结构的实现2.1堆向下调整算法2.2堆向上调整算法2.3删除堆顶元素2.4插入元素2.5其他函数接口 三、堆结构的应用3.1堆排序3.2Top-k问题 四、堆概念及结构相关题目 一、堆的概念及结构 如果有一个数字集合,并把它的所有元素按完全二叉树…

最新微信投票平台系统源码 一键创建各种投票活动 盈利模式强大

随着社交媒体的普及,微信已经成为人们日常生活中不可或缺的一部分。而微信投票平台源码,作为一种基于微信平台的投票工具,以其简单易用、功能强大的特点,在各种活动和竞赛中被广泛应用。今天给大家分享一款可商用的微信投票平台系…