一、Replicated*MergeTree表引擎概要
- 仅MergeTree系列的引擎支持数据复制:
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedVersionedCollapsingMergeTree
- ReplicatedGraphiteMergeTree
- 复制的对象是单个表,而非整个服务器。服务器上可以同时存在复制表和非复制表
- 复制不依赖于分片。每个分片都有自己独立的复制。
- insert和alter语句的压缩数据将被复制
CREATE
、DROP
、RENAME
、DETACH
和ATTACH
只在单个服务器上执行,且不会被复制
CREATE TABLE
将在执行查询的服务器上新建一个可复制表,如果该表已经存在于其它服务器上,则将添加一个副本DROP TABLE
将在执行该查询的服务器上删除该服务器上的副本RENAME TABLE
将重命名其中一个副本上的表。也就是说,复制表在不同的副本上可以有不同的名字
- Clikchouse用Apache Zookeeper来存储副本的元信息。需要zookeeper3.4.5或更高的版本
- 要使用复制表需要在配置文件中配置zookeeper服务器信息,如下zookeeper集群信息配置
<zookeeper incl="zookeeper-servers" optional="true" />
<zookeeper>
<node index="1">
<host>192.168.23.130</host>
<port>2181</port>
</node>
<node index="2">
<host>192.168.23.131</host>
<port>2181</port>
</node>
<node index="3">
<host>192.168.23.132</host>
<port>2181</port>
</node>
</zookeeper>
- 如果配置zookeeper集群信息,那么无法创建复制表,且当前存在的复制表为只读状态
SELECT
语句不使用zookeeper,因为复制不影响select的性能,并且查询的速度和非复制表一样快。查询分布式复制表时,clickhouse行为由max_replica_delay_for_distributed_queries
和fallback_to_stale_replicas_for_distributed_queries
控制- 对于每个INSERT查询通过几个事务将大约十多个条目添加到zookeeper中(确切来说,这是针对每个插入的数据块而言的,一次insert查询每
max_insert_block_size = 1048576
组成一个数据块)。与非复制表相比,这将导致insert的等待时间稍长。但是,如果按照不超过每秒一次insert批量插入,则不会造成任何问题。用于协调一个zookeeper集群的整个clickhouse集群总共每秒有数百个insert。数据插入的吞吐量和非复制表一样高。 - 对于非常大的集群,可以将不同的zookeeper集群应用于不用的分片上。但是,Yandex.Mertrica约有300台服务器,并没证明这样做的必要性
- 复制是异步的,且是多主服务器的。insert(或alter)语句可以发送到任何可用的服务器上。将数据插入到运行查询的服务器上,然后将复制到其它服务器上。因此是异步的,所以最近插入的数据将以一定延迟出现在其它副本上。如果副本不可用,则在其可用时写入数据。如果副本可用则等待时间是通过网络传输压缩数据块所花费的时间
- 默认情况下,insert语句只等待某一个副本上写入数据的确认。如果仅将数据成功写入一个副本,并且具有该副本的服务器不复存在,那么数据将丢失。要启用多个副本数据写入确认,那么请使用
insert_quorum
选项。 - 每个数据块都是原子写入的。insert查询被划分为最大
max_insert_block_size=1048576 rows
。换句话说,如果行数少于1048576,那么写入是原子性的。 - 数据块删除重复数据。对于同一数据块的多次写入(相同大小数据块包含相同顺序的相同行),该块仅写入一次。这样做的目的在于,当客户端由于网络故障不知道数据是否写入,因此可以简单的重复insert。发送相同的数据块。insert是幂等的,重复数据删除由merge_tree服务器设置控制。
- 复制期间,通过网络仅传输要插入的源数据。进一步数据合并以相同的方式协调并在所有副本上执行。这样可以最大程度减少网络使用,这意味着如果副本位于不同的数据中心时,复制效果很好。(请注意,在不同的数据中心复制数据是复制的主要目标)
- 可以具有任意数据量的数据副本。在配有RAID-5、RAID6或RAID10情况下,是比较安全可靠的
- 系统监视副本上的数据同步,并能够在发生故障后恢复。故障转移是自动的(对于数据微小差异)或半自动的(当数据差异很大时,这可能时配置错误)