ClickHouse Keeper 是 ZooKeeper 的替代品,与 ZooKeeper 不同,ClickHouse Keeper 是用 C++ 编写的,并使用 RAFT 算法实现,该算法允许对读写具有线性化能力。
clikhouse-keeper目的在于替换zookeeper,使用clickhouse后,服务器性能,提升了一大截,只需要在配置zookeeper的地方,改成clickhouse-keeper即可。
ClickHouse keeper相对zookeeper来说性能更好,维护更方便。
功能设计
使用clickhouse-keeper代替 zookeeper的步骤:
1: 部署clickhouse-keeper
部署clickhouse-keeper同部署clickhouse
1.1- 设置通信地址,以便对外通信
a. 检查端口是否被占用
假设keeper的端口是9181,与server通信接口为9444
netstat-anp|grep9181netstat-anp|grep9444
b. 设置 clickhouse-keeper的地址,每个节点内容一致
<?xml version="1.0"?>
<yandex>
<!-- 监听IP -->
<listen_host>0.0.0.0</listen_host>
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/keeper/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/keeper/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>30000</operation_timeout_ms>
<session_timeout_ms>60000</session_timeout_ms>
<raft_logs_level>error</raft_logs_level>
<force_sync>false</force_sync>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node01</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>node02</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>node03</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server>
</yandex>
c. 设置clickhouse-keeper的server_id 和clickhouse-server通信端口 9444
每个节点的server_id要确保唯一,不能和其他节点重复 , keeper_server中的server_id是要和配置raft协议集群时命名的一致。
例如:
在 clickhouse-node01上的配置, <server_id>1</server_id>
在clickhouse_node02上的配置, <server_id>2</server_id>
2:备份 clickhouse-server的配置文件和数据,以及zookeeper的元数据。(预防升级失败需要回滚)
b. zookeeper的数据: 在zoo.cfg,数据目录。
dataDir=/data/zookeeper/zkdata (存储snap数据)
dataLogDir=/data/zookeeper/zklog (存储 transation命令)
4: 迁移zk的元数据到 clickhouse-keeper
a- 停止所有的zk 节点。
在所有的zk节点上 执行
zkServer.sh stop
b- 建议 启停zk的leader,以便强制 复制一份 一致性的快照。
查找leader节点, 在所有的节点上执行
zkServer.sh stop
在leader节点上 启停zookeeper
zkServer.sh start
zkServer.sh stop
c- 运行 clickhouse-keeper-converter , 生成snapshot
clickhouse-keeper-converter --zookeeper-logs-dir /data/zookeeper/zklog/version-2 --zookeeper-snapshots-dir /data/zookeeper/zkdata/version-2 --output-dir /var/lib/clickhouse/keeper/snapshots
chown-R clickhouse:clickhouse /var/lib/clickhouse
同步数据
scp -r /var/lib/clickhouse/keeper root@clickhouse-keeper:/var/lib/clickhouse
e- 单独启动clickhouse-keeper
如果server和keeper是安装在同一个节点,这步可以省略
sudo-su clickhouse clickhouse-keeper --config /etc/clickhouse-server/keeper.xml --daemon
测试连接
zkCli.sh -server localhost:9181
5- 重启 clickhouse
/usr/bin/clickhouse-server stop
/usr/bin/clickhouse-server start
6- 验证是否clickhouse-keeper是否正常运行
echo ruok |nc localhost 9181
期望看到:imok
7- 验证clickhouse是否正常运行
连接客户端,创建一张分布式表,查看数据是否能正常操作分布式表(CRUD)。
select*from system.clusters;
8- 通过nginx接入clickhouse
upstream clickhouse{
server node1:8123 weight=1;
server node2:8123 weight=1;
server node3:8123 weight=1;
}
server{
listen 8123;
location /{
proxy_pass http://clickhouse;
}
}
版权归原作者 老朱-yubing 所有, 如有侵权,请联系我们删除。