ClickHouse之集群搭建以及数据复制

摘要:
上一篇文章简要介绍了ClickHouse,并进行了简单的性能测试。这次,我们将讨论集群构建和数据复制。如果数据复制需要Zookeeper的合作。192.168.0.10db _ server_yayun_01192.168.0.20db _ server_ yayun_02192.168.0.30db _ server__yayun_033。创建一个配置文件,默认情况下该文件不存在/etc/clickhouse server/config。xml有如下提示:如果元素是“include”属性,则信息值将被用于其他文件的相应替换。默认情况下,带替换的文件路径为/etc/metrika.xml。它可能被配置为“包含来自”元素。替换值在该文件中替换元素的/yandex/name_中指定。配置文件/etc/metrika xml内容如下:truedb_server_yayun_019000truedb_server_ yayun_029000truedb_server_yayun_039000192.168.0.302181192.168.0.10::/0100000000000.01lz4三台机器的配置文件如下相同的唯一的区别是:<宏><副本>192.168.0.10。修改配置文件后,3台服务器将重新启动。

前面的文章简单的介绍了ClickHouse,以及也进行了简单的性能测试。本次说说集群的搭建以及数据复制,如果复制数据需要zookeeper配合。

环境:

1. 3台机器,我这里是3台虚拟机。都安装了clickhouse。

2. 绑定hosts,其实不绑定也没关系,配置文件里面直接写ip。(3台机器都绑定hosts,如下)

192.168.0.10 db_server_yayun_01
192.168.0.20 db_server_yayun_02
192.168.0.30 db_server_yayun_03

3. 创建配置文件,默认这个配置文件是不存在的。/etc/clickhouse-server/config.xml有提示,如下:
If element has 'incl' attribute, then for it's value will be used corresponding substitution from another file.
By default, path to file with substitutions is /etc/metrika.xml. It could be changed in config in 'include_from' element.
Values for substitutions are specified in /yandex/name_of_substitution elements in that file.

配置文件/etc/metrika.xml内容如下:

<yandex>
<clickhouse_remote_servers>
    <perftest_3shards_1replicas>
        <shard>
             <internal_replication>true</internal_replication>
            <replica>
                <host>db_server_yayun_01</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <internal_replication>true</internal_replication>
                <host>db_server_yayun_02</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>db_server_yayun_03</host>
                <port>9000</port>
            </replica>
        </shard>
    </perftest_3shards_1replicas>
</clickhouse_remote_servers>


<zookeeper-servers>
  <node index="1">
    <host>192.168.0.30</host>
    <port>2181</port>
  </node>
</zookeeper-servers>

<macros>
    <replica>192.168.0.10</replica>
</macros>


<networks>
   <ip>::/0</ip>
</networks>


<clickhouse_compression>
<case>
<min_part_size>10000000000</min_part_size> <min_part_size_ratio>0.01</min_part_size_ratio> <method>lz4</method> </case>
</clickhouse_compression> </yandex>

3台机器的配置文件都一样,唯一有区别的是:

<macros>
    <replica>192.168.0.10</replica>
</macros>

服务器ip是多少这里就写多少,其实不写ip也没关系,3台机器不重复就行。这里是复制需要用到的配置。还有zk的配置如下:

<zookeeper-servers>
  <node index="1">
    <host>192.168.0.30</host>
    <port>2181</port>
  </node>
</zookeeper-servers>

我的zk是安装在30的机器上面的,只安装了一个实例,生产环境肯定要放到单独的机器,并且配置成集群。配置文件修改好以后3台服务器重启。
官方文档给的步骤是:

ClickHouse deployment to cluster

ClickHouse cluster is a homogenous cluster. Steps to set up:

1. Install ClickHouse server on all machines of the cluster
2. Set up cluster configs in configuration file
3. Create local tables on each instance
4. Create a Distributed table

前面2步都搞定了,下面创建本地表,再创建Distributed表。(3台机器都创建,DDL不同步,蛋疼)

CREATE TABLE ontime_local (FlightDate Date,Year UInt16) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);
CREATE TABLE ontime_all AS ontime_local ENGINE = Distributed(perftest_3shards_1replicas, default, ontime_local, rand())

插入数据(随便一台机器就行):

:) insert into ontime_all (FlightDate,Year)values('2001-10-12',2001);

INSERT INTO ontime_all (FlightDate, Year) VALUES

Ok.

1 rows in set. Elapsed: 0.013 sec. 

:) insert into ontime_all (FlightDate,Year)values('2002-10-12',2002);

INSERT INTO ontime_all (FlightDate, Year) VALUES

Ok.

1 rows in set. Elapsed: 0.004 sec. 

:) insert into ontime_all (FlightDate,Year)values('2003-10-12',2003);

INSERT INTO ontime_all (FlightDate, Year) VALUES

Ok.

我这里插入了3条数据。下面查询看看(任何一台机器都可以):

:) select * from  ontime_all;

SELECT *
FROM ontime_all 

┌─FlightDate─┬─Year─┐
│ 2001-10-122001 │
└────────────┴──────┘
┌─FlightDate─┬─Year─┐
│ 2002-10-122002 │
└────────────┴──────┘
┌─FlightDate─┬─Year─┐
│ 2003-10-122003 │
└────────────┴──────┘
→ Progress: 3.00 rows, 12.00 B (48.27 rows/s., 193.08 B/s.) 
3 rows in set. Elapsed: 0.063 sec. 

:) 

当在其中一台机器上面查询的时候,抓包其他机器可以看见是有请求的。

tcpdump -i any -s 0 -l -w - dst port 9000

那么关闭其中一台机器呢?

:) select * from ontime_all;

SELECT *
FROM ontime_all 

┌─FlightDate─┬─Year─┐
│ 2001-10-122001 │
└────────────┴──────┘
┌─FlightDate─┬─Year─┐
│ 2002-10-122002 │
└────────────┴──────┘
┌─FlightDate─┬─Year─┐
│ 2003-10-122003 │
└────────────┴──────┘
↓ Progress: 6.00 rows, 24.00 B (292.80 rows/s., 1.17 KB/s.) Received exception from server:
Code: 279. DB::Exception: Received from localhost:9000, ::1. DB::NetException. DB::NetException: All connection tries failed. Log: 

Code: 210, e.displayText() = DB::NetException: Connection refused: (db_server_yayun_02:9000, 192.168.0.20), e.what() = DB::NetException
Code: 210, e.displayText() = DB::NetException: Connection refused: (db_server_yayun_02:9000, 192.168.0.20), e.what() = DB::NetException
Code: 210, e.displayText() = DB::NetException: Connection refused: (db_server_yayun_02:9000, 192.168.0.20), e.what() = DB::NetException

可以看见已经抛错了,竟然不是高可用?后面又看到了文档的另外一种配置方法,那就是配置2个节点,副本2个,经过测试高可用没有问题,另外也是分布式并行查询。感兴趣的同学可以自行测试。
https://clickhouse.yandex/reference_en.html#Distributed

下面进行数据复制的测试,zk已经配置好了,直接建表测试(3台机器都创建):

CREATE TABLE ontime_replica (FlightDate Date,Year UInt16) ENGINE = ReplicatedMergeTree('/clickhouse_perftest/tables/ontime_replica','{replica}',FlightDate,(Year, FlightDate),8192);

插入数据测试:

insert into ontime_replica (FlightDate,Year)values('2018-10-12',2018);

任何一台机器均可查询到。其实到现在对于集群和复制都还没彻底搞明白,因为分布式表也进行了数据复制,所以有点懵。有大婶的话欢迎一起交流。

参考资料:

https://clickhouse.yandex/reference_en.html#Distributed

https://clickhouse.yandex/tutorial.html

免责声明:文章转载自《ClickHouse之集群搭建以及数据复制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLServer时间日期函数详解JAVA 内存详解 (理解 JVM 如何使用 Windows 和 Linux 上的本机内存)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python+mitmproxy抓包过滤+redis消息订阅+websocket实时消息发送,日志实时输出到web界面

本实例实现需求 在游戏SDK测试中,经常需要测试游戏中SDK的埋点日志是否接入正确。本实例通过抓包(客户端http/https 请求)来判定埋点日志是是否接入正确。 实现细节:使用django项目,后端采用python mitmdump 扩展脚本“log_handler.py”实时抓取与过滤4399SDK 客户端日志,将数据处理成约定需要的格式,保存和发布...

生成CPIO格式的initrd

因为initrd.img只是系统启动的一个虚拟磁盘而已,系统启动完成后就没有用处了,因此,我决定用busybox来完成一些必要的启动工作(用的是busybox-1.5.1,配置文件如下) cd /tmp mkdir initrd cd initrd mkdir dev proc sys lib mnt mkdir -p lib/modules/kernel...

Django框架详细介绍---请求流程

Django请求流程图 1.客户端发送请求 2.wsgiref是Django封装的套接字,它将客户端发送过来的请求(请求头、请求体封装成request)    1)解析请求数据   2)封装响应数据  3.中间件,进项身份验证等 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlewa...

理解 Android Build 系统

测试 前言 Android Build 系统是 Android 源码的一部分。关于如何获取 Android 源码,请参照 Android Source 官方网站 。 Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档。该系统主要由 Make 文件,Shell 脚本以及 Python 脚本组成,其中最主要的是...

使用Elasticsearch的processors来对csv格式数据进行解析

来源数据是一个csv文件,具体内容如下图所示: 导入数据到es中 有两种办法,第一种是在kibana界面直接上传文件导入 第二种方法是使用filebeat读取文件导入 这里采用第二种办法 配置文件名:filebeat_covid19.yml filebeat.inputs: - type: log paths: - /covid19/covid...

tomcat配置多个web网站的配置详解

假如只有一台服务器,需要配置多个web网站(端口不同我还没试),该怎么样配置tomcat呢,其实很简单,只需要将tomcat 下面的 server.xml  中增加两个甚至是多个<Host>……</Host> 标签即可, 标签的内容如下例子,其中需要注意的是每个web 项目的目录不要在同一个目录下,host标签中的 name 不能...