Skip to content

OceanBase 容器化部署配置

Docker 部署

1. 环境准备

Docker 是目前最流行的容器化平台,首先需要在服务器上安装并配置 Docker 环境:

bash
# 安装 Docker
yum install -y docker
# 启动 Docker 服务
systemctl start docker
systemctl enable docker
# 验证 Docker 安装
docker --version

2. 获取 OceanBase 镜像

OceanBase 提供了官方 Docker 镜像,可以从 Docker Hub 或私有仓库获取:

bash
# 从 Docker Hub 获取官方镜像
docker pull oceanbase/oceanbase-ce:latest
# 或从私有仓库获取
docker pull private-registry/oceanbase/oceanbase-ce:latest

3. 单节点部署

单节点部署适用于开发测试环境,快速搭建 OceanBase 实例:

bash
# 创建数据目录,用于持久化存储 OceanBase 数据、redo 日志和系统日志
mkdir -p /data/ob/single/{data,redo,log}

# 启动 OceanBase 容器,使用主机网络模式以获得更好的性能
# privileged 模式允许容器访问宿主机设备
# 通过环境变量配置集群名称、密码等关键参数
docker run -d \
  --name oceanbase-single \
  --privileged \
  --net host \
  -v /data/ob/single/data:/home/admin/oceanbase/store/data \
  -v /data/ob/single/redo:/home/admin/oceanbase/store/redo \
  -v /data/ob/single/log:/home/admin/oceanbase/log \
  -e OB_CLUSTER_NAME=obcluster \
  -e OB_ROOT_PASSWORD=root_password \
  -e OB_TENANT_NAME=sys \
  -e OB_TENANT_PASSWORD=tenant_password \
  oceanbase/oceanbase-ce:latest

# 查看容器状态,确认 OceanBase 实例是否正常运行
docker ps -a | grep oceanbase

# 进入容器,执行后续配置和管理操作
docker exec -it oceanbase-single bash

4. 多节点集群部署

多节点集群部署适用于生产环境,提供高可用性和扩展性:

bash
# 节点 1:启动第一个 observer 进程,作为集群的种子节点
# 配置 OB_ROOTSERVICE_LIST 指向自身,后续节点将通过此地址加入集群
docker run -d \
  --name oceanbase-node1 \
  --privileged \
  --net host \
  -v /data/ob/node1/data:/home/admin/oceanbase/store/data \
  -v /data/ob/node1/redo:/home/admin/oceanbase/store/redo \
  -v /data/ob/node1/log:/home/admin/oceanbase/log \
  -e OB_CLUSTER_NAME=obcluster \
  -e OB_SERVER_IP=192.168.1.101 \
  -e OB_ROOT_PASSWORD=root_password \
  -e OB_TENANT_NAME=sys \
  -e OB_TENANT_PASSWORD=tenant_password \
  -e OB_ZONE=zone1 \
  -e OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881 \
  oceanbase/oceanbase-ce:latest

# 节点 2:启动第二个 observer 进程,加入已创建的集群
docker run -d \
  --name oceanbase-node2 \
  --privileged \
  --net host \
  -v /data/ob/node2/data:/home/admin/oceanbase/store/data \
  -v /data/ob/node2/redo:/home/admin/oceanbase/store/redo \
  -v /data/ob/node2/log:/home/admin/oceanbase/log \
  -e OB_CLUSTER_NAME=obcluster \
  -e OB_SERVER_IP=192.168.1.102 \
  -e OB_ROOT_PASSWORD=root_password \
  -e OB_TENANT_NAME=sys \
  -e OB_TENANT_PASSWORD=tenant_password \
  -e OB_ZONE=zone2 \
  -e OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881 \
  oceanbase/oceanbase-ce:latest

# 节点 3:启动第三个 observer 进程,完成 3 副本集群部署
docker run -d \
  --name oceanbase-node3 \
  --privileged \
  --net host \
  -v /data/ob/node3/data:/home/admin/oceanbase/store/data \
  -v /data/ob/node3/redo:/home/admin/oceanbase/store/redo \
  -v /data/ob/node3/log:/home/admin/oceanbase/log \
  -e OB_CLUSTER_NAME=obcluster \
  -e OB_SERVER_IP=192.168.1.103 \
  -e OB_ROOT_PASSWORD=root_password \
  -e OB_TENANT_NAME=sys \
  -e OB_TENANT_PASSWORD=tenant_password \
  -e OB_ZONE=zone3 \
  -e OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881 \
  oceanbase/oceanbase-ce:latest

5. Docker Compose 部署

使用 Docker Compose 可以简化多容器应用的部署和管理,适合快速搭建完整的 OceanBase 集群:

yaml
# docker-compose.yml
# 定义 OceanBase 集群的完整配置,包括 3 个 observer 节点和 1 个 obproxy 节点
version: '3.8'

services:
  observer1:
    # 第一个 observer 节点,作为集群种子
    image: oceanbase/oceanbase-ce:latest
    container_name: observer1
    privileged: true
    network_mode: host
    volumes:
      - /data/ob/compose/observer1/data:/home/admin/oceanbase/store/data
      - /data/ob/compose/observer1/redo:/home/admin/oceanbase/store/redo
      - /data/ob/compose/observer1/log:/home/admin/oceanbase/log
    environment:
      - OB_CLUSTER_NAME=obcluster
      - OB_SERVER_IP=192.168.1.101
      - OB_ROOT_PASSWORD=root_password
      - OB_TENANT_NAME=sys
      - OB_TENANT_PASSWORD=tenant_password
      - OB_ZONE=zone1
      - OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881
    restart: always

  observer2:
    # 第二个 observer 节点,依赖 observer1 启动
    image: oceanbase/oceanbase-ce:latest
    container_name: observer2
    privileged: true
    network_mode: host
    volumes:
      - /data/ob/compose/observer2/data:/home/admin/oceanbase/store/data
      - /data/ob/compose/observer2/redo:/home/admin/oceanbase/store/redo
      - /data/ob/compose/observer2/log:/home/admin/oceanbase/log
    environment:
      - OB_CLUSTER_NAME=obcluster
      - OB_SERVER_IP=192.168.1.102
      - OB_ROOT_PASSWORD=root_password
      - OB_TENANT_NAME=sys
      - OB_TENANT_PASSWORD=tenant_password
      - OB_ZONE=zone2
      - OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881
    restart: always
    depends_on:
      - observer1

  observer3:
    # 第三个 observer 节点,依赖 observer2 启动
    image: oceanbase/oceanbase-ce:latest
    container_name: observer3
    privileged: true
    network_mode: host
    volumes:
      - /data/ob/compose/observer3/data:/home/admin/oceanbase/store/data
      - /data/ob/compose/observer3/redo:/home/admin/oceanbase/store/redo
      - /data/ob/compose/observer3/log:/home/admin/oceanbase/log
    environment:
      - OB_CLUSTER_NAME=obcluster
      - OB_SERVER_IP=192.168.1.103
      - OB_ROOT_PASSWORD=root_password
      - OB_TENANT_NAME=sys
      - OB_TENANT_PASSWORD=tenant_password
      - OB_ZONE=zone3
      - OB_ROOTSERVICE_LIST=192.168.1.101:2882:2881
    restart: always
    depends_on:
      - observer2

  obproxy:
    # OBProxy 代理节点,为客户端提供统一访问入口
    image: oceanbase/obproxy:latest
    container_name: obproxy
    network_mode: host
    environment:
      - OBPROXY_CLUSTER_NAME=obcluster
      - OBPROXY_ROOT_PASSWORD=root_password
      - OBPROXY_TENANT_NAME=sys
      - OBPROXY_TENANT_PASSWORD=tenant_password
      - OBPROXY_SERVERS=192.168.1.101:2881,192.168.1.102:2881,192.168.1.103:2881
    restart: always
    depends_on:
      - observer3
bash
# 启动 Docker Compose 集群,后台运行
docker-compose up -d
# 查看集群状态,确认所有容器正常运行
docker-compose ps
# 停止集群
docker-compose down

Kubernetes 部署

Kubernetes 部署适用于大规模生产环境,提供强大的编排和管理能力。

1. 环境准备

部署前需要安装和配置 Kubernetes 客户端工具 kubectl 和 Helm:

bash
# 安装 kubectl 命令行工具,用于与 Kubernetes 集群交互
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

# 安装 Helm 包管理工具,用于部署 OceanBase 等应用
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# 验证安装是否成功
kubectl version --client
helm version

2. 使用 Helm 部署

Helm 是 Kubernetes 的包管理工具,可以简化 OceanBase 集群的部署过程:

bash
# 添加 OceanBase 官方 Helm 仓库,获取最新的 Charts
helm repo add oceanbase https://oceanbase.github.io/helm-charts/
helm repo update

# 创建专用命名空间,隔离 OceanBase 资源
kubectl create namespace oceanbase

# 使用 Helm 部署 OceanBase 集群
# 通过 --set 参数配置集群名称、副本数、资源限制等关键参数
# 建议生产环境至少部署 3 个副本,分布在不同可用区
helm install obcluster oceanbase/oceanbase-ce \
  --namespace oceanbase \
  --set cluster.name=obcluster \
  --set cluster.replicas=3 \
  --set cluster.zones=zone1,zone2,zone3 \
  --set observer.resources.requests.cpu=4 \
  --set observer.resources.requests.memory=16Gi \
  --set observer.resources.limits.cpu=8 \
  --set observer.resources.limits.memory=32Gi \
  --set observer.storage.data.size=100Gi \
  --set observer.storage.redo.size=50Gi \
  --set rootPassword=root_password \
  --set tenantName=sys \
  --set tenantPassword=tenant_password

# 查看部署状态,等待所有 Pod 变为 Running 状态
kubectl get pods -n oceanbase -w

# 查看集群服务,获取访问地址和端口
kubectl get svc -n oceanbase

3. 自定义配置部署

对于复杂场景,可以通过自定义 values 文件进行更详细的配置:

yaml
# obcluster-values.yaml
# 完整的 OceanBase 集群配置文件,包含集群、observer 和 obproxy 配置
cluster:
  name: obcluster          # 集群名称
  replicas: 3              # 副本数量
  zones: zone1,zone2,zone3 # 可用区配置
  rootPassword: root_password  # 根密码
  tenantName: sys          # 租户名称
  tenantPassword: tenant_password  # 租户密码

observer:
  # Observer 组件配置
  image:
    repository: oceanbase/oceanbase-ce  # 镜像仓库
    tag: latest           # 镜像标签
    pullPolicy: IfNotPresent  # 镜像拉取策略
  resources:
    # 资源请求和限制
    requests:
      cpu: 4             # CPU 请求
      memory: 16Gi        # 内存请求
    limits:
      cpu: 8             # CPU 限制
      memory: 32Gi        # 内存限制
  storage:
    # 存储配置
    data:
      size: 100Gi        # 数据盘大小
      storageClass: standard  # 存储类
    redo:
      size: 50Gi         # Redo 日志盘大小
      storageClass: standard  # 存储类
  config:
    # Observer 配置参数
    enable_syslog_recycle: true  # 启用系统日志回收
    max_syslog_file_count: 100   # 最大系统日志文件数
    max_syslog_keep_time: 7      # 系统日志保留时间(天)
    memory_limit_percentage: 80  # 内存限制百分比
    system_memory: '4G'          # 系统内存大小
    datafile_size: '10G'         # 数据文件大小
    datafile_next: '2G'          # 数据文件扩展大小
    datafile_max_size: '50G'     # 数据文件最大大小

obproxy:
  # OBProxy 组件配置
  enabled: true          # 启用 OBProxy
  replicas: 2            # OBProxy 副本数
  image:
    repository: oceanbase/obproxy  # OBProxy 镜像
    tag: latest           # 镜像标签
    pullPolicy: IfNotPresent  # 镜像拉取策略
  resources:
    # OBProxy 资源配置
    requests:
      cpu: 1             # CPU 请求
      memory: 2Gi        # 内存请求
    limits:
      cpu: 2             # CPU 限制
      memory: 4Gi        # 内存限制
bash
# 使用自定义配置文件部署 OceanBase 集群
helm install obcluster oceanbase/oceanbase-ce \
  --namespace oceanbase \
  -f obcluster-values.yaml

4. 访问 OceanBase 集群

部署完成后,可以通过 OBProxy 访问 OceanBase 集群:

bash
# 获取 OBProxy Pod 名称
OBPROXY_POD=$(kubectl get pods -n oceanbase -l app=obproxy -o jsonpath='{.items[0].metadata.name}')

# 使用 kubectl port-forward 暴露 OBProxy 端口到本地,便于调试
kubectl port-forward -n oceanbase $OBPROXY_POD 2883:2883 &

# 使用 obclient 连接 OceanBase 集群,验证部署是否成功
# 连接地址为本地 127.0.0.1,端口 2883,用户名为 root@sys,密码为部署时设置的密码
obclient -h127.0.0.1 -P2883 -uroot@sys -p'root_password' -Doceanbase

容器化部署最佳实践

1. 资源配置最佳实践

OceanBase 对资源要求较高,合理配置资源是确保性能和稳定性的关键:

  • CPU 配置:每个 observer 实例建议配置 4-16 核 CPU,根据业务负载调整。生产环境建议至少 8 核 CPU。
  • 内存配置:每个 observer 实例建议配置 16-64GB 内存,内存不足会导致严重性能问题。
  • 存储配置
    • 数据盘:建议使用高性能 SSD,大小根据数据量确定,预留 30% 以上的空闲空间。
    • 日志盘:建议使用低延迟 NVMe SSD,大小为数据盘的 50%,确保 redo 日志写入性能。
  • 网络配置:建议使用主机网络模式以获得最佳性能,或使用高性能网络插件如 Calico 或 Cilium。

2. 存储配置最佳实践

存储是 OceanBase 性能的核心瓶颈,需要特别关注:

  • 使用本地存储:OceanBase 对存储性能要求极高,建议使用本地 SSD 而非网络存储,以减少延迟。
  • 数据与日志分离:将数据文件和 redo 日志存储在不同的物理磁盘上,避免 IO 竞争。
  • 使用合适的存储类:在 Kubernetes 中,为数据和日志分别配置高性能存储类,如本地 SSD 或 NVMe 存储类。
  • 配置存储预留:确保存储有足够的预留空间,建议预留 30% 以上的空闲空间,避免磁盘满导致集群故障。

3. 高可用配置

高可用是生产环境的基本要求,OceanBase 容器化部署需要考虑以下几点:

  • 多可用区部署:将副本分布在不同的可用区或物理机房,确保单个可用区故障不会导致集群不可用。
  • 合理设置副本数:生产环境建议使用 3 副本或 5 副本,平衡可用性和成本。
  • 配置健康检查
    yaml
    livenessProbe:
      exec:
        command:
          - /bin/bash
          - -c
          - /home/admin/oceanbase/bin/ob_admin check_liveness
      initialDelaySeconds: 300  # 启动后 5 分钟开始健康检查
      periodSeconds: 60          # 每 60 秒检查一次
      timeoutSeconds: 30         # 检查超时时间 30 秒
    readinessProbe:
      exec:
        command:
          - /bin/bash
          - -c
          - /home/admin/oceanbase/bin/ob_admin check_readiness
      initialDelaySeconds: 60    # 启动后 1 分钟开始就绪检查
      periodSeconds: 30          # 每 30 秒检查一次
      timeoutSeconds: 10         # 检查超时时间 10 秒

4. 监控与日志

完善的监控和日志收集是运维的重要保障:

  • 配置 Prometheus 监控

    yaml
    serviceMonitor:
      enabled: true            # 启用 ServiceMonitor
      interval: 30s            # 抓取间隔 30 秒
      scrapeTimeout: 10s        # 抓取超时 10 秒
  • 配置日志收集

    yaml
    logging:
      enabled: true            # 启用日志收集
      type: loki               # 使用 Loki 收集日志
      loki:
        url: http://loki:3100/loki/api/v1/push  # Loki 服务地址
  • 配置告警规则:针对关键指标如 CPU 使用率、内存使用率、IO 延迟等配置告警规则,及时发现并处理问题。

容器化部署常见问题

1. 容器启动失败

故障现象:容器启动后立即退出或状态为 CrashLoopBackOff

排查步骤

bash
# 查看容器日志,定位具体错误信息
docker logs oceanbase-single
# 或在 Kubernetes 中查看 Pod 日志
kubectl logs -n oceanbase obcluster-observer-0

# 检查资源使用情况,确认是否资源不足
docker stats oceanbase-single
# 或在 Kubernetes 中查看 Pod 详细信息
kubectl describe pod -n oceanbase obcluster-observer-0

# 检查存储目录权限,确保容器有读写权限
ls -la /data/ob/single/

解决方案

  • 确保资源配置足够,特别是 CPU 和内存
  • 检查并修复存储目录权限,确保容器进程有读写权限
  • 根据日志错误信息定位具体问题,如配置错误、端口冲突等
  • 调整启动参数,如增加内存限制、修改配置文件路径等

2. 集群节点无法通信

故障现象:多节点集群中节点间无法通信,导致集群无法正常初始化或数据无法同步

排查步骤

bash
# 检查节点间网络连通性
docker exec -it oceanbase-node1 ping 192.168.1.102
# 或在 Kubernetes 中检查 Pod 间通信
kubectl exec -n oceanbase obcluster-observer-0 -- ping obcluster-observer-1.oceanbase-observer.oceanbase.svc.cluster.local

# 检查端口开放情况,确认 OceanBase 服务端口是否正常监听
docker exec -it oceanbase-node1 netstat -tuln

解决方案

  • 确保网络模式配置正确,生产环境建议使用主机网络
  • 检查防火墙设置,确保 OceanBase 所需端口(2881、2882 等)已开放
  • 确认节点间网络连通性,排查网络故障
  • 检查集群配置中的 IP 地址和端口是否正确,特别是 ROOTSERVICE_LIST 配置

3. 存储性能问题

故障现象:容器化部署后 OceanBase 性能较差,查询延迟高,写入性能低

排查步骤

bash
# 使用 fio 工具测试存储性能,评估磁盘 IO 能力
docker run --rm -v /data/ob/single/data:/test fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --numjobs=8 --size=1G --runtime=60 --group_reporting

# 查看容器磁盘 IO 使用率,确认是否存在 IO 瓶颈
docker stats oceanbase-single

解决方案

  • 使用高性能 SSD 或 NVMe 存储,避免使用普通 HDD
  • 配置合适的存储类,在 Kubernetes 中选择高性能存储
  • 调整 OceanBase 存储参数,如增加 IO 线程数、调整读写缓存大小等
  • 优化容器存储驱动,如使用 overlay2 驱动并开启 direct-lvm

容器化与传统部署对比

部署方式部署速度资源利用率可扩展性管理复杂度适合场景
传统部署较慢较低一般较高小型固定集群
Docker 部署较快中等较好中等开发测试、小型集群
Kubernetes 部署优秀大型集群、生产环境

常见问题(FAQ)

Q1: OceanBase 容器化部署的优势是什么?

A1: OceanBase 容器化部署具有以下明显优势:

  • 部署速度快:使用容器镜像可以在几分钟内部署完整的 OceanBase 集群,大幅缩短部署时间。
  • 环境一致性好:容器镜像包含所有依赖和配置,确保开发、测试和生产环境一致。
  • 资源利用率高:通过容器化可以实现资源的精细管理和动态分配,提高硬件利用率。
  • 支持弹性伸缩:在 Kubernetes 环境下可以根据业务负载自动调整集群规模。
  • 便于管理和维护:使用 Helm 等工具可以简化集群的部署、升级和管理。
  • 适合微服务架构:容器化部署与微服务架构天然契合,便于与其他微服务集成。
  • 支持 CI/CD 自动化部署:可以集成到 CI/CD 流程中,实现自动化部署和升级。

Q2: 容器化部署需要注意哪些性能问题?

A2: 容器化部署需要特别关注以下性能问题:

  • 存储性能:OceanBase 对存储性能要求极高,必须使用高性能 SSD 或 NVMe 存储。
  • 网络性能:建议使用主机网络模式或高性能网络插件,减少网络延迟。
  • 资源配置:合理配置 CPU 和内存资源,避免资源不足导致性能下降。
  • 存储驱动:选择合适的容器存储驱动,如 overlay2,并开启 direct-lvm 以获得更好的性能。
  • IO 调度器:优化磁盘 IO 调度器,建议使用 noop 或 deadline 调度器。

Q3: 如何在 Kubernetes 中备份恢复 OceanBase 集群?

A3: 在 Kubernetes 环境中备份恢复 OceanBase 集群的方法:

  1. 使用 OceanBase 内置备份功能:通过 SQL 命令或 OCP 工具执行备份和恢复操作。
  2. 结合 Kubernetes CSI 快照功能:利用 CSI 快照功能对存储卷进行快照和恢复。
  3. 使用第三方备份工具:如 Velero 等工具,实现集群级别的备份和恢复。
  4. 定期导出数据:对于重要数据,定期使用 expdp/impdp 或 mysqldump 等工具导出数据,作为额外备份。

Q4: 如何升级容器化部署的 OceanBase 集群?

A4: 升级容器化部署的 OceanBase 集群的步骤:

  1. 备份数据:在升级前执行完整备份,确保数据安全。
  2. 更新镜像版本:修改 Helm values 文件中的镜像版本,或使用新的镜像标签。
  3. 滚动升级 Pod:使用 Helm upgrade 命令执行滚动升级,避免集群 downtime。
  4. 验证升级结果:升级完成后,验证集群状态、数据完整性和业务可用性。

Q5: 容器化部署的 OceanBase 如何与外部应用集成?

A5: 容器化部署的 OceanBase 与外部应用集成的方法:

  1. 使用 Kubernetes Service 暴露服务:通过 ClusterIP、NodePort 或 LoadBalancer 类型的 Service 暴露 OceanBase 服务。
  2. 配置 Ingress 访问:在 Kubernetes 集群中配置 Ingress 规则,实现外部访问。
  3. 使用 OBProxy 进行负载均衡:部署 OBProxy 组件,为客户端提供统一的访问入口和负载均衡。
  4. 配置合适的网络策略:根据业务需求配置 NetworkPolicy,控制 Pod 间的网络访问。
  5. 使用服务网格:对于复杂的微服务架构,可以使用 Istio 等服务网格工具进行流量管理和安全控制。