clickhouse如何解决GLIBC不兼容问题

简介: clickhouse如何解决GLIBC不兼容问题

介绍


首先解释下为什么会有GLIBC不兼容问题:在clickhouse的编译环境中ubuntu版本是20, 而运行环境中是16,不同ubuntu版本支持的GLIBC版本不一样,因此将ubuntu20上编译出来的ck放在ubuntu16下运行时,便会出现兼容性问题。虽然ck编译时绝大部分库都是静态链接的,但是glibc却是个例外。


$ ldd ./clickhouse    
 linux-vdso.so.1 (0x00007ffcc9f7a000)
 libpthread.so.0 => /usr/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2e84b57000)
 librt.so.1 => /usr/lib/x86_64-linux-gnu/librt.so.1 (0x00007f2e84b4c000)
 libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2e84b46000)
 libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f2e84954000)
 libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f2e84805000)
 /lib64/ld-linux-x86-64.so.2 (0x00007f2e84b7c000)



解决方法有几个思路:


  • 将编译环境改成ubuntu16:系统版本太老,很多必要的依赖无法成功安装,影响编译。不可行



  • 将运行环境改成ubuntu20: 生产环境不是说动就动的,不可行


  • 编译时静态链接glibc:副作用较多


  • 将glibc相关的共享库随ck binary一块打包:需要升级打包脚本,代价相对较小

接下来我们总结如何根据最后一种思路解决GLIBC的兼容性问题



解决


打包动态库


vim copylib.sh

#!/bin/bash
# copylib.sh
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
 cp "$Variable" $LibDir
done



上述脚本首先通过ldd得到binary依赖的动态库,然后将so文件复制到./lib目录

./copylib.sh clickhouse

结果如下

$ ll ./lib                                            
total 3728
-rw-r--r-- 1 root root   40040 Oct 31 16:45 librt.so.1
-rwxr-xr-x 1 root root  157224 Oct 31 16:45 libpthread.so.0
-rw-r--r-- 1 root root   18816 Oct 31 16:45 libdl.so.2
-rwxr-xr-x 1 root root 2029224 Oct 31 16:45 libc.so.6
-rw-r--r-- 1 root root 1369352 Oct 31 16:45 libm.so.6
-rwxr-xr-x 1 root root  191472 Oct 31 16:45 ld-linux-x86-64.so.2



修改ELF


首先安装patchelf (https://github.com/NixOS/patchelf.git)

使用patchelf工具修改clickhouse二进制文件的ELF信息

patchelf --set-rpath <prefix>/lib  clickhouse
patchelf --set-interpreter <prefix>/lib/ld-linux-x86-64.so.2 clickhouse



其中应当是clickhouse运行环境中lib所在的目录

完成修改后,结果如下:

$ ldd ./clickhouse
 linux-vdso.so.1 =>  (0x00007ffddf3dc000)
 libc.so.6 => /data/services/clickhouse/lib/libc.so.6 (0x00007fbf1533f000)
 /data/services/clickhouse/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fbf1530d000)
 libm.so.6 => /data/services/clickhouse/lib/libm.so.6 (0x00007fbf151be000)
 librt.so.1 => /data/services/clickhouse/lib/librt.so.1 (0x00007fbf15334000)
 libpthread.so.0 => /data/services/clickhouse/lib/libpthread.so.0 (0x00007fbf1519b000)
 libdl.so.2 => /data/services/clickhouse/lib/libdl.so.2 (0x00007fbf15195000)



运行clickhouse


过程略

相关文章
|
C语言
clickhouse如何解决GLIBC不兼容问题--终篇
clickhouse如何解决GLIBC不兼容问题--终篇
477 0
clickhouse如何解决GLIBC不兼容问题--终篇
|
4月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
SQL Unix OLAP
ClickHouse安装教程:开启你的列式数据库之旅
ClickHouse 是一个高性能的列式数据库管理系统,适用于在线分析处理(OLAP)。本文介绍了 ClickHouse 的基本使用步骤,包括下载二进制文件、安装应用、启动服务器和客户端、创建表、插入数据以及查询新表。还提到了图形客户端 DBeaver 的使用,使操作更加直观。通过这些步骤,用户可以快速上手并利用 ClickHouse 的强大性能进行数据分析。
103 4
|
4月前
|
存储 分布式计算 数据库
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
|
5月前
|
存储 SQL 缓存
数据库测试|Elasticsearch和ClickHouse的对决
由于目前市场上主流的数据库有许多,这次我们选择其中一个比较典型的Elasticsearch来和ClickHouse做一次实战测试,让大家更直观地看到真实的比对数据,从而对这两个数据库有更深入的了解,也就能理解为什么我们会选择ClickHouse。
数据库测试|Elasticsearch和ClickHouse的对决
|
4月前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
8月前
|
DataWorks API 调度
DataWorks产品使用合集之在调度配置配置了节点的上游节点输出,没办法自动生成这个flow的依赖,该怎么操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
8月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之建了 polar 与clickhouse的数据源。为什么数据库这里总是mysql呢
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
7月前
|
存储 大数据 关系型数据库
从 ClickHouse 到阿里云数据库 SelectDB 内核 Apache Doris:快成物流的数智化货运应用实践
目前已经部署在 2 套生产集群,存储数据总量达百亿规模,覆盖实时数仓、BI 多维分析、用户画像、货运轨迹信息系统等业务场景。
|
9月前
|
关系型数据库 MySQL 数据库
ClickHouse(07)ClickHouse数据库引擎解析
ClickHouse支持多种数据库引擎,包括Atomic(默认)、MySQL、MaterializeMySQL、Lazy、PostgreSQL、MaterializedPostgreSQL。Atomic提供非阻塞的表操作和原子的表交换,有UUID标识和延迟删除功能。MySQL引擎允许与远程MySQL服务器交互,支持INSERT和SELECT,不支持RENAME操作。PostgreSQL引擎类似,可与远程PostgreSQL服务进行读写操作。SQLite引擎用于连接SQLite数据库。实验性引擎如MaterializeMySQL和MaterializedPostgreSQL用于实现实时数据同步。
631 5