组建Redis集群遇到`GLIBC_2.14' not found和ps -ef 不显示用户名
RHEL6.9组建Redis sentinel集群遇到两个问题
今天在组件Redis sentinel 集群时,遇到两个问题,之前已经组建多次,都没碰到类似问题,在解决这两个问题时,耗费些时间。
问题1. ./redis-server: /lib64/libc.so.6: version `GLIBC_2.14' not found 问题
在将A服务器 RHEL6.9 上已经编译好的 Redis-3.0.3 整个目录,scp 到 RHEL6.9 服务器B上,
在 A 上能正常运行的redis-server程序,但在 B 服务器上却执行失败,在 B 服务器redis中的src目录下使用指令 ldd redis-server
可以看到如下的报错,
B 服务器ldd结果:
$ldd redis-server
./redis-server: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./redis-server)
linux-vdso.so.1 => (0x00007ffd3fbc7000)
libm.so.6 => /lib64/libm.so.6 (0x0000003e49a00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003e48a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003e49200000)
libc.so.6 => /lib64/libc.so.6 (0x0000003e48e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e48600000)
但是在 A 服务器上进行如上的命令,却正常,并没有not found。
A 服务器ldd结果:
$ldd redis-server
linux-vdso.so.1 (0x00007ffdcdb5b000)
libm.so.6 => /lib64/libm.so.6 (0x0000003940e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003940600000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003940200000)
libc.so.6 => /lib64/libc.so.6 (0x000000393fe00000)
/lib64/ld-linux-x86-64.so.2 (0x000000393fa00000)
这就奇怪了,但是细心观察,就能发现 /lib64/libc.so.6 () 的值是不一样的,初步怀疑是由于在 A 机器上编译环境和 B 上是不一样的。
利用相关指令查看 libc.so.6 中是否一样:
A 服务器查看 libc.so.6 内容:
$ 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
B 服务器查看 libc.so.6 内容:
$ 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_PRIVATE
上述指令对比就能看出,B服务器的 GLIBC 版本较低,虽然都是RHEL6.9操作系统,但内部库还是有些不一样的地方。
对应的解决方法有如下几种:
- 在 B 的环境中,直接进行 redis 源码编译,生成的可执行文件能在 B 中成功运行。
- 可以找到与 B 一样的
strings /lib64/libc.so.6 |grep GLIBC_
的操作系统环境,在其上编译之后,直接将可执行文件拷贝到B上运行。 - 升级 B 服务器的 GLIBC。
- 可在redis源码中添加约束,显式指定所依赖的memcpy函数的GLIBC版本,需添加的约束代码如下:
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
,【注意】只需在调用函数memcpy的源文件中加入此约束,该方法读者可以自行验证,后面参考链接中有相关博客介绍。
我是选择了方法2解决的上述报错问题,找到一个 strings /lib64/libc.so.6 |grep GLIBC_
和 B 服务器一样的内容,重新拷贝redis相关文件到 B 服务器中,执行redis进程成功。
问题2. ps -ef 进程 uid 不显示用户名而是数字
在上述redis于 B 服务器成功执行后,ps 进程发现第一纵列不是显示用户名,而是用户名的uid一串数字
$ ps -ef|grep redis
31241 129637 125617 0 17:53 pts/3 00:00:00 ./src/redis-server *:6358
31241 129866 1 0 17:55 ? 00:00:00 ./src/redis-sentinel *:16358 [sentinel]
在使用linux有一段时间,没遇到过这种现象,一般显示都直接是用户名,这样ps就知道该进程是哪个用户启动并有权限停止的。linux中是严格区分用户,不同非root用户对不同进程文件目录等有不同操作权限,可以使得多用户使用同一台服务器时的安全。
通过man命令查看ps命令的说明: 8位用户名的账户能够显示完整的用户名,9位用户名的账户就显示了UID。
当用户名的长度(用户名字符串的字符个数)大于8(默认)时,只会显示用户的UID, ps的这个长度可以自定义,如下命令:
ps -o ruser=thereisusername -e -o pid,ppid,c,stime,tty,time,cmd|grep xxx
说明:“thereisusername”是自定义填写的字符串,Linux会自动检查此字符串的长度,用户名长度比该字符串小的都会显示用户名。
在Redis使用和学习中,遇到上述问题,特此总结记录,加深影响,一点一滴积累Redis和Linux相关知识。
参考链接:
https://blog.csdn.net/Jin_Kwok/article/details/80319441?utm_source=blogxgwz7
https://blog.csdn.net/weixin_34294649/article/details/91699158
本人才疏学浅,如有错误不当之处,请批评指正,如有侵权,请立即联系我进行删除。
如果能为您带来一点点帮助,我将十分高兴,也多谢您关注:hongmaolinux 和转发推荐,谢谢!
组建Redis集群遇到`GLIBC_2.14' not found和ps -ef 不显示用户名的更多相关文章
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- redis集群搭建及注意事项
上一篇:redis的安装及注意事项 这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口.这样的话,相当于模拟出 ...
- 基于Dokcer搭建Redis集群搭建(主从集群)
最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...
- redis集群在线迁移第二篇(redis迁移后调整主从关系,停掉14机器上的所有从节点)-实战二
变更需求为: 1.调整主从关系,所有节点都调整到10.129.51.30机器上 2.停掉10.128.51.14上的所有redis,14机器关机 14机器下线迁移至新机房,这段时间将不能提供服务. 当 ...
- redis入门(14)redis集群下的数据分区存储
redis入门(10)redis集群下的数据分区存储
- 14.6、redis集群
1.环境配置: 服务器名称 ip地址 实例6379 实例6380 实例6381 实例6381 实例6381 实例6381 controller-node1 172.16.1.90 主 从 主 从 主 ...
- Linux Redis集群搭建与集群客户端实现
硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...
- 分布式缓存Redis集群搭建
redis安装 1.下载tar包至/opt/redis 2.解压tar包 tar -xvf redis-4.0.14.tar.gz 3. cd redis-4.0.14 make一下. 单节点的red ...
- Redis集群搭建详细过程整理备忘
三.安装配置 1.环境 使用2台centos服务器,每台机器上部署3个实例,集群为三个主节点与三个从节点: 192.168.5.144:6380 192.168.5.144:6381 192.168. ...
随机推荐
- 二进制部署K8S-1基本概念
二进制部署K8S-1基本概念 感谢老男孩教育王导的公开视频,文档整理自https://www.yuque.com/duduniao/k8s. 1.实验环境 1.1 虚拟机 因为在后期运行容器需要有大量 ...
- 大数据 什么是 ETL
ETL 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程.ETL 的目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提 ...
- redis 和 mysql 的主从复制
1. mysql主从复制 (1) 为什么要做主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写 ...
- SystemVerilog MCDF验证结构
MCDF的设计和验证花费的时间:(工作中假设的时间) design cycle time ==10days how about 验证?verify? 模块越往上(大')验证花费的时间越来越大,但是 ...
- 在react中使用redux并实现计数器案例
React + Redux 在recat中不使用redux 时遇到的问题 在react中组件通信的数据是单向的,顶层组件可以通过props属性向下层组件传递数据,而下层组件不能向上层组件传递数据,要实 ...
- Java枚举类与注解详解——一篇文章读懂枚举类与注解详
目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...
- 关于一类docker容器闪退问题定位
背景:正在学习docker期间,接到一个任务,通过docker部署一个应用A.该应用A类似于之前部署的应用B,结果很自然地犯了形而上学的错误. 思路:基于dockerfile+docker-compo ...
- GO学习-(22) Go语言之依赖管理
Go语言之依赖管理 Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个 ...
- Python+Selenium自动化-清空输入框、输入内容、点击按钮
Python+Selenium自动化-清空输入框.输入内容.点击按钮 1.输入内容 send_keys('valve'):输入内容valve #定位输入框 input_box = browser. ...
- 行人检测与重识别!SOTA算法
行人检测与重识别!SOTA算法 A Simple Baseline for Multi-Object Tracking, Yifu Zhang, Chunyu Wang, Xinggang Wang, ...