【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践
一、前言
随着企业业务的快速发展和数据量的不断增长,高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库,以其高扩展性、高可用性和高性能的特点,逐渐受到企业的广泛关注。然而,在复杂的分布式架构中,如何高效地部署和运维OceanBase以满足企业对可靠性和性能的要求,是一个亟待解决的技术挑战。本篇文章旨在探讨基于 Amazon EKS 部署高可用 OceanBase 的最佳实践,从架构设计、部署流程到高可用性的保障,全面剖析其中的关键技术和操作步骤。希望通过本实践,为开发者和企业提供一个清晰的技术参考,加速分布式数据库的云端部署进程,实现业务稳定运行与创新发展的双赢目标。
1.1 架构图
架构说明:该架构展示了如何利用 Amazon EKS 和 OceanBase 实现高性能、可扩展的分布式数据库解决方案。通过跨可用区部署和负载分布,确保了系统的高可用性、容错性和数据安全性。
二、理论篇
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组件介绍
这张图展示了基于 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
,点击创建堆栈
。
上传创建
EC2
的yaml文件。
选择登录
堡垒机
的密钥。
配置标签
Name:awsEKSEC2
。
确认。
显示
CREATE_COMPLETE
创建完成。
导航至
EC2控制面板
,查看此堡垒机的相关信息。
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命令行工具
# 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
[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
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 版本号,建议使用最新的版本。
- 查看部署结果
[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
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
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
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>
部署 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
3.2.10 查看监控指标
访问到 OceanBase Dashboard 页面后,可单击左侧的 集群 和 租户,选择查看集群或租户的监控信息。页面展示示例如
四、参考链接
1️⃣在 Kubernetes 环境中部署 OceanBase 集群-V4.2.1-OceanBase 数据库文档-分布式数据库使用文档
2️⃣在 Amazon Linux 2023 上安装 MySQL 8 服务器和客户端 - LinuxStory
3️⃣kubectl apply - cert-manager Documentation
相关文章:
【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践
一、前言 随着企业业务的快速发展和数据量的不断增长,高性能、高可用的数据库解决方案成为了关键需求。OceanBase作为一款分布式关系型数据库,以其高扩展性、高可用性和高性能的特点,逐渐受到企业的广泛关注。然而,在复杂的分布式…...
新能源电动汽车动力电池技术
新能源电动汽车动力电池技术是新能源汽车发展的核心之一,以下是动力电池技术的一些关键方面: 技术进展 能量密度提升:近年来,动力电池的能量密度有了显著提升,从2010年的100Wh/kg提高到2024年的300Wh/kg。能量密度的…...
小程序组件 —— 30 组件 - 背景图片的使用
在编写小程序的样式文件时,可以使用 background-image 属性来设置元素的背景图像;但是这个属性在微信小程序中使用时存在坑; 注意事项:微信小程序中的 background-iamge 不支持本地路径!需要使用网络图片,…...
量子力学复习
黑体辐射 热辐射 绝对黑体: (辐射能力很强,完全的吸收体,理想的发射体) 辐射实验规律: 温度越高,能量越大,亮度越亮 温度越高,波长越短 光电效应 实验装置…...
n8n - AI自动化工作流
文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台,它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证,n8n可让您构建强大的自动化…...
1.1.7 master公式的使用
code 递归例子 – 返回最大数据 # 递归行为, 返回[L, R]的最大值 # 递归:base case; 遍历;返回值 from test1 import *def getMax(arr):return process(arr, 0, len(arr)-1)def process(arr, L, R):if (L R):return arr[L] #…...
Windows系统安装Docker Desktop
文章目录 注意事项安装步骤官网下载软件安装到其它盘符操作(如果就想安装到C盘可以跳过这个步骤, 直接执行文件)等待出现软件安装界面Windows系统的配置软件的一些必要设置(以下设置需要点击apply才能生效,如果点不了,那就是安装后,出现了错误…...
快速上手LangChain(四)LangChain Hub和LangSmith
文章目录 快速上手LangChain(四)LangChain Hub和LangSmith什么是LangChain HubLangChain Hub功能 LangSmith使用 快速上手LangChain(四)LangChain Hub和LangSmith 什么是LangChain Hub LangChain Hub官网地址:https:…...
jquery实现的网页版扫雷小游戏源码
源码介绍 这是一款基于jQuery实现的经典扫雷小游戏源码,玩家根据游戏规则进行游戏,末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏!是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。 效果预览 源码下载 j…...
C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡
雷赛控制技术 DMC系列运动控制卡是一款新型的 PCI/PCIe 总线运动控制卡。可以控制多个步进电机或数字式伺服电机;适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO 控制、位置比较、位置锁存等功能的应用。 DMC3000 系列卡的运动控制函数库功…...
理解linux内核中的几种地址
1. 前言 《Linux内核完全注释》这本书提到了几种Linux内核中的几种地址,实地址,有虚拟地址,逻辑地址,线性地址,物理地址。除了物理地址以外,其他几种容易弄混淆。这里做一下笔记,讲一下我的理解…...
MySQL(二)MySQL DDL数据库定义语言
1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码,即可进入mysq1)1.1.1. 数据库操作 (1)查看数据库 mysql>show databases;注:MySQL语句分隔符为“;” mysql库很重要它里面有…...
《Vue3实战教程》19:Vue3组件 v-model
如果您有疑问,请观看视频教程《Vue3实战教程》 组件 v-model 基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏: vue <!-- Child.vue --> <script setup> co…...
spring boot通过文件配置yaml里面的属性
yaml文件 fsg: batch-approval:# 批量审批batch-approval:pool:core-size: 2max-size: 10queue-capacity: 100keep-alive: 60name-prefix: ApprovalThread-shutdown:await-termination: trueawait-termination-period: 60ConfigurationProperties配置 import lombok.Data; imp…...
解析 World Football Cup 问题及其 Python 实现
问题描述 本文讨论一道关于足球锦标赛排名规则的问题,来自 Berland 足球协会对世界足球规则的调整。题目要求对给定的比赛数据进行计算,并输出能进入淘汰赛阶段的球队列表。以下是规则详细描述。 题目规则 输入格式: 第一行包含一个整数 …...
DS复习提纲模版
数组的插入删除 int SeqList::list_insert(int i, int item) { //插入if (i < 1 || i > size 1 || size > maxsize) {return 0; // Invalid index or list is full}for (int j size-1; j > i-1; j--) { // Shift elements to the rightlist[j1] list[j];}li…...
算法解析-经典150(链表、二叉树)
文章目录 链表1.环形链表1.答案2.思路 2.两数相加1.答案2.思路 3.合并两个有序链表1.答案2.思路 4.反转链表 II1.答案2.思路 5.反转链表1.答案2.思路 6.K 个一组翻转链表1.答案2.思路 7.删除链表的倒数第 N 个结点1.答案2.思路 8.删除排序链表中的重复元素 II1.答案2.思路 9.旋…...
蓝桥杯-Python
1. 冒泡排序 算法步骤: 比较相邻元素,如果第一个大于第二个则交换从左往右遍历一遍,重复第一步,可以保证最大的元素在最后面重复上述操作,可以得到第二大、第三大、… n int(input()) a list(map(int, input()…...
语雀导入md文件图片丢失
经常被困扰是,从语雀导入md文件,即使知道把md文件和本地图片文件夹打包成zip进行导入,还是出现图片丢失 解决方式1: 把图片和md文件放到同个目录下,重新打包成zip文件,导入后有图片了 解决方式2…...
【Logstash02】企业级日志分析系统ELK之Logstash 输入 Input 插件
Logstash 使用 Logstash 命令 官方文档 https://www.elastic.co/guide/en/logstash/current/first-event.html #各种插件 https://www.elastic.co/guide/en/logstash/current/input-plugins.html https://www.elastic.co/guide/en/logstash/current/filter-plugins.html htt…...
HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级
注:本文为 “HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级” 相关文章合辑。 引文图片 csdn 转储异常,重传。 篇 1:Smart-Baby 回复中给出故障现象判断参考 篇 2、篇3 :HP 官方 BIOS 恢复、升级教程 开机黑屏,…...
Nginx代理本地exe服务http为https
Nginx代理本地exe服务http为https 下载NginxNginx命令exe服务http代理为https 下载Nginx 点击下载Nginx 下载好之后是一个压缩包,解压放到没有中文的路径下就可以了 Nginx命令 调出cmd窗口cd到安装路径 输入:nginx -v 查看版本 nginx -hÿ…...
enzymejest TDD与BDD开发实战
一、前端自动化测试需要测什么 1. 函数的执行逻辑,对于给定的输入,输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言,测试粒度较细,需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…...
Linux菜鸟级常用的基本指令和基础知识
前言:很多Linux初学者都会头疼于指令太多记不住,笔者刚学习Linux时也是如此,学习Linux指令时,学了后面的指令,前面的指令也会忘的差不多了,针对于以上这些情况,笔者今天来分享一篇Linux菜鸟级的常用指令的博…...
Spark创建多种数据格式的DataFrame
假如我们要通过RDD[Row]创建一个包含多个列的DataFrame,重点是列的数据类型可能会包含多个,这时候需要有一点技巧。 | uid | user_name | age | income | |:----|:----------|:----|:-------| | 1111 | nituchao | 21 | 123.0 | 这个DataFrame里包含…...
C语言:指针
1. 什么是指针? 在C语言中,指针是一个变量,用于存储另一个变量的内存地址。指针不是直接保存值,而是保存数据所在的内存位置。 语法: type *pointer_name; 例如: int *ptr; 在这个例子中,pt…...
kafka生产者专题(原理+拦截器+序列化+分区+数据可靠+数据去重+事务)
目录 生产者发送数据原理参数说明代码示例(同步发送数据)代码示例(异步) 异步和同步的区别同步发送定义与流程特点 异步发送定义与流程特点 异步回调描述代码示例 拦截器描述代码示例 消息序列化描述代码示例(自定义序…...
谷歌2025年AI战略与产品线布局
在2024年12月的战略会议上,谷歌高层向员工描绘了2025年的宏伟蓝图,特别是在人工智能(AI)领域。这一年被定位为AI发展的关键转折点,谷歌计划通过一系列新产品和创新来巩固其在全球科技领域的领导地位。本文将深入探讨谷歌的2025年AI战略、重点产品以及竞争策略。 一、整体…...
Kernel Stack栈溢出攻击及保护绕过
前言 本文介绍Linux内核的栈溢出攻击,和内核一些保护的绕过手法,通过一道内核题及其变体从浅入深一步步走进kernel世界。 QWB_2018_core 题目分析 start.sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./core.cpio \-append "…...
QT-窗口嵌入外部exe
窗口类: #pragma once #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QProcess> #include <QTimer> #include <QDebug> #include <Windows.h> #include <QWindow> #include <…...
38-其他地方使用模式
38-其他地方使用模式 模式除了可以在 match 表达式中使用外,还可以使用在变量定义(等号左侧是个模式)和 for in 表达式(for 关键字和 in 关键字之间是个模式)中。 但是,并不是所有的模式都能使用在变量定…...
才气小波与第一性原理
才气小波与第一性原理 才气小波与第一性原理具身智能云藏山鹰类型物热力学第二定律的动力机械外骨骼诠释才气小波导引社会科学概论软凝聚态数学意气实体过程王阳明代数Wangyangmingian王阳明算符才气语料库命运社会科学概论意气实体过程业务分层框架示例 才气小波与第一性原理 …...
104周六复盘 (188)UI
1、早上继续看二手书的一个章节,程序开发流程、引擎、AI等内容, 内容很浅,基本上没啥用,算是复习。 最大感触就是N年前看同类书的里程碑、AI相关章节时,会感觉跟自己没啥关系, 而如今则密切相关…...
CDP集群安全指南-动态数据加密
[〇]关于本文 集群的动态数据加密主要指的是加密通过网络协议传输的数据,防止数据在传输的过程中被窃取。由于大数据涉及的主机及服务众多。你需要更具集群的实际环境来评估需要为哪些环节实施动态加密。 这里介绍一种通过Cloudera Manager 的Auto-TLS功能来为整个…...
C# 设计模式:装饰器模式与代理模式的区别
C# 设计模式:装饰器模式与代理模式的区别 在软件设计中,装饰器模式(Decorator Pattern)和代理模式(Proxy Pattern)都是结构型设计模式,它们的目的都是通过对对象进行包装,来增加或改…...
[深度学习] 大模型学习1-大语言模型基础知识
大语言模型(Large Language Model,LLM)是一类基于Transformer架构的深度学习模型,主要用于处理与自然语言相关的各种任务。简单来说,当用户输入文本时,模型会生成相应的回复或结果。它能够完成许多任务&…...
GitLab集成Runner详细版--及注意事项汇总【最佳实践】
一、背景 看到网上很多用户提出的runner问题其实实际都不是问题,不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner,因为这类文章写得好的特别多,本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…...
STM32-笔记34-4G遥控灯
4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...
PHP 使用集合 处理复杂数据 提升开发效率
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
AI代码开发实践-微信小程序开发
接上回,本人参加了一次小孩学校组织的护学岗,萌生了开发一个微信小程序的水印相机的想法,说干就干。 最近也是在学习用AI编程,索性之前也用一点,今天就尝试一下 工具选择,环境搭建 阿里-通义灵码 通义灵…...
【网络安全 | 漏洞挖掘】私有项目中的账户接管过程
未经许可,不得转载。 正文 该程序包含多个通配符目标。在逐一搜索后,我最终发现了一个具有 P4 严重级别的 IDOR 漏洞(不正确的直接对象引用),允许我删除其他用户在帖子中的评论。 其中一个目标是一个只有单个域名的网站,提供注册、登录和重置密码功能。我尝试寻找任何可…...
【算法不挂科】算法期末考试【选择题专项练习】<多单元汇总>
前言 大家好吖,欢迎来到 YY 滴算法不挂科系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 一.选择题 【1】算法绪论 1.算法与程序的区别是( ) A.输出 B.输入 C.确定性 D.有穷性 D 2.算法复杂度分析的两种基本方法…...
分布式消息中间件有哪些知名的产品
首先是Apache Kafka,它是一个分布式流处理平台,专注于高性能、低延迟的实时数据管道和流应用。Kafka通过分区和复制机制实现了高可用性和容错性,支持消息的持久化存储和高效的数据传输。其强大的生态系统还提供了丰富的客户端库和集成工具&am…...
kubernets基础入门
首先通过Kubernets架构图来认识Kubernets各个功能组件之间是怎么相互关联配合工作的。 一、Kubernets架构图: 通过上图来介绍集群功能组件通信详细过程: kubernetes api server 作为集群的核心,负责集群各功能模块之间的通信。集群内的各个功…...
【数据库初阶】MySQL数据类型
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL…...
(九千七-星河襟)椭圆曲线加密(ECC, Elliptic Curve Cryptography)及其例题
椭圆曲线加密(ECC)是一种基于椭圆曲线数学的公钥加密技术。它提供了一种高效的加密方法,能够在较小的密钥长度下实现与传统加密算法(如RSA)相同的安全级别。以下是ECC的主要特点和工作原理的总结: 1. 基本…...
LookingGlass使用
背景 Looking Glass 是一款开源应用程序,可以直接使用显卡直通的windows虚拟机。 常见环境是Linux hostwindows guest,基本部署结构图: 编译 git clone --recursive https://github.com/gnif/LookingGlass.git编译client mkdir client/b…...
ArcGIS Server 10.2授权文件过期处理
新的一年,arcgis server授权过期了,服务发不不了。查看ecp授权文件,原来的授权日期就到2024.12.31日。好吧,这里直接给出处理方法。 ArcGIS 10.2安装时,有的破解文件中会有含一个这样的注册程序,没有的话&…...
js es6 reduce函数, 通过规格生成sku
const specs [{ name: 颜色, values: [红色, 蓝色, 绿色] },{ name: 尺寸, values: [S, M, L] } ];function generateSKUs(specs) {return specs.reduce((acc, spec) > {const newAcc [];for (const combination of acc) {for (const value of spec.values) {newAcc.push(…...
Spring 事务底层原理
61 张图,剖析 Spring 事务,就是要钻到底! 拜托!面试请不要再问我 Transactional my: AOP Transactional PlatformTransactionManager:数据源隔离 TransactionInterceptor:拦截添加了注解的…...