本文来自于擎创资深数据库工程师------禹鼎侯
写在前面:
本次技术分享主要介绍ClickHouse集群的tgz方式无root部署的实现思路,以及使用ckman如何快速地不用root权限搭建clickhouse集群。文章较长,干货很多,建议先收藏点赞以防丢失。
一、为什么要做无root部署?
关于ClickHouse集群安装 ,教程在网上随便一搜 ,就能找到很多。本人也曾恬不知耻地写过一篇相关的文章,也有近4000多的阅读。可见,在ClickHouse越来越火热的当下,如何高效地部署ClickHouse集群 ,已经越来越受运维工程师,甚至开发人员的关注。
二、什么是 root部署?
即不需要root用户权限,就可以将一整套ClickHouse集群搭建起来。
我们知道,ClickHouse官方提供了三类安装包,分别为rpm、deb和tgz。官网文档也分别对三种方式单节点安装提供了比较详尽的文档,我在这里贴一下链接,有兴趣的同学可以从传送门进入阅读:Installation | ClickHouse Docs(https://clickhouse.com/docs/en/getting-started/install)
请容许我在这里放几张安装的命令截图,因为这几张图非常细节地体现出了安装ClickHouse的一些共性。
rpm安装
deb安装
rpm安装
细心的朋友肯定都发现了,官网提供的安装方式,无一例外地都需要sudo权限,也就是说,普通用户必须提升到root权限才可以正常将ClickHouse安装成功。
那么,有没有一种方式,可以不需要root权限,就可以将ClickHouse安装好呢?官方文档强横霸道,它默认了部署ClickHouse的人一定有root用户的权限,但事实上,在一些比较重要的生产系统中,普通运维人员并不会直接持有root用户,或者具有sudo权限的高级用户,很可能只是分配了一个常规的无法执行sudo的普通用户,用来做一些简单的运维,那么这种场景下,如何才能成功部署ClickHouse节点甚至集群,就成了一个老大难的问题。
我这么说并非空穴来风,事实上这类需求已经越来越多,以下是我与我司一位不愿意透露姓名的孙姓某某的聊天记录:
这是一个非常典型的客户现场问题,我们在后续实际指导客户安装部署ClickHouse集群的时候 ,也碰到过更多这样的案例,着实已经屡见不鲜。
还有些可能是本身就不打算用rpm包去部署,而是依赖自己编译二进制可执行文件,这时候如何去部署?可能无root也才是更好的方案。
比如,我与这位ckman社区里某米公司的我不愿意透露他姓名的赵姓某某的聊天记录:
因此,无论是对于社区需求,还是我司内部的客户刚需,无root部署这条路都势在必行。
三、基于tgz安装包的无root部署方案
前面讲了,官网上提供的安装方式都是需要sudo提权到root权限才能去做的,那么为什么无root部署还是有理论上成功的可能呢?
我们当然首先要清楚官方安装ClickHouse时都干了些什么,在哪些地方需要用到root权限。
- 首先,官方安装ClickHouse时,配置文件默认放置在/etc/clickhouse-server目录下,这个目录可能需要root权限才能访问。
- 其次,官方安装的默认数据路径在/var/lib/clickhouse目录,该目录也需要root权限才能访问。
- 日志默认指定在/var/log/clickhouse-server目录下,这个目录同样需要root权限。
- 进程锁文件生成在/run/clickhouse-server目录下,该目录也需要root权限才能访问。
- 安装ClickHouse时,会用到clickhouse install命令,这个命令必须要root权限才能执行。
- clickhouse install命令会将clickhouse注册成服务,并做成开机自启,这个过程中不可避免地要去访问/etc/iinit.d目录和/etc/systemd/system目录,这些都需要root权限才能完成。
- 启动ClickHouse节点,如果使用systemctl服务管理的话,同样需要root权限才能完成。
看起来挺吓人的,但总结起来,无非是日志目录、配置文件目录、数据目录、以及进程锁目录需要用到root权限才能访问,那我们不能直接运行clickhouse的二进制可执行文件,手动指定这些目录吗?那绝对是当然的!
而直接执行二进制文件,对于官方提供的三种形式安装包,tgz安装包似乎有实现这个的可能。对于tgz,虽然官方提供的安装方式也需要sudo提权,但究其原理,无非是执行二进制文件,因此,我们可以不依赖官方的安装脚本,直接将解压后的二进制文件通过一定的包装,完成普通用户不依赖root权限也能正常执行。
具体思路大致如下 :
上述涉及到系统目录的操作都改到普通用户有权限操作的目录下完成。如:我目前使用的账户为eoi,假设该账户没有sudo权限,我们在 /home/eoi下创建clickhouse文件夹 ,作为clickhouse运行的工作目录 ,并做如下划分:
- etc目录:配置文件
- log目录:日志文件
- bin目录:可执行文件
- run目录:进程锁文件
- data目录:存放数据
于是我们可以创建安装脚本如下:
#install.sh
CWD=$1
if [ x$CWD = "x" ];then
CWD=$(dirname $(cd "$(dirname "$0")" && pwd))
fi
VERSION=$2
if [ x$VERSION = "x" ]; then
VERSION=$(curl -s https://packages.clickhouse.com/tgz/stable/ | \
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -V -r | head -n 1)
fi
curl -O "https://packages.clickhouse.com/tgz/stable/clickhouse-common-static-$VERSION-amd64.tgz"
curl -O "https://packages.clickhouse.com/tgz/stable/clickhouse-server-$VERSION-amd64.tgz"
curl -O "https://packages.clickhouse.com/tgz/stable/clickhouse-client-$VERSION-amd64.tgz"
tar -xzf "clickhouse-common-static-$VERSION-amd64.tgz"
tar -xzf "clickhouse-server-$VERSION-amd64.tgz"
tar -xzf "clickhouse-client-$VERSION-amd64.tgz"
mkdir -p $CWD/etc/clickhouse-server/config.d $CWD/etc/clickhouse-server/users.d $CWD/etc/clickhouse-client $CWD/log/clickhouse-server $CWD/bin $CWD/run $CWD/data/clickhouse
cp -rf clickhouse-common-static-$VERSION/usr/bin $CWD
cp -rf clickhouse-server-$VERSION/usr/bin $CWD
cp -rf clickhouse-client-$VERSION/usr/bin $CWD
cp -rf clickhouse-server-$VERSION/etc/clickhouse-server $CWD/etc
cp -rf clickhouse-client-$VERSION/etc/clickhouse-client $CWD/etc
#修改配置文件路径
sed -i "s#/var/log#$PWD/log#g" $PWD/etc/clickhouse-server/config.xml
sed -i "s#/var/lib#$PWD/data#g" $PWD/etc/clickhouse-server/config.xml
以上命令基本就能在用户自己的工作目录下安装好clickhouse,然后可以做一个start.sh用来启动
clickhouse-server:
#start.sh
DIR=$(cd "$(dirname "$0")" && pwd)
#log路径由于已经通过配置文件指定了,因此无需再在命令行指定
$DIR/bin/clickhouse-server --config-file=$DIR/etc/clickhouse-server/config.xml --pid-file=$HDIR/run/clickhouse-server.pid --daemon
停止的脚本也很简单
#stop.sh
DIR=$(cd "$(dirname "$0")" && pwd)
ps -ef|grep $DIR/bin/clickhouse-server |grep -v grep |awk '{print $2}' |xargs kill
tgz方式部署就不存在升级和卸载的操作了。升级就是重新安装,卸载直接删除工作目录即可。
四、实战演练
所谓光说不练假把式,前方高能,我们来实战演练一番:
在/home/eoi/clickhouse目录下运行./install.sh . 22.3.6.5,会在当前文件夹下多出下面这些文件:
重点关注下这两个文件夹下文件是否正确
以及config.xml中log路径和path路径是否已正确修改过来
如果以上各项检查都没有问题,就可以启动了。
看到上图的提示,就说明安装成功了,可以使用clickhouse status命令来检查运行状态
也可以使用client直接连接数据库,默认安装是没有密码的,如果需要密码,可以修改install脚本,传入一个密码即可。
到这一步为止,一个clickhouse节点无root部署就完成了。对于集群,也只需要同样的配置,无非是多配置一个metrika.xml而已。
五、CKman能做什么?
ckman作为一款开源免费的管理和监控ClickHouse集群的工具,全方位可支持无root部署集群的操作。
我们在最新发布的v2.2.5版本的ckman中,已经包含了该功能。使用ckman实现无root部署ClickHouse集群非常简单。如果你想更直观的了解ckman是如何做到无root部署的,可以观看视频教程:clickhouse可视化管理工具ckman使用教程_P16 clickhouse集群的无root方式部署。(https://www.bilibili.com/video/BV1gR4y1t75Q?p=16&vd_source=3445b7d38e945df5f598c76045a6bc30)
如果你有耐心听我水完这篇文章,那么请继续往下看。
要完成整个操作,首先要向ckman上传一个tgz格式的安装包。在ckman v2.2.5的版本中,我们重构了安装包管理页面 ,按照不同的安装包类型做了分类,具体效果如图所示
安装部署与常规的部署方式一致,只是需要在部署集群时选择安装包类型为amd64.tgz,额外填写一个安装路径。
这里为了演示,我提前准备了两个节点,分别为ck14和ck16,工作目录为/home/chenyc/clickhouse, 部署用户为chenyc,这是一个没有sudo权限的普通用户
在部署之前,我们将/home/chenyc/clickhouse目录提前创建好,其余的选项与rpm部署一致,直接在ckman上填写就行了,整个部署过程一分钟不到,部署完成后,可以在后台看到clickhouse进程,注意它的启动用户是chenyc,而不是默认的clickhouse用户。
至此,集群部署成功。
六、总结
经过ckman优化包装后,整个过程虽变得清晰明了,操作简单,但无root部署方式本身就有一些局限性,这个局限主要还是在开机自启方面,如果将ClickHouse做成服务,是可以非常方便地做到开机自启的。
但开启自启,root权限始终是绕不过去的一道坎,因此,无root部署无法将ClickHouse做到开机自启,一旦ClickHouse节点自己挂了,或者节点宕机,需要手动从ckman界面去启动。
这个局限是无法从技术 层面进行调和的,因此,ckman能做的,也仅仅是在使用tgz方式部署时,尝试将其做成服务并开启自启,如果能成功自然皆大欢喜,如果不能,也只能退而求其次。
擎创科技,Gartner连续推荐的AIOps领域标杆供应商。公司致力于协助企业客户提升对运维数据的洞见能力,优化运维效率,充分体现科技运维对业务运营的影响力。
行业龙头客户的共同选择
更多运维思路与案例持续更新中,敬请期待~
随手点关注,更新不迷路~