192.168.9.60、192.168.9.63、192.168.9.64三台centos(或openEuler系统)安装clickhouse集群(数据分散,不是1主2备)
一、安装clickhouse集群
以下操作在每台机器上一摸一样的执行:
关闭防火墙:
防火墙状态:service firewalld status
关闭防火墙:systemctl stop firewalld && systemctl disable firewalld
下载离线安装包
安装:
sudo yum localinstall -y /usr/clickhouse/clickhouse-common-static-24.2.3.70.x86_64.rpm /usr/clickhouse/clickhouse-server-24.2.3.70.x86_64.rpm /usr/clickhouse/clickhouse-client-24.2.3.70.x86_64.rpm
验证:
clickhouse-server --version
clickhouse-client --version
修改配置文件(3台一摸一样):
vi /etc/clickhouse-server/config.xml
修改部分:
XML
<remote_servers>
<my_cluster>
<shard>
<replica>
<host>192.168.9.60</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>192.168.9.63</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>192.168.9.64</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</remote_servers>
修改部分:
<!-- 允许监听所有网络接口 -->
<listen_host>::</listen_host>
增加用户:
修改 /etc/clickhouse-server/users.xml
<users></users>中增加:
XML
<root>
<password>Sn@123456</password>
<!-- 在这里填写明文密码 -->
<networks>
<ip>::/0</ip>
</networks>
</root>
重启:
sudo systemctl start clickhouse-server
sudo systemctl enable clickhouse-server
sudo systemctl status clickhouse-server
查看端口9000和8123是否开放:
sudo ss -nlpt
连接验证(比如在62连接60或63):
clickhouse-client --host 192.168.9.60 --port 9000 --user root --password 'Sn@123456'
clickhouse-client --host 192.168.9.63 --port 9000 --user root --password 'Sn@123456'
二、安装zookeeper集群
ZooKeeper 依赖于 Java:
sudo yum install -y java-1.8.0-openjdk
下载和解压 ZooKeeper
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
sudo mv apache-zookeeper-3.6.3-bin /opt/zookeeper
创建一个名为 zoo.cfg 的配置文件(3台机器配置一摸一样):
sudo mkdir -p /opt/zookeeper/data
sudo vi /opt/zookeeper/conf/zoo.cfg
添加以下内容:
bash
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.9.60:2888:3888
server.2=192.168.9.63:2888:3888
server.3=192.168.9.64:2888:3888
重点:在每个 ZooKeeper 节点上,创建一个 myid 文件并添加相应的 ID(1、2 或 3):
例如,在 192.168.9.60 节点上:
echo "1" > /opt/zookeeper/data/myid
在 192.168.9.63 节点上:
echo "2" > /opt/zookeeper/data/myid
在 192.168.9.64 节点上:
echo "3" > /opt/zookeeper/data/myid
分别启动各自的zookeeper,建议从后往前启动 :
/opt/zookeeper/bin/zkServer.sh start
配置clickhouse的zookeeper:
每台修改/etc/clickhouse-server/config.xml 文件,添加以下内容(添加位置可搜索zookeeper):
XML
<zookeeper>
<node>
<host>192.168.9.60</host>
<port>2181</port>
</node>
<node>
<host>192.168.9.63</host>
<port>2181</port>
</node>
<node>
<host>192.168.9.64</host>
<port>2181</port>
</node>
</zookeeper>
重启clickhouse
sudo systemctl restart clickhouse-server
验证:
/opt/zookeeper/bin/zkServer.sh status
查看端口2181是否开放:
sudo ss -nlpt
查看启动日志:
/opt/zookeeper/logs/zookeeper-root-server-master-01.out
(启动失败,可能是myid没建好,重建,重启每个机器)
测试连接:
/opt/zookeeper/bin/zkCli.sh -server 192.168.9.60:2181
dbveaver连接每个库,分别执行:
sql
CREATE DATABASE res;
-- res.rm_metric_data_history definition
CREATE TABLE res.rm_metric_data_history
(
`resid` String,
`respara` String,
`item_code` String,
`value` String,
`coltime` DateTime,
`gentime` DateTime DEFAULT now(),
`company_code` String
)
ENGINE = MergeTree
ORDER BY coltime
TTL coltime + toIntervalDay(180)
SETTINGS index_granularity = 8192
COMMENT '性能历史表';
INSERT INTO res.rm_metric_data_history
(resid, respara, item_code, value, coltime, gentime, company_code)
VALUES('9a82222a12d54c2a8c775147200d07b9', '-1', 'kafka.topic.net.bytes_in.rate', '1471.964798', '2024-07-12 18:13:00', '2024-07-12 18:11:50', '');
INSERT INTO res.rm_metric_data_history
(resid, respara, item_code, value, coltime, gentime, company_code)
VALUES('9a82222a12d54c2a8c775147200d07b9', '-1', 'kafka.topic.net.bytes_out.rate', '2943.929595', '2024-07-12 18:14:00', '2024-07-12 18:11:50', '');
在某机器执行创建分布式表:
sql
CREATE TABLE res.rm_metric_data_history_distributed ON CLUSTER my_cluster
AS res.rm_metric_data_history
ENGINE = Distributed(my_cluster, res, rm_metric_data_history, rand());
仅仅在1个机器执行了,但是另外2个机器也有了这个表了。因为你使用了 ON CLUSTER 语句在 ClickHouse 中创建表。这意味着 ClickHouse 会自动在集群中的所有节点上创建该表。ON CLUSTER 语句会将 DDL 操作(如创建表、修改表、删除表等)广播到集群中所有的节点,因此你只需在一个节点上执行 DDL 操作,就会在整个集群中生效。
select * from res.rm_metric_data_history_distributed;
在63查这个表数据,能查到3个库的所有rm_metric_data_history表数据。
插入数据同理:
INSERT INTO res.rm_metric_data_history_distributed
(resid, respara, item_code, value, coltime, gentime, company_code)
VALUES('9a82222a12d54c2a8c775147200d07b9', '-1', 'mysql.performance.com_selecte', '1', '2024-07-14 18:14:00', '2024-07-13 18:14:00', 'zhejiang');
在某台机器执行插入,数据会根据主键coltime分散到3台机器的res.rm_metric_data_history表里。
备注(clickhouse集群内机器关系):
这种配置是啥意思
XML
<remote_servers>
<my_cluster>
<shard>
<replica>
<host>server1</host>
<port>9000</port>
</replica>
<replica>
<host>server2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>server3</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</remote_servers>
Shard:是数据的水平分片,每个 shard 存储数据的一个子集。
Replica:是数据的副本,每个 shard 可以有多个副本,副本之间的数据是相同的,用于高可用性和负载均衡。
在你的配置中,将 server1 和 server2 放在同一个 shard 里,而 server3 单独放在一个 shard,意味着:
Shard 1 包含 server1 和 server2,它们是彼此的副本,存储相同的数据。
Shard 2 包含 server3,它独立存储数据。
理解这种配置的原因
高可用性:通过将多个副本放在一个 shard 里,可以确保即使一个副本失败,其他副本依然可用。
负载均衡:多个副本可以分担读请求的负载,提高查询性能。
常见的配置模式
每个 Shard 多个 Replica:
适用于需要高可用性和负载均衡的场景。
例如:
XML
<remote_servers>
<my_cluster>
<shard>
<replica>
<host>server1</host>
<port>9000</port>
</replica>
<replica>
<host>server2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>server3</host>
<port>9000</port>
</replica>
<replica>
<host>server4</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</remote_servers>
每个 Shard 一个 Replica:
适用于数据分布要求明确,不需要副本的场景。
例如:
XML
<remote_servers>
<my_cluster>
<shard>
<replica>
<host>server1</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>server2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>server3</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</remote_servers>