Databend 部署与运维概要:本地部署 Meta 服务并利用 Kubernetes 管理 Query 服务

本指南旨在介绍如何部署和运维 Databend ,并且采用结合本地部署 Meta 服务和使用 K8s 管理 Query 服务的形式,以平衡元数据管理持久化和计算资源弹性调度的需求。

由于 Databend 的部署逻辑在单机模式和集群模式下的一致性,部署模式可以从单机轻松拓展到多节点集群,所以本指南中只基于最简单的情况进行介绍,即:一个本地部署的单节点 Meta ,和一个由单机 K8s 集群管理的 Query 副本。

资源准备

在本指南中,我们需要创建两台机器:

  • 一台分配给 Meta 服务,以单机部署的形式运行;
  • 另一台分配给 Query 服务,需要先创建 K8s 集群,然后使用 Helm Charts 进行部署。

Meta 服务部署

Meta 服务用于元数据管理,应当优先创建 Meta 节点。

下载并运行 Meta 服务

在本地部署 Meta 服务的机器上,我们需要进行以下步骤:

  1. 创建对应的目录,并更改所有者为当前用户:
bash 复制代码
sudo mkdir /var/log/databend
sudo mkdir /var/lib/databend
sudo chown -R $USER /var/log/databend
sudo chown -R $USER /var/lib/databend
  1. 下载 Meta 的二进制发布,这里使用 databend-v1.2.159-nightly 作为示例
ruby 复制代码
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
  1. 编辑 Meta 服务的配置文件,位于 configs/databend-meta.toml ,参考配置如下:
ini 复制代码
# 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 = "<your-meta-ip>"

[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 = "<your-meta-ip>"
raft_advertise_host = "<your-meta-ip>"

# Start up mode: single node cluster
single        = true
  1. 使用配置文件运行 Meta 服务
bash 复制代码
cd bin
./databend-meta -c ../configs/databend-meta.toml > meta.log 2>&1 

检查 Meta 服务可用性

  1. 确保 Meta 服务已经启动
bash 复制代码
curl -I  http://127.0.0.1:28101/v1/health
  1. 确保外部服务可以访问 Meta 服务
bash 复制代码
curl -I http://<your-meta-ip>:28101/v1/health

Query 服务部署

Query 服务的部署采用 K8s,以确保其弹性扩展能力。

部署 Kubernetes 环境

在部署 Query 服务的机器上,我们需要建立一个 Kubernetes 环境。为了方便示范,这里我们使用 kubekey 来快速创建一个 K8s 环境,实际生产部署请遵循内部 K8s 部署和管理规范。

bash 复制代码
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

使用 Helm 部署 Query 服务

  1. 在部署 Databend 时,我们使用 Helm 来管理 Query 服务。首先,我们需要添加 Databend 的 Helm Charts 。
csharp 复制代码
helm repo add databend https://charts.databend.rs
  1. 其次我们需要创建一个values.yaml文件,用于配置 Query 服务需要的各项参数,相关配置可以参考 文档 | Deploying a Cluster on Kubernetes ,里面的 meta address 和 storage 根据实际情况配置,这里 query 版本目前默认为 v1.2.149-nightly 。下面是一份参考配置:
yaml 复制代码
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:
      - "<your-meta-endpoints>:9191"
  storage:
    # s3, oss
    type: oss
    oss:
      endpoint_url: "<endpoint_url>"
      bucket: "<bucket>"
      access_key_id: "<key>"
      access_key_secret: "<secret>"
# [recommended] enable access from outside cluster
service:
  type: LoadBalancer
  1. 部署 Query 服务
css 复制代码
helm install <your-tenant-name> databend/databend-query \
    --namespace databend-query --create-namespace \
    --values values.yaml
  1. 检查服务运行状态
ruby 复制代码
root@queryhelm:~# kubectl -n databend-query get svc
NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                    AGE
<your-tenant-name>-databend-query   LoadBalancer   10.233.46.231   <pending>     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
<your-tenant-name>-databend-query-0   1/1     Running   0          7m11s

检查 Query 服务可用性

  1. 安装客户端。建议客户使用 BendSQL 进行查询。但考虑到通过系统包管理器安装的便利性,也可以使用 MySQL Client 等客户端。

    apt install mysql-client

  2. 利用 Kubectl 转发以确保本地可访问

erlang 复制代码
nohup kubectl port-forward -n databend-query svc/<your-tenant-name>-databend-query 3307:3307 &
  1. 连接 Query 节点并进行查询
sql 复制代码
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 之间的兼容性。

Query 服务的缩放与升级

在部署过程中,如果计划使用其他版本的镜像/其他规模的副本数量,可以直接在 values.yaml 中进行修改:

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 总体上是无状态的,可以简单使用一行命令升级:

css 复制代码
helm upgrade --install <your-tenant-name> databend/databend-query \
    --namespace databend-query --create-namespace \
    --values values.yaml

Meta 服务的缩放与升级

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 的错误。

yaml 复制代码
ingress:
  enabled: true
  className: "nginx"
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x_databend_query_id"

参考资料

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

👨‍💻‍ Databend Cloud:databend.cn

📖 Databend 文档:databend.rs/

💻 Wechat:Databend

✨ GitHub:github.com/datafuselab...

相关推荐
傻啦嘿哟36 分钟前
Python 数据分析与可视化实战:从数据清洗到图表呈现
大数据·数据库·人工智能
cookqq1 小时前
mongodb源码分析session异步接受asyncSourceMessage()客户端流变Message对象
数据库·sql·mongodb·nosql
呼拉拉呼拉1 小时前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超1 小时前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
pp-周子晗(努力赶上课程进度版)2 小时前
【MySQL】视图、用户管理、MySQL使用C\C++连接
数据库·mysql
斯特凡今天也很帅2 小时前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
超级小忍3 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税3 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy4 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之5 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle