本指南旨在介绍如何部署和运维 Databend ,并且采用结合本地部署 Meta 服务和使用 K8s 管理 Query 服务的形式,以平衡元数据管理持久化和计算资源弹性调度的需求。
由于 Databend 的部署逻辑在单机模式和集群模式下的一致性,部署模式可以从单机轻松拓展到多节点集群,所以本指南中只基于最简单的情况进行介绍,即:一个本地部署的单节点 Meta ,和一个由单机 K8s 集群管理的 Query 副本。
在本指南中,我们需要创建两台机器:
Meta 服务用于元数据管理,应当优先创建 Meta 节点。
在本地部署 Meta 服务的机器上,我们需要进行以下步骤:
sudo mkdir /var/log/databend
sudo mkdir /var/lib/databend
sudo chown -R $USER /var/log/databend
sudo chown -R $USER /var/lib/databend
curl -LJO https://github.com/datafuselabs/databend/releases/download/v1.2.159-nightly/v1.2.159-nightly-x86_64-unknown-linux-musl.tar.gz
tar xzvf databend-v1.2.159-nightly-x86_64-unknown-linux-musl.tar.gz
configs/databend-meta.toml
,参考配置如下:# Usage:
# databend-meta -c databend-meta.toml
admin_api_address = "0.0.0.0:28101"
grpc_api_address = "0.0.0.0:9191"
# databend-query fetch this address to update its databend-meta endpoints list,
# in case databend-meta cluster changes.
grpc_api_advertise_host = ""
[raft_config]
id = 1
raft_dir = "/var/lib/databend/raft"
raft_api_port = 28103
# Assign raft_{listen|advertise}_host.
# This allows you to catch a bug in unit tests when something goes wrong in raft meta nodes communication.
raft_listen_host = ""
raft_advertise_host = ""
# Start up mode: single node cluster
single = true
cd bin
./databend-meta -c ../configs/databend-meta.toml > meta.log 2>&1
curl -I http://127.0.0.1:28101/v1/health
curl -I http://:28101/v1/health
Query 服务的部署采用 K8s,以确保其弹性扩展能力。
在部署 Query 服务的机器上,我们需要建立一个 Kubernetes 环境。为了方便示范,这里我们使用 kubekey 来快速创建一个 K8s 环境,实际生产部署请遵循内部 K8s 部署和管理规范。
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
chmod +x kk
apt install conntrack socat
./kk create cluster
kubectl get pod -A
在部署 Databend 时,我们使用 Helm 来管理 Query 服务。首先,我们需要添加 Databend 的 Helm Charts 。
helm repo add databend https://charts.databend.rs
其次我们需要创建一个values.yaml
文件,用于配置 Query 服务需要的各项参数,相关配置可以参考 文档 | Deploying a Cluster on Kubernetes ,里面的 meta address 和 storage 根据实际情况配置,这里 query 版本目前默认为 v1.2.149-nightly 。下面是一份参考配置:
replicaCount: 1
config:
query:
clusterId: example_cluster
# add builtin user
users:
- name: databend
# available type: sha256_password, double_sha1_password, no_password, jwt
authType: double_sha1_password
# echo -n "databend" | sha1sum | cut -d' ' -f1 | xxd -r -p | sha1sum
authString: 3081f32caef285c232d066033c89a78d88a6d8a5
meta:
# Set endpoints to use remote meta service
# depends on previous deployed meta service、namespace and nodes
endpoints:
- ":9191"
storage:
# s3, oss
type: oss
oss:
endpoint_url: ""
bucket: ""
access_key_id: ""
access_key_secret: ""
# [recommended] enable access from outside cluster
service:
type: LoadBalancer
helm install databend/databend-query \
--namespace databend-query --create-namespace \
--values values.yaml
root@queryhelm:~# kubectl -n databend-query get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-databend-query LoadBalancer 10.233.46.231 8080:32579/TCP,8124:30226/TCP,9090:31320/TCP,8900:31846/TCP,8000:30821/TCP,7070:30465/TCP,3307:30968/TCP 31m
root@queryhelm:~# kubectl -n databend-query get pods
NAME READY STATUS RESTARTS AGE
-databend-query-0 1/1 Running 0 7m11s
安装客户端。建议客户使用 BendSQL 进行查询。但考虑到通过系统包管理器安装的便利性,也可以使用 MySQL Client 等客户端。
apt install mysql-client
利用 Kubectl 转发以确保本地可访问
nohup kubectl port-forward -n databend-query svc/-databend-query 3307:3307 &
连接 Query 节点并进行查询
mysql -h127.0.0.1 -udatabend -P3307 -pdatabend
mysql> select * from system.clusters;
+------------------------+--------------+------+---------------------------------------------------------------------------------+
| name | host | port | version |
+------------------------+--------------+------+---------------------------------------------------------------------------------+
| ohzKStkZenhhO3FpoAAcZ5 | 10.233.107.5 | 9090 | v1.2.149-nightly-6397a6af00(rust-1.72.0-nightly-2023-10-09T16:12:52.382486326Z) |
+------------------------+--------------+------+---------------------------------------------------------------------------------+
mysql> SELECT avg(number) FROM numbers(100000000);
+-------------+
| avg(number) |
+-------------+
| 49999999.5 |
+-------------+
1 row in set (0.07 sec)
Read 100000000 rows, 762.94 MiB in 0.066 sec., 1.52 billion rows/sec., 11.30 GiB/sec.
注意:Query 服务的外部可访问性建议根据实际部署运维规范进行管理,这里不涉及相关操作。对于在云平台使用 LoadBalancer
的用户,可能会分配对应的公网 IP ,有潜在的安全问题,可以参考 文档 | Step 2. Deploy a Databend Query Cluster 进行处理。
在升级前特别需要检查 Meta 和 Query 之间的兼容性。
在部署过程中,如果计划使用其他版本的镜像/其他规模的副本数量,可以直接在 values.yaml
中进行修改:
- replicaCount: 1
+ replicaCount: 3
+ image:
+ repository: datafuselabs/databend-query
+ pullPolicy: IfNotPresent
+ # Overrides the image tag whose default is the chart appVersion.
+ tag: "v1.2.216-nightly"
Query 总体上是无状态的,可以简单使用一行命令升级:
helm upgrade --install databend/databend-query \
--namespace databend-query --create-namespace \
--values values.yaml
Meta 的节点添加与删除可以参考 文档 | Manage a Databend Meta Service Cluster 进行。如果想要直接部署 Meta 集群,也可以参阅 文档 | Deploying a Databend Cluster 。
Meta 的升级涉及数据迁移,建议联系 Databend 团队进行。
可以根据实际情况使用不同的 hash key 结合 "subset" hashing 等方式组合进行负载均衡。
Databend JDBC 在每次发起请求都会携带一个名为 X-DATABEND-QUERY-ID
的 HTTP Header,如果想要实现同一客户端,多个请求分散打到不同后端实例的效果,可以基于该 HTTP Header 来做 Nginx 的 Hash Key,以达到负载均衡的效果。
使用 Query ID 相关 Header 而不是其他方式的原因:
现在用户使用 SDK 去请求多副本的 Databend Query 由于 Query 会产生回查并且 Query ID 没有持久化,单纯对后端端点做负载均衡可能会出现 query id not found 的错误。
ingress:
enabled: true
className: "nginx"
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x_databend_query_id"
在本地部署 Databend :Deploying a Databend Cluster | Databend
在 K8s 上部署 Databend :Deploying a Cluster on Kubernetes | Databend
升级指南:Upgrading Databend Guide | Databend
Meta 和 Query 之间的兼容性:Compatibility | Databend
添加与删除 Meta 节点:Manage a Databend Meta Service Cluster | Databend
备份和还原 Meta 服务:Back Up and Restore Databend Schema Data | Databend
Query 相关集群规模放缩:Deploying a Cluster on Kubernetes | Databend
Custom NGINX upstream hashing - Annotations - Ingress-Nginx Controller:Annotations - Ingress-Nginx Controller