利用Velero对K8S备份还原与集群迁移实战

news2024/11/25 19:58:56

一、简介

Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。

  • 开源地址:https://github.com/vmware-tanzu/velero
  • 官方文档:Velero Docs - Overview

1.1 支持的版本列表

1.2 Velero组件

Velero 组件一共分两部分,分别是服务端和客户端。

  • 服务端:运行在你 Kubernetes 的集群中
  • 客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上

1.3 velero备份流程

  1. velero客户端调用kubernetes API Server创建backup任务
  2. Backup控制器基于watch机制通过Api Server获取到备份任务
  3. Backup控制器开始执行备份动作,会通过请求Api Server获取到需要备份的数据
  4. Backup 控制器将获取到的数据备份到指定的对象存储server端

1.4 Velero后端存储

Velero支持两种关于后端存储的CRD,分别是BackupStorageLocationVolumeSnapshotLocation

1.4.1 BackupStorageLocation

主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。主要支持的后端存储是 S3 兼容的存储,比如:Mino 和阿里云 OSS 等。

1.4.2 VolumeSnapshotLocation

主要用来给 PV 做快照,需要云提供商提供插件。阿里云已经提供了插件,这个需要使用 CSI 等存储机制。你也可以使用专门的备份工具 Restic,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。

Restic 是一款 GO 语言开发的数据加密备份工具,顾名思义,可以将本地数据加密后传输到指定的仓库。支持的仓库有 Local、SFTP、Aws S3、Minio、OpenStack Swift、Backblaze B2、Azure BS、Google Cloud storage、Rest Server。

二、准备存储插件

Velero支持很多种存储插件,可查看:Velero Docs - Providers获取插件信息,我们这里使用minio作为S3兼容的对象存储提供程序。您也可以在任意地方部署Minio对象存储,只需要保证K8S集群可以访问到即可。

2.1 准备minio清单

 
---
apiVersion: v1
kind: Service
metadata:
name: minio
namespace: velero
labels:
app: minio
spec:
selector:
app: minio
ports:
- name: api
port: 9000
protocol: TCP
- name: console
port: 9001
protocol: TCP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: minio
namespace: velero
labels:
app: minio
spec:
replicas: 1
serviceName: minio
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: docker.io/bitnami/minio:2023.3.22
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9000
name: api
protocol: TCP
- containerPort: 9001
name: console
protocol: TCP
env:
- name: MINIO_ROOT_USER
value: "minio"
- name: MINIO_ROOT_PASSWORD
value: "minio123"
- name: MINIO_DEFAULT_BUCKETS
value: "velero"
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi

2.2 创建minio应用

 
# 创建velero命名空间
$ kubectl create namespace velero
# 创建minio资源
$ kubectl apply -f minio.yaml
# 查看部署状态
$ kubectl get sts,pod,svc -n velero
NAME READY AGE
statefulset.apps/minio 1/1 66s
NAME READY STATUS RESTARTS AGE
pod/minio-0 1/1 Running 0 65s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio ClusterIP 10.99.223.162 <none> 9000/TCP,9001/TCP 66s
# 开放NodePort端口
$ kubectl patch svc minio -n velero -p '{"spec": {"type": "NodePort"}}'
$ kubectl patch svc minio -n velero --type='json' -p='[{"op": "replace", "path": "/spec/ports/0/nodePort", "value":9000},{"op": "replace", "path": "/spec/ports/1/nodePort", "value":9001}]'
$ kubectl get svc -n velero
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
minio NodePort 10.99.223.162 <none> 9000:9000/TCP,9001:9001/TCP 140m

通过浏览器访问服务器IP:9001,并使用账号minio密码minio123登入验证。

三、安装velero v1.10.2

版本列表:https://github.com/vmware-tanzu/velero/releases

3.1 安装velero命令程序

 
$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.2/velero-v1.10.2-linux-amd64.tar.gz
$ tar zxf velero-v1.10.2-linux-amd64.tar.gz
$ mv velero-v1.10.2-linux-amd64/velero /usr/bin/
$ velero -h
# 启用命令补全
$ source <(velero completion bash)
$ velero completion bash > /etc/bash_completion.d/velero

3.2 创建密钥

 
$ cat > credentials-velero <<EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF

3.3 安装velero到k8s集群

 
$ velero install \
--provider aws \
--image velero/velero:v1.10.2 \
--plugins velero/velero-plugin-for-aws:v1.6.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-node-agent \
--use-volume-snapshots=false \
--namespace velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000 \
--wait
# 执行install命令后会创建一系列清单,包括CustomResourceDefinition、Namespace、Deployment等。
# 可使用如下命令查看运行日志
$ kubectl logs deployment/velero -n velero
# 查看velero创建的api对象
$ kubectl api-versions | grep velero
velero.io/v1
# 查看备份位置
$ velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws velero Available 2023-03-28 15:45:30 +0800 CST ReadWrite true

选项说明:

  • --kubeconfig(可选):指定kubeconfig认证文件,默认使用.kube/config
  • --provider:定义插件提供方;
  • --image:定义运行velero的镜像,默认与velero客户端一致;
  • --plugins:指定使用aws s3兼容的插件镜像;
  • --bucket:指定对象存储Bucket桶名称;
  • --secret-file:指定对象存储认证文件;
  • --use-node-agent:创建Velero Node Agent守护进程,托管FSB模块;
  • --use-volume-snapshots:是否启使用快照;
  • --namespace:指定部署的namespace名称,默认为velero;
  • --backup-location-config:指定对象存储地址信息;

aws插件与velero版本对应关系:

3.4 卸载velero

如果您想从集群中完全卸载Velero,则以下命令将删除由velero install创建的所有资源:

 
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

四、备份与恢复

备份命令:velero create backup NAME [flags]
backup选项:

  • --exclude-namespaces stringArray : 要从备份中排除的名称空间
  • --exclude-resources stringArray: 要从备份中排除的资源,如storageclasses.storage.k8s.io
  • --include-cluster-resources optionalBool[=true]: 包含集群资源类型
  • --include-namespaces stringArray: 要包含在备份中的名称空间(默认'*')
  • --include-resources stringArray: 备份中要包括的资源
  • --labels mapStringString: 给这个备份加上标签
  • -o, --output string: 指定输出格式,支持'table'、'json'和'yaml';
  • -l, --selector labelSelector: 对指定标签的资源进行备份
  • --snapshot-volumes optionalBool[=true]: 对 PV 创建快照
  • --storage-location string: 指定备份的位置
  • --ttl duration: 备份数据多久删掉
  • --volume-snapshot-locations strings: 指定快照的位置,也就是哪一个公有云驱动

4.1 备份

4.1.1 使用官方案例创建测试应用
 
$ kubectl apply -f examples/nginx-app/base.yaml
namespace/nginx-example created
deployment.apps/nginx-deployment created
service/my-nginx created
# 查看资源清单
$ kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-57d5dcb68-g42mk 1/1 Running 0 41s
pod/nginx-deployment-57d5dcb68-pcc6t 1/1 Running 0 41s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.96.0.31 <pending> 80:27370/TCP 41s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 41s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-57d5dcb68 2 2 2 41s
4.1.2 备份测试应用
 
$ velero backup create nginx-backup --include-namespaces nginx-example
Backup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.

选项:

  • --include-namespaces:指定命名空间
  • --selector:标签选择器,如app=nginx
4.1.3 查看备份列表
 
$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
nginx-backup Completed 0 0 2023-03-09 09:38:50 +0800 CST 29d default <none>
# 查看备份详细信息
$ velero backup describe nginx-backup
# 查看备份日志
$ velero backup logs nginx-backup

登入minio控制台查看备份内容

4.1.4 定时备份指南
 
# 使用cron表达式备份
$ velero schedule create nginx-daily --schedule="0 1 * * *" --include-namespaces nginx-example
# 使用一些非标准的速记 cron 表达式
$ velero schedule create nginx-daily --schedule="@daily" --include-namespaces nginx-example
# 手动触发定时任务
$ velero backup create --from-schedule nginx-daily

更多cron示例请参考:cron package’s documentation

4.2 恢复

4.2.1 模拟灾难
 
# 删除nginx-example命名空间和资源
$ kubectl delete namespace nginx-example
# 检查是否删除
$ kubectl get all -n nginx-example
No resources found in nginx-example namespace.
4.2.2 恢复资源
 
$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
nginx-backup Completed 0 0 2023-03-09 09:38:50 +0800 CST 29d default <none>
$ velero restore create --from-backup nginx-backup
Restore request "nginx-backup-20230309095025" submitted successfully.
Run `velero restore describe nginx-backup-20230309095025` or `velero restore logs nginx-backup-20230309095025` for more details.
4.2.3 检查恢复的资源
 
$ velero restore get
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR
nginx-backup-20230309095025 nginx-backup Completed 2023-03-09 09:50:25 +0800 CST 2023-03-09 09:50:25 +0800 CST 0 1 2023-03-09 09:50:25 +0800 CST <none>
# 查看详细信息
$ velero restore describe nginx-backup-20230309095025
# 检查资源状态
$ kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-57d5dcb68-g42mk 1/1 Running 0 2m19s
pod/nginx-deployment-57d5dcb68-pcc6t 1/1 Running 0 2m19s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.96.0.204 <pending> 80:31291/TCP 2m19s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 2m19s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-57d5dcb68 2 2 2 2m19s

五、项目迁移实战

5.1、项目介绍

我们将使用Velero快速完成云原生应用PV数据的迁移实践过程,在本文示例中,我们将A集群中的一个MOS应用迁移到集群B中,其中数据备份采用自建Minio对象存储服务。

5.1.1 环境要求
  1. 迁移项目最好保证两个Kubernetes集群版本一致。
  2. 为了保证PV数据成功迁移,两边需要安装好相同名字的StorageClass
  3. 可以自己部署Minio,也可以使用公有云的对象存储服务,如华为的OBS、阿里的OSS等。
  4. 本案例将集群A中app-system命名空间中的服务及PV数据迁移到集群B中。
5.1.2 项目环境
角色集群IP集群版本部署软件
K8S 集群A192.168.1.102v1.22.10openebs、velero、app-system
K8S 集群B192.168.1.103v1.22.10openebs、velero、minio
5.1.3 项目说明

我们需要将集群A中 app-system 空间的所有资源和数据全部迁移到集群B中,该项目包括了deploymentstatefulsetserviceingressjobcronjobsecretconfigmappvpvc

 
# 项目清单信息
$ kubectl get deployment,sts,pvc -n app-system
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hasura-graphql 1/1 1 1 5h27m
deployment.apps/iot-backend 1/1 1 1 5h27m
deployment.apps/iot-gateway 1/1 1 1 5h27m
deployment.apps/iot-history 1/1 1 1 5h27m
deployment.apps/iot-observer 1/1 1 1 5h27m
deployment.apps/app-backend 1/1 1 1 5h27m
deployment.apps/app-frontend 1/1 1 1 5h27m
NAME READY AGE
statefulset.apps/minio 1/1 5h27m
statefulset.apps/mongo 1/1 5h27m
statefulset.apps/postgres 1/1 5h27m
statefulset.apps/rabbitmq 1/1 5h27m
statefulset.apps/redis 1/1 5h27m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/data-minio-0 Bound pvc-950d15a8-20a5-4e5f-8dbf-b904295355bb 50Gi RWO openebs-hostpath 5h27m
persistentvolumeclaim/data-mongo-0 Bound pvc-e435b80e-0370-4100-b223-ca841f24bd5d 50Gi RWO openebs-hostpath 5h27m
persistentvolumeclaim/data-postgres-0 Bound pvc-359ec32a-4bfc-4bc8-8cf3-38322e8ef59b 300Gi RWO openebs-hostpath 5h27m
persistentvolumeclaim/data-redis-0 Bound pvc-da718e0c-992c-4f6e-af44-abb1c7214a9e 2Gi RWO openebs-hostpath 5h27m
persistentvolumeclaim/app-backend Bound pvc-506261a9-6be4-4d95-8807-58201e31a527 10Gi RWO openebs-hostpath 5h27m

5.2 准备对象存储

按照2.12.2的方法在集群B(192.168.1.103)中创建minio应用,用来存放备份数据。

 
$ kubectl get sts,svc -n velero
NAME READY AGE
statefulset.apps/minio 1/1 3h44m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio NodePort 10.99.223.162 <none> 9000:9000/TCP,9001:9001/TCP 3h44m

5.3 安装velero

请确保在集群A集群B中已经安装好velero客户端,请参考3.1 安装velero命令程序

5.3.1 在集群A中安装velero服务
 
$ cat > credentials-velero <<EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF
$ velero install \
--provider aws \
--image velero/velero:v1.10.2 \
--plugins velero/velero-plugin-for-aws:v1.6.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-node-agent \
--use-volume-snapshots=false \
--namespace velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.1.103:9000 \
--wait

注意:其中S3的地址指向集群B(192.168.1.103)的minio对象存储。

5.3.2 在集群B种安装velero服务
 
$ cat > credentials-velero <<EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF
$ velero install \
--provider aws \
--image velero/velero:v1.10.2 \
--plugins velero/velero-plugin-for-aws:v1.6.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-node-agent \
--use-volume-snapshots=false \
--namespace velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000 \
--wait

注意:其中S3的地址指向本集群minio对象存储的svc地址。

5.4 备份MOS项目

 
$ velero backup create app-backup \
--default-volumes-to-fs-backup \
--include-namespaces app-system
Backup request "app-backup" submitted successfully.
Run `velero backup describe app-backup` or `velero backup logs app-backup` for more details.
# 查看备份状态
$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
app-backup Completed 0 0 2023-03-28 16:34:56 +0800 CST 29d default <none>
  • --default-volumes-to-fs-backup:默认将所有PV卷进行备份,详情查看官方文档。
  • --include-namespaces:指定要备份的命名空间

登入minio控制台上可以看到备份的文件:

5.5 恢复到集群B

 
# 到集群B中查看备份资源
$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
app-backup Completed 0 0 2023-03-28 16:41:55 +0800 CST 29d default <none>
# 执行恢复命令
$ velero restore create --from-backup app-backup
Restore request "app-backup-20230328164601" submitted successfully.
Run `velero restore describe app-backup-20230328164601` or `velero restore logs app-backup-20230328164601` for more details.
# 查看恢复任务
$ velero restore get
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR
app-backup-20230328164601 app-backup Completed 2023-03-28 16:46:01 +0800 CST 2023-03-28 17:01:26 +0800 CST 0 30 2023-03-28 16:46:01 +0800 CST <none>

5.6 验证服务和数据

 
$ kubectl get deploy,sts,svc,pvc -n app-system
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hasura-graphql 1/1 1 1 29m
deployment.apps/iot-backend 1/1 1 1 29m
deployment.apps/iot-gateway 1/1 1 1 29m
deployment.apps/iot-history 1/1 1 1 29m
deployment.apps/iot-observer 1/1 1 1 29m
deployment.apps/app-backend 1/1 1 1 29m
deployment.apps/app-frontend 1/1 1 1 29m
NAME READY AGE
statefulset.apps/minio 1/1 29m
statefulset.apps/mongo 1/1 29m
statefulset.apps/postgres 1/1 29m
statefulset.apps/rabbitmq 1/1 29m
statefulset.apps/redis 1/1 29m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hasura-graphql ClusterIP 10.107.231.148 <none> 8080/TCP 29m
service/iot-backend ClusterIP 10.98.78.23 <none> 3000/TCP 29m
service/iot-gateway ClusterIP 10.108.211.114 <none> 1880/TCP 29m
service/iot-history ClusterIP 10.98.217.234 <none> 3000/TCP 29m
service/iot-observer ClusterIP 10.105.75.200 <none> 3010/TCP 29m
service/minio ClusterIP 10.97.14.151 <none> 9000/TCP,9001/TCP 29m
service/mongo ClusterIP 10.97.212.84 <none> 27017/TCP 29m
service/app-backend ClusterIP 10.107.16.116 <none> 5959/TCP 29m
service/app-frontend ClusterIP 10.100.136.90 <none> 80/TCP,443/TCP 29m
service/postgres ClusterIP 10.101.235.245 <none> 5432/TCP,9187/TCP 29m
service/rabbitmq ClusterIP 10.108.29.67 <none> 15672/TCP,5672/TCP 29m
service/redis ClusterIP 10.101.105.81 <none> 6379/TCP,9121/TCP 29m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/data-minio-0 Bound pvc-ca5c63bf-9aaa-4755-ad8f-35718f51decf 50Gi RWO openebs-hostpath 29m
persistentvolumeclaim/data-mongo-0 Bound pvc-03203801-e339-44ee-bfb4-b196808c7cc5 50Gi RWO openebs-hostpath 29m
persistentvolumeclaim/data-postgres-0 Bound pvc-e2f2593e-5869-420c-bd39-54ce01dfa63f 300Gi RWO openebs-hostpath 29m
persistentvolumeclaim/data-redis-0 Bound pvc-a8e4445c-c6b5-483b-8b18-9d650daf35cc 2Gi RWO openebs-hostpath 29m
persistentvolumeclaim/app-backend Bound pvc-2b2f9747-a020-4a16-9975-2491457c4032 10Gi RWO openebs-hostpath 29m 

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

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

相关文章

Element通过v-for循环渲染的form表单校验

需求&#xff1a;有个表单信息是v-for渲染的&#xff0c;例如下图&#xff0c;通过循环遍历实现新增和删除模块&#xff0c;按照平时的写法实现校验&#xff0c;是不能实现我们想要的效果&#xff0c;根据这个需求&#xff0c;我找到了一个解决方法 1.HTML <el-form ref&qu…

【抓包工具】whistle抓包工具分享

一、使用场景 抓包请求转发 二、基础篇 官网&#xff1a;http://wproxy.org/whistle/ github: https://github.com/avwo/whistle 简介&#xff1a; whistle(读音[ˈwɪsəl]&#xff0c;拼音[wēisǒu])基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Window…

React 之 Router - 路由详解

一、Router的基本使用 1. 安装react-router react-router会包含一些react-native的内容&#xff0c;web开发并不需要 npm install react-router-dom 2. 设置使用模式 BrowserRouter或HashRouter Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件Bro…

优化视频流:利用美颜SDK提升直播质量的方法

随着互联网的迅猛发展&#xff0c;视频直播已成为人们分享、交流和娱乐的重要方式。然而&#xff0c;在实际的直播过程中&#xff0c;视频画质可能受到诸多因素的影响&#xff0c;例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众&#xff0c;美颜技术逐渐成为…

8.18号transformer 系列文章阅读

文章目录 STGM: Spatio-Temporal Graph Mixformer for Traffic ForecastingAttention Is Not All You Need AnymoreLEARNING IMAGE DERAINING TRANSFORMER NETWORK WITH DYNAMIC DUAL SELF-ATTENTIONSST: A Simplified Swin Transformer-based Model for Taxi Destination Pred…

zookeeper安装配置采坑流程

安装 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz解压&#xff1a; tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz如下 bin目录下文件是可执行文件 conf目录文件是配置文件 修改zoo.cfg&#xff08;复制zoo_sample&#x…

python生成器有几种写法,python生成器函数例子

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python生成器有几种写法&#xff0c;python生成器函数例子&#xff0c;今天让我们一起来看看吧&#xff01; 本文部分参考&#xff1a;Python迭代器&#xff0c;生成器–精华中的精华 https://www.cnblogs.com/deeper/p…

C#接化发:串口通信

文章目录 框架准备串口准备接、化、发测试 源码地址&#xff1a;C# 串口通信测试软件 框架准备 出于简单考虑&#xff0c;首先创建一个Winform项目&#xff0c;本文项目名称为portTest。 串口通信&#xff0c;至少有两个串口才能通信&#xff0c;所以拖动两个GroupBox&#…

Python 3 使用Hive 总结

启动HiveServer2 服务 HiveServer2 是一种可选的 Hive 内置服务&#xff0c;可以允许远程客户端使用不同编程语言向 Hive 提交请求并返回结果。 Thrift服务配置 假设我们已经成功安装了 Hive&#xff0c;如果没有安装&#xff0c;请参考&#xff1a;Hive 一文读懂 。在启动 H…

SAP后台表SE16和SE16N修改后台表数据方法

SAP后台表SE16和SE16N修改后台表数据方法 SAP中直接修改表、视图的Tcode有SE16N和SM30。 一 . SE16N界面输入&SAP_EDIT 其中使用SE16N修改表需要先输入命令&SAP_EDIT,回车左下角显示激活SAP编辑功能后&#xff0c;就可以对相应的表进行新增、删除、修改的操作。 有…

剑指offer44.数字序列中某一位的数字

最后一道题&#xff0c;我一定要自己做出来&#xff0c;想了不到一个小时想法差不多成熟了&#xff0c;但是有一个小细节出问题了&#xff0c;这个问题我在idea上debug都没debug出来。我先讲我的题解然后再讲我这个小问题出在哪里吧。以下是我的代码&#xff1a; class Soluti…

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化…

Mac m1芯片基于parallesls desktop安装Ubuntu

1.Ubuntu镜像下载 访问Ubuntu官网自行选择版本进行下载&#xff0c;可进行以下操作进行版本选择 对于Mac系统&#xff0c;不论VM/PD都需要用arm架构镜像&#xff0c;所以点击arm架构的镜像进行下载 2.准备PD PD安装包&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/46…

深入了解Maven

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用Maven可以简化依赖管…

FPGA GTP全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2组4套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP 接收接口GTP IP核调用和使用 4、设计思路框架HDMI输入视频配置及采集视频数据组包GTP aurora 8b/10b数据对齐视频数据解包图像…

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机&#xff0c;它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例&#xff0c;负载均衡器在接收到第一个来…

《HeadFirst设计模式(第二版)》第九章代码——组合模式

上一章链接&#xff1a; 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到&#xff0c;当一个菜单里面出现了子菜单的时候&#xff0c;前面的迭代器模式得换成组合模式。 组合模式&#xff1a; 允许将对象组合成树形结构来表现部分-整…

PyTorch训练深度卷积生成对抗网络DCGAN

文章目录 DCGAN介绍代码结果参考 DCGAN介绍 将CNN和GAN结合起来&#xff0c;把监督学习和无监督学习结合起来。具体解释可以参见 深度卷积对抗生成网络(DCGAN) DCGAN的生成器结构&#xff1a; 图片来源&#xff1a;https://arxiv.org/abs/1511.06434 代码 model.py impor…

跨境电商平台风控揭秘:如何应对刷单风险?

跨境电商平台内部对比被举报的买家信息时&#xff0c;会进行一系列分析来确认是否存在刷评行为。系统会追溯买家的购买记录和留评记录&#xff0c;根据留评率等信息来判断是否存在刷评的行为。如果系统确认买家存在刷评行为&#xff0c;那么该买家曾经留下的所有评价都有可能被…

我国出租车行业的发展伪历史(依赖倒置)

一、前言 既然是“伪历史”&#xff0c;大家就暂且不要纠结故事的真实性了&#xff0c;因为我们今天主要讲的并非是中国出租车的发展史&#xff0c;而是希望通过这个伪历史的例子来用日常生活中的例子&#xff0c;来深入理解一下什么叫依赖倒置。 还是按照惯例&#xff0c;我…