外观
OceanBase 容器化部署配置
Docker 部署
1. 环境准备
Docker 是目前最流行的容器化平台,首先需要在服务器上安装并配置 Docker 环境:
bash
# 安装 Docker
yum install -y docker
# 启动 Docker 服务
systemctl start docker
systemctl enable docker
# 验证 Docker 安装
docker --version2. 获取 OceanBase 镜像
OceanBase 提供了官方 Docker 镜像,可以从 Docker Hub 或私有仓库获取:
bash
# 从 Docker Hub 获取官方镜像
docker pull oceanbase/oceanbase-ce:latest
# 或从私有仓库获取
docker pull private-registry/oceanbase/oceanbase-ce:latest3. 单节点部署
单节点部署适用于开发测试环境,快速搭建 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 bash4. 多节点集群部署
多节点集群部署适用于生产环境,提供高可用性和扩展性:
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:latest5. 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:
- observer3bash
# 启动 Docker Compose 集群,后台运行
docker-compose up -d
# 查看集群状态,确认所有容器正常运行
docker-compose ps
# 停止集群
docker-compose downKubernetes 部署
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 version2. 使用 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 oceanbase3. 自定义配置部署
对于复杂场景,可以通过自定义 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.yaml4. 访问 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 监控:
yamlserviceMonitor: enabled: true # 启用 ServiceMonitor interval: 30s # 抓取间隔 30 秒 scrapeTimeout: 10s # 抓取超时 10 秒配置日志收集:
yamllogging: 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 集群的方法:
- 使用 OceanBase 内置备份功能:通过 SQL 命令或 OCP 工具执行备份和恢复操作。
- 结合 Kubernetes CSI 快照功能:利用 CSI 快照功能对存储卷进行快照和恢复。
- 使用第三方备份工具:如 Velero 等工具,实现集群级别的备份和恢复。
- 定期导出数据:对于重要数据,定期使用 expdp/impdp 或 mysqldump 等工具导出数据,作为额外备份。
Q4: 如何升级容器化部署的 OceanBase 集群?
A4: 升级容器化部署的 OceanBase 集群的步骤:
- 备份数据:在升级前执行完整备份,确保数据安全。
- 更新镜像版本:修改 Helm values 文件中的镜像版本,或使用新的镜像标签。
- 滚动升级 Pod:使用 Helm upgrade 命令执行滚动升级,避免集群 downtime。
- 验证升级结果:升级完成后,验证集群状态、数据完整性和业务可用性。
Q5: 容器化部署的 OceanBase 如何与外部应用集成?
A5: 容器化部署的 OceanBase 与外部应用集成的方法:
- 使用 Kubernetes Service 暴露服务:通过 ClusterIP、NodePort 或 LoadBalancer 类型的 Service 暴露 OceanBase 服务。
- 配置 Ingress 访问:在 Kubernetes 集群中配置 Ingress 规则,实现外部访问。
- 使用 OBProxy 进行负载均衡:部署 OBProxy 组件,为客户端提供统一的访问入口和负载均衡。
- 配置合适的网络策略:根据业务需求配置 NetworkPolicy,控制 Pod 间的网络访问。
- 使用服务网格:对于复杂的微服务架构,可以使用 Istio 等服务网格工具进行流量管理和安全控制。
