• 产品与解决方案
  • 行业解决方案
  • 服务
  • 支持
  • 合作伙伴
  • 关于我们

H3C 统一数字底盘故障处理手册-E7xxx-5W108

手册下载

H3C 统一数字底盘故障处理手册-E7xxx-5W108-整本手册.pdf  (2.90 MB)

  • 发布时间:2025/7/7 23:47:36
  • 浏览量:
  • 下载量:

统一数字底盘

故障处理手册

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

资料版本:5W108-20250707

 

Copyright © 2025 新华三技术有限公司 版权所有,保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。

除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。

本文档中的信息可能变动,恕不另行通知。


 

1 简介·· 1

1.1 故障处理注意事项·· 1

1.2 收集故障运行信息·· 1

1.2.1 运行日志收集方式·· 1

1.2.2 部署/升级日志收集方式·· 2

1.3 运行时数据收集方式·· 3

1.4 故障处理求助方式·· 4

2 操作系统处理·· 5

2.1 强制断电,导致服务器重启后操作系统XFS分区损坏,系统异常·· 5

2.1.1 故障描述·· 5

2.1.2 故障处理步骤·· 5

2.2 CAS将引导模式设置为UEFI以部署NingOS系统,系统启动时会概率进入GRUB界面。·· 5

2.2.1 故障描述·· 5

2.2.2 故障处理步骤·· 6

3 集群节点异常故障处理·· 7

3.1 集群节点服务器硬件故障无法恢复,必须更换节点服务器·· 7

3.1.1 故障描述·· 7

3.1.2 故障处理步骤·· 7

3.2 集群节点异常导致统一数字底盘服务不可用·· 7

3.2.1 故障描述·· 7

3.2.2 故障处理步骤·· 8

3.3 磁盘空间不足导致容器运行异常,一直处于Evicted状态·· 9

3.3.1 故障描述·· 9

3.3.2 故障处理步骤·· 9

3.4 修改集群网络模式失败·· 9

3.4.1 故障描述·· 9

3.4.2 故障处理步骤·· 9

3.5 Matrix升级后,kube-apiserverkube-schedulerkube-controller-manager服务异常·· 10

3.5.1 故障描述·· 10

3.5.2 故障处理步骤·· 10

3.6 系统节点长时间断电或异常致其他节点SeaSQL数据目录占用大量磁盘空间·· 11

3.6.1 故障描述·· 11

3.6.2 故障处理步骤·· 11

3.7 灾备环境主站点网络断开一段时间再恢复后,主站点中的部分节点状态为NotReady、大量Pod异常·· 12

3.7.1 故障描述·· 12

3.7.2 故障处理步骤·· 12

4 集群拒绝所有访问Matrix服务故障处理·· 13

4.1 安全策略配置为全部拒绝后,集群拒绝所有访问Matrix服务的请求·· 13

4.1.1 故障描述·· 13

4.1.2 故障处理步骤·· 13

5 密码错误导致登录Matrix失败故障处理·· 14

5.1 admin用户输入错误的密码导致登录Matrix失败·· 14

5.1.1 故障描述·· 14

5.1.2 故障处理步骤·· 14

5.2 admin之外的其他用户输入错误的密码导致登录Matrix失败·· 14

5.2.1 故障描述·· 14

5.2.2 故障处理步骤·· 14

6 默认路由丢失故障处理·· 16

6.1 使用ifconfig命令对网卡重启后默认路由丢失·· 16

6.1.1 故障描述·· 16

6.1.2 故障处理步骤·· 16

7 ETCD服务异常·· 17

7.1 ETCD服务启动失败或数据不一致·· 17

7.1.1 故障描述·· 17

7.1.2 故障处理步骤·· 18

7.2 ETCD非独立磁盘部署环境下,出现客户端请求超时或ETCD集群主备切换频繁·· 24

7.2.1 故障描述·· 24

7.2.2 故障处理步骤·· 25

8 Docker服务异常·· 26

8.1 执行Docker命令后长时间无响应·· 26

8.1.1 故障描述·· 26

8.1.2 故障处理步骤·· 26

8.2 页面显示Docker组件异常·· 26

8.2.1 故障描述·· 26

8.2.2 故障处理步骤·· 26

9 服务器下电重启或网络异常断开故障问题处理·· 28

9.1 节点所在服务器下电后重启,操作系统文件丢失·· 28

9.1.1 故障描述·· 28

9.1.2 故障处理步骤·· 28

9.2 节点所在服务器下电后重启或网络异常断开,Matrix依赖的文件丢失·· 28

9.2.1 故障描述·· 28

9.2.2 故障处理步骤·· 29

9.3 节点所在服务器下电后重启,页面中节点飘红、飘黄或监控页面Pod处于CreateContainerError状态·· 29

9.3.1 故障描述·· 29

9.3.2 故障处理步骤·· 29

9.4 节点所在服务器下电后重启,页面中节点飘红、飘黄或监控页面Pod处于异常状态·· 30

9.4.1 故障描述·· 30

9.4.2 故障处理步骤·· 30

9.5 节点所在服务器下电后重启,prometheus数据文件损坏导致Pod状态异常·· 31

9.5.1 故障描述·· 31

9.5.2 故障处理步骤·· 31

9.6 节点服务器断电重启,MACVLAN附加网络IPv6网卡不可用·· 31

9.6.1 故障描述·· 31

9.6.2 故障处理步骤·· 32

9.7 节点所在服务器下电后重启,使用附加网络的Pod反复重启·· 32

9.7.1 故障描述·· 32

9.7.2 故障处理步骤·· 32

9.8 集群节点所在服务器持续网络延迟,集群频繁切换主节点·· 33

9.8.1 故障描述·· 33

9.8.2 故障处理步骤·· 33

9.9 集群所在节点反复断电并重启后,访问Matrix页面出现卡顿和超时现象·· 33

9.9.1 故障描述·· 33

9.9.2 故障处理步骤·· 34

9.10 系统节点频繁断电重启或持续网络异常,导致Prometheus无法正常启动·· 35

9.10.1 故障描述·· 35

9.10.2 故障处理步骤·· 35

10 部署失败相关故障处理·· 36

10.1 集群部署失败,查看日志出现错误K8SINSTALL-ERROR· 36

10.1.1 故障描述·· 36

10.1.2 故障处理步骤·· 36

10.2 IPv6环境下,节点或现有网卡增加IP后,集群部署失败·· 36

10.2.1 故障描述·· 36

10.2.2 故障处理步骤·· 36

11 统一数字底盘页面无法访问·· 38

11.1 ETCD IO延迟导致处理请求缓慢·· 38

11.1.1 故障描述·· 38

11.1.2 故障处理步骤·· 38

11.2 密码丢失导致无法登录统一数字底盘·· 38

11.2.1 故障描述·· 38

11.2.2 故障处理步骤·· 38

11.3 Ext4文件系统损坏导致登录异常·· 39

11.3.1 故障描述·· 39

11.3.2 故障处理步骤·· 39

12 IP修改失败故障处理·· 40

12.1 在高级功能下虚IP修改失败·· 40

12.1.1 故障描·· 40

12.1.2 故障处理步骤·· 40

13 镜像损坏故障处理·· 41

13.1 镜像损坏·· 41

13.1.1 故障描述·· 41

13.1.2 故障处理步骤·· 41

13.2 镜像层校验失败·· 41

13.2.1 故障描述·· 41

13.2.2 故障处理步骤·· 42

14 异地容灾故障处理·· 43

14.1 主备断连后,在主站点上删除灾备系统,导致备站点上配置残留·· 43

14.1.1 故障描述·· 43

14.1.2 故障处理步骤·· 43

14.2 升主降备过程中,主备之间网络异常,导致降备站点无法访问·· 43

14.2.1 故障描述·· 43

14.2.2 故障处理步骤·· 43

14.3 自动倒换模式下出现备用站点接管成功,主用站点无法自动降备·· 44

14.3.1 故障描述·· 44

14.3.2 故障处理步骤·· 44

14.4 主备站点上的组件都是主用状态,业务异常·· 44

14.4.1 故障描述·· 44

14.4.2 故障处理步骤·· 44

14.5 创建异地容灾失败后,备站点服务异常·· 45

14.5.1 故障描述·· 45

14.5.2 故障处理步骤·· 45

15 SeaSQLCache相关故障处理·· 46

15.1 SeaSQLCache Persistent 实例单节点故障长时间不切主·· 46

15.1.1 故障描述·· 46

15.1.2 故障处理步骤·· 46

15.2 SeaSQLCache Persistent实例sentinel Pod不断重启·· 46

15.2.1 故障描述·· 46

15.2.2 故障处理步骤·· 46

15.3 SeaSQLCache Persistent在关闭一个节点后切换主节点失败·· 47

15.3.1 故障描述·· 47

15.3.2 故障处理步骤·· 47

15.4 SeaSQLCache Persistent实例服务端脑裂·· 48

15.4.1 故障描述·· 48

15.4.2 故障处理步骤·· 48

15.5 SeaSQLCache Persistent 实例哨兵脑裂·· 48

15.5.1 故障描述·· 48

15.5.2 故障处理步骤·· 48

16 Seaio相关故障处理·· 50

16.1 Seaio创建异地容灾失败·· 50

16.1.1 故障描述·· 50

16.1.2 故障处理步骤·· 50

16.2 Seaio从本地向服务端上传数据失败·· 51

16.2.1 故障描述·· 51

16.2.2 故障处理步骤·· 51

17 SeaSQL相关故障处理·· 52

17.1 SeaSQL实例可对外提供服务但有pod异常·· 52

17.1.1 故障描述·· 52

17.1.2 故障处理步骤·· 52

17.2 SeaSQL实例Running但无法对外提供服务·· 52

17.2.1 故障描述·· 52

17.2.2 故障处理步骤·· 52

17.3 从节点WAL日志删除或损坏引发的流复制异常·· 53

17.3.1 故障描述·· 53

17.3.2 故障处理步骤·· 53

17.4 SeaSQL Pod异常,无法启动·· 54

17.4.1 故障描述·· 54

17.4.2 故障处理步骤·· 54

17.5 业务连接时断时连·· 55

17.5.1 故障描述·· 55

17.5.2 故障处理步骤·· 55

17.6 Autovacuum失败导致表膨胀·· 56

17.6.1 故障描述·· 56

17.6.2 故障处理步骤·· 56

17.7 Pod 名称漂移导致出现两个Replica,但未sync standby· 57

17.7.1 故障描述·· 57

17.7.2 故障处理步骤·· 57

17.8 Matrix上修改IP后,SeaSQL异常·· 57

17.8.1 故障描述·· 57

17.8.2 故障处理步骤·· 57

17.9 SeaSQL卡在starting状态,无法启动成功·· 57

17.9.1 故障描述·· 57

17.9.2 故障处理步骤·· 58

17.10 两个从节点流复制都中断,手动全量修复失败·· 58

17.10.1 故障描述·· 58

17.10.2 故障处理步骤·· 59

18 seamq相关故障处理·· 61

18.1 系统断电或重启后seamq 实例状态异常·· 61

18.1.1 故障描述·· 61

18.1.2 故障处理步骤·· 61

18.2 服务器断电重启后,该服务器上部署的seamq实例反复重启·· 62

18.2.1 故障描述·· 62

18.2.2 故障处理步骤·· 62

18.3 集群中单节点丢包,导致业务消费seamq异常·· 63

18.3.1 故障描述·· 63

18.3.2 故障处理步骤·· 64

18.4 seamq实例Running但服务异常·· 64

18.4.1 故障描述·· 64

18.4.2 故障处理步骤·· 65

18.5 无效日志导致业务消费seamq异常,业务Pod反复重启·· 65

18.5.1 故障描述·· 65

18.5.2 故障处理步骤·· 66

19 SeaSQLPlus相关故障处理·· 67

19.1 由于日志或快照损坏,SeaSQLPluskeeper Pod会不断重启·· 67

19.1.1 故障描述·· 67

19.1.2 故障处理步骤·· 67

19.2 Seasqlplus-uc-shard因数据块损坏,Pod不断重启·· 67

19.2.1 故障描述·· 67

19.2.2 故障处理步骤·· 68

19.3 重建节点的Seasqlplus-*-shardacess相关SQL无法找到,导致SQL查询失败·· 68

19.3.1 故障描述·· 68

19.3.2 故障处理步骤·· 68

19.4 SeaSQLPlus因断电重启导致tablereadonly状态·· 69

19.4.1 故障描述·· 69

19.4.2 故障处理步骤·· 69

19.5 SeaSQLPlus应用组件安装失败提示REPLICA_ALREADY_EXISTS· 70

19.5.1 故障描述·· 70

19.5.2 故障处理步骤·· 70

20 PolarDB相关故障处理·· 71

20.1 集群状态异常,显示UNSYNC异常·· 71

20.1.1 故障描述·· 71

20.1.2 故障处理步骤·· 71

20.2 集群状态正常,但是备节点WAL日志堆积占用磁盘较大·· 72

20.2.1 故障描述·· 72

20.2.2 故障处理步骤·· 72

20.3 数据库实例正常,但数据库代理MaxScale异常·· 72

20.3.1 故障描述·· 72

20.3.2 故障处理步骤·· 72

20.4 SSH端口后,使用pdbcli查看PolarDB状态时出现异常·· 73

20.4.1 故障描述·· 73

20.4.2 故障处理步骤·· 73

20.5 已删除的数据库仍可通过代理连接,但继续使用时会出现错误·· 74

20.5.1 故障描述·· 74

20.5.2 故障处理步骤·· 74

20.6 节点断电重启后代理自愈时间较短导致出现异常·· 74

20.6.1 故障描述·· 74

20.6.2 故障处理步骤·· 74

21 OASIS相关故障处理·· 76

21.1 RabbitMQ部分QueueSlave无法同步数据·· 76

21.1.1 故障描述·· 76

21.1.2 故障处理步骤·· 76

22 SEANODB相关故障处理·· 77

22.1 Seanodb data node replica set id重置·· 77

22.1.1 故障描述·· 77

22.1.2 故障处理步骤·· 77

 


1 简介

本文档介绍统一数字底盘常见故障的诊断及处理措施。

1.1  故障处理注意事项

当出现故障时,请尽可能全面、详细地记录现场信息(包括但不限于以下内容),收集信息越全面、越详细,越有利于故障的快速定位。

·     记录您所使用的统一数字底盘版本、Matrix版本、操作系统版本。

·     记录具体的故障现象、故障时间、配置信息。

·     记录完整的网络拓扑,包括组网图、端口连接关系、故障位置。

·     收集日志信息和诊断信息(收集方法见1.2  收集故障运行信息)。

·     记录现场采取的故障处理措施及实施后的现象效果。

1.2  收集故障运行信息

您可以通过如下步骤,收集统一数字底盘的运行信息。

1.2.1  运行日志收集方式

(1)     在浏览器中输入统一数字底盘GUI的登录地址(格式为:http://ip_address:30000/central/index.html),回车后打开统一数字底盘GUI的登录界面。输入用户名和密码后,单击<登录>按钮进入统一数字底盘GUI首页。

(2)     在统一数字底盘GUI界面中,单击[系统>日志管理>运行日志列表]菜单项,进入运行日志列表页面,如1所示。然后勾选节点名称,可进行如下操作:

¡     通过“所在目录(相对路径)、“日期时间(起)”和“日期时间(止)”可查看指定目录和日期区间的节点日志文件信息。

¡     通过“文件或目录名称”可搜索特定模块的日志。例如:

-     查找告警日志时,请搜索“itom-alarm”。

-     查找健康检查日志时,请搜索“occ”。

-     查找备份恢复日志时,请搜索“backup_recovery”。

-     查找大屏日志时,请搜索“dashboard”。

-     查找资源权限日志时,可以搜索“k-ures”、“k-permission”或“k-framework”。

¡     勾选指定日志或勾选“全选”复选框,单击<导出>按钮,将导出的节点运行日志信息保存到本地。

图1 运行日志列表页面

 

1.2.2  部署/升级日志收集方式

1. 前台导出

(1)     在浏览器中输入Matrix的登录地址(格式为:https://ip_address:8443/matrix/ui),回车后在打开的登录界面。输入用户名和密码后,单击<登录>按钮进入概览页面。

(2)     通过单击页面右上角“”后单击“导出日志”,在弹出的确认框中单击<确定>按钮。

图2 单击“导出日志”

 

图3 单击“确定”按钮

 

(3)     日志导出完成后,可以在浏览器的下载页面查看已导出的日志。

2. 后台导出

如果导出的日志文件过大,可以选择在后台导出部署/升级的日志。即使用WinSCPMobaXtermFTP工具,分别将三个节点下的/var/log/matrix-diag/Matrix/Matrix/matrix.log日志文件下载到本地。

1.3  运行时数据收集方式

使用后台脚本/opt/matrix/tools/matrix_log_collection.sh收集运行时数据,这些数据具有实时性。在遇到网络或流量相关问题时,E7105版本之前的所有节点均需执行该脚本进行数据收集。请注意,日志收集会占用一定的磁盘空间,因此在执行前请确保磁盘有足够的剩余空间。而对于E7105及之后的版本,可以参考1.2.2  1. 前台导出进行数据收集。

(1)     登录各个节点的后台,执行命令sudo bash /opt/matrix/tools/matrix_log_collection.sh。在脚本执行过程中,需要多次输入“Y”以确认操作。

图4 执行脚本

 

(2)     脚本执行完成后,会在/home/matrix-log-collect目录下生成一个以“matrix-时间戳.tar.gz命名的压缩文件,请导出该文件以用于故障定位。

图5 查看/home/matrix-log-collect目录

 

1.4  故障处理求助方式

当故障无法自行解决时,请准备好设备运行信息、故障现象等材料,发送给技术支持人员进行故障定位分析。

用户支持邮箱:service@h3c.com

技术支持热线电话:400-810-0504(手机、固话均可拨打)

 


2 操作系统处理

2.1  强制断电,导致服务器重启后操作系统XFS分区损坏,系统异常

2.1.1  故障描述

客户现场强制断电,导致服务器重启后操作系统XFS分区损坏,系统异常,无法进入操作系统或进入了紧急模式。

2.1.2  故障处理步骤

进入紧急模式或单用户视图强制修复损坏分区,修复完成后重启服务器可正常进入操作系统。

XFS文件系统修复方法:

(1)     使用lsblk命令查找挂载路径,使用umount命令将其卸载,确保分区处于umount状态。

图6 查看挂载路径

 

(2)     检测文件系统是否损坏:执行 xfs_repair -n,检查文件系统是否损坏。

(3)     修复文件系统,如执行xfs_repair  -L /dev/sda1

(4)     执行 xfs_ncheck /dev/sda1检查文件系统是否修复成功。

注意

xfs_repair L参数 是修复 xfs 文件系统的最后手段,慎重选择,它会清空日志,会丢失用户数据和文件。

 

2.2  CAS将引导模式设置为UEFI以部署NingOS系统,系统启动时会概率进入GRUB界面。

2.2.1  故障描述

CAS虚拟化平台上部署NingOS系统,并将引导模式设置为UEFI时,存在一定概率系统启动会停留在GRUB页面,导致系统无法正常启动。

图7 GRUB界面

 

2.2.2  故障处理步骤

GRUB页面,通过按下“ESC”键并回车,可以正常启动系统。

 

 


3 集群节点异常故障处理

3.1  集群节点服务器硬件故障无法恢复,必须更换节点服务器

3.1.1  故障描述

集群中的某个节点因为硬件故障无法恢复,需要更换新的节点服务器。

3.1.2  故障处理步骤

集群中的某个节点因为硬件故障无法恢复,需要更换新的节点服务器,可按如下步骤处理:

(1)     在解决故障节点硬件问题前,应断开该节点的网络连接(如拔掉网线),以避免节点上的Pod(如底盘组件和业务组件的PXC Pod)在故障期间尝试重新加入集群失败,进而引发业务异常。

(2)     配置替换节点服务器,使其与原故障节点完全相同的主机名、网卡名称、节点IP地址、用户名、密码、RAID模式以及磁盘分区。

(3)     在替换节点服务器中安装与集群节点相同版本的Matrix软件,具体请参见《统一数字底盘部署指导》。

(4)     登录Matrix界面,在[部署/集群]页面下,单击故障节点右上角的按钮,选择[重建]菜单项重建该节点,即可完成更换服务器的操作。

(5)     节点重建完成后,查看其状态是否正常。

3.2  集群节点异常导致统一数字底盘服务不可用

3.2.1  故障描述

页面层面现象:

统一数字底盘页面无法登录。

登录Matrix页面进入紧急模式,或者正常模式进入后部署页面存在Master节点异常(节点飘红)。

以下问题全部存在时,即可通过该章节进行故障处理。

·     后台执行 export ETCDCTL_API=2 && etcdctl cluster-health命令短暂性或持续性返回其中一个或多个member unhealthy状态。该故障多见于集群中一个或多个节点网络延迟大(延迟10ms以上)或性能不足(CPU频率低、磁盘IO负载高、IOPS性能低等)。

·     执行 kubectl get endpoints -nservice-software itom-central-login-svc 命令查看itom-central-login 服务对应的endpoints。若endpoints 依然保留异常节点上Pod IP 地址,则视为异常。

图8 查看itom-central-login服务对应的endpoints

 

3.2.2  故障处理步骤

(1)     找到异常节点:在三台Master节点后台执行curl http://localhost:2379/health命令,若只有1~2个节点命令返回{"health":"false","reason":"xxx"}、则认为该节点异常,若三个节点均返回{"health":"false","reason":"xxx"}、则认为ETCD集群主节点异常。

ETCD集群主节点查询方式:

a.     执行 export ETCDCTL_API=2 && etcdctl member list 命令查询成员列表,isLeader=true的为ETCD集群的主节点,如下matrix-node1为主节点。

[root@name3 tools]# etcdctl member list

2fb4df4b48851734: name=etcd2 peerURLs=http://matrix-node2:2380 clientURLs=http://matrix-node2:2379 isLeader=false

36bce94b1f1c6222: name=etcd3 peerURLs=http://matrix-node3:2380 clientURLs=http://matrix-node3:2379 isLeader=false

c7366883276d5740: name=etcd3 peerURLs=http://matrix-node1:2380 clientURLs=http://matrix-node1:2379 isLeader=true

b.     执行cat /etc/hosts 看节点IP域名映射关系,找到 a)中matrix-node1对应的节点IP,如下ETCD主节点IP10.99.212.83

[root@name3 tools]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 name3

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 name3

10.99.212.83  matrix-apiserver

10.99.212.83  matrix-registry.h3c.com

10.99.212.83  etcd.matrix

10.99.212.87  matrix-node2

10.99.212.84  matrix-node3

10.99.212.83  matrix-node1

若集群中只有一个节点异常,则进行后续故障恢复,若集群中有2个及以上节点异常,请勿使用该故障恢复方式进行处理,否则可能导致集群无法恢复。

(2)     登录异常节点后台,执行systemctl stop etcd命令停掉问题节点的ETCD服务,并使用hostname命令获取主机名nodeName其中,nodeName为异常节点的名称。

(3)     登录主节点后台,执行kubectl drain nodeName --ignore-daemonsets --force --delete-emptydir-data --timeout=1800s命令将所有Pod从异常节点上驱逐。

(4)     执行kubectl delete node nodeName命令删除异常节点。其中,nodeName为异常节点的名称。

(5)     修复异常断连的节点。若是服务器硬件故障无法恢复,必须更换节点服务器进行修复。

(6)     修复节点之后,登录Matrix界面,在[部署>集群]页面下,单击故障节点右上角的按钮,选择[重建]菜单项重建该节点。

(7)     如果上述操作完成后故障仍无法排除,请联系技术支持工程师。

3.3  磁盘空间不足导致容器运行异常,一直处于Evicted状态

3.3.1  故障描述

集群中某个节点磁盘空间已满,在该节点主机中使用kubectl get pods --all-namespaces命令,出现大量处于Evicted状态的容器,手动清理磁盘后容器仍保持该状态。

3.3.2  故障处理步骤

造成故障的原因:节点服务器磁盘空间不足的情况下,K8S自动清理机制会产生大量处于Evicted状态的容器。

故障处理步骤如下:

(1)     手动清理节点根分区的磁盘空间,例如/var/log路径下的日志压缩包、/opt/matrix/app/install/packages/路径下的老版本安装包,以降低磁盘使用率。

(2)     登录Matrix GUI界面,进入集群部署页面。在该页面选择待修复的节点并单击节点右上角的按钮,选择“修复”选项进行节点修复,修复完成后K8S会自动删除节点服务器中处于Evicted状态的容器。

3.4  修改集群网络模式失败

3.4.1  故障描述

Matrix集群参数页面修改集群网络模式失败。

3.4.2  故障处理步骤

造成故障的原因:主用Master节点ETCD服务异常,修改集群网络模式时需要请求两次ETCD服务,一次请求用于修改calico中的网络模式,另一次请求用于修改页面上显示的网络模式,此时分为两种情况:

·     第一种情况:页面显示集群网络模式已修改,但提示“修改失败”。

该种情况的原因为:由于ETCD服务异常导致两次请求一次成功一次失败,calico和页面显示的数据不一致。

以当前环境为单子网环境,需要修改网络模式为多子网模式为例,如果页面提示修改失败,但是集群参数配置页已修改为多子网模式,可以通过下述步骤进行故障处理。

故障处理步骤如下:

a.     进入主用Master节点服务器,查看主用Master节点的ETCD服务是否已经恢复正常。若已恢复正常可继续进行下列操作;若没有恢复正常请联系技术支持工程师。

[root@name1 1.0.0]# export ETCDCTL_API=2&&etcdctl cluster-health

member fb58b3b32bac01c is healthy: got healthy result from http:// matrix-node1:2379

member aa6e53b313aa741f is healthy: got healthy result from http:// matrix-node2:2379

member d1fcbe1f6db25390 is healthy: got healthy result from http:// matrix-node3:2379

b.     主用Master节点的ETCD服务已恢复正常,请将集群网络模式修改为集群原有网络模式,例如上述环境需要改为单子网模式,单击应用后将提示修改失败,但是集群参数页面已经显示改为单子网模式。

c.     再次将网络模式修改为多子网模式,修改成功,即该故障已恢复。

·     第二种情况:页面显示集群网络模式没有修改,且提示“修改失败”。

该种情况的原因为:由于ETCD服务异常导致两次请求都没有成功。

故障处理步骤如下:

a.     进入主用Master节点服务器,查看主用Master节点的ETCD服务是否已经恢复正常。若已恢复正常可继续进行下列操作;若没有恢复正常请联系技术支持工程师。

[root@name1 1.0.0]# export ETCDCTL_API=2&&etcdctl cluster-health

member fb58b3b32bac01c is healthy: got healthy result from http:// matrix-node1:2379

member aa6e53b313aa741f is healthy: got healthy result from http:// matrix-node2:2379

member d1fcbe1f6db25390 is healthy: got healthy result from http:// matrix-node3:2379

b.     再次修改集群网络模式,页面显示和提示都为修改成功,即该故障已恢复。

3.5  Matrix升级后,kube-apiserverkube-schedulerkube-controller-manager服务异常

3.5.1  故障描述

Matrix升级(单机或集群)后节点飘红,查看异常节点的详情信息,显示kube-apiserverkubeSchedulerkubeControllerManager异常。登录异常节点后台,使用kubectl get pod -A -owide命令,异常节点上存在处于CrashLoopBackOff状态的Pod

3.5.2  故障处理步骤

该故障现象及故障处理步骤有以下两种。

1. 第一种情况

·     故障现象

在异常Pod所在节点上执行netstat -anlp | grep -w 6443netstat -anlp | grep -w 10251netstat -anlp | grep -w 10252命令,存在kube-apiserverkube-schedulerkube-controller-manager服务端口被占用且存在处于LISTEN连接的现象。

·     故障原因

Matrix升级后,由于老的进程未正常退出,kube-apiserver6443端口、kube-scheduler10251端口或kube-controller-manager10252端口未释放,导致新的Pod无法正常启动。后台执行kubectl logs -n kube-system $pod_namedocker logs $container_id命令可以查看端口被占用的相关日志。

·     故障处理步骤

kube-scheduler Pod异常为例,在问题节点后台执行如下命令进行恢复。其他异常Pod(例如:kube-apiserverkube-controller-manager)可参照如下步骤进行恢复。

a.     移除kube-scheduler Pod及容器。

[root@name ~]# mv /etc/kubernetes/manifests/kube-scheduler.yaml /opt/

b.     检查kube-scheduler容器是否全部退出,若已查询不到kube-scheduler容器,则进行下一步。若长时间查询仍然不退出,可尝试执行docker rm -f $container_id强制删除容器、或执行systemctl restart docker命令重启Docker服务。

[root@name ~]# docker ps | grep kube-scheduler

c.     执行netstat -anlp | grep -w 10251命令查询端口是否被释放,已释放现象为:命令查询结果中不存在LISTEN状态的连接。若已释放则进行下一步。

d.     启动kube-scheduler Pod

[root@name ~]# mv /opt/kube-scheduler.yaml/etc/kubernetes/manifests/

e.     执行kubectl get pod -n kube-system -o wide 命令查询Pod状态

f.     如果上述操作完成后故障仍无法排除,请联系技术支持工程师。

2. 第二种情况

·     故障现象

在异常Pod所在节点上执行netstat -anlp | grep -w 6443netstat -anlp | grep -w 10251netstat -anlp | grep -w 10252命令,存在端口被占用且只存在TIME_WAIT状态的连接,且占用端口的不是kube-apiserverkube-schedulerkube-controller-manager进程。

·     故障原因

Matrix升级过程中,由于kube-apiserverkube-schedulerkube-controller-manager Pod重启,导致64431025110252端口被其他进程抢占,进而导致Pod异常。

·     故障处理步骤

请联系技术支持工程师。

3.6  系统节点长时间断电或异常致其他节点SeaSQL数据目录占用大量磁盘空间

3.6.1  故障描述

集群环境某节点长时间不启动或节点异常,可能会引起某节点SeaSQL实例Pod的数据目录占用磁盘空间不断增长。尤其在如果某节点因为宕机或者关闭长期不启动,同时另外两个节点正常提供服务,且SeaSQL数据库进行大量插入、更新、删除等操作的情况。

3.6.2  故障处理步骤

1. 故障原因

SeaSQL数据库集群因为备库需要从主库不断的同步数据,而同步的数据依赖主库上的wal日志,目前为了数据库集群各备库Pod的正常同步数据,主库虽然开启了wal日志的自动清理,但是也会保留备库一直未同步的wal日志,这样如果一个备库所在节点长时间处于未启动状态,并且当前SeaSQL数据库不断进行insertdeleteudpate等操作,那么主库所在节点的wal日志目录占用磁盘会不断的增长。如下图所示,wal日志目录大小由原先的97M增长到11G

如下图所示,wal日志目录大小由原先的97M增长到11G

2. 故障处理步骤

本身SeaSQL主库保留wal日志是为了备库的正常同步数据以及正常运行,所以此时只要启动当前关闭的节点,然后节点正常处于服务状态,同时该节点SeaSQL 实例Pod正常运行,随着该节点备库Pod不断同步数据,主库会自动清理wal日志,然后所占用磁盘空间会慢慢降下来。如下图所示,wal日志所占用磁盘大小随着宕机节点的重启,逐渐由11G降到657M

3.7  灾备环境主站点网络断开一段时间再恢复后,主站点中的部分节点状态为NotReady、大量Pod异常

3.7.1  故障描述

断开灾备环境主站点的网络,等待一段时间后恢复网络,主站点中的部分节点状态持续为NotReady,该节点上大量Pod异常、且无法自行恢复。

3.7.2  故障处理步骤

1. 故障原因

异常节点Docker日志中有大量的锁请求和等待,在网络恢复后,主站点恢复过程中,Docker执行Podterminating、启动等发生了进程、Pod的互锁,导致节点状态异常。该问题出现概率极低。

2. 故障处理步骤

在异常节点后台执行systemctl restart docker.service命令重启Docker服务即可。

 


4 集群拒绝所有访问Matrix服务故障处理

4.1  安全策略配置为全部拒绝后,集群拒绝所有访问Matrix服务的请求

4.1.1  故障描述

在安全策略页面,基本设置区域的默认动作设置为“拒绝”且删除规则信息区域的默认规则后,集群拒绝所有访问Matrix服务的请求。

4.1.2  故障处理步骤

造成故障的原因:默认动作为“拒绝”的情况下,Matrix默认放开8443端口的规则也被删除。

故障处理步骤如下:

(1)     登录任意一台Master服务器。

(2)     进入脚本目录。

[root@node1 ~]# cd /opt/matrix/k8s/disaster-recovery/

(3)     执行恢复安全策略脚本。

¡     root用户执行如下命令:

[root@node1 ~]# bash recover-security-policies.sh

¡     root用户执行如下命令:

[admin@node1 ~]$ sudo bash -c "source /etc/profile;bash recover-security-policies.sh"

(4)     脚本执行完成后,重新登录Matrix页面。

 


5 密码错误导致登录Matrix失败故障处理

5.1  admin用户输入错误的密码导致登录Matrix失败

5.1.1  故障描述

在登录Matrix页面,如果admin用户忘记登录密码等原因导致登录Matrix失败。

5.1.2  故障处理步骤

请根据集群情况执行对应脚本,进行重置密码的操作。

·     集群运行正常时重置密码。

a.     进入某一个Master节点的脚本存放目录,使用命令bash resetMatrixUserPassword.sh reset_password执行该脚本,其中resetMatrixUserPassword.sh为脚本名称,reset_password为新密码,例如:bash resetMatrixUserPassword.sh Pwd@123456

[root@node1 ~]# cd /opt/matrix/k8s

[root@node1 k8s]# bash resetMatrixUserPassword.sh Pwd@123456

WARNING: Input userName is empty, use default userName "admin".

Password reset to Pwd@123456 for user admin succeeded

b.     脚本执行完成后,使用新密码重新登录Matrix页面即可。

·     集群紧急模式下重置密码。

a.     进入某一个Master节点的脚本存放目录,使用命令bash resetMatrixUserPassword_emergency.sh reset_password执行该脚本,其中resetMatrixUserPassword_emergency.sh为脚本名称,reset_password为新密码,例如:bash resetMatrixUserPassword_emergency.sh Pwd@123456

[root@node1 ~]# cd /opt/matrix/k8s

[root@node1 k8s]# bash resetMatrixUserPassword_emergency.sh Pwd@123456

WARNING: Input userName is empty, use default userName "admin".

Password reset to Pwd@123456 for user admin succeeded

b.     脚本执行完成后,使用新密码重新登录Matrix页面即可。

5.2  admin之外的其他用户输入错误的密码导致登录Matrix失败

5.2.1  故障描述

在登录Matrix页面,如果除admin之外的其他用户忘记登录密码等原因导致登录Matrix失败。

5.2.2  故障处理步骤

请根据集群情况执行对应脚本,进行重置密码的操作。

·     集群运行正常时重置密码。

a.     进入某一个Master节点的脚本存放目录,使用命令bash resetMatrixUserPassword.sh username  reset_password执行该脚本,其中resetMatrixUserPassword.sh为脚本名称,username为用户名称,reset_password为新密码,例如:bash resetMatrixUserPassword.sh test Pwd@123456

[root@node1 ~]# cd /opt/matrix/k8s

[root@name0 k8s]# bash resetMatrixUserPassword.sh test Pwd@12345

Password reset to Pwd@12345 for user test succeeded.

b.     脚本执行完成后,使用新密码重新登录Matrix页面即可。

·     集群紧急模式下重置密码。

请先根据5.1  admin用户输入错误的密码导致登录Matrix失败章节重置admin用户密码并修复集群,待集群恢复正常后再根据该章节内“集群运行正常时重置密码”操作方式重置用户的密码。

 


6 默认路由丢失故障处理

6.1  使用ifconfig命令对网卡重启后默认路由丢失

6.1.1  故障描述

在集群中某个节点的命令行界面,使用ifconfig interface_name downifconfig interface_name up命令对网卡进行重启后,默认路由丢失。

6.1.2  故障处理步骤

(1)     进入故障节点操作系统的命令行界面,使用命令nmcli connection reloadnmcli connection up 网卡名重启network服务即可。如下命令网卡名以ens192为例。

[root@node01 ~]# nmcli connection reload

[root@node01 ~]# nmcli connection up ens192

(2)     使用命令route -n查看节点默认路由是否恢复。以下返回结果为举例,不同的环境默认路由将会不同。

[root@node01 ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         10.99.212.1     0.0.0.0         UG    0      0        0 eth0

10.99.212.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

 


7 ETCD服务异常

7.1  ETCD服务启动失败或数据不一致

7.1.1  故障描述

出现如下任意现象,均是由于ETCD存储数据文件在节点重启后损坏或者文件丢失,导致ETCD服务启动失败或无法同步数据。可按照相应故障处理步骤进行操作。

现象一:

节点所在服务器下电后重启,ETCD服务由于数据库db文件损坏而启动失败,最终导致集群异常。查看/var/log/matrix-diag/Matrix/etcd/etcd.log日志有以下信息:

panic: freepages: failed to get all reachable pages (page 1407374894039040: out of bounds: 1264)

goroutine 116 [running]:

panic(0x55a1d6cce4a0, 0xc420202ef0)

        /opt/rh/go-toolset-1.10/root/usr/lib/go-toolset-1.10-golang/src/runtime/panic.go:551 +0x3c5 fp=0xc42006bf60 sp=0xc42006bec0 pc=0x55a1d5f0ae25

github.com/coreos/bbolt.(*DB).freepages.func2(0xc42020c180)

现象二:

正常情况下,ETCD/var/lib/etcd/default.etcd/member/snap日志(快照日志)文件的最大日志索引值(13d62e)大于wal日志(预写日志)文件的最小日志索引值(d4bf2)。以下图为例。

 

节点所在服务器下电后重启,若ETCDwal日志文件的最小日志索引值(e6fac)大于snap日志文件的最大日志索引值(e37fd),ETCD会由于丢失必要的操作日志数据,无法恢复数据,导致文件损坏。以下图为例。

 

现象三:

节点所在服务器下电后重启,ETCD服务由于数据库snap日志(快照日志)文件丢失而启动失败,最终导致集群异常。查看/var/log/matrix-diag/Matrix/etcd/etcd.log日志有以下信息:

etcdserver: recovering backend from snapshot error: database snapshot file path error: snap: snapshot file doesn't exist

现象四:

ETCD服务由于数据文件损坏而启动失败,导致节点状态异常。登录ETCD服务异常的节点查看日志有以下信息:

"error":"walpb: crc mismatch"

现象五:

集群环境节点重启后ETCD服务正常启动,但是由于某一个或多个节点上的ETCD数据文件损坏导致ETCD集群数据不同步,主要有两种现象:

·     在其中一个Master节点后台执行“watch kubectl get pod -A -owide | grep -v Running”命令,发现多次回显的Pod状态不一致。

·     查看三台Master节点ETCD服务的日志(日志目录:/var/log/matrix-diag/Matrix/etcd/),发现某一个或多个节点上该日志有以下信息:“failed to publish local member to cluster through raft”。存在该日志的节点为db文件损坏、ETCD服务异常节点,故障处理时请处理该异常节点。

7.1.2  故障处理步骤

登录各节点服务器,通过命令systemctl status etcd查看各节点的ETCD服务状态,running为正常状态。如下图所示。

 

若为不正常状态,可根据下列步骤进行故障恢复。

·     单机环境如果ETCD服务出现上述现象,可通过7.1.2  1. 单机故障恢复章节进行故障恢复。

·     集群环境如果仅有一个节点的ETCD服务出现上述现象,请登录Matrix界面,在[部署>集群]页面单击出现问题节点右上角的按钮,选择重建,可对指定节点进行重建操作,重建完成后故障即可恢复。

·     集群环境如果两个节点ETCD服务出现db文件损坏情况,此时Matrix页面会进入紧急模式状态,可通过节点重建方式逐个恢复问题节点。故障描述中的现象五不会进入紧急模式,也可通过节点重建方式逐个恢复问题节点。

·     集群环境如果三个节点的ETCD服务出现上述现象,可通过7.1.2  2. 集群故障恢复章节进行故障恢复。

1. 单机故障恢复

前置条件

出现上述ETCD服务启动失败场景。

故障恢复操作

(1)     登录节点服务器,通过systemctl status etcd查看节点的ETCD服务状态,running为正常状态。若为不正常状态,可根据下列步骤进行故障恢复。

(2)     停止节点上的Matrix服务。

¡     root用户通过systemctl stop matrix命令停止节点上的Matrix服务。使用命令systemctl status matrix验证Matrix服务是否已经停止。若停止成功,则将在Active字段后显示运行信息为inactive (dead)

[root@master1 ~]# systemctl stop matrix

¡     root用户通过sudo /bin/bash -c "systemctl stop matrix"命令停止节点上Matrix服务

[admin@node4 ~]$ sudo /bin/bash -c "systemctl stop matrix"

(3)     通过mv /etc/kubernetes/manifests/kube-apiserver.yaml /opt/matrix命令停止kube-apiserver服务。使用命令docker ps | grep kube-apiserver验证kube-apiserver服务是否已经停止。若无回显表示服务已停止。

[root@master1 ~]# mv /etc/kubernetes/manifests/kube-apiserver.yaml /opt/matrix

[root@master1 ~]# docker ps | grep kube-apiserver //查询是否已停止kube-apiserver

[root@master1 ~]#  //无回显表示服务已停止

(4)     完全停止ETCD服务,并删除ETCD数据目录。

¡     root用户通过systemctl stop etcd命令完全停止ETCD服务,使用命令systemctl status etcd验证ETCD服务是否已经停止。若停止成功,则将在Active字段后显示运行信息为inactive (dead)。通过命令rm -rf /var/lib/etcd/default.etcd/删除ETCD数据目录,确保/var/lib/etcd下面没有数据目录。

[root@master1 ~]# systemctl stop etcd

[root@master1 ~]# rm -rf /var/lib/etcd/default.etcd/

[root@master1 ~]# ll /var/lib/etcd/

¡     root用户通过sudo /bin/bash -c "systemctl stop etcd"命令完全停止ETCD服务,并且通过命令sudo /bin/bash -c "rm -rf /var/lib/etcd/default.etcd/"删除ETCD数据目录,确保/var/lib/etcd下面没有数据目录

[admin@node4 ~]$ sudo /bin/bash -c "systemctl stop etcd"

[admin@node4 ~]$ sudo /bin/bash -c "rm -rf /var/lib/etcd/default.etcd/"

[admin@node4 ~]$ ll /var/lib/etcd/

(5)     查询ETCD备份目录/opt/matrix/backup/etcd_backup_snapshot/找到最新的备份数据文件,例如Etcd_Snapshot_V900R001B06D012_20210805091547.db

[root@master1 ~]# ll /opt/matrix/backup/etcd_backup_snapshot/

(6)     进入ETCD恢复脚本目录,执行恢复操作,恢复脚本传入的Etcd_Snapshot_*_*.db为第(5)步查到的最新备份数据文件。

a.     进入ETCD恢复脚本目录。

[root@master1 ~]# cd /opt/matrix/k8s/disaster-recovery/

b.     执行恢复操作命令。

-     root用户执行恢复操作命令如下

[root@master1 ~]# bash etcd_restore.sh Etcd_Snapshot_V900R001B06D012_20210805091547.db

2021-08-06 03:16:19.500144 I | mvcc: restore compact to 109069

2021-08-06 03:16:19.506086 I | etcdserver/membership: added member 91651d28c8465c86 [http://10.99.212.125:2380] to cluster db6c09f0e7b9702b

-     root用户执行恢复操作命令如下

[admin@node4 ~]$ sudo bash etcd_restore.sh Etcd_Snapshot_V900R001B06D012_20210805091547.db

2021-08-06 03:16:19.500144 I | mvcc: restore compact to 109069

2021-08-06 03:16:19.506086 I | etcdserver/membership: added member 91651d28c8465c86 [http://10.99.212.125:2380] to cluster db6c09f0e7b9702b

(7)     重启ETCD服务。

¡     root用户通过systemctl restart etcd命令重启ETCD服务。

[root@master1 ~]# systemctl restart etcd

¡     root用户通过sudo /bin/bash -c "systemctl restart etcd"命令重启ETCD服务。

[admin@node4 ~]$ sudo /bin/bash -c "systemctl restart etcd"

(8)     重启Matrix服务。

¡     root用户通过systemctl restart matrix命令重启Matrix服务。

[root@master1 ~]# systemctl restart matrix

¡     root用户通过sudo /bin/bash -c "systemctl restart matrix"命令重启Matrix服务

[admin@node4 ~]$ sudo /bin/bash -c "systemctl restart matrix"

(9)     恢复kube-apiserver服务。

[root@master1 ~]# mv /opt/matrix/kube-apiserver.yaml /etc/kubernetes/manifests/

单机故障恢复后检查

(1)     使用北向业务虚IP登录Matrix平台的GUI界面。

(2)     点击“部署”页签,在弹出的菜单中选择“集群”,进入集群部署页面查看Master节点状态,Master节点状态正常,如下图所示。

图9 1Master节点正常状态

 

(3)     点击“观测”页签,在弹出的菜单中选择“工作负载”,查看Pod状态,所有Pod都处于Running状态,如下图所示。

图10 Pod页签中所有Pod都处于Running状态

 

2. 集群故障恢复

前置条件

集群中三个节点都出现上述ETCD服务启动失败场景。

故障恢复操作

(1)     登录所有Master节点服务器,通过systemctl status etcd查看节点的ETCD服务状态,running为正常状态。若为不正常状态,可根据下列步骤进行故障恢复。

(2)     停止所有Master节点上的Matrix服务。

¡     root用户通过systemctl stop matrix命令停止所有Master节点上的Matrix服务

[root@master2 ~]# systemctl stop matrix

¡     root用户通过sudo /bin/bash -c "systemctl stop matrix"命令停止节点上Matrix服务。

[admin@node4 ~]$ sudo /bin/bash -c "systemctl stop matrix"

(3)     执行mv /etc/kubernetes/manifests/kube-apiserver.yaml /opt/matrix命令停止所有Master节点上的kube-apiserver服务。

[root@master2 ~]# mv /etc/kubernetes/manifests/kube-apiserver.yaml /opt/matrix

(4)     停止所有Master节点上的ETCD服务,并删除ETCD数据目录。

¡     root用户通过systemctl stop etcd命令完全停止所有Master节点上ETCD服务,并且通过命令rm -rf /var/lib/etcd/default.etcd/删除ETCD数据目录,确保/var/lib/etcd下面没有数据目录

[root@master2 ~]# systemctl stop etcd

[root@master2 ~]# rm -rf /var/lib/etcd/default.etcd/

[root@master2 ~]# ll /var/lib/etcd/

¡     root用户通过sudo /bin/bash -c "systemctl stop etcd"命令完全停止ETCD服务,并且通过sudo /bin/bash -c "rm -rf /var/lib/etcd/default.etcd/"命令删除ETCD数据目录,确保/var/lib/etcd下面没有数据目录

[admin@node4 ~]$ sudo /bin/bash -c "systemctl stop etcd"

[admin@node4 ~]$ sudo /bin/bash -c "rm -rf /var/lib/etcd/default.etcd/"

[admin@node4 ~]$ ll /var/lib/etcd/

(5)     查询ETCD备份目录/opt/matrix/backup/etcd_backup_snapshot/找到最新的备份数据文件,例如Etcd_Snapshot_V900R001B06D012_20210805091653.db。请确认所有节点存在相同的备份数据文件,如果节点没有文件,可从其他节点拷贝ETCD备份文件到节点。

[root@master1 ~]# ll /opt/matrix/backup/etcd_backup_snapshot/

(6)     进入ETCD恢复脚本目录,执行恢复操作,恢复脚本传入的Etcd_Snapshot_*_*.db为第(5)步查到的最新备份数据文件,所有节点请使用相同的备份数据文件,保持备份恢复数据一致。

a.     进入ETCD恢复脚本目录

[root@master1 ~]# cd /opt/matrix/k8s/disaster-recovery/

b.     执行恢复操作命令

-     root用户执行恢复操作命令如下

[root@master2 ~]# bash etcd_restore.sh Etcd_Snapshot_V900R001B06D012_20210805091653.db

2021-08-06 06:33:14.788657 I | mvcc: restore compact to 273930

2021-08-06 06:33:14.802137 I | etcdserver/membership: added member 312131d4535cc53f [http://10.99.212.124:2380] to cluster cd6d5adc1bfd16f5

2021-08-06 06:33:14.802189 I | etcdserver/membership: added member 5fc2f82d74297956 [http://10.99.212.123:2380] to cluster cd6d5adc1bfd16f5

2021-08-06 06:33:14.802206 I | etcdserver/membership: added member ad12c65048f444bd [http://10.99.212.120:2380] to cluster cd6d5adc1bfd16f5

-     root用户执行恢复操作命令如下

[admin@node4 ~]$ sudo bash etcd_restore.sh Etcd_Snapshot_V900R001B06D012_20210805014548.db

2021-08-06 01:22:10.876952 I | mvcc: restore compact to 12660679

2021-08-06 01:22:10.906116 I | etcdserver/membership: added member ac2cefc4cae84e25 [http://[2000::100:2000]:2380] to cluster ced7b5d5ee633b40

2021-08-06 01:22:10.906174 I | etcdserver/membership: added member b4689a44b8c1f191 [http://[2000::100:2001]:2380] to cluster ced7b5d5ee633b40

2021-08-06 01:22:10.906197 I | etcdserver/membership: added member c328a554c1ca84f4 [http://[2000::100:2002]:2380] to cluster ced7b5d5ee633b40

(7)     在上述所有操作完成后,然后在所有Master节点依次重启ETCD服务。

¡     root用户通过systemctl restart etcd命令重启ETCD服务

[root@master2 ~]# systemctl restart etcd

¡     root用户通过sudo /bin/bash -c "systemctl restart etcd"命令重启ETCD服务

[admin@node4 ~]$ sudo /bin/bash -c "systemctl restart etcd"

(8)     在所有Master节点依次重启Matrix服务。

¡     root用户通过systemctl restart matrix命令重启Matrix服务

[root@master2 ~]# systemctl restart matrix

¡     root用户通过sudo /bin/bash -c "systemctl restart matrix"命令重启Matrix服务

[admin@node4 ~]$ sudo /bin/bash -c "systemctl restart matrix"

(9)     在所有Master节点依次恢复kube-apiserver服务。

[root@master2 ~]# mv /opt/matrix/kube-apiserver.yaml /etc/kubernetes/manifests/

集群故障恢复后检查

(1)     使用北向业务虚IP登录Matrix平台的GUI界面。

(2)     点击“部署”页签,在弹出的菜单中选择“集群”,进入集群部署页面查看Master节点状态,Master节点状态正常,如下图所示。

图11 三个Master节点+1Worker节点正常状态

 

(3)     点击“观测”页签,在弹出的菜单中选择“工作负载”,查看Pod状态,所有Pod都处于Running状态,如下图所示。

图12 Pod页签中所有Pod都处于Running状态

 

7.2  ETCD非独立磁盘部署环境下,出现客户端请求超时或ETCD集群主备切换频繁

7.2.1  故障描述

出现如下任意现象,可能是由于ETCD非独立磁盘部署环境,磁盘IO性能差导致的故障现象。可按照相应故障处理步骤进行操作。

现象一:

ETCD客户端如K8sMatrix等访问ETCD数据库超过800ms,分别登录各Master节点后台,在/var/log/matrix-diag/Matrix/etcd路径下查看etcd.log日志有以下信息。

[root@master2 etcd]# cat etcd.log |grep "took too long"

2020-11-15 12:36:42.013987 W | etcdserver: read-only range request "key:\"/registry/services/specs/default/kubernetes\" " with result "range_response_count:1 size:295" took too long (877.352309ms) to execute

2020-11-15 12:36:54.026221 W | etcdserver: read-only range request "key:\"/registry/pods/base-service/\" range_end:\"/registry/pods/base-service0\" " with result "range_response_count:42 size:107232" took too long (1.767232614s) to execute)

现象二:

ETCD集群频繁主备切换(多次执行etcdctl member list命令,若isLeader=true字段反复出现在不同节点,即为频繁主备切换),可能是由于ETCD集群因心跳超时导致。

图13 ETCD集群的主一直在etcd3

 

7.2.2  故障处理步骤

(1)     若上述现象出现在应用安装升级、配置下发等操作过程,并导致操作失败的情况,则可以尝试再次进行安装升级、配置下发操作进行恢复(由于首次操作已完成部分数据同步,再次操作对磁盘IO影响减弱,会提高升级成功的概率)。

(2)     若上述现象出现稳态运行过程(即当前页面无用户操作),则可以通过配置定制文件/opt/matrix/config/navigator_config.json的主备切换参数"matrixLeaderLeaseDuration"(租约老化时间)和"matrixLeaderRetryPeriod"(租约检测周期)来延迟主备切换超时时间,但修改后也会影响节点故障切换时间。

(3)     如果因磁盘IO差导致无法写入或数据丢失的情况,有几种故障恢复方法:

¡     方法一:

-     若出现Pod状态或通讯异常,可通过kubectl delete pod -n namespace podName命令删除异常Pod操作,删除后将自动创建Pod恢复ETCD数据资源。

¡     方法二:通过7.1.2  1. 单机故障恢复7.1.2  2. 集群故障恢复

¡     方法三:

-     卸载所有节点的Matrix软件包。

-     重新安装Matrix软件包。

-     登录页面,根据Matrix备份文件进行集群恢复,并进行重新安装应用再配置恢复,具体步骤请参考《统一数字底盘部署指导》的“备份恢复”章节。

 


8 Docker服务异常

8.1  执行Docker命令后长时间无响应

8.1.1  故障描述

执行docker psdocker imagesdocker inspectdocker rmi等命令后,长时间无响应。

8.1.2  故障处理步骤

(1)     重启Docker服务。

¡     root用户执行如下命令重启Docker服务。

[root@master1 ~]# systemctl restart docker

¡     root用户执行如下命令重启Docker服务。

[admin@master1 ~]$ sudo /bin/bash -c "systemctl restart docker"

(2)     验证Docker服务是否已恢复正常。

¡     root用户执行docker images命令查看Docker服务。

¡     root用户执行sudo /bin/bash -c " docker images "命令查看Docker服务。

(3)     若回显结果中存在当前节点的镜像信息,则表示Docker恢复正常。

图14 docker images命令回显

 

8.2  页面显示Docker组件异常

8.2.1  故障描述

断电重启导致var/lib/docker系统文件损坏,Docker服务状态异常。

8.2.2  故障处理步骤

需要重新安装ISO镜像并重建节点进行恢复。

图15 重建节点

 

 


9 服务器下电重启或网络异常断开故障问题处理

9.1  节点所在服务器下电后重启,操作系统文件丢失

9.1.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),节点所在服务器下电后重启,如果出现如下任意现象,均是由节点下电导致的问题。

·     /usr/lib/systemd/system目录下chronyd.servicedocker.servicecontainerd.service文件内容丢失。

·     /etc/chrony.confdockeretcdhostsssh配置文件内容丢失;/opt/matrix/k8s/下的deployenv.sh文件丢失。

·     /var/log下的日志文件或其中的内容丢失。

9.1.2  故障处理步骤

·     chronyd.servicedocker.servicecontainerd.service的内容丢失故障处理步骤

a.     通过ls /usr/lib/systemd/system/service-name.service命令查看所有节点上的service文件是否存在或内容是否为空。

b.     若某些节点上存在该文件且内容正常,可通过scp命令将该文件拷贝到丢失该文件或文件内容为空的节点上。

c.     若所有节点上都不存在该文件,请联系技术工程师或重新安装操作系统。

·     /etc//var/log下的文件或其中的内容丢失故障处理步骤

由于各节点的文件内容不一致,自行修改可能存在问题,请联系技术工程师处理或重新安装操作系统。

·     /opt/matrix/k8s/下的deployenv.sh文件丢失故障处理步骤

集群环境从其他有deployenv.sh文件的Master节点拷贝该文件到本节点,若均不存在,尝试重建;单机环境请联系技术工程师或重装Matrix

9.2  节点所在服务器下电后重启或网络异常断开,Matrix依赖的文件丢失

9.2.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),节点所在服务器下电后重启或网络异常断开,如果出现如下任意现象,均是由节点下电导致的问题。

·     etcdmatrix等服务的service文件或其中的内容丢失。

·     /opt/matrix/下的配置文件或其中的内容丢失。配置文件如定制化配置文件navigator_config.json

·     /opt/matrix/下的脚本文件或其中的内容丢失。脚本文件如docker.sh

·     /var/lib/docker下的Docker镜像文件损坏,如:

现象1:部分pod处于ImagePullBackOff状态,describe pod看事件日志,提示错误如下:

error creating overlay mount to /var/lib/ /overlay2/698028ac124c9d0ef831f7d2d9506acd01faddaae6ea06a0a169fb352e0eddf4/merged: too many levels of symbolic links 

现象2time="2021-05-10T18:05:50.518918884+08:00" level=error msg="Handler for GET /containers/2494c1172314e37bd8250be06a24e0636b7427f89b3b5a5398ecfad7c2fe171d/json returned error: readlink /var/lib/docker/overlay2/l: invalid argument"

·     /opt/matrix/下的Yaml文件或文件中的内容丢失。

9.2.2  故障处理步骤

·     service文件或其中的内容丢失、/opt/matrix/下的文件或其中的内容丢失故障处理步骤

a.     通过ls命令查看所有节点上的相关文件是否存在或其中的内容是否为空。

b.     若某些节点上存在该文件且内容正常,可通过scp命令将该文件拷贝到丢失该文件的节点上。

c.     若所有节点上都不存在该文件,请联系技术工程师或重新安装Matrix

·     /var/lib/docker下的Docker镜像文件损坏

¡     请通过上传Matrix版本包的方式重建节点。

¡     联系技术工程师处理。

9.3  节点所在服务器下电后重启,页面中节点飘红、飘黄或监控页面Pod处于CreateContainerError状态

9.3.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),节点所在服务器重启,出现如下现象:

·     Matrix相关Pod异常,页面中节点可能会飘红或飘黄。

·     若产品相关Pod异常,在[观测>工作负载]页面下存在CreateContainerError状态的Pod

登录任一Master节点后台,使用kubectl get pod -A -owide | grep CreateContainerError命令可以查看所有处于CreateContainerError状态的Pod

[root@node1 home]# kubectl get pod -A -owide | grep CreateContainerError

NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE   IP NODE       NOMINATED NODE   READINESS GATES

kube-system   calico-kube-controllers-cd96b6c89-hfz7s   0/1     CreateContainerError   0  29d 10.99.212.164    node1   <none>           <none>

9.3.2  故障处理步骤

方法一:

(1)     登录异常Pod所在节点,使用docker ps | grep podname | grep -v POD | grep Up|awk '{print $1}'命令获取其处于UP状态容器ID。其中,podname为异常Pod的名称。

[root@node1 home]# docker ps |grep calico-kube-controllers-cd96b6c89-hfz7s | grep -v POD|grep Up|awk '{print $1}'

c755b7812380

(2)     执行docker stop containerid && docker rm containerid命令删除该UP状态的容器。其中,containerid为容器ID。例如,docker stop c755b7812380 && docker rm c755b7812380

(3)     删除成功后,使用kubectl get pod -A -owide | grep CreateContainerError命令查询是否依然存在处于CreateContainerError状态的Pod,若依然存在,则需登录Matrix页面重建该节点。

方法二:

(4)     登录Matrix页面重建异常Pod所在节点。

9.4  节点所在服务器下电后重启,页面中节点飘红、飘黄或监控页面Pod处于异常状态

9.4.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),节点所在服务器重启,出现如下现象:

·     Matrix相关Pod异常,页面中节点可能会飘红或飘黄。

·     若产品相关Pod异常,在[观测>工作负载]页面下存在非RunningCompletedSucceeded状态的Pod

登录任一Master节点后台,使用kubectl get pod -A -owide | grep -Evw "Running|Completed|Succeeded"命令查看所有处于异常状态的Pod

·     现象1:登录异常Pod所在节点后台,使用cat /var/log/matrix-diag/Matrix/kubelet/kubelet.log | grep "unexpected end of JSON input"命令查看该节点的kubelet日志,若出现如下报错信息,则该问题的原因为:重启节点导致Pod数据损坏,Pod无法正常启动。

Multus: failed to load netconf: unexpected end of JSON input

·     现象2:登录异常Pod所在节点后台,使用cat /var/log/matrix-diag/Matrix/kubelet/kubelet.log | grep "device or resource busy"命令查看该节点的kubelet日志,若出现如下报错信息,则该问题的原因为:重启节点导致Pod占用的cgroup资源无法清理,Pod无法正常删除。

msg="Failed to removecgroup" error="rmdir/sys/fs/cgroup/perf_event/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod19477284_c12f_45ca_b1f7_e44567957829.slice/docker-39dee0c5f2b0333af7ce921b03cad9dee06b6b949c4a55a80fca31b48305d001.scope:device or resource busy"

·     现象3:登录任一Master节点后台,使用命令kubectl logs -f $pod -n $namespace查看故障Pod的日志(其中$pod为故障Pod的名称,$namespace为其所在的命名空间)。如果出现类似于以下的错误信息,则该问题的原因是Pod进程残留,导致无法正常启动。

java.net.BindException: Address already in use

9.4.2  故障处理步骤

方法一(当异常Pod较少时可以使用该方法):

(1)     登录任一Master节点后台,使用kubectl get pod -A -owide | grep -Evw "Running|Completed|Succeeded"命令查看异常状态Pod的命名空间和名称。

(2)     执行kubectl delete pod -n namespace podName --grace-period=0 --force 2>/dev/null命令删除异常Pod。其中namespace为上一步查询出的异常Pod的命名空间,podName为异常Pod的名称。

说明:该命令用于删除指定节点上某个异常Pod,包括ErrorCreateContainerError等异常状态,当存在多个异常Pod时,需多次执行该命令。

方法二(当异常Pod较多时可以使用该方法):

登录任一Master节点后台,执行kubectl get pod -A -owide --no-headers=true| grep -Evw "Running|Completed|Succeeded"| awk '{print $1 " " $2}'|xargs -I {} sh -c 'kubectl delete pod -n$1 $2 --grace-period=0 --force 2>/dev/null' sh {}命令。

说明:该命令用于批量删除所有处于异常状态的Pod

9.5  节点所在服务器下电后重启,prometheus数据文件损坏导致Pod状态异常

9.5.1  故障描述

通过kubectl  get pod -n monitor -owide | grep prometheus命令查看prometheus Pod名称及状态,发现存在crashloopbackoff状态的Pod。使用kubectl logs -f  -n monitor prometheus-podname prometheus-server命令查看日志,显示errorerr="opening storage failed: /data/xxx信息。

9.5.2  故障处理步骤

(1)     使用rm -rf /var/lib/ssdata/imonitor/prometheus_data/命令删除异常Pod所在节点的prometheus数据文件。

(2)     拷贝正常Pod所在节点的prometheus_data文件至异常Pod所在节点。若Pod都异常,则删除所有节点的prometheus_data文件。

(3)     重启异常Pod

9.6  节点服务器断电重启,MACVLAN附加网络IPv6网卡不可用

9.6.1  故障描述

已部署Matrix集群,当应用所在节点的服务器下电重启后,网卡不可用,具体现象如下:

使用命令kubectl exec -it -n kube-system harbor-master1-6mvlb /bin/bash进入容器

输入ip a命令查看容器内所有网卡IP,查看MACVLAN附加网络中的IPv6网卡,网卡名称以“eth2@if3”为例,状态显示为“tentative dadfailed”状态,则表示此IPv6网卡不可用。

[root@vdhcpsrc1-6658fb96f4-j4n4f /]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

3: eth0@if914: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether 6e:e7:ed:2c:ed:5e brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 177.177.204.216/32 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fd00:177:177:0:d416:1f2a:c3a4:ccac/128 scope global

       valid_lft forever preferred_lft forever

   inet6 fe80::6ce7:edff:fe2c:ed5e/64 scope link

       valid_lft forever preferred_lft forever

4: eth1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether d6:ae:4e:73:38:8d brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 110.1.0.105/24 scope global eth1

       valid_lft forever preferred_lft forever

    inet6 fe80::d4ae:4eff:fe73:388d/64 scope link

       valid_lft forever preferred_lft forever

5: eth2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether a2:23:c0:8f:ac:46 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet6 130::105/64 scope global tentative dadfailed

       valid_lft forever preferred_lft forever

    inet6 fe80::a023:c0ff:fe8f:ac46/64 scope link

       valid_lft forever preferred_lft forever

9.6.2  故障处理步骤

应用所在的节点服务器下电重启后,可能出现由于操作系统无法回收使用MACVLAN附加网络且子网为IPv6协议栈的应用进程,导致应用进程残留,此时需要再次重启容器所在的节点服务器进行恢复。

9.7  节点所在服务器下电后重启,使用附加网络的Pod反复重启

9.7.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),节点所在服务器重启,出现如下现象:

登录任一Master节点后台,使用kubectl get pod -A -o wide | grep -v Running命令查看Pod状态,显示使用附加网络的Pod反复重启,使用kubectl describe pod -n namespace podName命令查看Pod的事件。其中namespace为异常Pod的命名空间,podName为异常Pod的名称。报错信息如下:

Err adding pod to network"net-dtn-sim203": Multus: error in invoke Delegate add -"macvlan": failed to allocate for range 0: requested IP address172.30.128.140 is not available in range set3.2.27.1-3.2.27.254,172.30.128.1-172.30.128.254

9.7.2  故障处理步骤

故障由服务器断电重启导致附加网络的配置文件内容丢失导致,需要清理配置文件,使用root用户登录异常Pod所在节点后台执行恢复操作步骤如下:

(1)     使用cd /var/lib/cni/networks/${macvlan-name}/命令进入配置目录,其中macvlan-name为报错信息中的network名称,如示例中的net-dtn-sim203

(2)     使用rm -rf ${IP}命令删除损坏的配置文件,其中IP为报错信息中的IP地址,如示例中的172.30.128.140

 

9.8  集群节点所在服务器持续网络延迟,集群频繁切换主节点

9.8.1  故障描述

Matrix正常运行或集群/应用部署过程中(如集群部署、升级、恢复、重建、应用部署和升级等),如果节点所在服务器持续出现网络延迟,可能会出现以下现象:

·     登录统一数字底盘,查看系统日志列表,发现Matrix服务反复切换主节点。

图16 查看系统日志列表

 

·     登录所有Master节点后台,执行命令cat /var/log/matrix-diag/Matrix/etcd/etcd.log查看ETCD日志,发现频繁打印如下日志:dropped internal Raft message since sending buffer is full (overloaded network)

9.8.2  故障处理步骤

由于服务器节点持续网络延迟导致ETCD集群间通信异常,需要在所有Master节点执行systemctl restart etcd命令,以重启ETCD服务来恢复正常。

9.9  集群所在节点反复断电并重启后,访问Matrix页面出现卡顿和超时现象

9.9.1  故障描述

Matrix正常运行或集群/应用部署过程中(例如集群部署、升级、恢复、重建、应用部署和升级等),如果所有节点所在服务器反复重启,可能出现以下现象:

·     登录所有Master节点后台,使用ip addr命令查看各节点网卡上的IP地址,发现所有Master节点均配置了虚拟IP地址。

图17 查看IP地址

 

·     检查Matrix服务的日志文件,发现类似以下报错信息:

2024-10-11T09:08:46,499 | ERROR | GlobalMonitor-3-thread-1 | DefaultUncaughtExceptionHandler.uncaughtException:18 | uncaught exception in Thread[GlobalMonitor-3-thread-1,5,main], stack: [java.lang.Thread.getStackTrace(Thread.java:1179), com.h3c.matrix.util.DefaultUncaughtExceptionHandler.uncaughtException(DefaultUncaughtExceptionHandler.java:18), java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:863), java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:861), java.lang.Thread.uncaughtException(Thread.java:1354)]

java.lang.OutOfMemoryError: Java 堆空间

9.9.2  故障处理步骤

由于服务器反复断电重启导致Matrix服务Team线程异常,需要在所有节点执行systemctl restart matrix命令来重启Matrix服务以恢复正常。

 

9.10  系统节点频繁断电重启或持续网络异常,导致Prometheus无法正常启动

9.10.1  故障描述

如果节点所在的服务器频繁重启或持续出现网络延迟,可能会导致节点上的Prometheus Pod不断重启。当节点服务器恢复正常后,Prometheus可能因内存不足而无法完成正常启动。

9.10.2  故障处理步骤

1. 故障原因

Prometheus在服务器频繁重启或网络延迟的情况下会不断重启,从而生成大量的WAL文件。当WAL文件积累过多时,即使服务器恢复正常,Prometheus启动时仍需加载所有WAL文件,这会占用大量内存。由于默认的内存限制不足,导致出现OOM问题,Prometheus无法正常启动,从而不断重启。

在出现这种情况时,可以在Prometheus异常的节点上执行ll /var/lib/ssdata/imonitor/prometheus_data/wal/命令,查看 /var/lib/ssdata/imonitor/prometheus_data/wal/目录下的WAL文件数量,正常情况下应为3-4个。

2. 故障处理步骤

(1)     在集群任一Master节点执行以下命令以增大Prometheus的内存限制,使其能够加载所有WAL文件并完成启动。如果10Gi内存仍不足以完成启动,可以进一步增加内存限制。

[root@node1 ~]# kubectl set resources -n monitor deployment/prometheus --containers=prometheus-server --limits=memory=10Gi

(2)     Prometheus启动完成后会对WAL文件进行压缩,压缩后文件数量会减少,并且会定期执行压缩。建议等到WAL文件数量减少到接近个位数时,再执行以下命令将Prometheus的内存限制调整回3Gi

[root@node1 ~]# kubectl set resources -n monitor deployment/prometheus --containers=prometheus-server --limits=memory=3Gi

(3)     WAL文件的定时压缩速度较慢,通常每2小时进行一次。如果希望加速压缩,可以通过以下命令主动重启Prometheus,以触发压缩。其中,pod_name为故障节点上的Prometheus Pod名称可以多次执行此命令以加速压缩,但每次执行后需等待Prometheus启动完成。

[root@node1 ~]# kubectl delete pod -n service-software pod_name

 

 


10 部署失败相关故障处理

10.1  集群部署失败,查看日志出现错误K8SINSTALL-ERROR

10.1.1  故障描述

集群部署失败,单击节点右上角按钮,选择[日志]菜单项查看节点日志,提示K8SINSTALL-ERROR

10.1.2  故障处理步骤

造成故障的原因:节点存在两个及以上网卡且都为UP状态,但其中一张网卡未配置IP地址。

当操作系统中arp_ignore参数设置为0(默认值)时,系统会响应任意网卡上接收到的对本机IP地址的ARP请求(包括环回网卡上的地址)。此时,Matrix节点间通信时可能会将无IP地址但状态UP的网卡MAC作为ARP应答消息进行返回,进而导致集群节点间因网络不通出现部署失败。

故障排查及处理步骤:

(1)     若业务场景需要多张网卡,在部署/升级/重建集群前,请通过ifconfig命令查看网卡的排序,在Matrix集群使用的节点IP所在网卡前的所有物理网卡均已配置IP地址或配置为ONBOOT=no,否则会导致集群部署失败。例如,网卡排序为:ens190>ens191,若节点IP所在网卡为ens191,则需确保ens190也已配置IP地址。

(2)     集群中不应存在未接线但配置文件中ONBOOT=yes,未配置IP地址且ONBOOT=yes等异常配置。

(3)     如果集群采用bond作为Matrix主网卡,请确保在Matrix集群中的所有非bond成员的物理网卡均已配置IP地址或者配置为ONBOOT=no.

(4)     修改网卡配置后,执行nmcli connection reloadnmcli connection up 网卡名命令重启网络服务。

10.2  IPv6环境下,节点或现有网卡增加IP后,集群部署失败

10.2.1  故障描述

IPv6环境下,在其中一个节点上增加一张新网卡,并配置IP地址或者在现有网卡上增加新IP地址,由于其它节点的IP地址和新IP地址不在同一网段,导致重建、升级等操作失败。在增加新IP的节点后台执行ping6 pod_ip命令,提示无法ping通。其中pod_ip为容器IP地址,可以使用kubectl get pod -n kube-system -o wide命令查询。

10.2.2  故障处理步骤

在节点上增加新IP后由于该IP地址和其他节点的IP地址不在同一网段,集群无法正常建立,最终导致重建、升级等操作失败。

故障处理步骤:

·     将新增的不同网段的IP地址修改为和其他节点同一网段的IP地址。

·     在其它节点上配置路由策略,使节点间可以正常通信。

 


11 统一数字底盘页面无法访问

11.1  ETCD IO延迟导致处理请求缓慢

11.1.1  故障描述

统一数字底盘页面无法访问。

查看ETCD日志(/var/log/matrix-diag/Matrix/etcd/etcd.log),存在如下提示:

context deadline exceededwaiting for ReadIndex response took too long, retrying

查看apiserver日志,存在如下提示:

stopped listening on [::]:6443

11.1.2  故障处理步骤

造成故障的原因:由于ETCD IO延迟,导致API Server多次从ETCD获取数据失败,从而停止监听6443端口。组件通过6443端口调用K8s API失败。

故障处理步骤:

(1)     测试磁盘IO性能:若磁盘IO性能均值在10000及以上,则磁盘性能达标;若IO性能均值在10000以下,则磁盘存在性能问题,ETCD处理请求将会缓慢,请提高磁盘IO性能。

测试磁盘IO性能方法:

¡     root用户:执行bash /opt/matrix/tools/env_check.sh -p -d /var/lib/etcd命令。

¡     root用户:执行sudo bash /opt/matrix/tools/env_check.sh -p -d /var/lib/etcd命令。

(2)     执行kubectl get pod -n service-software | grep seasql-base|grep -v proxy命令查询所有stolon-keeper Pod的名称。

(3)     执行kubectl delete pod -n service-software pod_name命令依次重启seasql-base Pod

(4)     seasql-base Pod恢复Running状态后重新访问统一数字底盘页面。

11.2  密码丢失导致无法登录统一数字底盘

11.2.1  故障描述

若用户丢失密码,将无法登录统一数字底盘。

11.2.2  故障处理步骤

造成故障的原因:用户丢失密码。

可通过如下步骤重置密码:

(1)     登录主节点后台的/opt/matrix/app/install/metadata/UNIFIED-PLATFORM-BASE/base-rs/scripts/reset/目录。

[root@node1 ~]# cd /opt/matrix/app/install/metadata/UNIFIED-PLATFORM-BASE/base-rs/scripts/reset/

(2)     执行reset_admin_password.sh脚本重置密码。

[root@node1 reset]# ./reset_admin_password.sh

++ kubectl get svc -nservice-software k-framework-svc '-ojsonpath={.spec.clusterIP}'

+ ip=10.96.152.206

+ [[ 10.96.152.206 =~ : ]]

++ curl -X POST -s -k -g --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"userName": "admin"}' http://10.96.152.206:8088/token/auth/generate

++ jq .token

++ sed 's/\"//g'

+ token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJXSEZseDhLQ0ZmRGE3YnBiNnJ2eER6U214RVZ3NmRtMnpYQllRMVVCYWdBWmRvdVNCUTlDY0JnYlJMWVlicEsxQW9JamR6WEZXQkY2UE1CeXp3UDRmODE2c1BxWk4yT0dzUFRpZGlBWGRWUFVXZDNxa2hOM0N3TExNWk5Hd0o0UTV3Tys5dHJ0aThJeVBIOUV5S0pETGRxbWFJZHpucm1ZRlFqSDV5azhGZ009IiwianRpIjoiOTQ2Mjk2IiwiaWF0IjoxNzIzMTk0MzM4fQ.4_aEhfvXxaTeb13eyM3Xh-Gkz7q4WA_qh_9JdNPK9yhoXNaXFw1RuF2UBPL7qjK5wOFJWitHh0VaXxLezdeCbw

++ curl -s -k -g -X PUT -H 'accept: application/json' --header 'Content-Type: application/json' --header 'Cookie: X-Subject-Token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJXSEZseDhLQ0ZmRGE3YnBiNnJ2eER6U214RVZ3NmRtMnpYQllRMVVCYWdBWmRvdVNCUTlDY0JnYlJMWVlicEsxQW9JamR6WEZXQkY2UE1CeXp3UDRmODE2c1BxWk4yT0dzUFRpZGlBWGRWUFVXZDNxa2hOM0N3TExNWk5Hd0o0UTV3Tys5dHJ0aThJeVBIOUV5S0pETGRxbWFJZHpucm1ZRlFqSDV5azhGZ009IiwianRpIjoiOTQ2Mjk2IiwiaWF0IjoxNzIzMTk0MzM4fQ.4_aEhfvXxaTeb13eyM3Xh-Gkz7q4WA_qh_9JdNPK9yhoXNaXFw1RuF2UBPL7qjK5wOFJWitHh0VaXxLezdeCbw' http://10.96.152.206:8088/operator/resetAdminPassword

+ result=true

+ echo 'result is: true'

result is: true

(3)     脚本执行完成后,密码会被重置为“Pwd@12345”。

11.3  Ext4文件系统损坏导致登录异常

11.3.1  故障描述

无法登录Matrix和统一数字底盘,在后台执行任何命令时都会返回“Read-only file system”。

11.3.2  故障处理步骤

节点重启后在系统引导启动过程中出现卡住的情况,显示类似“You are in emergency mode”、“Entering emergency mode”等提示代表进入操作系统的紧急模式。在该模式下执行如下步骤:

(1)     执行dmesg | less命令或cat /var/log/messages命令查看系统日志,确定文件系统损坏的分区,此处以/dev/sdX作为异常分区举例。

(2)     执行mount|grep /dev/sdX命令查看分区类型。如果分区类型为ext4,则按照以下步骤继续操作。

(3)     执行umount /dev/sdX命令卸载该分区的文件系统。

(4)     执行e2fsck -y /dev/sdX命令修复该分区,若文件系统损坏严重,修复后文件数据可能丢失。

 


12 IP修改失败故障处理

12.1  在高级功能下虚IP修改失败

12.1.1  故障描述

Matrix[部署>集群>集群参数>修改集群参数]页面下,勾选“高级”复选框后,对虚IP进行修改。单击<应用>按钮后虚IP修改失败。查看Matrix日志,存在如下日志报错:

2022-02-16T10:33:52,207 | INFO  | DeployResource-11-thread-1 | K8sClientHelper.getConfigMapByName:2120 | [K8sClientHelper] get configmap by name param: namespace kube-system, configmapName kube-proxy

2022-02-16T10:33:52,227 | ERROR | DeployResource-11-thread-1 | DefaultUncaughtExceptionHandler.uncaughtException:18 | uncaught exception in Thread[DeployResource-11-thread-1,5,main], stack: [java.lang.Thread.getStackTrace(Thread.java:1559), com.h3c.matrix.util.DefaultUncaughtExceptionHandler.uncaughtException(DefaultUncaughtExceptionHandler.java:18), java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1057), java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052), java.lang.Thread.dispatchUncaughtException(Thread.java:1959)]

java.util.ServiceConfigurationError: io.fabric8.kubernetes.api.KubernetesResourceMappingProvider: Provider io.fabric8.kubernetes.internal.InternalResourceMappingProvider not found

12.1.2  故障处理步骤

由于Fabric8开源问题,获取configmap失败,导致虚IP修改失败。

故障处理步骤:

使用systemctl restart matrix命令重启当前操作节点后,再次进行虚IP修改操作。

 


13 镜像损坏故障处理

13.1  镜像损坏

13.1.1  故障描述

·     现象1Pod处于ImagePullBackOff状态,使用kubectl describe pod -n namespace podName命令查看事件日志,提示如下。其中,namespacepodName为处于该状态Pod的命名空间及名称。

too many levels of symbolic links

·     现象2Pod处于ImageInspectError状态,使用kubectl describe pod -n namespace podName命令查看事件日志,提示如下。其中,namespacepodName为处于该状态Pod的命名空间及名称。

readlink /var/lib/docker/overlay2/l: invalid argument"

·     现象3:节点kubelet服务频繁重启,引起K8S节点状态异常(Not Ready状态),页面上节点飘红,查看节点详情,kubeletcoreDNS等检查项异常。查看故障节点的kubelet日志(/var/log/matrix-diag/Matrix/kubelet/kubelet.log),频繁打印异常日志“Image garbage collection failed once. Stats initialization may not have completed yet" err="failed to get imageFs info: unable to find data in memory cache.”。

出现上述三种现象,则为镜像损坏的故障。

13.1.2  故障处理步骤

·     方法一

请依次执行以下命令,删除故障Pod所在节点的所有容器及镜像。

[root@master1 ~]# systemctl restart docker

[root@master1 ~]# docker system prune

[root@master1 ~]# docker rm -f $(docker ps -aq)

[root@master1 ~]# docker rmi -f $(docker images -q)

·     方法二

若使用方式一无法消除该故障,请登录Matrix页面,重建故障Pod所在节点。

13.2  镜像层校验失败

13.2.1  故障描述

应用组件的安装或升级失败。请使用命令kubectl describe pod -n namespace podName查看事件日志,其中namespacepodName分别为该状态Pod的命名空间和名称,如下命令中Pod的命名空间和名称分别以developmentmy-app-pod为例。

[root@master1 ~]# kubectl describe pod -n development my-app-pod

如果出现以下任一错误,请根据故障处理步骤进行修复。

·     报错一:Filed to pull image matrix-registry.h3c.com:8088/matrix:metrics-server:v0.6.4: rpc error: code =Unknow desc = filesystem layer verification failed for digest sha256:xxxx 

·     报错二:Failed to pull image "matrix-registry.h3c.com:8088/middle/plat-deploy-init:v1.2": rpc error: code = Unknown desc = Error response from daemon: invalid digest format

13.2.2  故障处理步骤

进入/opt/matrix/k8s/disaster-recovery/目录。如果存在recover-image.sh脚本,请执行bash recover-image.sh imageName:imageTag命令。其中imageNameimageTag是在日志查询结果中的镜像名称和镜像版本号,如下命令中以matrixmetrics-server:v0.6.4为例。执行成功后,请重新进行部署或升级。如果脚本不存在,请联系技术支持工程师。

[root@master1 ~]# cd /opt/matrix/k8s/disaster-recovery/

[root@master1 disaster-recovery]# bash recover-image.sh matrix/metrics-server:v0.6.4

 


14 异地容灾故障处理

14.1  主备断连后,在主站点上删除灾备系统,导致备站点上配置残留 

14.1.1  故障描述

灾备场景下,当备站点宕机或者和主站点网络异常时,此时用户在主站点上操作删除灾备系统,由于备站点无法接收主站点信息,此时会导致备站点上灾备相关配置残留,备站点相关组件还是处于灾备模式。

14.1.2  故障处理步骤

1. 故障原因

由于备站点和主站点之间网络异常或者备站点宕机,导致备站点无法收到和执行主站点请求,从而导致配置残留。

2. 故障处理步骤

可以通过执行删除备站点配置脚本进行修复。具体操作如下:

在备站点任意一个节点上执行如下命令,脚本执行日志提示success表示修复成功。

sh /opt/matrix/app/install/metadata/UNIFIED-PLATFORM-EXTENSION/rdr/scripts/clearMemberRdrConfig.sh

图18 执行脚本后返回success结果

 

14.2  升主降备过程中,主备之间网络异常,导致降备站点无法访问

14.2.1  故障描述

灾备场景下,在升主降备的过程中,主备站点之间网路异常,导致降备站点(原主)无法访问,页面显示异常。

14.2.2  故障处理步骤

1. 故障原因

由于升主降备过程中网络异常,降备站点执行降备操作时,无法和新主建立连接,导致数据库异常。

2. 故障处理步骤

(1)     如果新主灾备页面显示状态为升主失败,确保主备网络恢复正常后,登录新主用站点的统一数字底盘页面,进入[系统>应急管理>异地容灾]页面,单击容灾关系中组件的按钮,等待升主成功即可。

(2)     如果新主灾备页面显示状态为主用状态,确保主备网络恢复正常后,在备站点上执行命令kubectl get pod -A -o wide | grep rdrs-pod查看灾备服务所在节点,在站点灾备服务所在节点上执行sh /opt/matrix/app/install/metadata/UNIFIED-PLATFORM-EXTENSION/rdr/scripts/forceDropProduct.sh命令,脚本执行日志提示如下图所示即可说明修复成功。

 

14.3  自动倒换模式下出现备用站点接管成功,主用站点无法自动降备

14.3.1  故障描述

在带仲裁的自动倒换模式下,主用站点出现异常,备用站点自动接管成功。原主用站点异常恢复后,无法自动降备,出现双主状态。

14.3.2  故障处理步骤

故障处理步骤如下:

(1)     确保原主用站点恢复正常后,登录新主用站点的统一数字底盘页面,进入[系统>应急管理>异地容灾]页面,修改倒换模式为手动模式后,单击容灾关系中组件的按钮,等待降备成功即可。

(2)     如果上述操作完成后故障仍无法排除,请联系技术支持工程师。

14.4  主备站点上的组件都是主用状态,业务异常

14.4.1  故障描述

主备站点上的组件都是主用状态。登录主备站点的统一数字底盘页面,主备站点上的控制组件菜单均显示正常。

14.4.2  故障处理步骤

·     故障可能的原因:

手动模式下,主备之间网络中断,手动在备站点页面上点击升主,备用组件接管成功,原主用站点由于网络原因未收到降备请求,导致未降备,最终出现“双主”状态。

·     故障处理步骤如下:

如果新主灾备页面显示状态为主用状态,确保主备网络恢复正常后,在备站点上执行命令kubectl get pod -A -o wide | grep rdrs-pod查看灾备服务所在节点,在备站点灾备服务所在节点上执行sh /opt/matrix/app/install/metadata/UNIFIED-PLATFORM-EXTENSION/rdr/scripts/forceDropProduct.sh命令,脚本执行日志提示如下图所示即可说明修复成功。

图19 执行脚本返回success结果

 

14.5  创建异地容灾失败后,备站点服务异常

14.5.1  故障描述

异地容灾创建失败后,配置为备角色的站点会进入异常状态。

14.5.2  故障处理步骤

·     故障可能的原因:

在创建异地容灾的过程中,需要按照优先级执行各业务组件的钩子脚本。如果关键业务的钩子脚本执行失败,将导致整个容灾创建过程失败,而之前已成功执行的钩子脚本不会回滚。例如,数据库的钩子脚本可能会将备站点的数据库设置为只读,licmgr的钩子脚本可能会将licmgr角色修改为standby,从而导致备站点处于异常状态。

·     故障处理步骤如下:

在任一备站点后台,执行以下命令以恢复环境:

[root@node1 ~]# sh /opt/matrix/app/install/metadata/UNIFIED-PLATFORM-EXTENSION/rdr/scripts/createFailedClearMemberRdrConfig.sh

如果脚本执行日志与下图提示一致,则说明修复成功。

图20 执行脚本返回success结果

 

 


15 SeaSQLCache相关故障处理

15.1  SeaSQLCache Persistent 实例单节点故障长时间不切主

15.1.1  故障描述

在集群环境中,seasqlcache-persistent-master相关Pod重启后,可能偶尔出现较长时间(超过 1 小时)内反复重启,或持续反复重启不自动恢复的现象。

15.1.2  故障处理步骤

1. 故障原因

主节点断电后,哨兵之间通信异常,哨兵集群中的数量不足以达成客观切主的最低要求,无法进行主节点切换。这导致主节点频繁进入titl 模式,并且一直监听异常的seasqlcache Pod

2. 故障处理

(1)     使用以下命令进入 seasqlcache-persistent组件的哨兵容器。

[root@node1 ~]# kubectl exec -it -n service-software <sentinel-name-pod> -- bash

(2)     使用以下命令检查当前的 seasqlcache 主节点地址。如果结果为异常Pod名称开头的 FQDN 或未返回结果,说明未正常切主,需要继续执行后续步骤。

[root@node1 ~]# seasqlcache-cli -h seasqlcache-persistent-out-svc -p 26379 SENTINEL get-master-addr-by-name mymaster

(3)     使用以下命令手动进行主节点切换。

[root@node1 ~]# seasqlcache-cli -p 26379 SENTINEL failover mymaster

切换完成后,再次使用以下命令检查是否切换到其他正常 Pod 开头的 FQDN 地址。

[root@node1 ~]# seasqlcache-cli -h seasqlcache-persistent-out-svc -p 26379 SENTINEL get-master-addr-by-name mymaster

如果成功切换到其他正常Pod返回的FQDN地址,故障处理流程结束。

15.2  SeaSQLCache Persistent实例sentinel Pod不断重启

15.2.1  故障描述

在集群环境中,部分seasqlcache-persistent-sentinel相关的Pod在重启后,有时会出现持续且反复的重启现象,且不会自动恢复。

15.2.2  故障处理步骤

1. 故障原因

检查日志后发现,启动失败是因为SeaSQLCache哨兵配置文件中自动写入的主从信息有误。sentinel日志显示:“FATAL CONFIG FILE ERROR (SeaSQLCache 6.2.12)”。

2. 故障处理

(1)     在各节点后台执行命令rm -rf /var/lib/ssdata/middleware/seasqlcache-persistent/sentinel.conf以删除存在问题的配置文件。

(2)     在任一节点执行kubectl get pod -n service-software | grep seasqlcache-persistent-sentinel | awk '{print $1}' | xargs kubectl delete pod -n service-software命令以重启哨兵的各个Pod

15.3  SeaSQLCache Persistent在关闭一个节点后切换主节点失败

15.3.1  故障描述

在集群环境中,偶尔会出现断开 SeaSQLCache 主节点后,哨兵无法选举出新的主节点的问题。

15.3.2  故障处理步骤

1. 故障原因

Seasqlcache sentinel 之间的通信异常导致哨兵集群未能满足至少两台正常运行的哨兵以重新选举 SeaSQLCache 主节点的条件。

2. 故障处理

(1)     首先尝试根据15.2  SeaSQLCache Persistent实例sentinel Pod不断重启中的故障处理方法进行处理;如果未能恢复,则继续执行后续步骤。

(2)     在任一K8s Master节点上执行kubectl get statefulset -n service-software seasqlcache-persistent-sentinel -o yaml > statefulset.yaml命令。

(3)     在上述Master节点上执行vim statefulset.yaml命令,确保文件中包含podManagementPolicy: Parallel这一行。如果该行不存在,请将其添加到selector:上方,并确保格式对齐。如果已有podManagementPolicy配置,请确认其值为Parallel;如果不是,请进行修改。

(4)     在各节点后台执行cd /var/lib/ssdata/middleware/seasqlcache-persistent/; rm -rf sentinel.conf  seasqlcache.conf命令删除可能有问题的配置文件

(5)     在上述Master节点执行kubectl get pod -n service-software |grep seasqlcache-persistent-master |awk '{print $1}' |xargs kubectl delete pod -n service-software命令。

(6)     在上述Master节点执行kubectl delete statefulset seasqlcache-persistent-sentinel -n service-software kubectl apply -f statefulset.yamls命令。

15.4  SeaSQLCache Persistent实例服务端脑裂

15.4.1  故障描述

在集群环境中,偶尔会出现无法使用seasqlcache-persistent的情况。经过定位,发现这是由于seasqlcache-persistent-master的主节点不一致所导致。

15.4.2  故障处理步骤

1. 故障原因

seasqlcache-persistent-master的主节点不一致通常是由于seasqlcache节点发生了网络分区。在这种情况下,节点间无法相互通信,导致哨兵分别对各自的节点进行主节点选举,进而引发了多主脑裂的问题。

2. 故障处理

(1)     在环境后台,使用以下3条命令查看各seasqlcache-persistent-master的主从信息:

kubectl exec -it -n service-software   seasqlcache-persistent-master-0 -- bash -c "seasqlcache-cli -p 6379 -a y=twSG2+5vG=Te4_2o info replication"

kubectl exec -it -n service-software   seasqlcache-persistent-master-1 -- bash -c "seasqlcache-cli -p 6379 -a y=twSG2+5vG=Te4_2o info replication"

kubectl exec -it -n service-software   seasqlcache-persistent-master-2 -- bash -c "seasqlcache-cli -p 6379 -a y=twSG2+5vG=Te4_2o info replication"

(2)     确保上述查询出来的3个节点信息中,只有一个是role:master,另外两个是role:slave,并且role:master下对应的slave0slave1分别是另外两个节点,role:slave对应的master_hostrole:master节点。

(3)     如果不满足上述结果,请在各节点后台执行rm-rf /var/lib/ssdata/middleware/seasqlcache-persistent/seasqlcache.conf命令删除有问题的配置文件,并执行kubectl get pod -n service-software |grep seasqlcache-persistent |awk '{print $1}' |xargs kubectl delete pod -n service-software命令重启seasqlcache-persistent集群。

15.5  SeaSQLCache Persistent 实例哨兵脑裂

15.5.1  故障描述

在集群环境中,有时会遇到无法使用 seasqlcache-persistent 的问题。经过定位,原因是 seasqlcache-persistent-sentinel 选取的主节点并不一致。

15.5.2  故障处理步骤

1. 故障原因

seasqlcache-persistent-sentinel选取的主节点不一致,通常由于seasqlcache的哨兵节点遭遇网络分区,造成节点间互不可见。这导致各哨兵独立进行主节点选举,进而引起了多主脑裂现象。

2. 故障处理

(1)     首先参考本文15.4  SeaSQLCache Persistent实例服务端脑裂章节确定不存在服务端考虑问题,否则请先处理服务端脑裂问题。确保没有服务端脑裂问题后,继续下述步骤检查和处理:

(2)     在环境后台,使用以下3条命令查看各seasqlcache-persistent-master的主从信息:

kubectl exec -it -n service-software seasqlcache-persistent-sentinel-0 -- bash -c "seasqlcache-cli -p 26379  SENTINEL get-master-addr-by-name mymaster"

kubectl exec -it -n service-software seasqlcache-persistent-sentinel-1 -- bash -c "seasqlcache-cli -p 26379  SENTINEL get-master-addr-by-name mymaster"

kubectl exec -it -n service-software seasqlcache-persistent-sentinel-2 -- bash -c "seasqlcache-cli -p 26379  SENTINEL get-master-addr-by-name mymaster"

(3)     确保上述查询出来的3个哨兵节点返回的seasqlcache主节点信息一致。

(4)     如果不满足上述结果,请在各节点后台执行rm-rf /var/lib/ssdata/middleware/seasqlcache-persistent/sentinel.conf命令删除有问题的配置文件,并执行kubectl get pod -n service-software |grep seasqlcache-persistent-sentinel |awk '{print $1}' |xargs kubectl delete pod -n service-software命令重启哨兵各Pod

 


16 Seaio相关故障处理

16.1  Seaio创建异地容灾失败

16.1.1  故障描述

主站点30000页面创建异地容灾失败,页面查看“创建异地容灾系统日志”,系统提示Seaio异地容灾创建失败,失败脚本为:seaio_rdr_createRdrs_master.sh

图21 查看创建异地容灾系统日志

 

进入主站点服务器后台,查看Seaio异地容灾脚本日志/var/lib/ssdata/logcenter/middleware/seaio/seaio_rdr_createRdrs_master.log,有如下图所示报错日志,即提示主备节点不能同时都有数据。

图22 报错日志

 

16.1.2  故障处理步骤

1. 故障原因

Seaio组件创建异地容灾前需要清空备站点数据,偶现备节点Seaio中个别数据无法删除。

2. 故障处理步骤

仅需在备站点的所有Master节点执行以下操作,Worker节点无需执行。

(1)     登录备站点服务器后台。

(2)     执行cd /var/lib/ssdata/logcenter/middleware/seaio/data/pvc-xxxxxx命令进入到seaio数据目录,查看是否存在文件,有则需要删除,xxxxx代表seaio pv卷名称的后缀,操作示例如下图所示。

图23 执行Delete seaio文件命令

 

(3)     在集群环境中,位于/var/lib/ssdata/logcenter/middleware/seaio/data路径下,会有多个pvc-xxxxxx目录,这些目录均需要执行上述的确认和删除操作。

(4)     依次登录到备集群中的其他节点,分别执行上述步骤。

16.2  Seaio从本地向服务端上传数据失败

16.2.1  故障描述

业务将冷备环境中的数据从本地备份恢复到Seaio服务端(上传文件至服务端),但部分数据上传失败,导致备份恢复任务无法完成。报错信息如下:

图24 报错信息

 

16.2.2  故障处理步骤

1. 故障原因

由于未知原因,Seaio在批量上传数据时部分数据上传失败。

2. 故障处理步骤

仅需在任意一个Master节点执行mc admin service restart cli命令重启Seaio服务,即可恢复集群的正常运行,Worker节点无需操作。

 

 


17 SeaSQL相关故障处理

17.1  SeaSQL实例可对外提供服务但有pod异常

17.1.1  故障描述

在集群环境中,主节点断电一段时间后再重新启动,偶现SeaSQL的部分Pod不断重启的情况。

17.1.2  故障处理步骤

1. 故障原因

在集群突发断电的情况下,偶现数据同步未完成和数据写入不完整的问题,导致系统无法启动。

2. 故障处理步骤

在确保SeaSQL可以正常对外提供服务(例如,确保其他业务Podbase-rs正常运行,且没有处于初始化状态或不断重启)的情况下,执行以下操作:

(1)     运行命令kubectl get pod -Aowide | grep seasql-命令查看不断重启的Pod所在节点。

(2)     登录到对应节点,进入/var/lib/ssdata/middleware/目录。

(3)     如果是seasql-basePod不断重启,则进入patroni-base目录;如果是seasql-businessPod不断重启,则进入patroni-business目录。

(4)     执行命令mv data data_bak对目录重命名。

(5)     等待几分钟,观察SeaSQL Pod是否还会继续重启。

如果问题仍然存在,或者有其他业务Pod异常,请联系H3C研发工程师。

17.2  SeaSQL实例Running但无法对外提供服务

17.2.1  故障描述

SeaSQL容器化集群版本中,当Leader节点宕机并重新启动后,可能会出现整个SeaSQL集群中所有节点都变为Replica,没有Leader,导致集群退化为只读状态。这种情况下,SeaSQL实例虽然处于运行状态(Running),但无法对外提供服务。

17.2.2  故障处理步骤

1. 故障原因

宕机节点的数据同步异常。

2. 故障处理步骤

(1)     在后台任一节点执行kubectl get pod -n service-software | grep seasql-|grep -v proxy|grep Running命令查询出SeaSQL实例RunningPod

(2)     执行kubectl exec -it -n service-software pod名称 – bash命令进入Pod内,执行patronictl -c /etc/patroni/patroni.yml list命令查看SeaSQL集群节点成员信息,找到Lag in MB最小、TL最大的节点的Member名称。

(3)     执行patronictl -c /etc/patroni/patroni.yml failover --candidate Member名称  --force命令。

17.3  从节点WAL日志删除或损坏引发的流复制异常

17.3.1  故障描述

从节点上读取的数据与主节点不一致,尽管SeasqlPod运行正常,但在执行patronictl -c /etc/patroni/patroni.yml list命令查看流复制状态时,发现从节点滞后严重。

图25 查看流复制状态

 

17.3.2  故障处理步骤

1. 故障原因

如果从节点异常持续较长时间,Leader节点会清理旧的WAL日志文件。此时,即使从节点重新启动,由于所需的WAL日志已被清理,流复制将无法建立,导致数据无法同步。数据库日志中将记录如下错误信息:

2025-03-20 22:29:33.664 CST,,,42995,,67dc264d.a7f3,2,,2025-03-20 22:29:33 CST,,0,FATAL,08P01,"could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000000000000004 has already been removed",,,,,,,,,"","walreceiver",,0

2. 故障处理步骤

(1)     请在从节点上执行以下命令以手动进行全量恢复。

[root@seasql-base-1 seasql-2]# patronictl -c /etc/patroni/patroni.yml reinit SEASQL_CLUSTER_BASE

图26 手动进行全量恢复

 

(2)     命令执行后,会从其他正常节点同步全量数据到当前节点进行恢复,该过程会根据数据量的大小持续一定时间,要持续观察恢复进度,待观察到“Lag in MB”的值为0时,表示恢复完成。

(3)     命令执行后,当前节点将从其他正常节点同步全量数据进行恢复。该过程所需时间会根据数据量的大小而有所不同,需持续观察恢复进度。可通过执行patronictl -c /etc/patroni/patroni.yml list命令进行观察。当“Lag in MB”的值达到0时,表示恢复已完成。

图27 查看Lag in MB的值

 

17.4  SeaSQL Pod异常,无法启动

17.4.1  故障描述

SeaSQLPod部分或全部异常,导致数据库不可用。

图28 查看Pod信息

 

图29 查看数据库集群状态

 

17.4.2  故障处理步骤

1. 故障原因

SeaSQL的三个Pod按顺序启动,顺序为seasql-base-0seasql-base-1seasql-base-2。如果seasql-base-0因其他原因(如流复制中断等意外情况)无法成功启动,那么其余两个Pod将不会启动,直到seasql-base-0恢复正常后才能启动。

2. 故障处理步骤

(1)     查看日志以确认当前的Leader节点。

[root@matrix patroni-base]# etcdctl get /seasql-base/SEASQL_CLUSTER_BASE/leader

(2)     Leader节点手动将SeaSQL数据目录压缩打包后,通过SCP拷贝到seasql-base-0

[root@matrix patroni-base]# cd /var/lib/ssdata/middleware/patroni-base/

[root@matrix patroni-base]# tar -czf seasql-base-1.tar.gz data/

[root@matrix patroni-base]# scp seasql-base-1.tar.gz 10.121.88.136:/var/lib/ssdata/middleware/patroni-base

图30 拷贝SeaSQL数据目录至seasql-base-0

 

(3)     替换seasql-base-0的数据目录

[root@matrix patroni-base]# mv data/ bak_data_20250425

[root@matrix patroni-base]# tar -xzf seasql-base-1.tar.gz

图31 替换seasql-base-0的数据目录

 

(4)     重启seasql-base-0,重启成功后,三个Pod将会顺利启动。

[root@matrix patroni-base]# kubectl delete pod -n service-software   seasql-base-0

(5)     检查流复制状态,如果发现异常,请参照17.3  从节点WAL日志删除或损坏引发的流复制异常进行修复。

图32 查看数据库集群状态

 

17.5  业务连接时断时连

17.5.1  故障描述

业务通过svc连接数据库时,有时正常,有时会出现阻塞,但后台直接连接数据库却能正常工作。可以使用psql -U kong -h seasql-base-svc -p 5432 -d seasql命令连接数据库。

17.5.2  故障处理步骤

1. 故障原因

由于断电重启或其他原因,seasql-haproxy中的某个seasql-proxy可能会出现异常。因此,当通过svc连接数据库时,系统会随机从三个haproxy中选择一个进行连接。如果选择的是正常的haproxy,连接数据库将正常进行;而如果选择了异常的haproxy,则可能会导致连接卡住。

2. 故障处理步骤

执行如下命令重启所有haproxy

[root@matrix ~]# kubectl delete pod -n service-software   seasql-base-proxy-74d84d66df-875cx

[root@matrix ~]# kubectl delete pod -n service-software   seasql-base-proxy-74d84d66df-q8qfd

[root@matrix ~]# kubectl delete pod -n service-software   seasql-base-proxy-74d84d66df-vpfgh

17.6  Autovacuum失败导致表膨胀

17.6.1  故障描述

由于数据目录磁盘空间不足,导致数据库出现异常,但表中查询的实际数据量并不大。

图33 磁盘空间不足

 

17.6.2  故障处理步骤

1. 故障原因

数据表发生膨胀,尽管有效数据量很小,但大量无效数据导致表占用的磁盘空间过高。数据库默认会每分钟启动一个Autovacuum进程对表进行垃圾回收,正常情况下表不会膨胀。然而,如果业务占用的内存过高,可能会导致vacuum过程失败(出现“could not resize shared memory segment "/PostgreSQL.71222334" to 56456434 bytes”错误),从而导致表无法成功进行垃圾回收,最终导致磁盘空间被完全占满。

2. 故障处理步骤

在数据上执行VACUUM;命令,以对整个数据库进行一次vacuum垃圾回收。

图34 清理当前数据库的所有表

 

17.7  Pod 名称漂移导致出现两个Replica,但未sync standby

17.7.1  故障描述

SeaSQL集群中出现了两个Replica,但没有sync standby

17.7.2  故障处理步骤

1. 故障原因

SeaSQL的三个Pod的数据目录挂载在三个不同的服务器节点上。由于SeaSQL是一个有状态的服务,其leadersync standbyReplica的数据目录是有区别的。然而,由于Kubernetes随机调度Pod,可能会导致某个Pod的数据目录与实际不一致。例如,原本是leaderseasql-0可能被调度到seasql-base-1的数据目录所在节点上,这样就会导致seasql-base-0同时成为leadersync standby,从而导致数据库角色异常,集群中缺少sync standby角色。

2. 故障处理步骤

·     如果leadersync standbyPod数据目录发生互换,它们的数据是同步的,只需交换配置文件postgresql.conf即可。

·     如果leaderReplicaPod数据目录发生互换,则需要将数据目录恢复到原来的位置。

17.8  Matrix上修改IP后,SeaSQL异常

17.8.1  故障描述

使用Matrix平台的修改IP功能后,SeaSQL出现异常。

17.8.2  故障处理步骤

1. 故障原因

首先需要确认是否对SeaSQL执行了IP修改操作。请查看日志文件/var/log/matrix-diag/deploy/UNIFIED-PLATFORM-BASE/clusterReconfigHook.log。如果日志中有SeaSQLIP修改记录,则说明该操作已执行,接下来检查日志中是否有报错信息。

2. 故障处理步骤

根据日志中的错误信息定位问题并进行修复后,再在Matrix上重新进行IP修改。

17.9  SeaSQL卡在starting状态,无法启动成功

17.9.1  故障描述

虽然seasql-base-1Pod处于Running状态,但由于SeaSQL始终卡在starting状态,因此下图红框中显示为0/1,正常情况下应为1/1

图35 Pod处于Running状态

 

图36 SeaSQL处于starting状态

 

17.9.2  故障处理步骤

1. 故障原因

故障可能由如下其一导致:

·     如果SeaSQL所在节点频繁断电重启,或在使用pg_rewind同步数据时遭遇中断,可能会导致WAL损坏或缺失,从而使节点无法正常启动并卡在starting阶段。

·     如果SeaSQL原主节点长时间断电后重新启动,而新主节点的旧WAL已被回收,则原主节点在使用pg_rewind同步数据时会因缺失相关WAL而卡在starting阶段。

2. 故障处理步骤

·     存在leader节点

如果当前集群中仍然存在leader节点,可以直接使用以下命令来修复故障节点:

[root@matrix ~]# patronictl -c /etc/patroni/patroni.yml reinit SEASQL_CLUSTER_BASE

图37 修复完成

 

·     不存在leader节点

当前集群没有leader节点,所有已启动的Pod中的SeaSQL都处于starting状态。具体情况与17.4  SeaSQL Pod异常,无法启动故障描述类似,只是节点的状态是starting。在这种情况下,修复方法与该章节的故障处理步骤相同。

17.10  两个从节点流复制都中断,手动全量修复失败

17.10.1  故障描述

当两个从节点的流复制同时中断时,手动进行全量修复的措施未能奏效,导致流复制依然处于中断状态。

17.10.2  故障处理步骤

1. 故障原因

通过执行patronictl -c /etc/patroni/patroni.yml list命令检查数据库集群状态时,虽然集群显示存在leader节点且所有节点状态为“running”,但“Lag in MB”列显示非零值。如下图所示。

图38 查看数据库集群状态

 

由于参数设置的原因,默认情况下,当“Lag in MB”小于max_slot_wal_keep_size(默认值为20480MB)时,即使集群间存在较大的网络延迟或IO/网络瓶颈导致暂时性的流复制延迟,集群仍能自动同步延迟的WAL日志,无需人为干预。然而,当“Lag in MB”超过20480MB时,所需同步的WAL日志可能已被清理,此时需要通过执行reinit来恢复节点的流复制延迟。

由于reinit在备节点处于running状态时,默认从其他备节点同步WAL日志。因此,如果两个备节点都处于running状态且都存在流复制延迟,会导致一个备节点无法从另一个备节点获取完整的WAL日志。在这种情况下,需要手动停止其中一个节点的patroni服务,然后对处于running状态的备节点执行reinit,以便其能够直接从Leader节点同步数据。

2. 故障处理步骤

(1)     停止另一个备节点的Patroni服务。

[root@matrix patroni-base]# kubectl delete pod -n service-software   seasql-base-2

图39 停止Patroni服务

 

(2)     在数据库集群的Leader节点上对seasql-base-1执行reinit操作。

[root@seasql-base1 seasql-2]# patronictl -c /etc/patroni/patroni.yml reinit SEASQL_CLUSTER_BASE

(3)     再次查看集群状态,发现seasql-base-1已经不再延迟。

[root@seasql-base1 seasql-2]# patronictl -c /etc/patroni/patroni.yml list

图40 查看集群状态

 

(4)     seasql-base-2执行reinit即对剩余存在流复制延迟的备节点执行reinit

(5)     检查集群状态,确保所有备节点没有流复制延迟。可以通过执行patronictl -c /etc/patroni/patroni.yml list命令来确认所有备节点的“Lag in MB”显示为0

图41 查看集群状态

 

 

 


18 seamq相关故障处理

18.1  系统断电或重启后seamq 实例状态异常

18.1.1  故障描述

在节点系统断电或重启后,seamq服务偶尔会显示非Running状态的Pod,该Pod会不断重启,重启次数持续增加,并且Pod状态会频繁在CrashLoopBackOffRunning之间切换。下图展示了seamq正常运行时的状态。

图42 正常情况下的seamq状态

 

18.1.2  故障处理步骤

故障可能的原因:当节点系统断电或重启后,可能会导致该节点上运行的seamq实例的数据文件损坏或内容不完整,从而使得相应的Pod持续处于不断重启的状态。

可以通过kubectl logs -nservice-software -f 异常seamq-pod名称 | grep "Found a corrupted index file"命令确认是否存在seamq数据文件损坏。

(1)     执行kubectl get pod -nservice-software -owide | grep seamq命令获取异常Pod所在的节点。

图43 获取异常Pod所在节点

 

(2)     执行kubectl get pod -n service-software seamq-base-controller-0 -o json | jq -r '.spec.volumes | .[] | select(.name == "data")'命令获取异常Pod在宿主机上的数据目录

图44 获取数据目录

 

(3)     执行cd /var/lib/ssdata/middleware/seamq/data命令进入到有文件损坏的节点目录

(4)     按顺序执行如下命令。

sudo rm -rf *

kubectl delete pod -n service-software 异常pod名称

(5)     等待该异常Pod恢复正常即可。

如果seamq配置为三个实例的Pod集群环境,单个节点的文件损坏不会影响seamq的正常运行。然而,如果超过一个节点遭受文件损坏,可能会对seamq服务的运行造成影响。对于单节点实例Pod环境,文件损坏则无法确保seamq服务的稳定运行和数据完整性。通过前述恢复操作,虽然seamq可以恢复正常运行,但可能会导致部分数据丢失。

18.2  服务器断电重启后,该服务器上部署的seamq实例反复重启

18.2.1  故障描述

在服务器断电重启后,可能会导致该服务器上部署的seamq实例在短暂的Running状态后进入重启循环,最终Pod状态显示为CrashLoopBackOff

图45 查看seamq的服务状态

 

通过命令kubectl logs -n service-software 异常的pod名称 --tail=5查看Pod日志时,出现文件读取错误:ERROR Shutdown broker because all log dirs in /bitnami/seamq/data have failed

图46 获取服务异常原因

 

18.2.2  故障处理步骤

故障可能原因:在服务器断电时,可能会出现seamq缓冲区中的数据未能及时完整写入磁盘,导致部分文件内容不完整。启动seamq时,如果读取到异常文件,将会出现致命错误并导致服务重启。

(1)     执行命令kubectl logs -n service-software 异常seamq Pod名称 | grep "Error while reading checkpoint file"以获取seamq读取异常的文件信息。

图47 获取异常文件名

 

(2)     执行命令kubectl get pod -n service-software -o wide | grep seamq以获取异常Pod所在的节点信息。

图48 获取异常Pod所在节点

 

(3)     执行kubectl get pod -n service-software 异常seamq Pod -o json | jq -r '.spec.volumes | .[] | select(.name == "data")'命令获取异常Pod在宿主机上的数据目录。

图49 获取数据目录

 

(4)     将步骤1中的顶层目录“bitnami”替换为步骤3获取的数据目录。在本场景示例中,获取的异常文件/bitnami/seamq/data/__consumer_offsets-38/leader-epoch-checkpoint在宿主机上的路径为/var/lib/ssdata/middleware/seamq/data/__consumer_offsets-38/leader-epoch-checkpoint

(5)     登录到异常seamq  Pod所在的宿主机,执行命令rm /var/lib/ssdata/middleware/seamq/data/__consumer_offsets-38/leader-epoch-checkpoint删除异常文件。

(6)     执行kubectl delete pod -n service-software 异常pod名称命令重启异常的seamq Pod,然后等待服务恢复正常即可。

 

18.3  集群中单节点丢包,导致业务消费seamq异常

18.3.1  故障描述

seamq相关业务日志输出异常,消费Kafka日志时频繁出现“Preparing to rebalance”信息。可通过执行命令kubectl logs -n service-software seamq-base-controller-0 | grep "Preparing to rebalance"查看。其中,“seamq-base-controller-0”是seamq集群的Pod名,可替换为其他Pod名。

图50 查看pod日志

 

使用ping命令检查集群节点间的网络时,发现某个节点的丢包率较高。

图51 检查集群间节点网络

 

18.3.2  故障处理步骤

1. 故障原因

seamq心跳检测任务因网络丢包而时而成功、时而失败,导致丢包节点上的seamq实例不断地上线和下线。在此过程中,会触发seamq重平衡,导致Topic短暂不可读写

2. 故障处理步骤

当发生该故障时,可通过关闭丢包节点解决。

(1)     登录丢包节点后台,执行命令sudo shutdown -h now进行关机,或通过拔掉网线使节点脱离集群。

(2)     修复网络问题后重启节点,使节点重新加入集群

18.4  seamq实例Running但服务异常

18.4.1  故障描述

执行命令kubectl get pod -n service-software | grep seamq查看Pod的运行状态,发现它们均处于Running状态,但业务仍无法消费seamq。接着,通过命令kubectl logs -n service-software seamq-base-controller-0(“seamq-base-controller-0”是seamq集群的Pod名,可替换为其他Pod名)查看Pod的最后一行日志,发现日志的输出时间与当前服务器时间相差很大,差距可超过两小时。

图52 查看Pod最后一行日志

 

18.4.2  故障处理步骤

1. 故障原因

seamq日志输出使用log4j开源日志管理框架来跟踪服务堆栈信息,发现部分seamq线程的状态为BLOCKED。堆栈跟踪显示,问题发生在Log4jOutputStreamManager.writeBytes方法,多个线程在尝试锁定OutputStreamManager对象时被阻塞,从而导致系统性能下降甚至出现假死现象。

2. 故障处理步骤

(1)     执行命令kubectl get pod -n service-software | grep ^seamq | awk '{print $1}'以获取Pod名称。

图53 获取seamqPod名称

 

(2)     查看各个Pod的最后一行日志。若发现日志的输出时间与当前服务器时间相差很大,差距可超过两小时,即说明该Pod当前处于假死状态。

图54 seamq服务日志

 

(3)     执行命令kubectl delete pod 假死服务pod -n service-software以重启假死服务。“假死服务pod名”请替换为相应的假死服务Pod名称。

 

18.5  无效日志导致业务消费seamq异常,业务Pod反复重启

18.5.1  故障描述

在一个或多个节点异常断电后重新上电,依赖seamq的服务出现反复重启的问题。业务Pod输出日志显示:“flight FIND_COORDINATOR request with correlation id 215227 due to node 2 being disconnected”。

图55 业务Pod状态

 

18.5.2  故障处理步骤

1. 故障原因

查看seamq日志时提示:“Found record size 0 smaller than minimum record overhead (14)”,这表明在日志段文件00000000000002599697.log中存在损坏的记录,可能由以下原因导致:

(1)     磁盘故障:由于硬件错误,导致文件写入不完整。

(2)     seamq异常崩溃:Broker进程意外终止,导致日志未正常关闭。

(3)     手动修改文件:人为误操作,例如直接删除或修改日志文件。

2. 故障处理步骤

可以参考18.1.2  故障处理步骤进行修复。

 

 


19 SeaSQLPlus相关故障处理

19.1  由于日志或快照损坏,SeaSQLPluskeeper Pod会不断重启

19.1.1  故障描述

SeaSQLPluskeeper Pod不断重启,通过执行kubectl logs -f -nservice-software $pod命令查看keeper Pod日志,查看到如下Failed to preprocess stored log报错。

图56 查看报错

 

19.1.2  故障处理步骤

1. 故障原因

Keeper log数据损坏,导致无法加载stored log数据,无法启动keeper

2. 故障处理步骤

(1)     在环境后台,通过执行kubectl get pod -n service-software -owide|grep seasqlplus命令查看不断重启的SeaSQLPluskeeper Pod所在的节点。

(2)     将如下命令中的“seasqlplus-sa-keeper-0”改为不断重启的SeaSQLPluskeeper Pod名称,以获取该Pod的数据目录。

kubectl describe pv -n service-software $(kubectl describe pvc -n service-software $(kubectl describe pod -n service-software seasqlplus-sa-keeper-0|grep 'ClaimName'|awk '{print $2}')|grep Volume:|awk '{print $2}')|grep Path:

(3)     连接到第(1)步查找到的不断重启的seasqlplus-*-keeper所在节点后台,执行rm -rf  ${path}/*命令,其中${path}需改为上一步获取到SeaSQLPluskeeper Pod的数据目录;

(4)     执行kubectl delete po -nservice-software $pod命令重启故障Pod,其中$pod需要改为不断重启的SeaSQLPluskeeper Pod名称

19.2  Seasqlplus-uc-shard因数据块损坏,Pod不断重启

19.2.1  故障描述

Seasqlplus-uc-shard Pod不断重启,通过执行kubectl logs -f -nservice-software $pod查看Pod日志,其中$pod为故障pod,查看到如下broken part 报错。

图57 查看报错

 

19.2.2  故障处理步骤

1. 故障原因

SeaSQLPlus数据损坏,导致无法加载数据,无法启动。

2. 故障处理步骤

(1)     在环境后台,使用kubectl get pod -n service-software -owide|grep seasqlplus命令查看故障的SeaSQLPlus Pod名及其所在的节点

(2)     将如下命令中的“seasqlplus-sa-shard0-0”改为不断重启的SeaSQLPlusPod名称,以获取该Pod的数据目录

kubectl describe pv -n service-software $(kubectl describe pvc -n service-software $(kubectl describe pod -n service-software seasqlplus-sa-shard0-0|grep 'ClaimName'|awk '{print $2}')|grep Volume:|awk '{print $2}')|grep Path:

(3)     进入故障Pod对应的节点后台,执行rm -rf  ${path}/data/store/*命令,其中${path}需改为上一步获取到的目录名。

(4)     执行kubectl delete po -nservice-software $pod命令重启故障Pod,其中$pod需要改为不断重启的故障Pod名。

19.3  重建节点的Seasqlplus-*-shardacess相关SQL无法找到,导致SQL查询失败

19.3.1  故障描述

使用全新的服务器替换重建Matrix的一个节点,重建完成后分析组件健康度趋势无数据报CK异常。

执行kubectl logs -f -nservice-software $pod命令查看重建节点的Seasqlplus-*-shard Pod日志,$pod为故障Pod

查看到如下No such file or directory. (FILE_DOESNT_EXIST)报错:

2024.10.22 11:14:52.917949 [ 4373 ] {} <Error> TCPHandler: Code: 107. DB::ErrnoException: Cannot open file /bitnami/seasqlplus/data/access/384c3486-19a6-fbed-3ba6-2da0622663b9.sql, errno: 2, strerror: No such file or directory. (FILE_DOESNT_EXIST), Stack trace (when copying this message, always include the lines below):

19.3.2  故障处理步骤

1. 故障原因

SeaSQLPlus重建节点同步access数据文件与对应user id不一致,导致查询SQL时部分数据无法查询成功。

2. 故障处理步骤

(1)     在环境任一节点后台,执行kubectl get pod -n service-software -owide|grep seasqlplus命令查看重建节点上的seasqlplus pod名称。

(2)     将如下命令中的“seasqlplus-sa-shard0-0”改为重建节点上的SeaSQLPlusPod名称(应该是有2个,需要分别按照如下步骤各自获取和处理,下面不再赘述),以获取该这两个Pod的数据目录:

kubectl describe pv -n service-software $(kubectl describe pvc -n service-software $(kubectl describe pod -n service-software seasqlplus-sa-shard0-0|grep 'ClaimName'|awk '{print $2}')|grep Volume:|awk '{print $2}')|grep Path:

(3)     进入重建节点后台,执行如下命令,其中${path}为上一步获取到的目录名。

cd ${path}/data/access

sudo su -c "mv xxx.sql yyy.sql"

注意:需将xxx.sql改为该目录下实际存在的sql文件名,并通过日志提示的Cannot open file /bitnami/seasqlplus/data/access/384c3486-19a6-fbed-3ba6-2da0622663b9.sql, errno: 2, strerror: No such file or directory. (FILE_DOESNT_EXIST) 来确定yyy.sql即:384c3486-19a6-fbed-3ba6-2da0622663b9

(4)     执行如下命令重启重建节点上的Pod,其中$pod需要改为第(2)步处理的Pod名。

kubectl delete po -nservice-software $pod

19.4  SeaSQLPlus因断电重启导致tablereadonly状态

19.4.1  故障描述

SeaSQLPlus集群中的某个节点断电后重新启动,table状态变为readonly。执行kubectl logs -f -n service-software $Pod命令查看重建节点的故障Pod日志,其中$Pod为重建节点的故障Pod

[root@node1 ~]# kubectl logs -f -n service-software $Pod

执行结果中出现了TABLE_IS_READ_ONLY报错:

2024.11.08 12:50:11.636954 [ 3999 ] {4455ad14-e181-4ebc-9993-e27ecd8f4f36} <Error> TCPHandler: Code: 242. DB::Exception: Table is in readonly mode: replica_path=/seasqlplus/tables/shard2/influxdb_ndp_net_db/tunnel_data_info_5m_7d_physical/replicas/seasqlplus_sa_shard2_1. (TABLE_IS_READ_ONLY), Stack trace (when copying this message, always include the lines below)

19.4.2  故障处理步骤

1. 故障原因

SeaSQLPlus断电重启后,节点与keeper中元数据不一致,导致table状态为readonly

2. 故障处理步骤

在故障Pod/opt/bitnami/scripts目录执行fixReadOnly.sh脚本,其中$Pod为故障Pod

[root@node1 ~]# kubectl exec -it -nservice-software $Pod bash

# cd /opt/bitnami/scripts

# bash fixReadOnly.sh

19.5  SeaSQLPlus应用组件安装失败提示REPLICA_ALREADY_EXISTS

19.5.1  故障描述

SeaSQLPlus集群的应用组件安装失败。查看相应的应用初始化作业日志以获取详细信息:

[root@node1 ~]# grep 'REPLICA_ALREADY_EXISTS' /opt/matrix/app/deploy-tool/custom_file/UC-NTA-E7xxx-xxx/nta/scripts/database/seasqlplus-uc/init/seasqlplus-uc-init.sh-xxxx-xx-xx.log

执行结果中查询得到REPLICA_ALREADY_EXISTS报错:

Code: 253. DB::Exception: Received from seasqlplus-uc-shard2-0.seasqlplus-uc-headless.service-software.svc.cluster.local:9000. DB::Exception: Replica /seasqlplus/tables/shard2/nta_db/tbl_nta_conv1week_bgp_local/replicas/seasqlplus_uc_shard2_0 already exists. (REPLICA_ALREADY_EXISTS)

19.5.2  故障处理步骤

1. 故障原因

SeaSQLPlus应用卸载过程中,使用DROP DATABASE时未处理DROP TABLE,可能导致keeper数据中残留与表相关的元数据。

2. 故障处理步骤

在卸载故障应用组件后,请在相应的keeper Pod中执行删除上述故障描述中残留的元数据,以seasqlplus-uc-keeper-0为例,其中$Pod代表对应的keeper Pod

[root@node1 ~]# kubectl exec -it -nservice-software seasqlplus-uc-keeper-0 bash

# seasqlplus-keeper-client -h 0.0.0.0 -p 2181

/ :) rmr /seasqlplus/tables/shard2/nta_db/tbl_nta_conv1week_bgp_local/replicas/seasqlplus_uc_shard2_0

 

 


20 PolarDB相关故障处理

20.1  集群状态异常,显示UNSYNC异常

20.1.1  故障描述

在一主两备环境下,数据库实例和代理仍正常提供服务,但在查看集群状态(/root/polardb/pdbcli status --config config.yaml)时发现异常:某个节点显示FAILEDUNSYNC。如下:

"standby": [

                {

                        "endpoint": "10.99.216.83:1523",

                        "work_path": "/var/lib/thirdDB/clusters/polardb1",

                        "phase": "FAILED",

                        "start_at": "2024-10-11 14:46:48",

                        "sync_status": "UNSYNC"

                },

                {

                        "endpoint": "10.99.216.167:1523",

                        "work_path": "/var/lib/thirdDB/clusters/polardb1",

                        "phase": "RUNNING",

                        "start_at": "2024-10-11 14:58:43",

                        "sync_status": "SYNC"

                }

           ]

20.1.2  故障处理步骤

1. 故障原因

在系统性能不佳且负载过高的条件下,大规模数据操作可能会导致备份节点与主节点之间的位点延迟超过3600秒,此时备份节点的状态将被标记为UNSYNC。若在进行大量数据操作时发生断电,导致主备节点切换,原主节点由于位点超前可能无法进行数据同步,从而导致同步失败。在这种情况下,需要手动介入以恢复数据一致性。

2. 故障处理步骤

如果一个被标记为UNSYNC的节点没有硬件问题,并且观察超过30分钟后仍未自动恢复,可以通过在存放数据库安装包的节点执行以下命令手动重建异常节点:

cd /root/polardb/ && pdbcli rebuild db --target <ip> --config config.yaml

在上述命令中,将<ip>替换为处于UNSYNC状态的节点的IP地址。例如:

cd /root/polardb/ && pdbcli rebuild db --target 10.99.216.83 --config config.yaml

20.2  集群状态正常,但是备节点WAL日志堆积占用磁盘较大

20.2.1  故障描述

通过使用pdbcli status命令检查集群状态时,虽然显示一切正常,但观察到备份节点的WAL日志磁盘占用较高,存在磁盘满载的风险。该问题已在2024-10-27发布的polardb版本中得到解决。对于旧版本,可以参照此操作进行处理。

20.2.2  故障处理步骤

1. 故障原因

当发生断电导致主节点切换时,旧主节点遗留了大量的残留slot,这部分占用了一定的磁盘空间。此外,当旧主节点作为备份节点重新加入集群并同步新的WAL日志数据时,这两部分数据的累积导致磁盘占用增加。

2. 故障处理步骤

(1)     在异常节点检查solt的活跃状态,active的值为t则活跃,为f则不活跃

a.     执行如下命令登录到数据库。其中,异常节点IP和数据库用户名请根据实际情况替换。

/u01/polardb_pg/bin/psql -h 异常节点ip -dpostgres -p1523 -U数据库用户名

b.     登录数据库后执行如下命令

select * from pg_replication_slots;

(2)     删除不活跃slot,并进行checkpoint执行如下

select * from pg_drop_replication_slot(‘slot_name’);

checkpoint;

(3)     最后判断异常节点WAL日志占用是否正常,如异常请联系H3C工程师。

20.3  数据库实例正常,但数据库代理MaxScale异常

20.3.1  故障描述

PolarDB所在节点系统断电重启后,概率出现数据库代理服务无法自动启动,导致业务连接数据库异常。

20.3.2  故障处理步骤

1. 故障原因

节点在断电重启后,如果代理无法启动,通常是因为MaxScale未能探测到其他节点,导致其自动停止运行。

2. 故障处理步骤

(1)     需确保NetworkManager服务已开启。可通过在PolarDB所在节点后台执行systemctl status NetworkManager命令查看NetworkManager服务是否已开启,若已开启,则将在Active字段后显示运行信息为active (running)

图58 查看NetworkManager服务运行状态

 

(2)     执行nmcli device status命令检查网卡是否正常可用。

图59 查看网卡状态

 

(3)     手动启用MaxScale代理服务。

如果非root用户部署,在执行如下命令前,请先执行sudo -i提升权限。

a.     在数据库各代理节点执行ps aux|grep -v grep |grep maxscale命令验证数据库代理服务MaxScale是否成功启用,未查到/opt/maxscale/bin/maxscale -f /opt/maxscale/polardb1/etc/maxscale.cnf -U root相关进程则为启用失败。

b.     在数据库各代理节点执行/opt/maxscale/bin/maxscale -f /opt/maxscale/polardb1/etc/maxscale.cnf -U root命令进行手动启用,等待命令执行完成即可。

20.4  修改SSH端口后,使用pdbcli查看PolarDB状态时出现异常

20.4.1  故障描述

修改SSH端口后,PolarDB的部署将会失败;而在已部署的PolarDB环境中修改SSH端口后,使用pdbcli命令查看PolarDB状态会报错。

20.4.2  故障处理步骤

1. 故障原因

PolarDB依赖于本地SSH客户端配置文件/etc/ssh/ssh_config中的端口设置。如果仅修改SSH服务端的端口,而不更新客户端配置,将导致PolarDB安装失败或pdbcli命令查询状态时报错。

2. 故障处理步骤

以将SSH端口修改为12345为例,参考《统一数字底盘部署指导》修改完成后,请在PolarDB各节点上执行以下命令以更新本机SSH客户端配置:

[root@node1 ~]# sed -i '/Port /d' /etc/ssh/ssh_config

[root@node1 ~]# echo 'Port 12345' >> /etc/ssh/ssh_config

20.5  已删除的数据库仍可通过代理连接,但继续使用时会出现错误

20.5.1  故障描述

通过PolarDB代理访问已删除的数据库时,虽然连接可以正常建立,但在进行建表等操作时会提示该数据库不存在。这种情况通常出现在组件部署失败回滚后重新部署时。

20.5.2  故障处理步骤

1. 故障原因

PolarDB代理会缓存已创建的数据库和用户等信息,这些信息不会在数据库删除后立即清理。因此,当通过代理访问已删除的数据库时,仍然可以建立连接,因为代理缓存中仍保留该数据库的信息。然而,在尝试授权或进行建表等操作时,由于PolarDB服务端检测到该数据库不存在,SQL执行将会失败。

2. 故障处理步骤

手动重启MaxScale代理服务,以清理代理缓存数据。如果是非root用户,请在执行以下命令前先使用sudo -i命令提升权限。

(1)     在每个数据库代理节点执行ps aux|grep -v grep |grep maxscale|awk '{print $2}'|xargs kill -9命令以停止MaxScale代理服务。

在每个数据库代理节点执行/opt/maxscale/bin/maxscale -f /opt/maxscale/polardb1/etc/maxscale.cnf -U root命令手动启用MaxScale,等待命令执行完成即可。

20.6  节点断电重启后代理自愈时间较短导致出现异常

20.6.1  故障描述

PolarDB所有节点断电重启后,无法连接PolarDB。在任一节点执行pdbcli status命令时,发现所有代理节点均处于FAILED状态。

20.6.2  故障处理步骤

1. 故障原因

PolarDB代理自主恢复时间超过配置阈值后,停止自主恢复,导致代理未能处于启动状态。

2. 故障处理步骤

依次在PolarDB代理节点执行以下步骤以修改阈值StartLimitInterval

(1)     执行命令vim /etc/systemd/system/polardb-proxy-polardb1.service,将StartLimitInterval=900s修改为StartLimitInterval=86400s

图60 修改参数值

 

(2)     执行命令systemctl daemon-reload && systemctl restart polardb-proxy-polardb1.service以重启服务并使配置生效。

 

 


21 OASIS相关故障处理

21.1  RabbitMQ部分QueueSlave无法同步数据

21.1.1  故障描述

RabbitMQ集群环境中,偶现部分QueueSlave无法同步数据。通过RabbitMQ的监控页面,我们可以看到这些Queue的“Node”列中有标记为“unsynchronised”的节点。请注意,RabbitMQ的监控页面默认是无法直接访问的,需要按照以下步骤进行访问设置:

(1)     修改SVC类型,以便外部可通过该SVC访问RabbitMQ监控页面。

kubectl patch service rabbitmq-out -n oasis -p '{"spec": {"type": "NodePort"}}'

(2)     获取放开的端口号

kubectl get svc -n oasis rabbitmq-out -ojson|jq '.spec.ports[0].nodePort'

(3)     通过北向IP和该端口访问RabbitMQ的监控页面,页面的用户名和密码都是“o2o”,Queue的信息在“Queues”页签。如果某个队列Slave无法同步数据,就会在“Node”列中存在标记为“unsynchronised”的节点。

图61 RabbitMQ的监控页面

 

21.1.2  故障处理步骤

1. 故障原因

该问题偶现,目前已知可能触发此问题的操作是RabbitMQ所在节点的网卡重启。

2. 故障处理步骤

重启RabbitMQ即可恢复:

kubectl get pod -n oasis |grep rabbitmq-node|awk '{print $1}'|xargs kubectl delete pod -n oasis

 


22 SEANODB相关故障处理

22.1  Seanodb data node replica set id重置

22.1.1  故障描述

Seanodb集群环境中,偶现data node replica set id被重置的情况。通过Seanodb日志可以发现“replica set IDs do not match”的错误提示。可按以下步骤进行排查:

(1)     运行如下命令查询。

[root@node1 ~]# grep 'replica set IDs do not match' /var/lib/ssdata/logcenter/middleware/seanodb/seanodb.log

(2)     查看返回结果,如存在匹配项,则根据故障处理步骤进行修复。

22.1.2  故障处理步骤

1. 故障原因

该问题偶现,目前已知可能触发该问题的操作是Seanodb所在节点的断电重启。

2. 故障处理步骤

删除故障节点的Seanodb数据后,重启对应的故障Pod即可恢复。注意,请将$Pod替换为实际的故障Pod名。

[root@node1 ~]# rm -rf /var/lib/ssdata/oasis/mongodb/shard/datadir/*

[root@node1 ~]# kubectl delete pod -n service-software $Pod

 

 

新华三官网
联系我们