【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践

一、前言

随着企业业务的快速发展和数据量的不断增长,高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库,以其高扩展性、高可用性和高性能的特点,逐渐受到企业的广泛关注。然而,在复杂的分布式架构中,如何高效地部署和运维OceanBase以满足企业对可靠性和性能的要求,是一个亟待解决的技术挑战。本篇文章旨在探讨基于 Amazon EKS 部署高可用 OceanBase 的最佳实践,从架构设计、部署流程到高可用性的保障,全面剖析其中的关键技术和操作步骤。希望通过本实践,为开发者和企业提供一个清晰的技术参考,加速分布式数据库的云端部署进程,实现业务稳定运行与创新发展的双赢目标。

1.1 架构图

image-20241121221248874

架构说明:该架构展示了如何利用 Amazon EKSOceanBase 实现高性能、可扩展的分布式数据库解决方案。通过跨可用区部署和负载分布,确保了系统的高可用性、容错性和数据安全性。

二、理论篇

2.1 EKS介绍

Amazon Elastic Kubernetes Service(Amazon EKS)是一项基于开源 Kubernetes 项目的 AWS 托管式服务。虽然您需要了解 Amazon EKS 服务如何与 AWS Cloud 集成(尤其是在您首次创建 Amazon EKS 集群时),但是一旦它启动并运行,您就可以像使用任何其他 Kubernetes 集群一样使用您的 Amazon EKS 集群。因此,要开始管理 Kubernetes 集群和部署工作负载,您至少需要对 Kubernetes 概念有基本的了解。

2.2 OceanBase介绍

OceanBase 数据库是一款完全自研的企业级原生分布式数据库,在普通硬件上实现金融级高可用,首创“三地五中心”城市级故障自动无损容灾新标准,刷新 TPC-C 标准测试,单集群规模超过 1500 节点,具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性。

2.3 OceanBase组件介绍

image-20241125145007674

这张图展示了基于 OceanBase 数据库的分布式架构设计,结合主从复制、高可用性和水平扩展的特点。以下是对图的详细分析:

OBProxy

  • 位于架构的最顶层,作为 OceanBase 的访问代理。
  • 负责处理用户请求并将其分发到后端的 OBServer 节点。
  • 实现了负载均衡和高可用性,保证用户请求的高效路由。

OBServer

  • 是 OceanBase 数据库的核心存储和计算节点。
  • 每个 OBServer 节点分布在不同的 Zone(区域)中,提供高可用的区域隔离能力。

多租户架构

  • Tenant(租户):
    • 每个 OBServer 节点支持多租户架构,即在同一物理节点上可以运行多个逻辑租户。
    • 租户之间的资源隔离确保了不同业务或用户的数据安全和性能独立。

逻辑分区与数据分布

  • LS(Log Stream,日志流)
    • 每个租户中的数据被分割为多个 LS(如 LS1、LS2、LS3 等)。
    • 每个 LS 是存储分区的逻辑单元,内部包含多个 Tablet(数据表)。
    • 通过 Paxos 协议实现分布式一致性,保障数据的高可用性。
  • Tablet
    • 数据分片的最小单位,每个 LS 内部进一步划分为多个 Tablet。
    • Tablet 实现数据的分布式存储和管理。

高可用性与主从复制

  • 主副本与从副本
    • 每个 LS 都有一个主副本(蓝色)和多个从副本(绿色)。
    • 主副本负责处理写操作,从副本提供读操作支持。
    • 在主副本故障时,从副本可以快速提升为主副本,保证业务连续性。
  • Paxos 协议
    • 在多个副本之间实现强一致性,通过 Paxos 协议保障数据的一致性和高可用性。

水平扩展与无缝容灾

  • 水平扩展
    • 架构支持动态添加 OBServer 节点,实现系统的水平扩展。
    • 无需中断业务即可扩展存储和计算能力。
  • 无缝自动容灾
    • 在 Zone 级别实现了容灾能力,某个 Zone 出现故障时,其他 Zone 可自动接管其任务。
    • 多 Zone 部署进一步增强了数据可靠性。

OBD

OceanBase Deployer,OceanBase 安装部署工具,简称为 OBD。

ODP

OceanBase Database Proxy,OceanBase 数据库代理,是 OceanBase 数据库专用的代理服务器,简称为 ODP(又称为 OBProxy)。

OBAgent

OBAgent 是 OceanBase 数据库监控采集框架,支持推、拉两种数据采集模式,可以满足不同的应用场景。

Grafana

Grafana 是一款开源的数据可视化工具,它可以将数据源中的各种指标数据进行可视化展示,以便更直观地了解系统运行状态和性能指标。

Prometheus

Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型以及快捷数据采集、存储和查询接口。

三、实战篇

3.1 使用eskctl工具部署EKS集群

3.1.1 使用CloudFormation创建堡垒机

导航至CloudFormation,点击创建堆栈

image-20231119144901782

上传创建EC2的yaml文件。

image-20231119145059936

选择登录堡垒机的密钥。

image-20231119145213837

配置标签Name:awsEKSEC2

image-20231119145249731

确认。

image-20231119145326414

显示CREATE_COMPLETE创建完成。

image-20231119150102790

导航至EC2控制面板,查看此堡垒机的相关信息。

image-20231119150232679

3.1.2 安装AWS CLI命令行工具

# 下载压缩包
$ sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"# 解压
$ sudo unzip awscliv2.zip# 执行命令安装
$ sudo ./aws/install# 查看aws cli版本信息,确认是否安装成功。
$ sudo aws --version# 配置aws
$ sudo aws configure
# 配置信息如下:
AWS Access Key ID [None]: AKIAXxxxxxxxxx3GB
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-southeast-1
Default output format [None]: json

3.1.3 安装eksctl命令行工具

image-20231119151755570

# for ARM systems, set ARCH to: `arm64`, `armv6` or `armv7`
ARCH=amd64
PLATFORM=$(uname -s)_$ARCHcurl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"# (Optional) Verify checksum
curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --checktar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gzsudo mv /tmp/eksctl /usr/local/bin# 添加环境变量
# vim .bashrc
export PATH=/usr/local/bin:$PATHsource .bashrceksctl version

3.1.4 安装helm工具

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

image-20241120154540790

[root@bastion ~]# helm version
version.BuildInfo{Version:"v3.16.3", GitCommit:"cfd07493f46efc9debd9cc1b02a0961186df7fdf", GitTreeState:"clean", GoVersion:"go1.22.7"}

3.1.5 创建 EKS集群

编写cluster.yaml

[root@bastion ~]# vim cluster.yaml
[root@bastion ~]# cat cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfigmetadata:name: xybeks-clusterregion: ap-southeast-1managedNodeGroups:
- name: xybaws-ngsdesiredCapacity: 3instanceType: m5.2xlargevolumeSize: 500iam:withAddonPolicies:autoScaler: trueavailabilityZones: ["ap-southeast-1a", "ap-southeast-1c"]availabilityZones: ["ap-southeast-1a", "ap-southeast-1c"]

执行命令创建eks集群。

eksctl create cluster -f cluster.yaml

image-20241120150220637

image-20241120150201184

3.2 基于EKS部署高可用OceanBase

3.2.1 前提条件

在开始之前,确保已满足以下条件:

  • 有可用的 Kubernetes 集群且至少有 9 个可用 CPU,33 GB 可用内存 和 360 GB 的可用存储空间。

  • ob-operator 依赖 cert-manager,确保已安装 cert-manager。

  • 连接 OceanBase 集群时,需已安装 MySQL 客户端或 OBClient。

3.2.2 安装 cert-manager

[root@bastion ~]# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml[root@bastion ~]# kubectl get pods --namespace cert-manager
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-6796d554c5-hlvlv              1/1     Running   0          4m59s
cert-manager-cainjector-77cd756b5d-nsssk   1/1     Running   0          4m59s
cert-manager-webhook-dbb5879d7-9wbb2       1/1     Running   0          4m59s

3.2.3 部署 ob-operator

使用 ob-operator 可以简化 OceanBase 数据库在 Kubernetes 中的部署和运维。

helm repo add ob-operator https://oceanbase.github.io/ob-operator/helm install ob-operator ob-operator/ob-operator --namespace=oceanbase-system --create-namespace --version=2.3.0
[root@bastion ~]# helm install ob-operator ob-operator/ob-operator --namespace=oceanbase-system --create-namespace --version=2.3.0
NAME: ob-operator
LAST DEPLOYED: Fri Nov 22 08:48:15 2024
NAMESPACE: oceanbase-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
_                                      ____ | |__         ___  _ __   ___ _ __ __ _| |_ ___  _ __/ _ \| '_ \ _____ / _ \| '_ \ / _ \ '__/ _` | __/ _ \| '__|
| (_) | |_) |_____| (_) | |_) |  __/ | | (_| | || (_) | |\___/|_.__/       \___/| .__/ \___|_|  \__,_|\__\___/|_||_|Welcome to ob-operator! We are so happy to see you here! Once ob-operator is installed, you can explore OceanBase database on your Kubernetes cluster with ease.The following steps will guide you through the OceanBase database deployment:1. Quick Start - Deploy a single-node OceanBase database for testinghttps://oceanbase.github.io/ob-operator/docs/manual/quick-start-of-ob-operator2. Advanced - Create an OceanBase database with customized configurationshttps://oceanbase.github.io/ob-operator/docs/manual/ob-operator-user-guide/cluster-management-of-ob-operator/create-cluster3. Tenants - Create and manage tenants in OceanBase databasehttps://oceanbase.github.io/ob-operator/docs/manual/ob-operator-user-guide/tenant-management-of-ob-operator/tenant-management-intro4. High availability - Enable high availability for OceanBase on K8shttps://oceanbase.github.io/ob-operator/docs/manual/ob-operator-user-guide/high-availability/high-availability-intro5. Get help from the communityFeel free to ask questions or report issues on GitHub: https://github.com/oceanbase/ob-operator/issuesOther ways to get help: https://oceanbase.github.io/ob-operator/#getting-helpFor more information, please visit our website: https://oceanbase.github.io/ob-operator
[root@bastion ~]#
[root@bastion ~]# helm repo add ob-operator https://oceanbase.github.io/ob-operator/
"ob-operator" has been added to your repositories[root@bastion ~]# helm repo list
NAME            URL
ob-operator     https://oceanbase.github.io/ob-operator/
  • --namespace:命名空间,可根据需要自定义,建议使用 oceanbase-system
  • --version:ob-operator 版本号,建议使用最新的版本。

image-20241120155831602

  • 查看部署结果
[root@bastion ~]# kubectl get pods -n oceanbase-system
NAME                                           READY   STATUS    RESTARTS   AGE
oceanbase-controller-manager-c84cb45cb-4mw79   2/2     Running   0          4m6s
[root@bastion ~]# kubectl get crds
NAME                                             CREATED AT
certificaterequests.cert-manager.io              2024-11-20T07:49:39Z
certificates.cert-manager.io                     2024-11-20T07:49:39Z
challenges.acme.cert-manager.io                  2024-11-20T07:49:39Z
clusterissuers.cert-manager.io                   2024-11-20T07:49:39Z
cninodes.vpcresources.k8s.aws                    2024-11-20T06:50:23Z
eniconfigs.crd.k8s.amazonaws.com                 2024-11-20T06:53:39Z
issuers.cert-manager.io                          2024-11-20T07:49:40Z
k8sclusters.k8s.oceanbase.com                    2024-11-20T07:57:24Z
obclusteroperations.oceanbase.oceanbase.com      2024-11-20T07:57:24Z
obclusters.oceanbase.oceanbase.com               2024-11-20T07:57:24Z
obparameters.oceanbase.oceanbase.com             2024-11-20T07:57:24Z
obresourcerescues.oceanbase.oceanbase.com        2024-11-20T07:57:24Z
observers.oceanbase.oceanbase.com                2024-11-20T07:57:24Z
obtenantbackuppolicies.oceanbase.oceanbase.com   2024-11-20T07:57:24Z
obtenantbackups.oceanbase.oceanbase.com          2024-11-20T07:57:24Z
obtenantoperations.oceanbase.oceanbase.com       2024-11-20T07:57:24Z
obtenantrestores.oceanbase.oceanbase.com         2024-11-20T07:57:24Z
obtenants.oceanbase.oceanbase.com                2024-11-20T07:57:24Z
obzones.oceanbase.oceanbase.com                  2024-11-20T07:57:24Z
orders.acme.cert-manager.io                      2024-11-20T07:49:40Z
policyendpoints.networking.k8s.aws               2024-11-20T06:50:23Z
securitygrouppolicies.vpcresources.k8s.aws       2024-11-20T06:50:23Z

image-20241120160249932

3.2.4 部署 OceanBase 集群

创建 PVC

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml

创建 Namespace

kubectl create namespace oceanbase

创建默认用户的 Secret

kubectl create secret -n oceanbase generic root-password --from-literal=password='<root_password>'
kubectl create secret -n oceanbase generic proxyro-password --from-literal=password='<proxyro_password>'
[root@bastion ~]# kubectl create secret -n oceanbase generic root-password --from-literal=password='C1sc@123'
secret/root-password created
[root@bastion ~]# kubectl create secret -n oceanbase generic proxyro-password --from-literal=password='C1sc!123'
secret/proxyro-password created
[root@bastion ~]# kubectl get secret -n oceanbase
NAME               TYPE     DATA   AGE
proxyro-password   Opaque   1      37s
root-password      Opaque   1      46s

定义 OceanBase 集群

vim obcluster.yaml
apiVersion: oceanbase.oceanbase.com/v1alpha1
kind: OBCluster
metadata:name: obclusternamespace: oceanbase
spec:clusterName: obclusterclusterId: 1userSecrets:root: root-passwordproxyro: proxyro-passwordtopology:- zone: zone1replica: 1- zone: zone2replica: 1- zone: zone3replica: 1observer:image: oceanbase/oceanbase-cloud-native:4.2.1.1-101010012023111012resource:cpu: 8memory: 32Gistorage:dataStorage:storageClass: local-pathsize: 100GiredoLogStorage:storageClass: local-pathsize: 100GilogStorage:storageClass: local-pathsize: 100Gimonitor:image: oceanbase/obagent:4.2.1-100000092023101717resource:cpu: 2memory: 2Gi

部署 OceanBase 集群

kubectl apply -f obcluster.yaml

执行如下命令查看 OceanBase 集群状态,当状态变成 running 时即表示 OceanBase 集群已成功部署并完成初始化。该过程一般需要几分钟时间,主要耗时过程为镜像拉取和集群初始化。

kubectl get obclusters.oceanbase.oceanbase.com obcluster -n oceanbase
[root@bastion ~]kubectl get obclusters.oceanbase.oceanbase.com obcluster -n oceanbasese
NAME        STATUS    AGE     CLUSTERNAME
obcluster   running   4m20s   obcluster

3.2.5 直连 OceanBase 集群

获取 OceanBase 集群 Pod 地址

kubectl get pods -n oceanbase -l ref-obcluster=obcluster -o wide
[root@bastion ~]# kubectl get pods -n oceanbase -l ref-obcluster=obcluster -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
obcluster-1-zone1-hnf88c   2/2     Running   0          4m47s   192.168.23.253   ip-192-168-19-85.ap-southeast-1.compute.internal    <none>           <none>
obcluster-1-zone2-qz5z76   2/2     Running   0          4m47s   192.168.26.226   ip-192-168-13-178.ap-southeast-1.compute.internal   <none>           <none>
obcluster-1-zone3-m6nrwv   2/2     Running   0          4m47s   192.168.52.203   ip-192-168-33-45.ap-southeast-1.compute.internal    <none>           <none>

连接 OceanBase 集群

mysql -h10.10.10.1 -P2881 -uroot@sys -p oceanbase -A -cmysql -h192.168.52.203 -P2881 -uroot@sys -p oceanbase -A -c

image-20241120214645951

3.2.6 部署ODP

  • 创建 ODP 的配置文件
vim obproxy.yaml
apiVersion: v1
kind: Service
metadata:name: svc-obproxynamespace: oceanbase
spec:type: NodePortselector:app: obproxyports:- name: "sql"port: 2883targetPort: 2883- name: "prometheus"port: 2884targetPort: 2884---
apiVersion: apps/v1
kind: Deployment
metadata:name: obproxynamespace: oceanbase
spec:selector:matchLabels:app: obproxyreplicas: 2template:metadata:labels:app: obproxyspec:containers:- name: obproxyimage: oceanbase/obproxy-ce:4.2.1.0-11ports:- containerPort: 2883name: "sql"- containerPort: 2884name: "prometheus"env:- name: APP_NAMEvalue: helloworld- name: OB_CLUSTERvalue: obcluster- name: RS_LISTvalue: "192.168.23.253:2881;192.168.26.226:2881;192.168.52.203:2881"- name: PROXYRO_PASSWORDvalueFrom: secretKeyRef:name: proxyro-passwordkey: passwordresources:limits:memory: 2Gicpu: "1"requests: memory: 200Micpu: 200m

主要环境变量配置说明:

  • APP_NAME:ODP 的应用名称。
  • OB_CLUSTER:ODP 连接的 OceanBase 集群名。
  • RS_LIST:OceanBase 集群的 rs_list,格式为 ${ip1}:${sql_port1};${ip2}:${sql_port2};${ip3}:${sql_port3},需要根据实际部署情况来进行替换。您可直连到 OceanBase 集群中执行 SELECT GROUP_CONCAT(CONCAT(SVR_IP, ':', SQL_PORT) SEPARATOR ';') AS RS_LIST FROM oceanbase.DBA_OB_SERVERS;
  • PROXYRO_PASSWORD:需要配置 name 为上文创建的 proxyro@sys 用户的 Secret 名称,Secret 中需要包含 password 字段。
[root@ip-192-168-33-45 ~]# mysql -h192.168.23.253 -P2881 -uroot@sys -p oceanbase -A -c
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221527956
Server version: 5.7.25 OceanBase_CE 4.2.1.1 (r101010012023111012-2f6924cd5a576f09d6e7f212fac83f1a15ff531a) (Built Nov 10 2023 12:13:00)Copyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> SELECT GROUP_CONCAT(CONCAT(SVR_IP, ':', SQL_PORT) SEPARATOR ';') AS RS_LIST FROM oceanbase.DBA_OB_SERVERS;
+-------------------------------------------------------------+
| RS_LIST                                                     |
+-------------------------------------------------------------+
| 192.168.23.253:2881;192.168.26.226:2881;192.168.52.203:2881 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)mysql> 
  • 部署 ODP
kubectl apply -f obproxy.yaml
  • 验证是否部署成功(执行如下命令查看 ODP 的 pod 状态。)
kubectl get pod -A | grep obproxy

输出结果:

[root@bastion ~]# kubectl get pod -A | grep obproxy
oceanbase            obproxy-599f8548b6-26hm2                                   1/1     Running   0             64s
oceanbase            obproxy-599f8548b6-qwj44                                   1/1     Running   0             64s

执行如下命令查看 ODP 的服务

kubectl get svc svc-obproxy -n oceanbase
[root@bastion ~]# kubectl get svc svc-obproxy -n oceanbase
NAME          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
svc-obproxy   NodePort   10.100.45.141   <none>        2883:30962/TCP,2884:30989/TCP   91s

3.2.7 通过 ODP 连接 OceanBase 集群📍

  • 获取 ODP 的服务连接地址
kubectl get svc ${servicename} -n ${namespace}for example
kubectl get svc svc-obproxy -n oceanbase
[root@bastion ~]# kubectl get svc svc-obproxy -n oceanbase
NAME          TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
svc-obproxy   NodePort   10.100.110.207   <none>        2883:32566/TCP,2884:30472/TCP   22m[root@bastion ~]# kubectl get svc svc-obproxy -n oceanbase
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
svc-obproxy   ClusterIP   10.100.110.207   <none>        2883/TCP,2884/TCP   58m
  • 连接 OceanBase 集群(可以通过 CLUSTER-IP 和 PORT 的方式进行连接,对应的连接命令如下。)
mysql -h10.100.251.241 -P2883 -uroot@sys#obcluster -p oceanbase -A -cmysql -h47.129.178.84 -P30962 -uroot@sys#obcluster -pC1sc@123 oceanbase -A -c

image-20241121181425328

3.2.8 监控 OceanBase 集群

  • 部署 OceanBase Dashboard
helm repo add ob-operator https://oceanbase.github.io/ob-operator/helm repo update ob-operatorhelm install oceanbase-dashboard ob-operator/oceanbase-dashboard --version=0.2.1
[root@bastion ~]# helm repo add ob-operator https://oceanbase.github.io/ob-operator/
"ob-operator" already exists with the same configuration, skipping
[root@bastion ~]# helm repo update ob-operator
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ob-operator" chart repository
Update Complete. ⎈Happy Helming![root@bastion ~]# helm install oceanbase-dashboard ob-operator/oceanbase-dashboard --version=0.2.1
NAME: oceanbase-dashboard
LAST DEPLOYED: Fri Nov 22 09:21:43 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Welcome to OceanBase dashboard1. After installing the dashboard chart, you can use `port-forward` to expose the dashboard outside like:> kubectl port-forward -n default services/oceanbase-dashboard-oceanbase-dashboard 18081:80 --address 0.0.0.0then you can visit the dashboard on http://$YOUR_SERVER_IP:180812. Use the following command to get password for default admin user> echo $(kubectl get -n default secret oceanbase-dashboard-user-credentials -o jsonpath='{.data.admin}' | base64 -d)Log in as default account:
Username: admin
Password: <Get from the above command>

image-20241120222422835

部署 OceanBase Dashboard 后 K8s 集群需要一段时间用于拉取所需镜像,可通过如下命令查询 OceanBase Dashboard 是否完成安装。

[root@bastion ~]# kubectl get deployment oceanbase-dashboard-oceanbase-dashboard
NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
oceanbase-dashboard-oceanbase-dashboard   1/1     1            1           70s

3.2.9 访问 OceanBase Dashboard

OceanBase Dashboard 默认创建的登录账号为 admin,通过输出中的第二条命令可获取默认账号的密码,命令如下。

echo $(kubectl get -n default secret oceanbase-dashboard-user-credentials -o jsonpath='{.data.admin}' | base64 -d)
eqWD3vMdvlAzf0QK
  • 通过 NodePort 访问:OceanBase Dashboard 默认创建 NodePort 类型的服务,可通过 NodePort 访问 OceanBase Dashboard。
[root@bastion ~]# kubectl get svc oceanbase-dashboard-oceanbase-dashboard
NAME                                      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
oceanbase-dashboard-oceanbase-dashboard   NodePort   10.100.70.58   <none>        80:32354/TCP   22h

image-20241120222748411

image-20241123000914715

3.2.10 查看监控指标

访问到 OceanBase Dashboard 页面后,可单击左侧的 集群租户,选择查看集群或租户的监控信息。页面展示示例如

image-20241120223010357

image-20241120223033596

image-20241120223152874

四、参考链接

1️⃣在 Kubernetes 环境中部署 OceanBase 集群-V4.2.1-OceanBase 数据库文档-分布式数据库使用文档

2️⃣在 Amazon Linux 2023 上安装 MySQL 8 服务器和客户端 - LinuxStory

3️⃣kubectl apply - cert-manager Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具】—— SpringBoot3.x整合swagger

Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。Swagger简单说就是可以帮助生成接口说明文档&#xff0c;操作比较简单添加注解说明&#xff0c;可以自动生成格式化的文档。 项目环境 jdk17SpringBoot 3.4.0Sp…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

基于视觉语言模型(VLM)的CogAgent

前言 CogAgent 是由清华大学与智谱AI联合推出的一个多模态大模型&#xff0c;专注于图形用户界面&#xff08;GUI&#xff09;的理解和导航。它代表了在视觉语言模型&#xff08;VLM&#xff09;领域的一项重要进展&#xff0c;特别是在GUI Agent能力方面。相较于传统的基于文…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx&#xff0c;打开powershell管理员&#xff0c;输入以下命令,选择1并等待 irm https://get.activated.win | iex参考&#xff1a;https://www.bilibili.com/video/BV1TN411M72J/?sp…

C# 找出给定三角形的所有角度(Find all angles of a given triangle)

给定三角形在二维平面上所有三个顶点的坐标&#xff0c;任务是找到所有三个角度。 示例&#xff1a; 输入&#xff1a;A (0, 0), B (0, 1), C (1, 0) 输出&#xff1a;90, 45, 45 为了解决这个问题&#xff0c;我们使用下面的余弦定律。 c^2 a^2 …

【数据结构】(Python)差分数组。差分数组与树状数组结合

差分数组&#xff1a; 基于原数组构造的辅助数组。用于区间修改、单点查询。区间修改的时间复杂度O(1)。单点查询的时间复杂度O(n)。差分数组的元素&#xff1a;第一个元素等于原数组第一个元素&#xff0c;从第二个元素开始是原数组对应下标的元素与前一个元素的差&#xff0…

修复OpenHarmony系统相机应用横屏拍照按钮点不到的问题

适配OpenHarmony系统相机应用横屏UI&#xff0c; 相关pr: https://gitee.com/openharmony/applications_camera/pulls/233/files 适配效果 如何安装 编译好的hap提供在附件中 1.预置在源码&#xff0c;随固件安装 2.安装hap hdc shell "mount -o remount,rw /"…

10-Gin 文件上传 --[Gin 框架入门精讲与实战案例]

使用 Gin 框架处理文件上传是一个常见的任务&#xff0c;Gin 提供了简单而直观的方法来处理文件上传。下面将介绍如何用 Gin 实现文件上传功能。 1. 安装 Gin 如果你还没有安装 Gin&#xff0c;可以通过 Go 的包管理工具 go get 来安装&#xff1a; go get -u github.com/gi…

Promise实现原理解析,及实现方法。

Promise原理解析 Promise的介绍原理分析源码实现发布部分全部代码订阅部分基础代码简单发布订阅完整代码测试订阅能力链式调用的实现完整链式调用代码链式调用Promise完整功能代码 Promise的介绍 一&#xff0c;Promise的理解 在JavaScript中&#xff0c;Promise是一种用于处理…

http报头解析

http报文 http报文主要有两类是常见的&#xff0c;第一类是请求报文&#xff0c;第二类是响应报文&#xff0c;每个报头除了第一行&#xff0c;都是采用键值对进行传输数据&#xff0c;请求报文的第一行主要包括http方法&#xff08;GET&#xff0c;PUT&#xff0c; POST&#…

【日常开发】Git Stash使用技巧

文章目录 引言一、git stash 基础命令&#xff08;一&#xff09;存储当前工作区的修改&#xff08;二&#xff09;查看存储列表 二、查看存储的内容&#xff08;一&#xff09;查看特定存储的详细内容&#xff08;二&#xff09;查看特定存储修改的文件列表 三、恢复存储的修改…

微服务保护-sentinel

为什么要有微服务保护&#xff1f; 微服务保护是为了避免微服务雪崩而出现的&#xff0c;每个微服务能处理的请求是有限的&#xff0c;如果一个微服务出现问题导致一个请求进入微服务的时间太久&#xff0c;就会导致大量去请求停滞在微服务内部&#xff0c;这样就会过分占用系统…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

关于easy-es对时间范围查询遇到的小bug

前言&#xff1a;在使用easy-es之前作为一个小白的我只有es原生查询的基础&#xff0c;在自己通过查看官方文档自学easy-es遇到了一个挫折&#xff0c;其他的还好语法和MybatisPlus差不多&#xff0c;正以为我觉得很快就能入手&#xff0c;在对时间范围的判断就给我当头一棒&am…

从0到机器视觉工程师(一):机器视觉工业相机总结

目录 相机的作用 工业相机 工业相机的优点 工业相机的种类 工业相机知名品牌 光源与打光 打光方式 亮暗场照明 亮暗场照明的应用 亮暗场照明的区别 前向光漫射照明 背光照明 背光照明的原理 背光照明的应用 同轴光照明 同轴光照明的应用 总结 相机的作用 相机…

HTML——53. 创建表单

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>创建表单</title></head><body><!--form标签用于创建一个表单&#xff0c;会将里面的内容一起发送服务器&#xff0c;其结构类似于表格--><!--表…

逐行讲解大模型流式输出 streamer 源码

目录 简介TextStreamer 基础流式输出TextIterateStreamer 迭代器流式输出本地代码模型加载并前端展示streamlit 输出显示gradio 输出显示 vllm 部署模型并前端展示streamlit 输出显示gradio 输出显示 备注 简介 本文详细讲解了大模型流式输出的源码实现&#xff0c;包括TextSt…

java_使用阿里云oss服务存储图片

什么情况下可以使用阿里云oss服务存储图片&#xff1f; 对图片的访问速度有高要求时使用&#xff0c;方便用户快速的&#xff08;比如在网页页面中&#xff09;访问到图像 参考&#xff1a;41 尚上优选项目-平台管理端-商品信息管理模块-阿里云OSS介绍_哔哩哔哩_bilibili 1.…

第5章 共享内存范式:C语言层面

5.1OpenMP 5.1.1OpenMP的介绍 OpenMP三个原则 5.2OpenMP的使用 编译制导指令以#pragma omp 开始&#xff0c;后边跟具体的功能指令&#xff0c;格式如:#pragma omp 指令[子句[,子句].]。常用的功能指令如下: 5.2.1编译制导 5.2.2API和环境变量 具体案例-邻接矩阵 // 本代码…

web 开发全局覆盖文件上传身份验证漏洞利用

全局覆盖 首先认识全局变量和局部变量 再一个就是知道全局变量是全局使用的并且有个特点就是可以覆盖 这个就是全局变量我们输出一下发现 z居然等于函数内的计算值 把我们原来定义的全局变量 $z给覆盖了 看一下局部变量 这个时候 z就不会被覆盖 <?php $x1; $y2; …