ClickHouseOLAPClickHouseckman
ckmanClickHouse ManagerClickHouseClickHouseClickHouse
ckman
githubstar
ckman架构ckman支持多中心部署,使用nacos进行配置同步,可以对多个集群进行管理,在集群的每个节点下,如果配置node_exporter,则可以对对应的节点进行指标监控。node_exporter的数据传给prometheus,然后在前端展示。
ckman编译Linux & MacOS下编译
编译环境配置
- 安装Node.js
由于ckman将前端代码静态嵌入到了server中,因此需要安装Node.js以编译前端代码:
MacOS上安装Node.js:
brew install node
Linux下安装Node.js:
yum install -y nodejs
安装完成后,在frontend目录下执行:
cd frontend
sudo rm -rf node_modules package-lock.json && npm install
- 安装pkger
go get github.com/markbates/pkger/cmd/pkger
- 安装 nfpm2.2.4:
nfpm是一款用来打包rpm的工具,如果不打算做成rpm包,可以不安装。
由于nfpm新版本配置文件和旧版本差别很大,建议安装指定的2.2.4版本。
wget -q https://github.com/goreleaser/nfpm/releases/download/v2.2.4/nfpm_2.2.4_Linux_x86_64.tar.gz
tar -xzvf nfpm_2.2.4_Linux_x86_64.tar.gz
cp nfpm /usr/local/bin
编译命令
Linux和MacOS下编译命令都是一样的:
make package VERSION=1.2.5
以上命令会编译成打包成一个tar.gz安装包,该安装包解压即可用。
rpm编译
make rpm
Docker编译
鉴于编译环境的诸多依赖,配置起来可能比较麻烦,因此也提供了docker编译的方式,直接运行下面的命令即可:
make docker-build VERSION=1.2.5
如果想利用docker编译rpm版本,可以先进入docker环境,再编译:
make docker-sh
make rpm
ckman安装部署ckmanrpmtar.gz
rpm安装
安装
rpm
rpm -ivh ckman-1.2.5.x86_64.rpm
/etc/ckman
启动
rpmckman
方式一:
/usr/local/bin/ckman -c=/etc/ckman/conf/ckman.yaml -p=/run/ckman/ckman.pid -l=/var/log/ckman/ckman.log -d
方式二:
systemctl start ckman
tar.gz包安装
安装
可以在任意目录进行安装。安装方式为直接解压安装包即可。
tar -xzvf ckman-1.5.0-201216-6b03a3a.Linux.x86_64.tar.gz
启动
ckman
cd ckman
bin/start
启动之后,在浏览器输入 http://localhost:8808 跳出如下界面,说明启动成功:
ckman配置文件
ckmanckmanconf/ckman.yml
serverid1ckmanidckmanidport8808ckmanhttphttpsfalsehttpspproftruepprofsession_timeout3600token1tokentokentokenckmanloglevelINFOINFOmax_count5max_size1010Mmax_age1010prometheushosts127.0.0.1:19090iptimeout10nacosenabledtruenacostruehosts127.0.0.1nacosipport8848nacosuser_namenacosnacospassword0192023A7BBD73250516F069DF18B500nacosnamespacenacosnamespaceDEFAULT
安装部署node_exporter和prometheus
static_configs:
- targets: ['localhost:9100']
prometheus:
hosts:
- 192.168.21.73:9090
ckman功能说明ckman 支持的接口
/api/loginPOST/api/logout PUT/api/v1/ck/clusterGET/api/v1/ck/clusterPUT/api/v1/ck/clusterPOST/api/v1/ck/cluster/{clusterName}DELETE/api/v1/ck/destroy/{clusterName}PUT/api/v1/ck/get/{clusterName}GET/api/v1/ck/node/{clusterName}POST/api/v1/ck/node/{clusterName}DELETE/api/v1/ck/open_sessions/{clusterName}GETsession/api/v1/ck/query/{clusterName}GETQuery/api/v1/ck/rebalance/{clusterName}PUTRebanlance/api/v1/ck/slow_sessions/{clusterName}GETSQL/api/v1/ck/start/{clusterName}PUT/api/v1/ck/stop/{clusterName}PUT/api/v1/ck/table/{clusterName}GET/api/v1/ck/table/{clusterName}PUT/api/v1/ck/table/{clusterName}POST/api/v1/ck/table/{clusterName}DELETE/api/v1/ck/table_metric/{clusterName}GET/api/v1/ck/upgrade/{clusterName}PUT/api/v1/configGET/api/v1/configPUT/api/v1/deploy/ckPOSTck/api/v1/metric/queryGETquery/api/v1/metric/query_rangeGET/api/v1/packageGET/api/v1/packagePOST/api/v1/packageDELETE/api/v1/zk/replicated_table/{clusterName}GET/api/v1/zk/status/{clusterName}GET
登录
ckmanckman Ckman123456!
tokentokentoken
登陆成功后会进入如下所示的主页:
在主页上,除了有创建集群和导入集群等操作按钮外,还有集群展示的列表。
ckmanconf/clusters.json
clusters.json
clusters.json
{
"ck_cluster_config_version": 5, # 配置版本,如果配置了多中心部署,会从nacos上同步集群配置,版本号大的会覆盖版本号小的
"test": { #集群名称
"mode": "import", #集群的模式,import表示是导入的集群,还有deploy,表示是通过部署的,import的集群只能查看,不能操作,deploy的集群可以查看和操作
"hosts": [ #ck节点ip列表
"192.168.101.40",
"192.168.101.41",
"192.168.101.42",
"192.168.101.57"
], #ck节点的hostname
"names": [
"vm10140",
"vm10141",
"vm10142",
"zhanglei01"
],
"port": 9000, #ck节点的端口
"user": "eoi", #ck用户
"password": "123456", #ck密码
"database": "default", #访问的数据库
"cluster": "test", #集群的名字
"zkNodes": [ #zk的ip列表
"192.168.101.40",
"192.168.101.41",
"192.168.101.42"
],
"zkPort": 2181, #zk的端口
"isReplica": true, #是否支持副本
"version": "20.8.5.45", #ck版本
"sshUser": "", #ssh连接节点主机的用户名,如果是import的集群,此处为空
"sshPassword": "", #ssh连接节点主机的密码
"shards": [ #分片信息,以下表示2分片2副本
{
"replicas": [ #副本信息
{
"ip": "192.168.101.40",
"hostname": "vm10140"
},
{
"ip": "192.168.101.41",
"hostname": "vm10141"
}
]
},
{
"replicas": [
{
"ip": "192.168.101.42",
"hostname": "vm10142"
},
{
"ip": "192.168.101.57",
"hostname": "zhanglei01"
}
]
}
],
"path": "" #存放数据的路径,如果是import的集群,为空
}
}
rebanlanceclusters.jsonck_cluster_config_version
安装包管理
在主页上点击设置按钮,进入如下的页面:
Upload RPMs
serverclientcommon
common
ckmanpackage
点击删除按钮,则会删除掉对应版本的安装包。
ckckck
集群管理
创建集群
Create a ClickHouse Cluster
需要填写的项主要有以下:
- 此处版本信息只会列出当前`ckman`服务下的安装包版本,如果配置了多中心,其他`ckman`的安装包是无法看见的
- 如果开启了副本,默认是1个`shard`一个副本,所以节点数量一定要是偶数,否则会报错
- 如果要增加节点的副本数,可通过增加节点完成,创建集群时最多只能指定一个副本
- 如果没有开启副本,则有几个节点就有几个`shard`
- 该用户必须具有`root`权限或是`root`本身,否则部署无法成功,一般都是`root`。
modedeployrebanlance
导入集群
Import a ClickHouse Cluster
需要填写的信息如下所示:
Cluster NameckmanClickHouse Node IPclickhouseipClickHouse TCP PortckTCP9000Zookeeper Node ListzkZooKeeper Portzk2181Cluster UsernameckCluster Passwordck
导入集群有个前提是该集群必须确实存在,否则导入会出现问题。
modeimportrebanlanceroot
管理节点
Go to cluster
OverviewManageTablesSessionQuery ExecutionSettingsManage
Start ClusterStop ClusterDestroy ClusterRebanlance Clusterdeployimport
- `ssh`到每台`ck`节点下启动`clickhouse`服务,都成功才返回成功
- `ssh`到每台`ck`节点下关闭`clickhouse`服务,都成功才返回成功
- 首先第一步要停止正在运行的`clickhouse`服务
- 然后卸载`clickhouse`软件
- 删除`cluster.json`并同步到`nacos`
- 销毁集群与删除集群的区别:
- 销毁集群后集群彻底不存在了
- 删除集群只是删除`ckman`中集群管理的入口(`cluster.json`),集群还存在,可以重新导入
- 一般情况下,通过`clickhouse-sinker`插入的数据基本上是均衡分布在各个节点的。但是如果新增了一个节点,那么新增的节点数据一定是空的,这时候可以通过`rebanlance`工具进行数据搬运
- `rebanlance`搬运数据是直接将某个分区的数据直接搬运到目标节点,在搬运的过程中如果有查询操作,正在搬运的这部分数据是无法查到的,因此在进行`rebanlance`操作时,请避免查询操作(`rebanlance`操作时间很短,一般不会影响业务)
升级集群
Upgrade ClusterUpgrade
增加节点
增加节点需要填写:
New Node IPIPNode ShardShard NUmbershardshardshardshardshard
metrika.xml
删除节点
shardshardreplicaclickhousecluster.json
metrika.xml
监控管理
node_exporterprometheus
node_exporterckck
cknode_exporterprometheusnode_exporter
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090', 'localhost:9100', '192.168.101.40:9100', '192.168.101.41:9100', '192.168.101.42:9100', '192.168.101.57:9100']
集群监控
Overview
ClickHouse Table KPIs
clickhouse.Query
ClickHouse Node KPIs
cpu usageCPUmemory usagedisk usageIOPSIO
ZooKeeper KPIs
znode_countleader_uptimeleaderstale_sessions_expiredjvm_gc_collection_seconds_countjvmgcjvm_gc_collection_seconds_sumjvmgc
数据加载监控
clickhouse-sinkerkafkaclickhouseData Loader Managementclickhouse-sinker
sum by(task)(rate(clickhouse_sinker_consume_msgs_total[1m]))sum by(task) (rate(clickhouse_sinker_flush_msgs_total[1m]))sum by(task) (clickhouse_sinker_shard_msgs)sum by(task) (clickhouse_sinker_ring_msgs)sum by(task)(clickhouse_sinker_parsing_pool_backlog)sum by(task) (clickhouse_sinker_writing_pool_backlog)
表管理
Table MetricsTable Replication StatusZookeeper Status
Table Metrics
统计表的一些指标。
Queries Cost
0.50.99max
Table Replication Status
统计复制表的一些状态。
shard
shard
Zookeeper Status
zookeeper
可查看的指标包括:版本,主从状态,平均延迟,近似数据总和大小,znode数等。
会话管理
Open Sessions
显示当前正在进行的会话。
Slow Sessions
710SQL
SQLSQLSQLckquery idIP
Query管理
ckmanclickhouse
mutation
Settings
ckman设置
ckman
HA Pair AddressesckmanPrometheus AddressesAlert Manager Addresses
Save & Rebootckman
命令行工具ckman
exporter
HDFS
如:
exporter --ch-hosts=192.168.101.40,192.168.101.42 --ch-user=eoi --ch-password=123456 --ch-tables=dbtest,tbtesttype --hdfs-addr=localhost:50070 --hdfs-dir=/data
参数说明:
- 查看版本号
- clickhouse节点列表(每shard仅列出一个)
- clickhouse tcp 端口号,默认9000
- clickhouse 用户
- clickhouse 密码
- clickhouse 数据库,默认default
- 表名列表
- 开始时间,默认1970-01-01
- 结束时间
- 文件最大大小限制,默认10G
- hdfs的ip:port
- hdfs的用户
- hdfs的文件路径
purger
drop
如:
purger --ch-hosts=192.168.101.40,192.168.101.42 --ch-port=9000 --ch-user=eoi --ch_password=123456 --ch-database=default --ch-tables=dbtest --dt-begin=2021-02-01 --dt-end=2021-02-28
参数说明:
- 查看版本号
- clickhouse节点列表(每shard仅列出一个)
- clickhouse tcp 端口号,默认9000
- clickhouse 用户
- clickhouse 密码
- clickhouse 数据库,默认default
- 表名列表
- 开始时间,默认1970-01-01
- 结束时间
schemer
在指定结点创建与另一指定结点相同的表格。
通过该工具,会在目标节点上创建于源节点除system数据库以外的所有数据库和表。如:
schemer --src-host=192.168.101.40 --dst-host=192.168.21.73 --ch-port=9000 --ch-user=eoi --ch-password=123456
参数说明:
- 显示版本信息
- 源节点
- 目标节点
- tcp端口号,默认9000
- 目标节点ck用户
- 目标节点ck密码
rebanlancer
集群结点间负载均衡。
detachsshattach
ckmanrebanlance
参数说明:
- 显示版本信息
- ck节点列表
- ck节点tcp端口,默认9000
- ck用户名
- ck密码
- ck数据库,默认default
- 数据存放目录
- 节点主机用户名(需要有root权限)
- 节点主机密码
扩展APIckmanckmancURLPostmanAPI
API
描述表
METHOD: GETURL: /api/v1/ck/table/{clusterName}
DESCRIBE TABLE database.tabletableNamedatabase
举例如下:
GET http://192.168.31.55:8808/api/v1/ck/table/test?tableName=tbtest&database=default
返回结果:
{
"code": 200,
"msg": "ok",
"data": [
{
"name": "service",
"type": "String",
"defaultType": "",
"defaultExpression": "",
"comment": "",
"codecExpression": "",
"ttlExpression": ""
},
{
"name": "ip",
"type": "String",
"defaultType": "",
"defaultExpression": "",
"comment": "",
"codecExpression": "",
"ttlExpression": ""
},
{
"name": "metric",
"type": "String",
"defaultType": "",
"defaultExpression": "",
"comment": "",
"codecExpression": "",
"ttlExpression": ""
},
{
"name": "value",
"type": "Int64",
"defaultType": "",
"defaultExpression": "",
"comment": "",
"codecExpression": "",
"ttlExpression": ""
},
{
"name": "timestamp",
"type": "DateTime",
"defaultType": "",
"defaultExpression": "",
"comment": "",
"codecExpression": "",
"ttlExpression": ""
}
]
}
注意:本操作要求表在集群的各节点存在,包括本地表和dist_开头的分布式表。
更新表
METHOD: PUTURL: /api/v1/ck/table/{clusterName}
ALTER
支持的操作包括增加列、修改列、删除列。
修改完成后需要删除分布式表并重建。
举例如下:
PUT /api/v1/ck/table/test
{
"name":"t1", #表名
"database":"default", #数据库名
"add":[{
"name":"fieldNew", #在field3后增加一个fieldNew,类型为String
"type":"String",
"after":"field3"
},
{
"name":"filedLast", #在最后增加一个字段fieldLast,类型为Int32
"type":"Int32"
}],
"modify":[{
"name":"field6", #将filed6修改为DateTime类型
"type":"DateTime"
}],
"drop": ["field8", "field9"] #删除field8,field9
}
注意:该操作只能针对集群中各节点的本地表,且表在各个节点存在。对dist_开头的分布式表无法操作。
创建表
METHOD: POSTURL: /api/v1/ck/table/{clusterName}
MergeTreedistinctfalseReplacingMergeTree
POST /api/v1/ck/table/test
{
"name": "t1", #要创建的表名
"database": "default", #数据库
"fields":[{ #字段信息
"name":"id",
"type":"Int32"
},{
"name":"birth",
"type":"Date"
},{
"name":"name",
"type":"String"
}],
"order": ["id"], #order by 的字段,可以指定多个
"partition":"toMMMMYY(birth)", #partition by的字段
"distinct": true
}
当然,最终的引擎还是要根据集群是否支持副本来决定,一共有以下几种情况:
truetrueReplicatedReplacingMergeTreetruefalseReplacingMergeTreefalsetrueReplicatedMergeTreefalsefalseMergeTree
dist_
删除表
METHOD: DELETEURL: /api/v1/ck/table/{clusterName}
tableNamedatabase
举例如下:
DELETE http://192.168.31.55:8808/api/v1/ck/table/test?tableName=t1&database=default
t1dist_t1
注意:表必须在集群的各个节点存在且不能是dist_开头的分布式表。如果该本地表虽然在集群中各节点存在,但没有根据该本地表创建过分布式表,删除依然会报错。这一点需要注意。结语
ckmanckman