一、Replicated*MergeTree表引擎概要

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