
方案1.0.jpg
优势
架构简单,单机和分布式都可以用
劣势
方案2.0:MergeTree + Distributed + 多副本
在方案一的基础上为每个节点增加副本

方案2.0.jpg
优势
在1.0的基础上,数据安全有了保障,任何一个实例或者服务器挂掉了,不影响集群查询服务
劣势
如果某个节点挂了,恢复以后可以将丢失的增量数据补全,但是如果硬盘彻底损坏,存量数据基本无法恢复,且这种方案不能用两个节点互为主备,会造成数据错乱
方案3.0:ReplicatedMergeTree + Distributed + 多副本
把2.0方案中的数据表引擎替换成ReplicatedMergeTree,并设置分布式写入时只写入分片的一个节点:internal_replication设置为true
实现同一个分片中,写入一个节点的数据后,自动同步到其他的副本中
下图实现的是一个节点启动多个ClickHouse实例

方案3.0.jpg
优势
由ReplicatedMergeTree表引擎管理数据副本(依赖Zookeeper),无须担心节点挂掉后数据的同步和丢失问题
劣势
集群配置比较复杂, macros配置分片和副本需要仔细
metrika.xml配置

2分片2副本配置.jpg
节点扩展

方案3.0节点扩展.jpg
单节点多实例部署
多套配置文件
将/etc/clickhouse-server/目录下的config.xml、users.xml 、metrika.xml复制到/etc/clickhouse-server/replica02/目录下
并对config.xml中配置的目录和端口做如下修改:
<!-- 日志目录 -->
<logger>
<log>/var/log/clickhouse-server/replica02/clickhouse-server.log</log>
<errorlog>/var/log/clickhouse-server/replica02/clickhouse-server.err.log</errorlog>
</logger>
<!-- 端口 -->
<http_port>8124</http_port>
<tcp_port>9001</tcp_port>
<mysql_port>9005</mysql_port>
<interserver_http_port>9010</interserver_http_port>
<!-- 数据目录 -->
<path>/var/lib/clickhouse/replica02/</path>
<tmp_path>/var/lib/clickhouse/replica02/tmp/</tmp_path>
<user_files_path>/var/lib/clickhouse/replica02/user_files/</user_files_path>
<!-- user配置 -->
<user_directories>
<local_directory>
<!-- Path to folder where users created by SQL commands are stored. -->
<path>/var/lib/clickhouse/replica02/access/</path>
</local_directory>
</user_directories>
<include_from>/etc/clickhouse-server/replica02/metrika.xml</include_from>
<format_schema_path>/var/lib/clickhouse/replica02/format_schemas/</format_schema_path>
多套服务启动文件
复制 /etc/systemd/system/clickhouse-server.service 重命名为 clickhouse-server-replica02.serviced
修改启动时加载的配置指向新的文件上,同时pid-file需要跟服务名称保持一直,否则启动不起来
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/replica02/config.xml --pid-file=/run/clickhouse-server/clickhouse-server-replica02.pid
修改完毕后,重新加载systemd服务 system daemon-reload
然后使用命令启动多实例 sudo systemctl start clickhouse-server-replica02
集群验证
通过客户端登录任意节点,查询集群配置信息
select * from system.clusters;

集群信息.jpg
集群数据写入
写入分布式表
分布式表会跨服务器分发插入数据,仅仅是简单的请求转发,同时写入多个副本无法保证副本数据的一致性,长时间可能会造成副本数据有些不一样
所以不推荐直接写入分布式表
利用ReplicatedMergeTree引擎写入本地表
将数据副本的同步过程交给ClickHouse的复制表引擎管理
可以自已指定要将哪些数据写入哪些服务器,并直接在每个分片上执行写入,并且你可以使用任何分片方案。对于复杂业务特性的需求,这可能是非常重要的
官方推荐这种方案
文章均来自互联网如有不妥请联系作者删除QQ:314111741 地址:http://www.mqs.net/post/15098.html
添加新评论