技术分享 | 无root权限也能高效搭建ClickHouse集群?

news2024/11/16 17:46:42

 

本文来自于擎创资深数据库工程师------禹鼎侯

写在前面:

本次技术分享主要介绍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领域标杆供应商。公司致力于协助企业客户提升对运维数据的洞见能力,优化运维效率,充分体现科技运维对业务运营的影响力。

行业龙头客户的共同选择

更多运维思路与案例持续更新中,敬请期待~

随手点关注,更新不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wireshark提取RTSP over TCP中的视频流

wireshark提取RTSP over TCP中的视频流 文章目录wireshark提取RTSP over TCP中的视频流1 背景2 提取前准备3 H264提取步骤4 后记1 背景 前面文章中介绍了rtp中提取H264或者H265视频的方式,其适用于基于RTP over UDP的方式,因为UDP方式,视频流…

ip 地址分类说明

1,IP地址简介 前面我们已经了解了TCP/IP协议的网络层的相关协议,并且已经在OSI参考模型中了解到每一个协议栈的网络层都有网络层地址,TCP/IP协议也不例外。本节重点介绍TCP/IP协议栈的网络层地址------IP地址。IP地址是进行复杂的子网规划的基础。 我们前…

ubuntu 18.04 crontab 设置自动开关机

Ubuntu 使用 Cron 实现计划任务 - 知乎 1、切换root su root 2、安装并启动 cron apt install cron 若已经安装,输入以下命令判断 cron 服务是否启动:pgrep cron。如果有 pid (一串数字)输出则说明 cron 服务已经启动&#xf…

pcl协方差计算精度

最近在计算法线的时候发现法线的结果偏差很大,经过分析得到在计算点云协方差矩阵时,选择不同的方法会导致不同的结果。下面是测试过程: 1、测试点云 点云是中间一点的邻域点,是从上往下看,法线的方向近似为&#xff0…

操作股票下单接口的执行流程代码分享

股票下单接口也相当于是程序化交易,可以根据用户的意愿,定制的交易计划去执行,还可以在一定程度上战胜人性的弱点,下面来看看操作股票下单接口的执行流程代码分享: // 委托下单 // category: 0>买入, 1>卖出,…

DataWhale - OpenCV教程01

MetaData: Author:Link: https://vxr.xet.tech/s/49dV3oPublisher:Date: 2022-12-12 - 16:28 笔记记录的时间 ✅ 2022-12-12 Tag: 软件技能 计算机视觉的发展历史: 1982年马尔的书《视觉》,将视觉的任务分为两类:重建和识别。2012年&#…

十年老码农现身说法:凛冬将至,为什么我不劝退互联网

大家好,我是xxx 这两天在B站刷到好多吐槽秋招拿不到offer的视频,其中有几个看得我又好笑又同情。 有一个老哥说自己19年硕士毕业的时候想要进华为但差了临门一脚没能拿到offer,非常遗憾,最后觉得一定是自己不够强所以没能如愿。…

如何运行Scala Object

一 、问题描述 执行一个Scala Obejct 程序,Java 沿袭过来的当然直接用main,Scala 官方还提供了另外的一种方法 定义的object extend App trait在object中定义好main() 二、Scala CookBook 这是一段对《 Scala Cookbook》的摘抄,6.4 如何运…

人工智能时代,Python还不快学起来吗

“是时候学点Python了”。作为一名不怎么安分的程序员,你或许觉得,产生这样的想法并不奇怪,但学习Python却是出于自己对工作现状以及如何应对未来挑战所作出的思考。读过我以前博客的朋友,可能都知道,我推崇软件领域中…

Android开发黑白灰模式和夜间模式设置

接口数据来源鸿洋大神“玩安卓”网站:https://wanandroid.com/ 黑白灰正常模式和黑白灰夜间模式截图 夜间模式与正常模式截图 黑白灰与原色模式设置 /*** 设置灰白色*/protected void setGrayScreen() {Paint paint new Paint();ColorMatrix cm new ColorMatrix(…

八十七氟癸基笼状聚倍半硅氧烷poss

八十七氟癸基笼状聚倍半硅氧烷poss 八十七氟癸基笼状聚倍半硅氧烷是一种含氟有机、无机杂化的笼状聚倍半硅氧烷,可用于可用于热塑性塑料体系改性,降低其表面能。也可用于自修复超疏水材料。 应用领域 1、塑料改性,降低表面张力 2、自修复…

【温故而知新】分布式系统(二)

分布式系统的 CAP 理论 时间:2022年12月12日 作者:小蒋聊技术 【温故而知新】分布式系统(二)分布式系统的 CAP 理论_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅手机版欢迎收听小蒋聊技术的其他类最新章节声音“【温故而知新】分…

漏洞深度分析|Thinkphp 多语言 RCE

项目介绍 ThinkPHP 是一个快速、简单的面向对象的轻量级 PHP 开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。 根据目前FOFA系统最新数据(一年内数据)&#xf…

基于昇思MindSpore,实现使用胶囊网络的图像描述生成算法

项目链接 https://github.com/Liu-Yuanqiu/acn_mindspore 项目描述 图像描述生成算法 人类可以轻易的使用语言来描述所看到的场景,但是计算机却很难做到,图像描述生成任务的目的就是教会计算机如何描述所看到的内容,其中涉及到了对视觉信…

JavaOOP面试题(108道)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

mybatis以及mybatisplus批量插入问题

1. 思路分析: 批量插入是我们日常开放经常会使用到的场景,一般情况下我们也会有两种方案进行实施,如下所示。 方案一 就是用 for 循环循环插入: 优点:JDBC 中的 PreparedStatement 有预编译功能,预编译之…

vue3较vue不同的地方

自定义指令的区别: vue2的写法: Vue.directive(scroll, {}) //scroll是指令名称 vue3的写法: 定义全局的:在main.js文件中定义: createApp(App).directive("hello",{}).use(store).use(router).mount(#…

小程序import及include引用的简单理解

场景:在小程序中,WXML 提供两种文件引用方式import和include 我自己记录下自己的一些简单理解 官方文档:引用 | 微信开放文档 第一:import import,就是可以引入自定义指定的template模板 比如:我在import页…

stm32f767之ADC

一,基本介绍 1,ADC时钟。 ADC时钟一般常用来自于经可编程预分频器分频的APB2 时钟,该预分频器允许ADC 在fPCLK2/2、 /4、/6 或/8 下工作。ADCCLK 的最大值限制。2,ADC通道。 有16 条复用通道。我的理解是每个ADC(1&…

气泡水位计安装示意图 气泡水位计工作原理

气泡式水位计测量精度高,免气瓶,免测井,免维护,抗振动,寿命长,特别适用于流动水体、大中小河流等水深比较大的场合。具有安装简单,操作、组网灵活,尤其是无井水位测量最理想的水位监…