搭建Clickhouse集群

3,921 阅读3分钟

今天搭建了clickhouse集群,分享给大家

本次搭建集群是使用了两台云主机,为了简单就没有配置域名映射,整个过程都是使用的内网IP,clickhouse集群依赖zookeeper,所以要搭建zookeeper集群,由于资源有限,zookeeper使用的是单点模式,如果资源足够的话可以搭建集群,我也推荐大家搭建zookeeper集群

  • 免密登录
  • zookeeper部署
  • clickhouse安装
  • clickhouse配置集群
  • 结果展示

1. 免密登录

为了方便传输文件,两台机器之前配置免密登录.

  • 需要先在 B节点 配置 A节点 的公钥
  • A节点 请求 B节点 要求登录
  • B节点 使用 A节点 的公钥, 加密一段随机文本
  • A节点 使用私钥解密, 并发回给 B节点
  • B节点 验证文本是否正确 每台服务器都要执行: ssh-keygen -t rsa

然后两台机器交换公钥:

将node1的/root/.ssh/公钥拷贝到node2的/root/.ssh/authorized_keys中

将node2的/root/.ssh/公钥拷贝到node1的/root/.ssh/authorized_keys中

2. zookeeper部署

下载zookeeper服务,然后解压

tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/

修改zoo.cfg文件 如果要配置zookeeper集群可以自行google,这里不是重点

3. clickhouse安装

两台服务器都是centos,如果是Ubuntu或者其他服务,可以去clickhouse官网查看

sudo yum install yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64
如果您想使用最新的版本,请用testing替代stable(我们只推荐您用于测试环境)。prestable有时也可用。
然后运行命令安装:
sudo yum install clickhouse-server clickhouse-client

以上的命令分别在node1、node2上执行 通过systemctl start clickhouse-server命令来开启 通过systemctl status clickhouse-server命令来查看启动状态 可以通过clickhouse-client命令来检查是否安装成功: 两台机器都要检查一下

4. clickhouse配置集群

主要在node1上修改/clickhouse-server/config.xml文件,主要修改三处:

修改第一处:

<!-- 打开这个 -->
 <listen_host>::</listen_host>
    <!-- Same for hosts with disabled ipv6: -->
    <!-- <listen_host>0.0.0.0</listen_host> -->
    <!-- 新增外部配置文件metrika.xml  -->

修改第二处:

<remote_servers>
   <cluster_2hards_1replicas>
        <!-- 数据分片1  -->
        <shard>
            <replica>
                <host>172.17.162.84</host>
                <port>9000</port>
            </replica>
        </shard>
        <!-- 数据分片2  -->
        <shard>
            <replica>
                <host>172.17.162.83/host>
                <port>9000</port>
            </replica>
        </shard>
    </luster_2hards_1replicas>
    .....省略原始配置
 </emote_servers>

修改第三处:

#如果是zookeeper集群,可以配置多个节点
   <zookeeper>
        <node>
            <host>172.17.162.83</host>
            <port>2181</port>
        </node>
    </zookeeper>

将config.xml同步到node2的/etc/clickhouse-server/中

通过systemctl restart clickhouse-server命令来重启服务(两台机器都需要重启)

集群之间是用过9000端口进行通信的,所以通过telnet命令来确认一下端口是否开放

5、结果展示

在两个节点上分别创建本地表

CREATE TABLE default.cluster2s1r_local(`id` Int32,`website` String,`wechat` String,`FlightDate` Date,Year UInt16)ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);

在node1上创建分布式表

CREATE TABLE default.cluster2s1r_all AS cluster3s1r_local ENGINE = Distributed(cluster_2shards_1replicas, default, cluster3s1r_local, rand());

然后往分布式表中插入数据

INSERT INTO default.cluster2s1r_all (id,website,wechat,FlightDate,Year)values(1,'https://niocoder.com/','java干货','2020-11-28',2020);
INSERT INTO default.cluster2s1r_all (id,website,wechat,FlightDate,Year)values(2,'http://www.merryyou.cn/','javaganhuo','2020-11-28',2020);
INSERT INTO default.cluster2s1r_all (id,website,wechat,FlightDate,Year)values(3,'http://www.xxxxx.cn/','xxxxx','2020-11-28',2020);

然后分别查询分布式表和本地表

#查询分布式表
:) select * from cluster2s1r_all;

SELECT *
FROM cluster2s1r_all

Query id: 19bb300d-b586-4e6a-bd51-10bf12e85eef

┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐
│  1 │ https://niocoder.com/ │ java干货 │ 2020-11-282020 │
└────┴───────────────────────┴──────────┴────────────┴──────┘
┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐
│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-282020 │
└────┴─────────────────────────┴────────────┴────────────┴──────┘
┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐
│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-282020 │
└────┴──────────────────────┴────────┴────────────┴──────┘

#node1的本地表
:) select * from cluster2s1r_local

SELECT *
FROM cluster3s1r_local

Query id: 88604512-cce5-457e-9d7f-f5ebb8d44ad6

Ok.

0 rows in set. Elapsed: 0.002 sec. 

#node2的本地表
:) select * from cluster2s1r_local

SELECT *
FROM cluster3s1r_local

Query id: 44832ca8-3338-499e-9a93-07448e7ae698

┌─id─┬─website───────────────┬─wechat───┬─FlightDate─┬─Year─┐
│  1 │ https://niocoder.com/ │ java干货 │ 2020-11-282020 │
└────┴───────────────────────┴──────────┴────────────┴──────┘
┌─id─┬─website─────────────────┬─wechat─────┬─FlightDate─┬─Year─┐
│  2 │ http://www.merryyou.cn/ │ javaganhuo │ 2020-11-282020 │
└────┴─────────────────────────┴────────────┴────────────┴──────┘
┌─id─┬─website──────────────┬─wechat─┬─FlightDate─┬─Year─┐
│  3 │ http://www.xxxxx.cn/ │ xxxxx  │ 2020-11-282020 │
└────┴──────────────────────┴────────┴────────────┴──────┘

希望可以帮助到跟我遇到同样问题的同学,这个方式肯定没问题,如果有问题,可以给我留言