一、Helm概述

官网:https://v3.helm.sh/zh/docs/

https://helm.sh/ helm

官方的 chart 站点: https://hub.kubeapps.com/

Helm 是 kubernetes 的包管理工具,相当于 linux 环境下的 yum/apg-get 命令。

Helm 的首要目标一直是让“从零到 Kubernetes”变得轻松。无论是运维、开发人员、经验丰富的 DevOps 工程师,还是刚刚入门的学生,Helm 的目标是让大家在两分钟内就可以在 Kubernetes 上安装应用程序。

Helm 可以解决的问题:

  运维人员写好资源文件模板

  交给开发人员填写参数即可

Helm 中的一些概念:

(1)helm:命令行客户端工具,主要用于 Kubernetes 应用中的 chart 的创建、打包、发布和管理。

(2)Chart:helm 程序包,一系列用于描述 k8s 资源相关文件的集合,比方说我们部署 nginx,需要 deployment 的 yaml,需要 service 的 yaml,这两个清单文件就是一个 helm 程序包,在 k8s 中把这些 yaml 清单文件叫做 chart 图表。

  vlues.yaml 文件为模板中的文件赋值,可以实现我们自定义安装;

  如果是 chart 开发者需要自定义模板,如果是 chart 使用者只需要修改 values.yaml 即可

  repository:存放 chart 图表的仓库,提供部署 k8s 应用程序需要的那些 yaml 清单文件

  chart--->通过 values.yaml 这个文件赋值-->生成 release 实例

  helm 也是 go 语言开发的

(3)Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在 k8s 中创建出真实运行的资源对象

总结: helm 把 kubernetes 资源打包到一个 chart 中,制作并完成各个 chart 和 chart 本身依赖关系并利用 chart 仓库实现对外分发,而 helm 还可通过 values.yaml 文件完成可配置的发布,如果 chart 版本更新 了,helm 自动支持滚更更新机制,还可以一键回滚,但是不是适合在生产环境使用,除非具有定义自制 chart 的能力。

helm 属于 kubernetes 一个项目:

下载地址: https://github.com/helm/helm/releases

找 Linux amd64 这个 checksum 的,下载之后传到机器即可,目前 Helm 最新稳定版本是 3.6.3

二、Helm v3版本变化

helm v3版本相比v2版本的变化

2019 年 11 月 13 日,Helm 团队发布 Helmv3 的第一个稳定版本。

该版本主要变化如下:

架构变化:

  1、Helm 服务端 Tiller 被删除

  2、Release 名称可以在不同命名空间重用

  3、支持将 Chart 推送至 Docker 镜像仓库中

  4、使用 JSONSchema 验证 chartvalues

三、安装Helm v3

K8s 版本支持的各个 helm 版本对照表:https://helm.sh/zh/docs/topics/version_skew/

[root@master helm]# tar -xzvf helm-v3.6.3-linux-amd64.tar.gz
[root@master helm]# cp linux-amd64/helm /usr/bin/
# 不需要安装Tiller了

# 查看helm版本
[root@master helm]# helm version
version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"clean", GoVersion:"go1.16.5"}

# 第二种安装方法
[root@master ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
[root@master ~]# chmod 700 get_helm.sh
[root@master ~]# ./get_helm.sh

四、配置Chart仓库地址

配置国内存放chart仓库地址:

阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts)

官方仓库(https://hub.kubeapps.com/charts/incubator)官方 chart 仓库,国内可能无法访问。

微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐,基本上官网有的 chart 这里都有,国内可能无法访问。

# 添加阿里云的chart仓库
[root@master helm]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories # 添加bitnami的chart仓库
[root@master helm]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories # 更新chart仓库
[root@master helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈ #查看配置的 chart 仓库
[root@master helm]# helm repo list
NAME URL
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
bitnami https://charts.bitnami.com/bitnami # 删除chart 仓库命令
helm repo remove aliyun # 重新添加需要重新运行添加命令 # 从指定chart仓库地址搜索chart
[root@master helm]# helm search repo aliyun

五、Helm基本使用

5.1 搜索和下载Chart

#查看阿里云 chart 仓库中的 memcached
[root@master helm]# helm search repo aliyun | grep memcached
aliyun/mcrouter 0.1.0 0.36.0 Mcrouter is a memcached protocol router for sca...
aliyun/memcached 2.0.1 Free & open source, high-performance, distribut... # 查看chart信息
[root@master helm]# helm show chart aliyun/memcached
apiVersion: v1
description: Free & open source, high-performance, distributed memory object caching
system.
home: http://memcached.org/
icon: https://upload.wikimedia.org/wikipedia/en/thumb/2/27/Memcached.svg/1024px-Memcached.svg.png
keywords:
- memcached
- cache
maintainers:
- email: gtaylor@gc-taylor.com
name: Greg Taylor
name: memcached
sources:
- https://github.com/docker-library/memcached
version: 2.0.1 # 下载chart包到本地
[root@master helm]# helm pull aliyun/memcached
[root@master helm]# tar -xzvf memcached-2.0.1.tgz
[root@master helm]# cd memcache
[root@master memcached]# ls
Chart.yaml README.md templates values.yaml Chart.yaml: chart 的基本信息,包括版本名字之类
templates: 存放 k8s 的部署资源模板,通过渲染变量得到部署文件
values.yaml:存放全局变量,templates 下的文件可以调用
[root@master templates]# ls
_helpers.tpl NOTES.txt pdb.yaml statefulset.yaml svc.yaml _helpers.tpl 存放能够复用的模板
NOTES.txt 为用户提供一个关于 chart 部署后使用说明的文件

5.2 部署Chart

5.2.1 helm部署memcached服务

#1.导入镜像
[root@master helm]# docker load -i memcache_1_4_36.tar.gz
Loaded image: memcached:1.4.36-alpine # 2.修改 statefulset.yaml 文件
vim memcached/templates/statefulset.yaml
apiVersion: apps/v1
在spec下添加selector字段,标签内容和metadata.labels中内容相同
spec:
selector:
matchLabels:
app: {{ template "memcached.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
serviceName: {{ template "memcached.fullname" . }} # 3.删除 affinity 亲和性配置,测试不需要的 # 4. helm运行memcached
[root@master memcached]# helm install memcached ./
NAME: memcached
LAST DEPLOYED: Thu Sep 1 16:23:42 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Memcached can be accessed via port 11211 on the following DNS name from within your cluster:
memcached-memcached.default.svc.cluster.local If you'd like to test your instance, forward the port locally: export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 11211 In another tab, attempt to set a key: $ echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211 You should see: STORED # 4.验证memcache是否部署成功
[root@master memcached]# kubectl get pods
NAME READY STATUS RESTARTS AGE
memcached-memcached-0 1/1 Running 0 2m23s
memcached-memcached-1 1/1 Running 0 79s
memcached-memcached-2 1/1 Running 0 68s
[root@master memcached]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
memcached-memcached ClusterIP None <none> 11211/TCP 3m22s #5.测试:上面安装完成后提供了测试方法
[root@master memcached]# yum install nc -y
[root@master memcached]# export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached-memcached" -o jsonpath="{.items[0].metadata.name}")
[root@master memcached]# kubectl port-forward $POD_NAME 11211
Forwarding from 127.0.0.1:11211 -> 11211
Forwarding from [::1]:11211 -> 11211
# 新开一个窗口
[root@master ~]# echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211
STORED

5.3 release相关操作

# 查看release状态
[root@master ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
memcached default 1 2022-09-01 16:23:42.635363066 +0800 CST deployed memcached-2.0.1 # 删除release
[root@master ~]# helm delete memcached
release "memcached" uninstalled
[root@master ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION # 删除release会把release下对应的资源也删除
[root@master ~]# kubectl get pods
No resources found in default namespace.

六、自定义Chart图表

6.1 自定义一个chart

# 1.创建一个chart模板
[root@master helm]# helm create myapp
Creating myapp
[root@master helm]# tree myapp/
myapp/
├── charts #用于存放所依赖的子 chart
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates #模板目录,保留创建 k8s 的资源清单文件
│   ├── deployment.yaml #deployment 资源的 go 模板文件
│   ├── _helpers.tpl # 模板助手文件,定义的值可在模板中使用
│   ├── hpa.yaml #水平 pod 自动扩缩容 go 模板文件
│   ├── ingress.yaml #七层代理 go 模板文件
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml #service 的 go 模板文件
│   └── tests
│   └── test-connection.yaml
└── values.yaml #模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件 3 directories, 10 files

6.2 Chart.yaml编写规则

[root@master myapp]# cat Chart.yaml | grep -v "^$" | grep -v "^#"
apiVersion: v2
name: myapp
description: A Helm chart for Kubernetes
maintainer:
- name: simon
wechat: simonxiong
type: application
version: 0.0.1
appVersion: "1.16.0" # 可以删除

解释说明:

Chart.yaml 文件主要用来描述对应 chart 的相关属性信息,其中 apiVersion 字段用于描述对 应 chart 使用的 api 版本,默认是 v2 版本;

name 字段用于描述对应 chart 的名称;

description 字段用 于描述对应 chart 的说明简介;

type 字段用户描述对应 chart 是应用程序还是库文件,应用程序类型的 chart,它可以运行为一个 release,但库类型的 chart 不能运行为 release,它只能作为依赖被 application 类型的 chart 所使用;

version 字段用于描述对应 chart 版本;

appVersion 字段用于描述对应 chart 内部程序的版本信息;

6.3 go模板文件渲染

[root@master myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }} # nindent 4 首行缩进4个字母
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "myapp.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "myapp.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

解释·:

该部署清单模板文件,主要用 go 模板语言来写的,其中{{ include "myapp.fullname" . }}就表 示取 myapp 的全名;

{{ .Values.image.repository }}这段代码表示读取当前目录下的 values 文件中的 image.repository 字段的值;

{{ .Values.image.tag | default .Chart.AppVersion }}表示对于 values 文件中 image.tag 的值或者读取 default.chart 文件中的 AppVersion 字段的值;

简单讲 go 模板就是应用 对应 go 模板语法来定义关属性的的值;

一般都是从 values.yaml 文件中加载对应字段的值作为模板文件 相关属性的值。

nindent 4:表示首行缩进 4 个字母

TRUNC(NUMBER)表示截断数字

6.4 values.yaml文件编写

[root@master myapp]# cat values.yaml
# Default values for myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates. replicaCount: 1 image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "latest" # 可以指定版本 imagePullSecrets: []
nameOverride: ""
fullnameOverride: "" serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: "" podAnnotations: {} podSecurityContext: {}
# fsGroup: 2000 securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000 service:
type: ClusterIP
port: 80 ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80 nodeSelector: {} tolerations: [] affinity: {}

解释:

比如我们要引用 values.yaml 文件中的 image 字段下的 tag 字段的值,我们可以在模板文件中写成 {{ .Values.image.tag }};

如果在命令行使用--set 选项来应用我们可以写成 image.tag;

修改对应的值可以直接编辑对应 values.yaml 文件中对应字段的值,也可以直接使用--set 指定对应字段的对应值即可;

默认情况在命令行使用--set 选项给出的值,都会直接被替换,没有给定的值,默认还是使用 values.yaml 文件中给定的默认值;

6.5 部署release

[root@master myapp]# helm install myapp .
NAME: myapp
LAST DEPLOYED: Thu Sep 1 16:57:38 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES: # 测试方法
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT [root@master myapp]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 1/1 1 1 59s
[root@master myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp ClusterIP 10.108.29.46 <none> 80/TCP 100s
[root@master myapp]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-86bdd79db4-vdc4p 1/1 Running 0 2m [root@master myapp]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 1 2022-09-01 16:57:38.17020489 +0800 CST deployed myapp-0.0.1 1.16.0

七、 helm 常用命令演示

7.1 检查values语法格式

# 查看语法是否正确
[root@master myapp]# helm lint /root/helm/myapp/
==> Linting /root/helm/myapp/
[INFO] Chart.yaml: icon is recommended 1 chart(s) linted, 0 chart(s) failed

7.2 upgrade升级release

[root@master myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp ClusterIP 10.108.29.46 <none> 80/TCP 6m44s [root@master myapp]# helm upgrade --set service.type="NodePort" myapp .
Release "myapp" has been upgraded. Happy Helming!
NAME: myapp
LAST DEPLOYED: Thu Sep 1 17:05:01 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT [root@master myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.108.29.46 <none> 80:31923/TCP 7m33s
#通过上面可以看到 Service 的 type 类型已经变成了 nodePort

7.3 回滚release

# 查看历史版本
[root@master myapp]# helm history myapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Thu Sep 1 16:57:38 2022 superseded myapp-0.0.1 1.16.0 Install complete
2 Thu Sep 1 17:05:01 2022 deployed myapp-0.0.1 1.16.0 Upgrade complete
# 回滚
[root@master myapp]# helm rollback myapp 1
Rollback was a success! Happy Helming! [root@master myapp]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp ClusterIP 10.108.29.46 <none> 80/TCP 10m [root@master myapp]# helm history myapp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Thu Sep 1 16:57:38 2022 superseded myapp-0.0.1 1.16.0 Install complete
2 Thu Sep 1 17:05:01 2022 superseded myapp-0.0.1 1.16.0 Upgrade complete
3 Thu Sep 1 17:07:48 2022 deployed myapp-0.0.1 1.16.0 Rollback to 1

7.4 打包Chart

[root@master myapp]# helm package /root/helm/myapp/
Successfully packaged chart and saved it to: /root/helm/myapp/myapp-0.0.1.tgz # 打包好后,可以运行到别的有helm的服务器上

7.5 操作release命令

--help 查看helm帮助命令

升级 release 版本
helm upgrade 回滚 release 版本
helm rollback 创建一个 release 实例
helm install 卸载 release
helm uninstall 查看历史版本
helm history

7.6 操作Chart命令

#检查 Chat 的语法
helm lint chart 相关的
查看 chart 的详细信息
helm inspect 把 chart 下载下来
helm pull 把 chart 打包
helm package

K8s包管理工具Helm v3(19)的更多相关文章

  1. k8s包管理工具helm - 介绍和安装

    目录 1.Kubernetes 应用部署的挑战 2.Helm 是什么 3.Helm 组件及相关术语 4.Helm 工作原理 5.Helm 安装 5.1 客户端安装 5.2 安装服务端 Tiller 5 ...

  2. Kubernetes-17:Kubernets包管理工具—>Helm介绍与使用

    Kubernets包管理工具->Helm 什么是Helm? 我们都知道,Linux系统各发行版都有自己的包管理工具,比如Centos的YUM,再如Ubuntu的APT. Kubernetes也有 ...

  3. k8s的应用包管理工具helm的部署和使用

    1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...

  4. ASP.NET Core on K8S深入学习(10)K8S包管理器Helm

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Helm 1.1 为何需要Helm? 虽然K8S能够很好地组织和编排容 ...

  5. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  6. Kubernetes的包管理工具Helm的安装和使用

    1.源码安装 [root@master ~]# wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.0-linux-amd64 ...

  7. kubernetes包管理工具Helm安装

    helm官方建议使用tls,首先生成证书. openssl genrsa -out ca.key.pem openssl req -key ca.key.pem -new -x509 -days -s ...

  8. 容器编排系统K8s之包管理器Helm基础使用

    前文我们了解了k8s上的hpa资源的使用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14293237.html:今天我们来聊一下k8s包管理器helm的相 ...

  9. 使用 Helm 包管理工具简化 Kubernetes 应用部署

    当在 Kubernetes 中已经部署很多应用时,后续需要对每个应用的 yaml 文件进行维护操作,这个过程会变的很繁琐,我们可以使用 Helm 来简化这些工作.Helm 是 Kubernetes 的 ...

  10. Helm包管理工具(简介、安装、方法)

    认识Helm 每次我们要部署一个应用都需要写一个配置清单(维护一套yaml文件),但是每个环境又不一样.部署一套新的环境成本是真的很高.如果我们能够使用类似于yum的工具来安装我们的应用的话那就太好了 ...

随机推荐

  1. AMD、request.js,生词太多,傻傻搞不清

    前言 之前在公司用JS写前端页面,本来自己是一个写后端的,但是奈何人少,只能自己也去写了.但是自己对前端基本不懂,基本就是照着前人写的照着抄,反正大体意思是明白的,但是出现问题了,基本上也是吭哧吭哧好 ...

  2. 【Nginx】如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!

    写在前面 随着互联网的发展,很多公司和个人越来越重视网络的安全性,越来越多的公司采用HTTPS协议来代替了HTTP协议.为何说HTTPS协议比HTTP协议安全呢?小伙伴们自行百度吧!我就不说了.今天, ...

  3. 【Oracle】手动安装和卸载Oracle,这是最全的一篇了!!

    写在前面 之前写过一篇在CentOS 7/8上安装Oracle的文章,按照我写的文章安装成功了,但是卸载Oracle时出现了问题.今天,我就整理一篇手动安装和卸载Oracle的文章吧.全文为实战型内容 ...

  4. java中 YYYY与yyyy 区别

    大多数情况下格式日期都是用的SimpleDateFormat,比如说把一个日期格式成"yyyy-MM-dd"的形式. 对于年份来说,大写的Y和小写的y其意义是不同的. y 是Yea ...

  5. MySQL与Java JDBC数据类型对照

    MySQL数据类型 JAVA数据类型 JDBC TYPE BIGINT Long BIGINT TINYINT Byte TINYINT SMALLINT Short SMALLINT MEDIUMI ...

  6. FPGA中的速度优化

    FPGA中的速度优化 一.逻辑设计中的速度概念 逻辑设计速度相关的概念有三个:设计吞吐量.设计延时和设计时序.速度优化策略而言,吞吐量需要提高,延时应该降低,时序应该收敛(时序余量slave越大,收敛 ...

  7. matlab的基本操作

    matlab的基本操作 1.写在前面 最近在处理一些作业时用到了matlab,发现以前学习的语句已经忘得差不多了.现在找到以前的学习资料,重新复习一下.顺便总结一下知识点,以免下一次使用时又忘记了而又 ...

  8. KingbaseES V8R3 集群运维案例 -- cluster.log无日志输出问题诊断

    案例说明: KingbaseES V8R3集群正常运行期间,现场发现cluster.log日志无任何信息输出,针对这一问题做了复现及提出解决方案.后现场检查发现,cluster.log文件曾被删除: ...

  9. KingbaseES中truncate和oracle中truncate区别

    truncate命令在KingbaseES中本质上区别于oracle.因为oracle中,数据文件datafile可以被表所共享,每张表被分配各自的连续的extents.而在KingbaseES中,数 ...

  10. #容斥#51nod 1407 与与与与

    题目 给出 \(n\) 个数,问有多少个子集的按位与为0 分析 考虑容斥,设 \(f[i]\) 表示有多少个数按位与为 \(x\),满足 \(x\&i=i\) 那么答案就是 \(\sum_{i ...