暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

ClickHouse(v21.9.5.16-stable)集群搭建

GrowthDBA 2021-11-09
2073
上篇文章,记录了一下Oracle 11G单实例安装部署的过程。今天,还是趁热打铁,记录一下ClickHouse集群搭建的过程。在官档的描述中,ClickHouse集群依赖于ZooKeeper,ZooKeeper作为一个相对成熟的分布式一致性存储服务,可以解决诸如心跳管理、主备切换、分布式锁等很多常见问题,和ClickHouse搭配起来应该是一个非常不错的选择,官方也是这么做的。所以,今天的实操记录也会涉及ZooKeeper的安装和配置。

ClickHouse是“战斗民族”俄罗斯搜索巨头Yandex公司开源的一个极具“战斗力”的实时数据分析数据库,是面向OLAP的分布式列式DBMS,圈内人戏称为“喀秋莎数据库”。ClickHouse简称"CH",但在中文社区里大家更偏爱"CK",反馈是因为有"AK"的感觉!与Hadoop、Spark这些巨无霸组件相比,ClickHouse很轻量级,其特点:列式存储数据库,数据压缩;关系型、支持SQL;分布式并行计算,把单机性能压榨到极限;高可用;数据量级在PB级别。——这段话引用自一篇公众号文章《百分点大数据技术团队:ClickHouse国家级项目最佳实践》,文章地址:https://mp.weixin.qq.com/s/9S6DhDhv7lFbMaFScf137Q

下面的内容我就把ClickHouse简称为"CK",官方的"C"和"H"字母是大写,对于有中度强迫症的我来说,简称为"CH"更符合我的胃口,但是为了方便大家区分和易读,所以就委曲求全简称为CK吧,ZooKeeper就简称为ZK

约定好简称,下面就开始今天的内容吧。


01


环境准备与规划.




服务器通过系统工程师配置后,相关设置都已完成,如关闭SELINUX、防火墙等,我们这里不再赘述。

服务器配置及软件版本

属性‍‍‍详情‍‍‍
服务器配置基于OpenStack私有云:40C/128G/5T*4台
操作系统版本CentOS Linux release 7.5.1804 (Core)
Linux内核版本3.10.0-862.el7.x86_64
ZooKeeper版本3.7.0
ClickHouse版本21.9.5.16-stable

ZooKeeper路径、端口规划

名称‍‍‍详情‍‍‍
软件安装目录/usr/local/zookeeper
数据目录/usr/local/zookeeper/data
日志目录/usr/local/zookeeper/log
配置文件目录/usr/local/zookeeper/conf/zoo.cfg
端口&MyID2182(对外)、2999丨3999(内部)、1丨2丨3(3节点myid)

ClickHouse路径、端口规划

名称‍‍‍详情‍‍‍
CK服务端/usr/bin/clickhouse-server
CK客户端/usr/bin/clickhouse-client
数据目录/data/clickhouse-server/data
日志目录/data/clickhouse-server/logs
配置文件目录/etc/clickhouse-server
HTTP PORT8123
TCP PORT9000
INTERSERVER HTTP PORT9009

相关服务器、软件目录、版本、端口都已规划好,下面开始部署。




02


ZooKeeper安装部署.





因为ZK有选举机制,同时为满足高可用需求,需要用到最小保证高可用的单数机器来作为ZK节点,所以我们选取其中3台服务器来部署ZK。

编写安装ZK的Ansible脚本

安装ZK时,很多步骤都已具体化,所以我们一下安装3个节点使用Ansible来简化我们的工作,以便后期部署ZK集群时可以直接使用脚本安装。

01

定义机器列表文件


在堡垒机上定义一个ip_list文件,内容为要部署的目标机器的IP、主机名、MyID。

mkdir zookeepercd zookeepervim ip_list[zookeeper]172.xx.xx.x HOSTNAME=sz-pg-adt-apps-002.xxxxxx.com ID=1172.xx.xx.x HOSTNAME=sz-pg-adt-apps-003.xxxxxx.com ID=2172.xx.xx.x HOSTNAME=sz-pg-adt-apps-004.xxxxxx.com ID=3[clickhouse]172.xx.xx.x

02

定义参数文件模板


ZK安装过程,我们需要将所有的节点信息(IP地址、主机名)添加至每个节点/etc/hosts文件中,所以需要定义一个参数文件模板。

vim hosts.j2127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6{% for item in groups['zookeeper'] %}{{ item }} {{ hostvars[item]['HOSTNAME'] }}{% endfor %}

再为ZK定义一个参数文件模板:
vim zoo.cfg.j2tickTime=2000initLimit=10syncLimit=5dataDir= /usr/local/zookeeper/datadataLogDir= /usr/local/zookeeper/logclientPort=2182autopurge.purgeInterval=0globalOutstandingLimit=200{% for item in groups['zookeeper'] %}server.{{ hostvars[item]['ID'] }}={{ item }}:2999:3999{% endfor %}

03

Ansible主入口文件


Ansible最核心的文件,定义安装整个流程,因为我们推出的环境会默认安装hadoop用户,所以指定用户时会指定该用户,大家因各自环境而异。

vim deploy.zookeeper.yaml---- hosts: zookeeper  remote_user: root  gather_facts: true  # 定义ZK相关变量  vars:    zookeeper_version: apache-zookeeper-3.7.0-bin.tar.gz    zookeeper_dir: apache-zookeeper-3.7.0-bin  # 开始定义任务  tasks:  # 1、修改所有节点/etc/hosts文件  - name: "1 | update the /etc/hosts"    template:      src: ./hosts.j2      dest: /etc/hosts  # 2、创建ZK安装目录,并赋予相关用户权限  - name: "2 | create the work_dir"    file:      path: /usr/local/zookeeper      state: directory      owner: hadoop      group: hadoop      mode: 0755  # 3、从HTTP服务器下载安装包并解压  - name: "3 | download and unpack the zookeeper package"    unarchive:      src: http://10.xx.x.xx/td-configuration/deploy/clickhouse/{{ zookeeper_version }}      dest: /tmp/      remote_src: yes      owner: hadoop      group: hadoop  # 4、 判断解压后的目录中是否有bin目录,有则为true  - name: "4 | stat /tmp/{{zookeeper_dir}}/bin"    stat:      path: /tmp/{{zookeeper_dir}}/bin    register: zookeeper_stat  # 5、再次判断目标端目录中是否有bin目录,无则为false  - name: "5 | stat /usr/local/zookeeper/bin"    stat:      path: /usr/local/zookeeper/bin    register: bin_stat  # 6、判断解压目录、移动目标目录,如果有解压目录且目标目录没有bin目录,可以执行移动目录操作(即第4步为true,第5步为false执行移动操作)  - name: "6 | move directory |"    shell: mv /tmp/{{zookeeper_dir}}/* /usr/local/zookeeper/    args:      executable: /bin/bash    # 条件判断通过后执行移动目录操作    when:      - zookeeper_stat.stat.exists      - not bin_stat.stat.exists  # 7、设置ZK配置文件  - name: "7 | update the /usr/local/zookeeper/conf/zoo.cfg"    template:      src: ./zoo.cfg.j2      dest: /usr/local/zookeeper/conf/zoo.cfg      owner: hadoop      group: hadoop      mode: 0644  # 8、创建ZK数据、日志目录并赋予用户权限  - name: "8 | create the other directories"    file:      path: /usr/loacl/zookeeper/{{ item }}      state: directory      owner: hadoop      group: hadoop      mode: 0755    with_items:      - 'data'      - 'log'  # 9、创建各个节点myid文件  - name: "9 | create the myid"    lineinfile:      path: /usr/local/zookeeper/data/myid      state: present      create: yes      # 获取ip_list中定义的ID变量值,实现赋值      regexp: '^\s*{{ ID }}'      line: "{{ ID |string }}"  # 10、设置ZK环境变量  - name: "10 | env"    lineinfile:      path: /etc/profile      state: present      regexp: '{{ item.S }}'      line: "{{ item.D }}"    with_items:      - { S: '^\s*export\s+ZK_HOME=.*',D: 'export ZK_HOME=/usr/local/zookeeper' }      - { S: '^\s*export\s+PATH=.*ZK_HOME.*',D: 'export PATH=$PATH:$ZK_HOME/bin' }  # 11、再次递归相应目录用户权限  - name: "11 | chown"    file:      path: /usr/local/zookeeper      owner: hadoop      group: hadoop      recurse: yes  # 12、启动ZK服务  - name: "12 | start service"    shell: |      source /etc/profile      /usr/local/zookeeper/bin/zkServer.sh start    ignore_errors: yes

Ansible执行安装

ansible-playbook -i ip_list deploy.zookeeper.yaml

小提示
截图中的命令为:
ansible-playbook -i ip_list deploy.zookeeper.yaml --key-file=sz-key
说明:--key-file是Ansible的一个参数,后面指定的是堡垒机的私钥文件。(因个人环境而异)



03


ClickHouse安装部署.




同样地,相同的具体化步骤,我们也使用Ansible来完成。

编写安装CK的Ansible脚本

01

定义机器列表文件


在堡垒机上定义一个ip_list文件,内容为要部署的目标机器的IP。

mkdir clickhousecd clickhousevim ip_list[clickhouse]172.xx.xx.x172.xx.xx.x172.xx.xx.x172.xx.xx.x

02

Ansible主入口文件


vim deploy.clickhouse.yaml---- hosts: clickhouse  remote_user: root  gather_facts: true  tasks:  # 1、下载相关安装包并安装  - name: "1 | download and installed"    yum:      name:      - http://10.xx.x.xx/td-configuration/deploy/clickhouse/v21.9.5.16-stable/clickhouse-common-static-21.9.5.16-2.x86_64.rpm      - http://10.xx.x.xx/td-configuration/deploy/clickhouse/v21.9.5.16-stable/clickhouse-common-static-dbg-21.9.5.16-2.x86_64.rpm      - http://10.xx.x.xx/td-configuration/deploy/clickhouse/v21.9.5.16-stable/clickhouse-server-21.9.5.16-2.noarch.rpm      - http://10.xx.x.xx/td-configuration/deploy/clickhouse/v21.9.5.16-stable/clickhouse-client-21.9.5.16-2.noarch.rpm      state: present  # 2、创建CK相关目录  - name: "2 | create directories"    file:      path: /data/clickhouse-server/{{ item }}      state: directory    with_items:      - 'access'      - 'data'      - 'format_schemas'      - 'logs'      - 'tmp'      - 'user_files'  # 3、CK目录赋予对应用户权限  - name: "3 | chown"    file:      path: /data/clickhouse-server      owner: clickhouse      group: clickhouse      recurse: yes

Ansible执行安装

ansible-playbook -i ip_list deploy.clickhouse.yaml --key-file=sz-key

至此,CK安装完成。

修改CK配置文件

因为CK的配置文件内容较多,所以,只将需要调整的部分展示出来。

  • CK主配置文件:/etc/clickhouse-server/config.xml
vim /etc/clickhouse-server/config.xml<!-- 日志目录 --><log>/data/clickhouse-server/logs/clickhouse-server.log</log><errorlog>/data/clickhouse-server/logs/clickhouse-server.err.log</errorlog><!-- CK内部HTTP通信HOST,填写本机IP,每个节点都不一样 --><interserver_http_host>172.xx.xx.x</interserver_http_host><!-- 监听HOST --><listen_host>0.0.0.0</listen_host><!-- 软件的目录配置,同Ansible安装创建的目录 --><path>/data/clickhouse-server/data/</path><tmp_path>/data/clickhouse-server/tmp/</tmp_path><user_files_path>/data/clickhouse-server/user_files/</user_files_path><local_directory><path>/data/clickhouse-server/access/</path></local_directory><format_schema_path>/data/clickhouse-server/format_schemas/</format_schema_path><!-- 指定ZK配置 --><zookeeper incl="zookeeper-servers" optional="true" /><!-- 指定外部CK集群配置文件 --><include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
  • 引用到外部的集群相关配置文件:/etc/clickhouse-server/config.d/metrika.xml

vim /etc/clickhouse-server/config.d/metrika.xml<?xml version="1.0"?><yandex><!--zookeeper相关配置-->    <zookeeper-servers>     <!--需要与config.xml中zookerper的incl名称匹配-->        <node index="1">    <!--node节点配置-->            <host>172.xx.xx.x</host>   <!--zk_host-->            <port>2182</port>   <!--zk_port-->        </node>        <node index="2">            <host>172.xx.xx.x</host>            <port>2182</port>        </node>        <node index="3">            <host>172.xx.xx.x</host>            <port>2182</port>        </node>    </zookeeper-servers>    <remote_servers>        <!-- 集群名称 -->        <test_cluster>            <!-- 集群第1个分片 -->            <shard>                <internal_replication>true</internal_replication>                <!-- 集群第1个分片的第1个副本 -->                <replica>                    <host>172.xx.xx.x</host>                    <port>9000</port>                </replica>                <!-- 集群第1个分片的第2个副本 -->                <replica>                    <host>172.xx.xx.x</host>                    <port>9000</port>                </replica>            </shard>            <!-- 集群第2个分片 -->            <shard>                <internal_replication>true</internal_replication>                <!-- 集群第2个分片的第1个副本 -->                <replica>                    <host>172.xx.xx.x</host>                    <port>9000</port>                </replica>                <!-- 集群第2个分片的第2个副本 -->                <replica>                    <host>172.xx.xx.x</host>                    <port>9000</port>                </replica>            </shard>        </test_cluster>    </remote_servers>    <macros>        <layer>01</layer>       <!-- 集群标识 -->        <shard>01</shard>       <!-- 分片标识:不同机器放的分片数不一样 -->        <replica>rep_1_1</replica>       <!-- 副本标识:不同机器放的副本数不一样 -->    </macros></yandex>
小提示
  • CK集群主配置文件/etc/clickhouse-server/config.xml配置项:<interserver_http_host>172.xx.xx.x</interserver_http_host>,需要填写每个节点自己的IP;
  • 引用到外部的集群相关配置文件/etc/clickhouse-server/config.d/metrika.xml配置项:<macros>...</macros>,每个节点需要填写自己在当前集群的信息,比如第3个节点,应该配置成<layer>01</layer>(集群标识为01)、<shard>02</shard>(所处在第2个分片)、<replica>rep_2_1</replica>(副本的名称格式为:rep_[分片号]_[副本号])。

启动CK服务并检查集群情况

CK集群的启动需要所有节点都操作:

# 启动服务,所有节点都需要执行systemctl start clickhouse-server# 查看CK服务状态systemctl status clickhouse-server

查看当前的集群状态信息:
# 登录SQL对话框clickhouse-client -m# 查看当前集群状态SELECT * FROM system.clusters;# 查看ZK信息SELECT * FROM system.zookeeper where path='/clickhouse';

此,我们的4节点、2分片、2副本的CK集群就搭建完成了。is_local为1表示当前节点
小提示
  • CK支持SQL,clickhouse-client命令后面可以跟很多参数,例子中的-m参数:代表多行输入,最后要以';'为结束符才算完整的一个SQL、--host:指定主机名、--port:指定端口等,其实你会发现,和MySQL客户端mysql参数类似。

  • CK中有一个system系统库,也可以使用use system;的语句切换到该库下,show tables;命令可以看到里面的各个元数据表,这些表记录着CK集群的各种状态。

  • 在修改配置文件的时候一定要仔细,认真区分好集群、分片、副本的关系。我刚开始学习的时候也很乱,不过,书读百遍其义自见。




04


小结.



我们也可以查看ZK记录的集群信息:
zkCli.sh -server 172.xx.xx.x:2182ls /ls -s /clickhousels -w /clickhousels -R /clickhouse

万事开头难。ClickHouse我是从零开始接触的,近期,公司的事情也比较多,所以本文细节不到位的地方大家多多担待,随着今后的学习,慢慢将ClickHouse的知识体系给完善起来。
通过这段时间对ClickHouse的学习和实践,感觉搭建部署还是比较简单的,安装软件、修改配置文件、启动服务就OK了。虽然简单,但还是需要特别分清集群、分片、副本的关系,弄明白之后才能在未来的大规模集群搭建时游刃有余。今天的文章就到这里吧,下篇文章见。


end


文章转载自 GrowthDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论