云服务器内容精选

  • 查看权限 登录 表格存储服务 管理控制台。 单击管理控制台左上角的,选择区域。 单击左侧集群管理,显示当前集群列表,选择需要操作的集群,进入用户管理页面。 单击操作列“查看权限”,弹出用户权限页面。 表2 查看权限 参数 说明 用户名 新建的用户名。 全局权限 查询、插入、更改、创建、删除。 各级权限 数据库和表:创建的数据库和表。 高危权限:创建表、删除表。 普通权限:查询、插入、更改。 支持查看账户对数据库的操作权限。
  • JDBC连接 public void run() throws InterruptedException { final ClickHouseProperties clickHouseProperties = new ClickHouseProperties(); // 认证用的密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量CK_PASSWORD String password = System.getenv("CK_PASSWORD"); clickHouseProperties.setSslRootCertificate("/etc/ssl/certificate.crt"); clickHouseProperties.setSsl(true); clickHouseProperties.setSslMode("strict"); clickHouseProperties.setUser("test"); clickHouseProperties.setPassword(password); clickHouseProperties.setSocketTimeout(2 * 3600 * 1000); final BalancedClickhouseDataSource dataSource = new BalancedClickhouseDataSource("xxxx.mycloudtable.com:8443/default?ssl=true", clickHouseProperties); try { final ClickHouseConnection conn = dataSource.getConnection(); conn.createStatement().executeQuery("select now()"); } catch (Throwable e) { e.printStackTrace(); } } clickHouseProperties.setSslRootCertificate("/etc/ssl/certificate.crt");中的/etc/ssl/certificate.crt指存放证书路径。
  • 打开安全和非安全通道步骤 登录 表格存储 服务管理控制台。 单击管理控制台左上角的,选择区域。 单击右上角的购买集群按钮,进入“购买集群”页面。 配置好参数,单击“立即购买”。 进入“规格详情”页面,确认集群规格订单信息,单击“提交”,成功提交集群创建任务。 集群创建成功后,进入详情页面打开“同时开启安全通道和非安全通道”按钮,弹出确认框,确认无误后,单击“确定”。 在详情页面开启安全通道后,集群会重启。 安全通道和非安全通道同时开启后无法关闭。
  • HTTPS连接步骤 安全集群创建后,打开详情页面,下载证书。 下载证书后,自定义存放路径。 通过https协议执行样例sql。 echo 'select 1' | curl -H 'X-ClickHouse-User: user' -H 'X-ClickHouse-Key: password' --cacert /clickhouse/client/client/bin/certificate.crt 'https://host:port/?' --data-binary @- select 1:执行的sql语句。 user:用户名。 password:创集群时创建的密码。 /clickhouse/client/client/bin/certificate.crt:指证书存放路径。 host、port:host指的是内网地址,port指的是https协议端口。
  • 打开安全通道操作步骤 登录表格存储服务管理控制台。 单击管理控制台左上角的,选择区域。 单击右上角的购买集群按钮,进入“购买集群”页面。 完成其他配置后,查看安全通道加密按钮是否开启,默认开启。 图1 安全通道 关闭https会给企业服务带来风险。 创建集群开启https选项,后续无法关闭。 创建集群未开启https选项,后续无法开启。 配置好参数,单击“立即购买”。 进入“规格详情”页面,确认集群规格订单信息,单击“提交”,成功提交集群创建任务,集群创建成功后,进入详情页面查看通道开启状态。
  • 前提条件 当集群状态处于“服务中”,且没有任何任务操作(如:水平扩容、磁盘扩容等)时,可以执行变更操作。 规格变更只支持从小规格变更为大规格,如果要大规格更改为小规格,建议新建小规格集群,采用数据迁移进行切换。 一次只支持变更一种类型的节点规格(计算节点、ZooKeeper节点),且变更完成后只生效所选类型的节点规格。 规格变更过程中,整个集群不可用,变更结束前不能再次变更。 规格变更过程中系统不可用。
  • 常见问题 执行连接ClickHouse组件客户端命令后,登录报错“Connection refused”。 请检查当前集群是否为定制端口(在创建集群时将“组件端口”参数选择为“定制”),如果为定制端口,则需要将连接ClickHouse组件客户端命令中所使用的端口替换为下表中的“定制默认端口”。 配置参数 开源默认端口 定制默认端口 端口说明 interserver_http_port 9009 9009 用于在ClickHouse server间通信的http端口。 interserver_https_port 9010 9010 用于在ClickHouse server间通信的https端口。 http_port 8123 8123 用于通过http连接到ClickHouse server的端口。 https_port 8443 8443 用于通过https连接到ClickHouse server的端口。 tcp_port 9000 9000 用于客户端通过TCP连接到ClickHouse server的端口。 tcp_port_secure 9440 9440 用于客户端通过TCP SSL连接到ClickHouse server的端口。 lb_tcp_port 21424 21424 ClickHouseBalancer的TCP通信端口号。 lb_http_port 21425 21425 ClickHouseBalancer的Http通信端口号。 lb_https_port 21426 21426 ClickHouseBalancer的Https通信端口号。 lb_tcp_secure_port 21428 21428 ClickHouseBalancer的TCP SSL通信端口号。
  • ClickHouse表数据操作 创建表后,可以插入数据到本地表。 例如插入数据到本地表test。 insert into test values(toDateTime(now()), rand()); 查询本地表信息。 例如查询表test数据信息: select * from test; SELECT * FROM test ┌───────────EventDate─┬─────────id─┐ │ 2020-11-05 21:10:42 │ 1596238076 │ └──────────────── ┴───────────┘ 1 rows in set. Elapsed: 0.002 sec. 查询Distributed分布式表。 例如分布式表test_all基于test创建,所以test_all表也能查询到和test相同的数据。 select * from test_all; SELECT * FROM test_all ┌───────────EventDate─┬─────────id─┐ │ 2020-11-05 21:10:42 │ 1596238076 │ └──────────────── ┴───────────┘ 1 rows in set. Elapsed: 0.004 sec. 切换登录节点为相同shard_num的shard节点,并且查询当前表信息,能查询到相同的表数据。 例如,退出原有登录节点:exit; 切换到节点node-group-1tXED0003: clickhouse client --host node-group-1tXED0003 --multiline --port 9440 --secure; show tables; SHOW TABLES ┌─name─────┐ │ test │ │ test_all │ └────────┘ 查询本地表数据。例如在节点node-group-1tXED0003查询test表数据。 select * from test; SELECT * FROM test ┌───────────EventDate─┬─────────id─┐ │ 2020-11-05 21:10:42 │ 1596238076 │ └──────────────── ┴───────────┘ 1 rows in set. Elapsed: 0.005 sec. 切换到不同shard_num的shard节点,并且查询之前创建的表数据信息。 例如退出之前的登录节点node-group-1tXED0003: exit; 切换到node-group-1tXED0001节点。 clickhouse client --host node-group-1tXED0001 --multiline --port 9440 --secure; 查询test本地表数据,因为test是本地表所以在不同分片节点上查询不到数据。 select * from test; SELECT * FROM test Ok. 查询test_all分布式表数据,能正常查询到数据信息。 select * from test_all; SELECT * FROM test ┌───────────EventDate─┬─────────id─┐ │ 2020-11-05 21:12:19 │ 3686805070 │ └──────────────── ┴───────────┘ 1 rows in set. Elapsed: 0.002 sec.
  • 创建本地复制表和分布式表 使用ReplicatedMergeTree引擎创建复制表。 详细的语法说明请参考:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/replication/#creating-replicated-tables。 例如,在default_cluster_1集群节点上和default数据库下创建表名为test的ReplicatedMergeTree表: CREATE TABLE default.test ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id; 参数说明如下: ON CLUSTER语法表示分布式DDL,即执行一次就可在集群所有实例上创建同样的本地表。 default_cluster_1为查看ClickHouse服务cluster等环境参数信息中查询到的cluster集群标识符。 ReplicatedMergeTree引擎族接收两个参数: ZooKeeper中该表相关数据的存储路径。 该路径必须在/clickhouse目录下,否则后续可能因为ZooKeeper配额不够导致数据插入失败。 为了避免不同表在ZooKeeper上数据冲突,目录格式必须按照如下规范填写: /clickhouse/tables/{shard}/default/test,其中/clickhouse/tables/{shard}为固定值,default为数据库名,test为创建的表名。 副本名称,一般用{replica}即可。 CREATE TABLE default.test ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id ┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ node-group-1tXED0002 │ 9000 │ 0 │ │ 5 │ 3 │ │ node-group-1tXED0003 │ 9000 │ 0 │ │ 4 │ 3 │ │ node-master1dOnG │ 9000 │ 0 │ │ 3 │ 3 │ └────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘ ┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ node-master3QsRI │ 9000 │ 0 │ │ 2 │ 0 │ │ node-group-1tXED0001 │ 9000 │ 0 │ │ 1 │ 0 │ │ node-master2OXQS │ 9000 │ 0 │ │ 0 │ 0 │ └────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘ 6 rows in set. Elapsed: 0.189 sec. 使用Distributed引擎创建分布式表。 例如,以下将在default_cluster_1集群节点上和default数据库下创建名为test_all的Distributed表: CREATE TABLE default.test_all ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = Distributed(default_cluster_1, default, test, rand()); CREATE TABLE default.test_all ON CLUSTER default_cluster_1 ( `EventDate` DateTime, `id` UInt64 ) ENGINE = Distributed(default_cluster_1, default, test, rand()) ┌─host─────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ node-group-1tXED0002 │ 9000 │ 0 │ │ 5 │ 0 │ │ node-master3QsRI │ 9000 │ 0 │ │ 4 │ 0 │ │ node-group-1tXED0003 │ 9000 │ 0 │ │ 3 │ 0 │ │ node-group-1tXED0001 │ 9000 │ 0 │ │ 2 │ 0 │ │ node-master1dOnG │ 9000 │ 0 │ │ 1 │ 0 │ │ node-master2OXQS │ 9000 │ 0 │ │ 0 │ 0 │ └────────────────────┴────┴─────┴──── ┴─────────── ┴──────────┘ 6 rows in set. Elapsed: 0.115 sec. Distributed引擎需要以下几个参数: default_cluster_1为查看ClickHouse服务cluster等环境参数信息中查询到的cluster集群标识符。 default本地表所在的数据库名称。 test为本地表名称。 (可选的)分片键(sharding key) 该键与config.xml中配置的分片权重(weight)一同决定写入分布式表时的路由,即数据最终落到哪个物理表上。它可以是表中一列的原始数据(如site_id),也可以是函数调用的结果,如上面的SQL语句采用了随机值rand()。注意该键要尽量保证数据均匀分布,另外一个常用的操作是采用区分度较高的列的哈希值,如intHash64(user_id)。
  • 查看ClickHouse服务cluster等环境参数信息 使用ClickHouse客户端连接到ClickHouse服务端。 查询集群标识符cluster等其他环境参数信息。 select cluster,shard_num,replica_num,host_name from system.clusters; SELECT cluster, shard_num, replica_num, host_name FROM system.clusters ┌─cluster───────────┬─shard_num─┬─replica_num─┬─host_name──────── ┐ │ default_cluster_1 │ 1 │ 1 │ node-master1dOnG │ │ default_cluster_1 │ 1 │ 2 │ node-group-1tXED0001 │ │ default_cluster_1 │ 2 │ 1 │ node-master2OXQS │ │ default_cluster_1 │ 2 │ 2 │ node-group-1tXED0002 │ │ default_cluster_1 │ 3 │ 1 │ node-master3QsRI │ │ default_cluster_1 │ 3 │ 2 │ node-group-1tXED0003 │ └─────────────── ┴────── ┴─────── ┴──────────────┘ 6 rows in set. Elapsed: 0.001 sec. 查询分片标识符shard和副本标识符replica。 select * from system.macros; SELECT * FROM system.macros ┌─macro───┬─substitution─────┐ │ id │ 76 │ │ replica │ 2 │ │ shard │ 3 │ └────── ┴────────────┘ 3 rows in set. Elapsed: 0.001 sec.
  • 解决办法 使用以下命令修改表的“kafka_skip_broken_messages”属性: # ALTER test.user_log MODIFY SETTINGS kafka_skip_broken_messages=10000 10000可以根据数据中脏数据的比例进行调整。 kafka_skip_broken_messages:Kafka消息解析器对每个块的架构不兼容消息的容忍度,默认值:0。 例如:kafka_skip_broken_messages = N,则引擎会跳过N条无法解析的Kafka消息。
  • 原因分析 Kafka出现消息堆积,说明ClickHouse消费数据时出现异常,需要查看ClickHouse的日志。 登录 MRS 集群,进入ClickHouse实例所在的节点,查看“/var/log/Bigdata/clickhouse”目录下的“clickhouse-server.log”日志文件,发现以下报错: 进入到其他ClickHouse节点也发现了同样的报错日志,由此可知Kafka消息堆积是因为ClickHouse解析Kafka数据时出现异常。
  • 规则 写本地表,查询分布式表,提升写入和查询性能,保证写入和查询的数据一致性。 只有在去重诉求的场景下,可以使用分布式表插入,通过sharding key将要去重的数据转发到同一个shard,便于后续去重查询。 外部模块保证数据导入的幂等性。 ClickHouse不支持数据写入的事务保证。通过外部导入数据模块控制数据的幂等性,比如某个批次的数据导入异常,则drop对应的分区数据或清理掉导入的数据后,重新导入该分区或批次数据。 大批量少频次的写入。 ClickHouse的每次数据插入,都会生成一到多个part文件,如果data part过多, merge压力会变大,甚至出现各种异常影响数据插入。建议每个批次5k到100k行,写入字段不能太多,太多字段情况下要减少写入行数,以降低对写入节点的内存和CPU压力,每秒不超过1次插入。 多副本并行导入。 有大数据的导入场景,建议将数据提前拆分成多份,在一个shard内的多个副本同时导入,以分摊一个节点导入数据的压力,同时能提升数据入库的性能,缩短入库时间。 常见错误: Too many parts(304). Merges are processing significantly slower than inserts 原因分析:MergeTree的merge的速度跟不上目录生成的速度,数据目录越来越多就会抛出这个异常。
  • 建议 一次只插入一个分区内的数据 如果数据属于不同的分区,则每次插入,不同分区的数据会独立生成part文件,导致part总数量膨胀,建议一批插入的数据属于同一个分区。 写入速率 单节点写入速度为50~200MB/S,如果写入的数据每行为1Kb,那么写入的速度为50,000到200,000行每秒,如果行数据容量更小,那么写入速度将更高,如果写入性能不够,可以使用多个副本同时写入,同一时间每个副本写入的数据保持均衡。 慎用分布式表批量插入 写分布式表,数据会分发到集群的所有本地表,每个本地表插入的数据量是总插入量的1/N,batch size可能比较小,导致data part过多,merge压力变大,甚至出现异常影响数据插入; 数据的一致性问题:数据先在分布式表写入节点的主机落盘,然后数据被异步地发送到本地表所在主机进行存储,中间没有一致性的校验,如果分布式表写入数据的主机出现异常,会存在数据丢失风险; 对于数据写分布式表和数据写本地表相比,分布式表数据写入性能也会变慢,单批次分布式表写,写入节点的磁盘和网络IO会成为性能瓶颈点。 分布式表转发给各个shard成功与否,插入数据的客户端无法感知,转发失败的数据会不断重试转发,消耗CPU。 大批量数据导入要分时、分节点、扩容 如果数据盘为SATA盘,当大批量数据集中插入时候,会抢占磁盘,使得磁盘长时间处于繁忙状态,影响其他alter类操作的效率。 尽量避免批量导数据的SQL并发执行,会给磁盘和ClickHouse并发能力带来冲击。 Kafka数据入库 不建议建ClickHouse kafka表引擎,进行数据同步到ClickHouse中,当前CK的kafka引擎有会导致kafka引擎数据入库产生性能等诸多问题,通过用户使用经验,需要应用侧自己写kafka的数据消费,攒批写入ClickHouse,提升ClickHouse的入库性能。 使用分区替换或增加的方式写入数据 为避免目标表写入脏数据导致的删改,先将数据写入临时表,再从临时表写入目标表。 操作步骤如下: 创建一张与目标表table_dest结构、分区键、排序键、主键、存储策略、引擎都一致的临时表table_source。 先把数据写到临时表,一次只写入一个分区的数据,检查临时表的数据准确无误。 使用以下SQL查看目标表的分区: SELECT partition AS `partition`,sum(rows) AS `count` FROM system.parts WHERE active AND database=='数据库名' AND table=='表名' GROUP BY partition ORDER BY partition ASC; 如果目标表存在该分区,将分区替换到目标表,到集群的每个节点上执行如下语法: ALTER TABLE table_dest REPLACE PARTITION partition_expr FROM table_source; 如果目标表不存在该分区,将分区增加到目标表,到集群的每个节点上执行如下语法: ALTER TABLE table_dest REPLACE PARTITION tuple() partition_expr FROM table_source;
  • 操作步骤 先获取clickhouse-example样例代码工程。 代码获取地址:https://github.com/huaweicloud/huaweicloud-mrs-example/blob/mrs-3.1.2/src/clickhouse-examples/。 在样例工程“conf”目录下有一个“clickhouse-example.proerties”配置文件,其中各项的配置的作用如下所示: #连接节点或Balancer的ip列表,ip之间用逗号隔开 loadBalancerIPList= #是否需要开启ssl,如果取值为true,则loadBalancerHttpsPort必填 sslUsed=true #端口号 loadBalancerHttpPort= loadBalancerHttpsPort= #ClickHouse安全模式开关,安全模式集群时该参数固定为true。 CLICKHOUSE_SECURITY_ENABLED=true #连接的用户名 user= #连接的用户的密码 password= #集群名称 clusterName= #数据库名称 databaseName= #表名称 tableName= #一个批次写入的条数 batchRows=10000 #写入数据的总批次 batchNum=10 #ip:port。安全模式下https端口,普通模式下http端口 clickhouse_dataSource_ip_list= #ip:tcp port native_dataSource_ip_list=ip:port,ip:port,ip:port 在Demo.java有三种连接JDBC的样例:节点的JDBC连接、banlancer的JDBC连接和tcp端口的banlancer的JDBC连接。 Demo提供了createDatabase、createTable、insertData和queryData的样例。