常见故障定位手段

    可以通过如下方法确定操作系统是否存在问题:

    • 通过SSH或者其它远程登录工具登录该节点。如果连接失败,请尝试通过ping发包检查网络状态。

      • 如果ping操作没有回复,则表明这台机器可能存在网络连接故障、处于宕机状态或者正处于重启状态。

        如果操作系统内核发生panic引起系统崩溃,系统重新启动时间较慢,需经过较长时间(大约20分钟)才能重启。建议每5分钟尝试连接一次,20分钟后不能连接成功,则表明这台机器已宕机或网络连接有问题,需要管理员到现场进行检查处理。

      • 如果网络可以ping通,但在SSH登入时卡住或登入后不能执行任何命令,通常是由系资源不足(如CPU或IO资源过载)引起的机器不响应外部连接。建议重试几次。如果5分钟内仍不能成功,需要管理员到现场进行检查处理。

    • 可以远程登录节点,但在执行操作时,响应缓慢,需要检查系统运行情况后,进行进一步处理。例如,收集系统信息、确定系统版本、硬件、参数设置及登录用户情况。下面列出一些常用命令供参考。

      • “who”命令查看当前在线用户。
    1. [root@openGauss36 ~]# cat /etc/openEuler-release
    2. openEuler release 20.03 (LTS)
    3. [root@openGauss36 ~]# uname -a
    4. Linux openGauss36 4.19.90-2003.4.0.0036.oe1.aarch64 #1 SMP Mon Mar 23 19:06:43 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
    5. [root@openGauss36 ~]#
    1. - sysctl -a”命令(需要root用户执行)和“cat /etc/sysctl.conf”命令获得系统参数信息。
    2. - cat /proc/cpuinfo”和“cat /proc/meminfo”获得CPU和内存信息。
    • “top -H”命令查看CPU的使用情况,确定是否因为某个进程导致CPU使用率过高。如果存在这种情况,通过gdb或gstack打印该程序堆栈,观察是否该程序处于死循环逻辑。
    • “iostat -x 1 3”命令查看IO的使用情况,确定是否当前磁盘的IO处于饱和状态。查看当前运行的执行作业情况,决定是否对占用较多IO的执行作业进行处理。
    • “vmstat 1 3”命令查看当前系统中内存的消耗情况,结合“top”命令获得消耗内存较多的进程,处于超出预期的状态。
    • 以root用户查看操作系统日志信息(/var/log/messages)或dmseg信息,检查操作系统是否发生过异常错误。
    • 操作系统的watchdog是为了保证OS系统正常运行,或者从死循环,死锁等状态退出的一种机制,如果watchdog超时(一般默认值为60s),系统将会复位。 ```

    在数据库正常工作的情况下,网络层对上层用户是透明的,但数据库在长期运行时,可能会由于各种原因导致出现网络异常或错误。常见的因网络故障引发的异常有:

    • 数据库启动失败,报网络错误。
    • 状态异常,如:节点上所有的实例都是UnKnown或者所有主机都切换为备机。
    • 网络连接建立失败。
    • 对数据库执行SQL操作时,报网络异常中断的错误。
    • 连接数据库或执行查询时发生进程停止响应。数据库出现了网络故障后,主要通过使用Linux系统提供的网络相关命令工具 (ping、ifconfig、netstat、lsof等),进程堆栈查看工具(gdb、gstack),结合数据库的日志信息,进行分析定位。本节通过举例介绍常见的网络问题,并进行基本的分析定位。

    常见故障问题如下:

    • 数据库状态异常

      问题现象:某一节点上出现如下问题:

      • 所有实例都是UnKnown。
      • 所有主实例都切换成了备实例。
      • 查询中出现大量Connection reset by peer,Connection timed out等报错信息。

      处理办法

      • 如果ssh不能连接故障机器,在其他机器上使用Ping命令向该机器发数据包。如果可以Ping通,说明可能是该机器上的资源(内存、CPU、磁盘)耗尽导致不能建立连接。

      • 如果ssh可以连接该机器,尝试执行查询,并每隔1s执行/sbin/ifconfig eth?(?代表数字,表示第几个网卡)命令,查看如下信息中的dropped及errors值的变化情况, 如果增长迅速,可能是网卡或网卡驱动故障。

      • 检查如下参数设置是否正确。

        1. net.ipv4.tcp_retries1 = 3
        2. net.ipv4.tcp_retries2 = 15
    • 网络连接建立失败

      问题现象1: 节点连接其他节点失败,日志中报出“ Connection refused ”错误。

      处理办法

      • 查看端口是否配置错误,导致连接时使用的端口并非对方侦听的端口。查看报错节点配置文件postgresql.conf记录端口号与对方侦听的端口就号是否一致。
      • 查看对方端口侦听是否正常(可以使用“netstat –anp”命令)。
      • 查看对方进程是否存在。

    常见的磁盘故障是磁盘空间不足、磁盘出现坏块、磁盘未挂载等。 部分磁盘故障会导致文件系统损坏,例如磁盘未挂载,数据库管理自动定期执行磁盘检测时会识别故障并将实例停止,查看实例状态时对应实例状态异常;部分磁盘故障不会导致文件系统损坏,例如磁盘空间不足,数据库管理无法检测到,服务进程访问到故障磁盘会异常退出,例如数据库无法启动、checksum校验不对、页面读写失败、页面校验错误等。

      • 查看日志,日志中会有类似 “data path disc writable test failed”异常,说明文件系统已损坏。

      • 文件系统损坏可能是磁盘未挂载,通过ls –l可以看到该磁盘对应的目录权限异常,如下:

    • 对于不会导致文件系统损坏的故障,服务进程访问到故障磁盘会异常退出,定位方法如下。

      查看日志。日志中会有文件读写错误,例如“No space left on device”、“ invalid page header n block 122838 of relation base/16385/152715”。 文件读写错误可能是磁盘空间不足,通过df -h可以看到磁盘空间已达100%,如下。

      1. [root@openeuler123 mnt]# df -h
      2. devtmpfs 255G 0 255G 0% /dev
      3. tmpfs 255G 35M 255G 1% /dev/shm
      4. tmpfs 255G 57M 255G 1% /run
      5. tmpfs 255G 0 255G 0% /sys/fs/cgroup
      6. /dev/mapper/openeuler-root 196G 8.8G 178G 5% /
      7. tmpfs 255G 1.0M 255G 1% /tmp
      8. /dev/sda2 9.8G 144M 9.2G 2% /boot
      9. /dev/sda1 10G 5.8M 10G 1% /boot/efi
      10. /dev/mapper/openeuler-home 1.5T 69G 1.4T 5% /home
      11. tmpfs 51G 0 51G 0% /run/user/0
      12. tmpfs 51G 0 51G 0% /run/user/1004
      13. /dev/sdb1 2.0T 169G 1.9T 9% /data
    • 日志。数据库日志记录了数据库服务端启动、运行或停止时出现的问题,当数据库在启动、运行或停止的过程中出现问题时,数据库用户可以通过运行日志快速分析问题的产生原因,并根据不同的原因采取相应的处理方法,尽可能地解决问题。

    • 视图。数据库提供了许多视图,用于展示数据库的内部状态,在定位故障时,经常使用的视图如下:

      • pg_stat_activity,用于查询当前实例上各个session的状态。

      • pg_thread_wait_status,用于查询该实例上各个线程的等待事件。

      • pg_locks,用于查询当前实例上的锁状态。

    • CORE文件。数据库相关进程在运行过程中可能会因为各种意外情况导致数据库崩溃 (Coredump),而崩溃时产生的core文件对于迅速定位程序崩溃的原因及位置非常重要。如果进程运行时出现Coredump现象,建议立即收集core文件便于分析、定位故障。

      • 对性能有一定的影响,尤其是进程频繁异常时对性能的影响更大。