关于“ClickHouse”集群安装 ,教程在网上随便一搜 ,就能找到很多。本人也曾写过一篇相关的文章,竟然有近4000多的阅读,可见,在`ClickHouse`越来越火热的当下,如何高效地部署`ClickHouse`集群 ,已经越来越受运维工程师,甚至开发人员的关注。
当然本文并不是讲使用常规方式如何部署“ClickHouse”集群的,而是要讲到“ClickHouse”集群的另一种部署方式,即无`root`部署。
“何为无 `root`部署?即不需要`root`用户权限,就可以将一整套`ClickHouse`集群搭建起来。”
我们知道,`ClickHouse`官方提供了三类安装包,分别为`rpm`、`deb`和`tgz`。官网文档也分别对三种方式单节点安装提供了比较详尽的文档,我在这里贴一下链接,有兴趣的同学可以从传送门进入阅读:[Installation | ClickHouse Docs](https://clickhouse.com/docs/en/getting-started/install)。
请容许我在这里放几张安装的命令截图,因为这几张图非常细节地体现出了安装`ClickHouse`的一些共性。
细心的朋友肯定都发现了,官网提供的安装方式,无一例外地都需要`sudo`权限,也就是说,普通用户必须提升到`root`权限才可以正常将`ClickHouse`安装成功。
那么,有没有一种方式,可以不需要`root`权限,就可以将`ClickHouse`安装好呢?官方文档强横霸道,它默认了部署`ClickHouse`的人一定有`root`用户的权限,但事实上,在一些比较重要的生产系统中,普通运维人员并不会直接持有`root`用户,或者具有`sudo`权限的高级用户,很可能只是分配了一个常规的无法执行`sudo`的普通用户,用来做一些简单的运维,那么这种场景下,如何才能成功部署`ClickHouse`节点甚至集群,就成了一个老大难的问题。
我这么说并非空穴来风,事实上这类需求已经越来越多,以下是我与我司一位不愿意透露姓名的孙姓某某的聊天记录:
这是一个非常典型的客户现场问题,我们在后续实际指导客户安装部署ClickHouse集群的时候 ,也碰到过更多这样的案例,着实已经屡见不鲜。
还有些可能是本身就不打算用`rpm`包去部署,而是依赖自己编译二进制可执行文件,这时候如何去部署?可能无`root`也才是更好的方案。比如我与这位`ckman`社区里某米公司的我不愿意透露他姓名的赵姓某某的聊天记录:
因此,无论是对于社区需求,还是我司内部的客户刚需,无`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`目录:存放数据
于是我们可以创建安装脚本如下:
```bash
#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`:
```bash
#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
```
停止的脚本也很简单 :
```bash
#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`集群的工具,也是作为当前全中国乃至全球(宇宙)唯一一款开源免费的`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`用户。
至此,集群部署成功。
本文介绍了`ClickHouse`集群的`tgz`方式无`root`部署的实现思路,以及使用`ckman`如何快速地不用root权限搭建`clickhouse`集群。虽然经过`ckman`优化包装后,整个过程变得清晰明了,操作简单,但无root部署方式本身就有一些局限性,这个局限主要还是在开机自启方面,如果将`ClickHouse`做成服务,是可以非常方便地做到开机自启的,但开启自启,root权限始终是绕不过去的一道坎,因此,无`root`部署无法将`ClickHouse`做到开机自启,一旦`ClickHouse`节点自己挂了,或者节点宕机,需要手动从`ckman`界面去启动。
这个局限是无法从技术 层面进行调和的,因此,`ckman`能做的,也仅仅是在使用`tgz`方式部署时,尝试将其做成服务并开启自启,如果能成功自然皆大欢喜,如果不能,也只能退而求其次。话说都已经不需要`root`权限帮你把集群搭建起来了,还要啥自行车呢?
本文作者来自 擎创科技的技术同事