文章借鉴http://fuxkdb.com/2020/05/02/2020-05-02-ClickHouse多实例部署/
感谢大佬!
生产环境并不建议多实例部署, ClickHouse一个查询可以用到多个CPU, 本例只适用于测试环境
集群部署关系如下:
逻辑结构图如下:
编辑三台主机/etc/hosts添加如下内容:
172.16.120.10 centos-1 172.16.120.11 centos-2 172.16.120.12 centos-3依赖组件安装 JDK 下载openjdk
wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u242-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u242b08.tar.gz tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u242b08.tar.gz -C /usr/local/做软链
ln -s /usr/local/jdk8u242-b08 /usr/local/java配置环境变量
#vi ~/.bashrc export JAVA_HOME=/usr/local/java export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATHZooKeeper
3.6.0有bug
所以改用稳定版本3.4.14
下载安装包wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/做软链
ln -s /usr/local/zookeeper-3.4.14 /usr/local/zookeeper配置环境变量
#vi ~/.bashrc export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin修改配置文件
cd /usr/local/zookeeper/conf #参考官方 #https://clickhouse.tech/docs/en/operations/tips/#zookeeper #vim zoo.cfg tickTime=2000 initLimit=30000 syncLimit=10 maxClientCnxns=2000 maxSessionTimeout=60000000 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/logs autopurge.snapRetainCount=10 autopurge.purgeInterval=1 preAllocSize=131072 snapCount=3000000 leaderServes=yes clientPort=2181 集群配置部分三个节点分别为: # centos-1 server.1=0.0.0.0:2888:3888 server.2=172.16.120.11:2888:3888 server.3=172.16.120.12:2888:3888 # centos-2 server.1=172.16.120.10:2888:3888 server.2=0.0.0.0:2888:3888 server.3=172.16.120.12:2888:3888 # centos-3 server.1=172.16.120.10:2888:3888 server.2=172.16.120.11:2888:3888 server.3=0.0.0.0:2888:3888创建目录
mkdir -p /data/zookeeper/{data,logs} mkdir -p /usr/local/zookeeper/logsmyid
# centos-1 echo "1">/data/zookeeper/data/myid # centos-2 echo "2">/data/zookeeper/data/myid # centos-3 echo "3">/data/zookeeper/data/myid配置zk日志
默认zk日志输出到一个文件,且不会自动清理,所以,一段时间后zk日志会非常大
1.zookeeper-env.sh ./conf目录下新建zookeeper-env.sh文件,修改到sudo chmod 755 zookeeper-env.sh权限#cat conf/zookeeper-env.sh #!/usr/bin/env bash #tip:custom configurationfile,do not amend the zkEnv.sh file #chang the log dir and output of rolling file ZOO_LOG_DIR="/usr/local/zookeeper/logs" ZOO_LOG4J_PROP="INFO,ROLLINGFILE"2.log4j.properties 修改日志的输入形式
zookeeper.root.logger=INFO, ROLLINGFILE #zookeeper.root.logger=INFO, ConSOLE # Max log file size of 10MB log4j.appender.ROLLINGFILE.MaxFileSize=128MB # uncomment the next line to limit number of backup files log4j.appender.ROLLINGFILE.MaxBackupIndex=10配置运行zk的JVM
./conf目录下新建java.env文件,修改到sudo chmod 755 java.env权限,主要用于GC log,RAM等的配置.
#!/usr/bin/env bash #config the jvm parameter in a reasonable #note that the shell is source in so that do not need to use export #set java classpath #CLASSPATH="" #set jvm start parameter , also can set JVMFLAGS variable SERVER_JVMFLAGS="-Xms1024m -Xmx2048m $JVMFLAGS"启动zookeeper服务(所有节点)
# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED验证zk
# zkServer.sh status #bin/zkCli.sh -server 127.0.0.1:2181 Connecting to 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 0] [zk: 127.0.0.1:2181(CONNECTED) 0] ls / [zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 1] create /zk_test mydata Created /zk_test [zk: 127.0.0.1:2181(CONNECTED) 2] ls / [zk_test, zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 3] get /zk_test mydata [zk: 127.0.0.1:2181(CONNECTED) 4] set /zk_test junk [zk: 127.0.0.1:2181(CONNECTED) 5] get /zk_test junk [zk: 127.0.0.1:2181(CONNECTED) 6] delete /zk_test [zk: 127.0.0.1:2181(CONNECTED) 7] ls / [zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 8]ClickHouse安装 yum安装
yum install yum-utils rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64 yum install clickhouse-server clickhouse-clientRPM方式离线安装
查看clickhouse源码tag,找出最近的长期维护的版本
官网下载如下包: https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-21.8.12.29-2.noarch.rpm https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-21.8.12.29-2.x86_64.rpm https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-dbg-21.8.12.29-2.x86_64.rpm https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-server-21.8.12.29-2.noarch.rpm https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-test-21.8.12.29-2.noarch.rpm 安装clickhouse rpm -ivh /soft/clickhouse/*.rpm创建目录
centos-1 创建目录: mkdir -p /data/clickhouse/{node1,node4}/{data,tmp,logs} centos-2 创建目录: mkdir -p /data/clickhouse/{node2,node5}/{data,tmp,logs} centos-3 创建目录: mkdir -p /data/clickhouse/{node3,node6}/{data,tmp,logs}创建配置文件
配置clickhouse参数文件,账户文件,分片配置文件
node1配置文件如下 config.xmlusers.xmlwarning /data/clickhouse/node1/logs/clickhouse.log /data/clickhouse/node1/logs/error.log 500M 5 8123 9000 9009 centos-1 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node1/ /data/clickhouse/node1/tmp/ /data/clickhouse/node1/users.xml /data/clickhouse/node1/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8001 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node1/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
node2配置文件如下: config.xmltrue centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 01 node1 ::/0 10000000000 0.01 lz4
users.xmlwarning /data/clickhouse/node2/logs/clickhouse.log /data/clickhouse/node2/logs/error.log 500M 5 8123 9000 9009 centos-2 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node2/ /data/clickhouse/node2/tmp/ /data/clickhouse/node2/users.xml /data/clickhouse/node2/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8001 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node2/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
node3配置文件如下: config.xmltrue centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 02 node2 ::/0 10000000000 0.01 lz4
users.xmlwarning /data/clickhouse/node3/logs/clickhouse.log /data/clickhouse/node3/logs/error.log 500M 5 8123 9000 9009 centos-3 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node3/ /data/clickhouse/node3/tmp/ /data/clickhouse/node3/users.xml /data/clickhouse/node3/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8001 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node3/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
node4配置文件如下: config.xmltrue centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 03 node3 ::/0 10000000000 0.01 lz4
users.xmlwarning /data/clickhouse/node4/logs/clickhouse.log /data/clickhouse/node4/logs/error.log 500M 5 8124 9002 9010 centos-1 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node4/ /data/clickhouse/node4/tmp/ /data/clickhouse/node4/users.xml /data/clickhouse/node4/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8002 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node4/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
node5配置文件如下: config.xmltrue centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 02 node4 ::/0 10000000000 0.01 lz4
users.xmlwarning /data/clickhouse/node5/logs/clickhouse.log /data/clickhouse/node5/logs/error.log 500M 5 8124 9002 9010 centos-2 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node5/ /data/clickhouse/node5/tmp/ /data/clickhouse/node5/users.xml /data/clickhouse/node5/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8002 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node5/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
node6配置文件如下: config.xmltrue centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 03 node5 ::/0 10000000000 0.01 lz4
users.xmlwarning /data/clickhouse/node6/logs/clickhouse.log /data/clickhouse/node6/logs/error.log 500M 5 8124 9002 9010 centos-3 0.0.0.0 2048 3 64 4294967296 5368709120 /data/clickhouse/node6/ /data/clickhouse/node6/tmp/ /data/clickhouse/node6/users.xml /data/clickhouse/node6/access/default system query_logtoMonday(event_date) 7500 system query_thread_logtoMonday(event_date) 7500 /metrics 8002 true true truedefault Asia/Shanghai 3600 3600 300 0 300 600 2 0 0 /clickhouse/task_queue/ddl /data/clickhouse/node6/metrika.xml
metrika.xml54975581388 61847529062 21474836480 21474836480 0 random 1 8 1 8 54975581388 61847529062 21474836480 21474836480 0 random 1 1 1 3600 0 0 0 0 0 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c 1::/0 default default 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c ::/0 readonly default
用户密码生成方式true centos-1 9000 default t5P9rh5M centos-3 9002 default t5P9rh5M true centos-2 9000 default t5P9rh5M centos-1 9002 default t5P9rh5M true centos-3 9000 default t5P9rh5M centos-2 9002 default t5P9rh5M centos-1 2181 centos-2 2181 centos-3 2181 01 01 node6 ::/0 10000000000 0.01 lz4
密码生成方式:
https://clickhouse.tech/docs/en/operations/settings/settings_users/
shell命令行执行:
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
输出结果
t5P9rh5M(明文密码) 328afba155145b9ab4dadc378a38f830107b1c48ae64a37690b163408b47c52c(加密长密码, 即password_sha256_hex)修改属主
cd /data && chown -R clickhouse.clickhouse clickhouse进程守护
使用systemd管理
以node1为例
# vim /etc/systemd/system/clickhouse_node1.service [Unit] Description=ClickHouse Server (analytic DBMS for big data) Requires=network-online.target After=network-online.target [Service] #Type=simple Type=forking User=clickhouse Group=clickhouse Restart=always RestartSec=30 RuntimeDirectory=clickhouse-server #ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid ExecStart=/usr/bin/clickhouse-server --daemon --config=/data/clickhouse/ch_9000/config.xml --pid-file=/data/clickhouse/node1/clickhouse-server.pid #PIDFile=/data/clickhouse/node1/clickhouse-server.pid LimitCORE=infinity LimitNOFILE=500000 CapabilityBoundingSet=CAP_NET_ADMIN CAP_IPC_LOCK CAP_SYS_NICE [Install] WantedBy=multi-user.target
以上面的配置作为模板创建 node1~node6 的systemd配置文件
ClickHouse服务启动centos-1主机进行如下 *** 作: systemctl start clickhouse_node1.service systemctl start clickhouse_node4.service centos-2主机进行如下 *** 作: systemctl start clickhouse_node2.service systemctl start clickhouse_node5.service centos-3主机进行如下 *** 作: systemctl start clickhouse_node3.service systemctl start clickhouse_node6.service 验证如下端口是否被监听: netstat -anlp|grep 9000 (clickhouse tcp端口) netstat -anlp|grep 9002 (clickhouse tcp端口) netstat -anlp|grep 8123 (clickhouse http端口) netstat -anlp|grep 8124 (clickhouse http端口) netstat -anlp|grep 9009 (clickhouse 数据交互端口) netstat -anlp|grep 9010 (clickhouse 数据交互端口) 登陆方式: clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query="show databases" 验证集群状态 [root@vm1 ~]# clickhouse-client -u default --password t5P9rh5M --port 9000 -hcentos-1 --query="select cluster,shard_num,replica_num,host_name,port,user from system.clusters" ch_cluster_all 1 1 centos-1 9000 default ch_cluster_all 1 2 centos-3 9002 default ch_cluster_all 2 1 centos-2 9000 default ch_cluster_all 2 2 centos-1 9002 default ch_cluster_all 3 1 centos-3 9000 default ch_cluster_all 3 2 centos-2 9002 default 接下来再来看一下集群的分片信息(宏变量):分别在各自机器上执行下面命令:(以node1为例) vm1 :) select * from system.macros; SELECt * FROM system.macros Query id: dfe3400f-cbce-4657-9ed1-a4250b58748c ┌─macro───┬─substitution─┐ │ layer │ 01 │ │ replica │ node1 │ │ shard │ 01 │ └─────────┴──────────────┘ 3 rows in set. Elapsed: 0.003 sec测试集群功能是否正常 创建数据库testdb
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 ClickHouse client version 20.3.4.10 (official build). Connecting to localhost:9000 as user default. Connected to ClickHouse server version 20.3.4 revision 54433. centos-1 :) create database testdb on cluster ch_cluster_all; CREATE DATAbase testdb ON CLUSTER ch_cluster_all ┌─host─────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ centos-3 │ 9000 │ 0 │ │ 5 │ 0 │ │ centos-2 │ 9000 │ 0 │ │ 4 │ 0 │ │ centos-1 │ 9002 │ 0 │ │ 3 │ 0 │ │ centos-3 │ 9002 │ 0 │ │ 2 │ 0 │ │ centos-1 │ 9000 │ 0 │ │ 1 │ 0 │ │ centos-2 │ 9002 │ 0 │ │ 0 │ 0 │ └──────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ 6 rows in set. Elapsed: 0.107 sec.创建本地表
clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/sbtest','node1') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-1 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/sbtest','node4') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;" clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-2 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-02/sbtest','node2') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-2 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-03/sbtest','node5') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;" clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-3 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-03/sbtest','node3') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-3 --query="CREATE TABLE testdb.sbtest_local ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01-01/sbtest','node6') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SETTINGS index_granularity = 8192;"创建分布式表
clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-1 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())" clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-2 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-2 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())" clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-3 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())" clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-3 --query=" CREATE TABLE testdb.sbtest ( EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = Distributed(ch_cluster_all,testdb, sbtest_local, rand())"验证数据复制状态: 写入分片1组的写入节点的local表
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query="insert into testdb.sbtest_local VALUES (now(), 10000, 10000)"在分片1组local表可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query="select * from testdb.sbtest_local" 2020-05-02 23:02:31 10000 10000在分片1 副本节点local读取可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-3 --query="select * from testdb.sbtest_local" 2020-05-02 23:02:31 10000 10000写入分片2组的写入节点的local表
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-2 --query="insert into testdb.sbtest_local VALUES (now(), 20000, 20000)"在分片2组local表可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-2 --query="select * from testdb.sbtest_local" 2020-05-02 23:03:31 20000 20000在分片2 副本节点local读取可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-1 --query="select * from testdb.sbtest_local" 2020-05-02 23:03:31 20000 20000写入分片3组的写入节点的local表
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-3 --query="insert into testdb.sbtest_local VALUES (now(), 30000, 30000)"在分片3组local表可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-3 --query="select * from testdb.sbtest_local" 2020-05-02 23:04:39 30000 30000在分片3 副本节点local读取可见一条记录
# clickhouse-client -u default --password xxxxxx --port 9002 -hcentos-2 --query="select * from testdb.sbtest_local" 2020-05-02 23:04:39 30000 30000Distributed表验证
# clickhouse-client -u default --password xxxxxx --port 9000 -hcentos-1 --query="select * from testdb.sbtest" 2020-05-02 23:02:31 10000 10000 2020-05-02 23:03:31 20000 20000 2020-05-02 23:04:39 30000 30000
可以看到结果是之前写入的3条记录
结论,clickhouse基本功能正常
实现类似mysql免输用户密码登录我们都知道mysql cli可以通过在my.cnf添加如下参数实现快速登录
[client] user=xx password=xxx
clickhouse-client也可以
根据官方文档描述, 在client config文件中添加如下参数即可
# vim ~/.clickhouse-client/config.xml分布式DDL *** 作username password False
默认情况下,CREATE、DROp、ALTER、RENAME *** 作仅仅在当前执行该命令的server上生效。在集群环境下,可以使用ON CLUSTER语句,这样就可以在整个集群发挥作用。
分布式表只是作为一个查询引擎,本身不存储任何数据,查询时将sql发送到所有集群分片,然后进行进行处理和聚合后将结果返回给客户端,因此clickhouse限制聚合结果大小不能大于分布式表节点的内存,当然这个一般条件下都不会超过;分布式表可以所有实例都创建,也可以只在一部分实例创建,这个和业务代码中查询的示例一致,建议设置多个,当某个节点挂掉时可以查询其他节点上的表,分布式表的建表语句如下:
分布式表一般用本地表加all来表示,这里distable就是上面xml配置中的标签名称,最后的rand()表示向分布式表插入数据时,将随机插入到副本,在生产环境建议插入的时候客户端可以随机分桶插入到本地表,查询的时候走分布式表,即分布式表只读,本地复制表只写.
比如创建一张分布式表:
CREATE TABLE log_test_2_all ON CLUSTER cluster_2shards_1replicas ( `ts` DateTime, `uid` String, `biz` String ) ENGINE = Distributed(cluster_2shards_1replicas,default,log_test_2_local,rand())
Distributed表引擎的定义形式如下所示:关于ClickHouse的表引擎,后续文章会做详细解释。
Distributed(cluster_name, database_name, table_name[, sharding_key])
各个参数的含义分别如下:
- cluster_name:集群名称,与集群配置中的自定义名称相对应。
- database_name:数据库名称
- table_name:表名称
- sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。
温馨提示:
创建分布式表是读时检查的机制,也就是说对创建分布式表和本地表的顺序并没有强制要求。
同样值得注意的是,在上面的语句中使用了ON CLUSTER分布式DDL,这意味着在集群的每个分片节点上,都会创建一张Distributed表,这样便可以从其中任意一端发起对所有分片的读、写请求。
创建完成上面的分布式表时,在每台机器上查看表,发现每台机器上都存在一张刚刚创建好的表。
接下来就需要创建本地表了,使用变量宏创建本地表:
CREATE TABLE log_test_2_local ON CLUSTER cluster_2shards_1replicas #两个分片,一个副本 ( `ts` DateTime, `uid` String, `biz` String ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/log_test_2', '{replica}') PARTITION BY toYYYYMMDD(ts) ORDER BY ts SETTINGS index_granularity = 8192
ReplicatedMergeTree 参数
- zoo_path — ZooKeeper 中该表的路径。
- replica_name — ZooKeeper 中的该表的副本名称。
如上例所示,这些参数可以包含宏替换的占位符,即大括号的部分。它们会被替换为配置文件里 ‘macros’ 那部分配置的值。示例:
01 emr-header-1
ZooKeeper 中该表的路径»对每个可复制表都要是唯一的。不同分片上的表要有不同的路径。
/clickhouse/tables/ 是公共前缀,我们推荐使用这个。
{shard} 是分片标识部分。对于大多数情况来说,你只需保留 {shard} 占位符即可,它会替换展开为分片标识。
table_name 是该表在 ZooKeeper 中的名称。使其与 ClickHouse 中的表名相同比较好。 这里它被明确定义,跟 ClickHouse 表名不一样,它并不会被 RENAME 语句修改(你可以在前面添加一个数据库名称 table_name 也是 例如: db_name.table_name)。
添加一点数据
INSERT INTO log_test_2_all VALUES ('2019-06-07 20:01:01', 'a', 'show'); INSERT INTO log_test_2_all VALUES ('2019-06-07 20:01:02', 'b', 'show'); INSERT INTO log_test_2_local VALUES ('2019-06-07 20:01:03', 'a', 'click'); INSERT INTO log_test_2_local VALUES ('2019-06-08 20:01:04', 'c', 'show'); INSERT INTO log_test_2_local VALUES ('2019-06-08 20:01:05', 'c', 'click');
查看第一个副本服务器的本地表
xx :) SELECT hostName(),* FROM log_test_2_local; SELECt ``hostName(), ``* FROM log_test ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐ │ 192.168.4.5 │ 2019-06-08 20:01:04 │ c │ show │ └─────────────────────────────────┴─────────────────────┴─────┴──────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐ │ 192.168.4.5 │ 2019-06-07 20:01:03 │ a │ click │ └─────────────────────────────────┴─────────────────────┴─────┴───────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐ │ 192.168.4.5 │ 2019-06-08 20:01:05 │ c │ click │ └─────────────────────────────────┴─────────────────────┴─────┴───────┘ 3 rows in set. Elapsed: 0.002 sec.
查看第二个副本服务器的本地表
xx :) SELECt hostName(),* FROM log_test_2_local; SELECt ``hostName(), ``* FROM log_test ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐ │ 192.168.4.3 │ 2019-06-07 20:01:02 │ b │ show │ └─────────────────────────────────┴─────────────────────┴─────┴──────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐ │ 192.168.4.3 │ 2019-06-07 20:01:03 │ a │ click │ └─────────────────────────────────┴─────────────────────┴─────┴───────┘ 2 rows in set. Elapsed: 0.003 sec.
查看任意服务器的分布式表
xx :) SELECt hostName(),* FROM log_test_2_all; SELECt ``hostName(), ``* FROM log_test ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐ │ 192.168.4.3 │ 2019-06-08 20:01:04 │ c │ show │ └─────────────────────────────────┴─────────────────────┴─────┴──────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐ │ 192.168.4.3 │ 2019-06-08 20:01:05 │ c │ click │ └─────────────────────────────────┴─────────────────────┴─────┴───────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐ │ 192.168.4.3 │ 2019-06-07 20:01:01 │ a │ show │ └─────────────────────────────────┴─────────────────────┴─────┴──────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐ │ 192.168.4.3 │ 2019-06-07 20:01:02 │ b │ show │ └─────────────────────────────────┴─────────────────────┴─────┴──────┘ ┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐ │ 192.168.4.3 │ 2019-06-07 20:01:03 │ a │ click │ └─────────────────────────────────┴─────────────────────┴─────┴───────┘ 5 rows in set. Elapsed: 0.003 sec.
结论: 分布式表不存储数据,而是一个全局视图,展示所有本地表的数据
集群修改字段类型
ALTER TABLE log_test ON CLUSTER cluster_2shards_1replicas MODIFY COLUMN biz LowCardinality(String) ;
集群下线分区
ALTER TABLE log_test ON CLUSTER cluster_2shards_1replicas DETACH PARTITION 20190608;
集群删除表
DROp TABLE log_test ON CLUSTER cluster_2shards_1replicas;问题
ClickHouse到底改写本地表还是分布式表??? 如果预估自己的业务数据量不大(日增不到百万行), 那么写分布式表和本地表都可以, 但要注意如果选择写本地表, 请保证每次写入数据都建立新的连接, 且每个连接写入的数据量基本相同 如果预估自己的业务数据量大(日增百万以上, 并发插入大于10), 那么请写本地表 建议每次插入50W行左右数据, 最多不可超过100W行. 总之CH不像MySQL要小事务. 比如1000W行数据, MySQL建议一次插入1W左右, 使用小事务, 执行1000次. CH建议20次,每次50W. 这是MergeTree引擎原理决定的, 频繁少量插入会导致data part过多, 合并不过来. 再有, AP不像TP, TP为了避免建立新连接产生的损耗影响性能, 通常会使用长连接, 连接池等技术做优化. 但AP业务不需要, 因为AP的属性就不会有高并发, 小SQL.
2 │ b │ show │
└─────────────────────────────────┴─────────────────────┴─────┴──────┘
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐
│ 192.168.4.3 │ 2019-06-07 20:01:03 │ a │ click │
└─────────────────────────────────┴─────────────────────┴─────┴───────┘
2 rows in set. Elapsed: 0.003 sec.
查看任意服务器的分布式表
xx SELECT hostName(),* FROM log_test_2_all;
SELECt
hostName(),*
FROM log_test
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐
│ 192.168.4.3 │ 2019-06-08 20:01:04 │ c │ show │
└─────────────────────────────────┴─────────────────────┴─────┴──────┘
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐
│ 192.168.4.3 │ 2019-06-08 20:01:05 │ c │ click │
└─────────────────────────────────┴─────────────────────┴─────┴───────┘
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐
│ 192.168.4.3 │ 2019-06-07 20:01:01 │ a │ show │
└─────────────────────────────────┴─────────────────────┴─────┴──────┘
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz──┐
│ 192.168.4.3 │ 2019-06-07 20:01:02 │ b │ show │
└─────────────────────────────────┴─────────────────────┴─────┴──────┘
┌─hostName()──────────────────────┬──────────────────ts─┬─uid─┬─biz───┐
│ 192.168.4.3 │ 2019-06-07 20:01:03 │ a │ click │
└─────────────────────────────────┴─────────────────────┴─────┴───────┘
5 rows in set. Elapsed: 0.003 sec.
结论: 分布式表不存储数据,而是一个全局视图,展示所有本地表的数据 集群修改字段类型
ALTER TABLE log_test ON CLUSTER cluster_2shards_1replicas MODIFY COLUMN biz LowCardinality(String) ;
集群下线分区
ALTER TABLE log_test ON CLUSTER cluster_2shards_1replicas DETACH PARTITION 20190608;
集群删除表
DROP TABLE log_test ON CLUSTER cluster_2shards_1replicas;
## 问题
ClickHouse到底改写本地表还是分布式表???
如果预估自己的业务数据量不大(日增不到百万行), 那么写分布式表和本地表都可以, 但要注意如果选择写本地表, 请保证每次写入数据都建立新的连接, 且每个连接写入的数据量基本相同
如果预估自己的业务数据量大(日增百万以上, 并发插入大于10), 那么请写本地表 建议每次插入50W行左右数据, 最多不可超过100W行. 总之CH不像MySQL要小事务. 比如1000W行数据, MySQL建议一次插入1W左右, 使用小事务, 执行1000次. CH建议20次,每次50W. 这是MergeTree引擎原理决定的, 频繁少量插入会导致data part过多, 合并不过来. 再有, AP不像TP, TP为了避免建立新连接产生的损耗影响性能, 通常会使用长连接, 连接池等技术做优化. 但AP业务不需要, 因为AP的属性就不会有高并发, 小SQL.
#
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)