问题现象
通过 OCP 安装或升级OB集群时,遇到报错 /home/admin/oceanbase/bin/observer: /lib64/libm.so.6: version 'GLIBC_2.27' not found (required by /home/admin/oceanbase/bin/observer)。

使用ldd命令查看了一下可执行文件 /home/admin/oceanbase/bin/observer 所依赖的共享库(shared library dependencies),发现缺失如下的 lib 库。
[root@observer1 ~]# ldd /home/admin/oceanbase/bin/observer
/home/admin/oceanbase/bin/observer: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by /home/admin/oceanbase/bin/observer)
/home/admin/oceanbase/bin/observer: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /home/admin/oceanbase/bin/observer)
/home/admin/oceanbase/bin/observer: /lib64/libc.so.6: version `GLIBC_2.22' not found (required by /home/admin/oceanbase/bin/observer)
/home/admin/oceanbase/bin/observer: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by /home/admin/oceanbase/bin/observer)
/home/admin/oceanbase/bin/observer: /lib64/libc.so.6: version `GLIBC_2.27' not found (required by /home/admin/oceanbase/bin/observer)
/home/admin/oceanbase/bin/observer: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by /home/admin/oceanbase/bin/observer)
linux-vdso.so.1 => (0x00007fffe6ffe000)
librt.so.1 => /lib64/librt.so.1 (0x00007f055a425000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f055a221000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0559f1f000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f0559d1d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0559b01000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0559733000)
/lib64/ld-linux-x86-64.so.2 (0x00007f058b72b000)
进一步查看一下当前操作系统上安装的 GLIBC 的版本,确实不存在 GLIBC_2.18 或更高版本。
[root@observer1 ~]# strings /lib64/libc.so.6 | grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
[root@observer1 ~]# rpm -qa | grep glibc
glibc-common-2.17-326.el7_9.3.x86_64
glibc-devel-2.17-326.el7_9.3.x86_64
glibc-2.17-326.el7_9.3.x86_64
glibc-headers-2.17-326.el7_9.3.x86_64
问题原因
GLIBC 是 GNU 发布的 libc 库,即 C 运行库,它是 Linux 系统中最底层的 API,几乎其它任何运行库都会依赖于 GLIBC。GLIBC 除了封装 Linux 操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
类似这种 version 'GLIBC_2.27' not found 报错的含义是当前系统自带的 GLIBC 库版本太老了,但因为几乎所有的 Linux 运行库都依赖于 GLIBC,因此如果直接更新 glibc 将会引起系统不稳定(比如 PAM 机制失效,直接导致机器无法通过 SSH 登陆),所以一般建议还是升级操作系统的版本。
这边遇到该报错的直接原因是客户的操作系统为 CentOS 7.9,属于 EL7 操作系统,但做安装/升级时使用的 OceanBase RPM 包为 EL8 平台上构建出来的 RPM 包。EL8 版本的 observer binary 构建时使用了较高版本的 GLIBC,因此如果在 EL7 的 OS 上使用 EL8 版本的 RPM 包来做安装/升级,大概率都会遇到报错:/home/admin/oceanbase/bin/observer: /lib64/libm.so.6: version 'GLIBC_2.27' not found (required by /home/admin/oceanbase/bin/observer),因为 EL7 的 OS 上自带的 GLIBC 版本较低,跟 EL8 的 RPM 里面的 observer binary 构建时依赖的glibc版本不匹配。
备注
EL7 和 EL8 是 Linux 操作系统的大版本号。EL7 代表的是 Red Hat Enterprise Linux 7.x 版本,而 EL8 则代表 Red Hat Enterprise Linux 8.x 版本。它们的主要区别在于更新的版本、内核改进以及其他一些系统特性。
从 OceanBase 数据库 V4.2.1 BP7 和 OBProxy V4.3.1 开始,OceanBase 和 OBProxy 的 x86 版本同时发布支持 7u 和 8u 的两个 RPM 包,支持在 8u 环境中部署。
下表列出了不同操作系统版本适用的安装包。
| 操作系统 | 安装包下载地址 |
|---|---|
| Alibaba Cloud Linux 2、CentOS 7、RedHat 7、Ubuntu 16.X | el7 下载地址 |
| Alibaba Cloud Linux 3、CentOS 8、RedHat 8、Debian 10 、Anolis OS 8.X | el8 下载地址 |
问题的风险及影响
OBServer 进程启动失败/安装或升级 OceanBase 数据库集群失败。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
EL7 操作系统 + OceanBase/OBProxy EL8 RPM 包。
解决方法
方法一: 如果可以的话,轮转升级操作系统至 EL8 版本。
方法二: 如果当前失败的任务支持放弃或者回滚,直接放弃/回滚失败的任务,重新使用正确的 RPM 包来安装/升级 OceanBase 数据库集群。
方法三:如果当前失败的任务不支持放弃或者回滚,可以使用 rpm2cpio 命令解压正确的 RPM 包,将解压后的 admin、bin 和 etc 目录拷贝覆盖到
/home/admin/oceanbase目录中,再重跑失败的任务。[root@observer1 ~]# su - admin [admin@observer1 ~]$ rpm2cpio oceanbase-4.3.3.1-101000032024102022.el7.x86_64.rpm | cpio -div [admin@observer1 ~]$ ls home/admin/oceanbase/ admin bin etc [admin@observer1 ~]$ cp -r * /home/admin/oceanbase/
规避方式
无。