**
clickhouse优点与弊端:
**
优点:1,为了高效的使用CPU,数据不仅仅按列存储,同时还按向量进行处理;
2,数据压缩空间大,减少IO;处理单查询高吞吐量每台服务器每秒最多数十亿行;
3,索引非B树结构,不需要满足最左原则;只要过滤条件在索引列中包含即可;即使在使用的数据不在索引中,由于各种并行处理机制ClickHouse全表扫描的速度也很快;
4,写入速度非常快,50-200M/s,对于大量的数据更新非常适用。
弊端:
1,不支持事务,不支持真正的删除/更新;
2,不支持高并发,官方建议qps为100,可以通过修改配置文件增加连接数,但是在服务器足够好的情况下;
3,SQL满足日常使用80%以上的语法,join写法比较特殊;最新版已支持类似SQL的join,但性能不好;
4,尽量做1000条以上批量的写入,避免逐行insert或小批量的insert,update,delete操作,因为ClickHouse底层会不断的做异步的数据合并,会影响查询性能,这个在做实时数据写入的时候要尽量避开;
5,Clickhouse快是因为采用了并行处理机制,即使一个查询,也会用服务器一半的CPU去执行,所以ClickHouse不能支持高并发的使用场景,默认单查询使用CPU核数为服务器核数的一半,安装时会自动识别服务器核数,可以通过配置文件修改该参数。
全量数据导入:数据导入临时表 -> 导入完成后,将原表改名为tmp1 -> 将临时表改名为正式表 -> 删除原表
增量数据导入: 增量数据导入临时表 -> 将原数据除增量外的也导入临时表 -> 导入完成后,将原表改名为tmp1-> 将临时表改成正式表-> 删除原数据表
下面来搭建服务器集群吧
一、服务器IP
1.1.1.1
1.1.1.2
1.1.1.3
1、需要这个四个rpm包进行下载(离线下载地址 clickhouse离线下载地址)
2、 使用root 用户 , 将放入的四个rpm放入指定目录/data/ck下面
3.、在三台服务器的/data/ck目录下分别执行 :
rpm -ivh *.rpm
4、三台服务器上面分别执行
vim /etc/clickhouse-server/config.xml
将 60行左右的
<!-- <listen_host>::</listen_host> -->
打开改为
<listen_host>::</listen_host>
将<max_concurrent_queries>100</max_concurrent_queries>修改为
<max_concurrent_queries>1000</max_concurrent_queries>
<!-- 新增外部配置文件metrika.xml 增加下面配置-->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
5、在1.1.1.1服务器上 /etc/clickhouse-server/目录下新建metrika.xml文件
vim /etc/clickhouse-server/metrika.xml
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<!-- 3分片1备份 -->
<cluster_3shards_1replicas>
<!-- 数据分片1 -->
<shard>
<replica>
<host>1.1.1.1</host> # 服务器1.1.1.1地址
<port>9000</port>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<replica>
<host>1.1.1.2</host> # 服务器1.1.1.2地址
<port> 9000</port>
</replica>
</shard>
<!-- 数据分片3 -->
<shard>
<replica>
<host>1.1.1.3</host> # 服务器1.1.1.3地址
<port>9000</port>
</replica>
</shard>
</cluster_3shards_1replicas>
</clickhouse_remote_servers>
<zookeeper-servers>
<node index="1">
<host>1.1.1.1</host> # zookeeper地址,这个zk是我搭建的单机版的zk,很简单,解压就可以用了,不用部署集群
<port>2181</port>
</node>
</zookeeper-servers>
<macros>
<replica>1.1.1.1</replica> #(这里要写本机的地址,本机地址为1.1.1.1.另外两台记得改为对应的地址)
</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>
如下图
6、将1.1.1.1服务器上面的metrika.xml scp到另外两台服务器的相同目录上面,
将对应的id修改正确即可。
附:另一台服务器的截图metrika.xml
7、启动
三台服务器分别执行:
sudo service clickhouse-server start
使用dbeaver能够成功连接即可。
8、clickhouse数据目录挂载(数据目录挂载)
https://blog.csdn.net/sojer/article/details/104643238
9、搭建好ck集群,使用新集群插入数据
1、 首先在三个节点上创建三个相同的库名。
create database test_1130
2、在三个节点上创建三个相同的表名。
create table test_1130.haha(a UInt16, b String , c Nullable(String)) ENGINE = MergeTree() ORDER BY (a,b);
3、在任一个节点上面执行(此操作是创建一个视图表,此视图表和三个节点上面的数据量相加的和相等。)
create table test_1130.haha1(a UInt16, b String , c Nullable(String)) engine= Distributed(cluster_3shards_1replicas, test_1130, haha , a);
解释
cluster_3shards_1replicas:集群名称,
test_1130:三个节点上面的库名,
haha :三个节点上面的表名,
a:ck插入数据使用的hashId,这个必须有。
4、插入数据,直接插入到步骤三里面的视图表haha1就可以
insert into test_1130.dis_table2(a, b,c) values(3, '3s','34w');
说明:ck插入数据会根据每条数据里面的hashId(上面的为字段a)来判断自己的规则,看自己是插入到哪个分表里。也就是说,总的数据在haha1的视图表里,其他的3个表输入分表,每个里面储存一部分数据。
10、增加用户权限:
在三台服务器上面分别操作
cd /etc/clickhouse-server/
vim user.xml
现在最上面增
<normal> --只读,不能DDL
<readonly>1</readonly>
<allow_ddl>0</allow_ddl>
</normal>
<normal_1> --读且能set,不能DDL
<readonly>2</readonly>
<allow_ddl>0</allow_ddl>
</normal_1>
<normal_2> --只读,即使DDL允许
<readonly>1</readonly>
<allow_ddl>1</allow_ddl>
</normal_2>
<normal_3> --读写,能DDL
<readonly>0</readonly>
<allow_ddl>1</allow_ddl>
</normal_3>
增加
<!-- 具有读写功能用户-->
<admin>
<password>123456</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</admin>
<!--只看某库,只读用户 -->
<test>
<password>123456</password> --明文密码
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>normal_1</profile>
<quota>default</quota>
<allow_databases>
<database>test_1217</database>
<database>test_0108</database>
</allow_databases>
</test>
<!--只读用户,查看所有库 -->
<lisi>
<password>123456</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>normal_1</profile> --用户引用相关profile
<quota>default</quota>
</lisi>