当前位置: 首页 > news >正文

基于helm的方式在k8s集群中部署gitlab - 部署(一)

文章目录

    • 1. 背景说明
    • 2. 你可以学到什么?
    • 3. 前置条件
    • 4. 安装docker服务(所有节点)
    • 5. 部署k8s集群
      • 5.1 系统配置(所有节点)
      • 5.2 安装kubelet组件(所有节点)
        • 5.2.1 编写kubelet源
        • 5.2.2 安装kubelet
        • 5.2.3 启动kubelet
      • 5.3 集群初始化(master节点)
      • 5.4 从节点加入到集群中
      • 5.5 安装k8s网络插件
      • 5.6 安装ingress网络
      • 5.7 配置StorageClass
    • 6. helm安装gitlab
      • 6.1 添加gitlab的helm源
      • 6.2 创建证书密钥
      • 6.3 创建集成smtp和ldap的密钥
      • 6.4 拉取并修改gitlab的values文件
      • 6.5 部署gilab
      • 6.6 修改gitlab-nginx-ingress
        • 方法1: 修改gitlab-nginx-ingress的暴露type(upgrade后会失效)
        • 方法2: 修改gitlab的values文件
      • 6.7 修改gitlab-shell的端口
    • 7. 部署runner
      • 7.1 部署nginx代理
      • 7.2 配置runner
      • 7.3 更新gitlab
      • 7.4 测试runner
    • 8. minio功能验证
    • 9. ldap功能验证

1. 背景说明

客户之前的gitlab服务在k8s集群中部署的,为了整合现有的硬件资源,计划将gitlab服务迁移到虚拟机上。

先在测试环境进行如下模拟操作:

  • 基于kubeadm部署一套k8s集群,在集群上部署gitlab服务;
  • 将数据备份到对象存储中;
  • 最终将数据恢复在另外一台gitlab单实例上,实现gitlab在k8s和单实例ominibus之前迁移的一个完整闭环。

2. 你可以学到什么?

  • k8s集群部署
  • K8s 暴露服务的类型
  • K8s storageclass、configmap、secret
  • helm部署gitlab(配置smtp、ldap、runner)
  • gitlab配置对象存储

3. 前置条件

  • helm 安装
  • K8s 集群版本 1.23 (两台 8C16G OS为7.9)
  • Docker 版本 20.10.23
  • 证书在阿里云上申请免费ssl证书即可或者通过let’s encry 申请免费的泛域名证书

4. 安装docker服务(所有节点)

参考 docker安装(二进制&yum)

5. 部署k8s集群

参考k8s1.15安装详细精华版

也可以通过如下命令快捷安装

5.1 系统配置(所有节点)

修改内核参数 - /etc/sysctl.conf

# 转发
net.ipv4.ip_forward = 1
# iptables网络
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#加在生效
sysctl -p 

5.2 安装kubelet组件(所有节点)

5.2.1 编写kubelet源

编辑/etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum repolist
5.2.2 安装kubelet
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
5.2.3 启动kubelet
# 启动
systemctl start kubelet.service
# 开启自启
systemctl enable kubelet.service

5.3 集群初始化(master节点)

主节点上执行如下命令

# 命令解析
kubeadm init  \
--apiserver-advertise-address=10.100.0.14  \ 										 # 通常为主节点的ip地址
--image-repository registry.aliyuncs.com/google_containers  \    # 指定基础镜像拉取的仓库
--kubernetes-version v1.23.0  \ 																 # 指定k8s的组件版本
--service-cidr=10.92.0.0/12  \ 																	 # k8s集群svc的子网
--pod-network-cidr=10.220.0.0/16  \ 														 # k8s集群pod的子网
--ignore-preflight-errors=all																		 # 忽略运行时的错误# 一条初始化命令如下:
kubeadm init  --apiserver-advertise-address=10.100.0.14  --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version v1.23.0  --service-cidr=10.92.0.0/12  --pod-network-cidr=10.220.0.0/16  --ignore-preflight-errors=all

5.4 从节点加入到集群中

从节点上执行如下命令

 kubeadm join 10.100.0.14:6443 \--token saleos.q26gm2rbtgrwvdla \--discovery-token-ca-cert-hash sha256:5058ac78bd8f7879e14bae262d359b2b499d55a2d54796e3d103a27208f06d93

5.5 安装k8s网络插件

# 参考 https://github.com/flannel-io/flannel#deploying-flannel-with-kubectl
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

5.6 安装ingress网络

# 参考 https://github.com/kubernetes/ingress-nginx/tree/controller-v1.1.1#support-versions-table
# 参考 https://github.com/kubernetes/ingress-nginx/blob/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
# 下载wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
# 如果有问题 可以下一下crd的网络和你的svc的crd一样即可,将LoadBalancer改成NodePort

5.7 配置StorageClass

参考 安装并配置StorageClass

6. helm安装gitlab

6.1 添加gitlab的helm源

# 添加helm源
helm repo add gitlab-jh https://charts.gitlab.cn
# 更新helm源
helm repo update 

6.2 创建证书密钥

# 创建gitlab服务运行的命名空间
kubectl create ns jihulab
# 创建证书sa(将证书上传到主节点机器上的某个目录下,然后切换到该目录即可)
kubectl create secret tls gitlab-jihulab-cn-ssl --cert=kube.bdeet.top.pem --key=kube.bdeet.top.key -n jihulab
kubectl create secret tls registry-jihulab-cn-ssl --cert=registry.bdeet.top.pem --key=registry.bdeet.top.key -n jihulab
kubectl create secret tls minio-jihulab-cn-ssl --cert=minio.bdeet.top.pem --key=minio.bdeet.top.key -n jihulab

6.3 创建集成smtp和ldap的密钥

kubectl create secret generic ldap-admin --from-literal=password='Jh@2022' -n jihulab
kubectl create secret generic smtp-gitlab --from-literal=password='wqfhqohixshrnnnh' -n jihulab

6.4 拉取并修改gitlab的values文件

拉取gitlab 15.8.0的charts,编辑values文件

...
...
## 域名配置hosts:	domain: bdeet.top	hostSuffix:	externalIP:	ssh:	gitlab:	name: kube.bdeet.top	https: true	minio:	name: minio.bdeet.top	https: true	registry:	name: registry.bdeet.top	https: true
...
...
## ldap集成ldap:	preventSignin: false	servers:	main:	label: 'LDAP'	host: '129.226.208.223'	port: 389	uid: 'uid'	bind_dn: 'cn=ldap,dc=wkx,dc=cn'	base: 'dc=wkx,dc=cn'	password:	secret: ldap-admin	key: password	encryption: 'plain'
...
...
## 配置邮箱       smtp:	enabled: true	address: smtp.gmail.com	port: 587	user_name: "kxw12108@gmail.com"	## https://docs.gitlab.com/charts/installation/secrets#smtp-password	password:	secret: "smtp-gitlab"	key: password	# domain:	authentication: "login"	starttls_auto: true	openssl_verify_mode: "peer"	pool: false	## https://docs.gitlab.com/charts/charts/globals#outgoing-email	## Email persona used in email sent by GitLab	email:	from: "kxw12108@gmail.com"	display_name: "GitLab Administrator"	reply_to: "kxw12108@gmail.com"	subject_suffix: "GitLab"	smime:	enabled: false	secretName: ""	keyName: "tls.key"	certName: "tls.crt"
...
...

6.5 部署gilab

# 创建gitlab运行的命名空间
kubectl create ns jihulab
# 安装gitlab
helm install  gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s  \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false  \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--values values.yaml -n jihulab

6.6 修改gitlab-nginx-ingress

方法1: 修改gitlab-nginx-ingress的暴露type(upgrade后会失效)
kubectl edit svc -n jihulab gitlab-nginx-ingress-controller
# 将type: LoadBalancer 改成 type: NodePort,保存退出后,会看到gitlab-shell
方法2: 修改gitlab的values文件
...
...
nginx-ingress:enabled: true......service:externalTrafficPolicy: "Local"type: "NodePort" # 添加ingress的svc的type......

问题说明

由于我们的自建k8s集群 gitlab的ingress的svc没有使用LoadBalancer而是NodePort,因为之前将minio、registry、gitlab的域名解析到该节点上后肯定是无法访问的,还必须需要在域名后添加nodeport的端口才可以。

kube.bdeet.top       			 --->        kube.bdeet.top:nodeport
registry.bdeet.top         --->        registry.bdeet.top:nodeport      
minio.bdeet.top            --->        minio.bdeet.top:nodeport

6.7 修改gitlab-shell的端口

由于将gitlab-nginx-ingress-controller的暴露端口的方式修改成了NodePort,因为ssh的端口也需要调整(查看下gitlab-nginx-ingress-controller ssh的暴露端口),否则会无法克隆。修改gitlab-shell

...
...
global:	shell:	port: 31475
...
...

更新gitlab

# 更新
helm upgrade gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s  \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false  \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--set nginx-ingress.service.type=NodePort \
--set global.shell.port=31475 \
--values values.yaml -n jihulab

7. 部署runner

这样的runner存在一个问题就是由于使用的是nodeport的暴露方式,因为runner中的gitlaburl需要加端口,同时在runner进行克隆的时候也需要加端口,因为在部署一个nginx,作为一个转发。

7.1 部署nginx代理

# 安装nginx
yum -y install nginx
# 配置nginx 
# cat /etc/nginx/nginx.conf
...
...server {listen       443 ssl http2;listen       [::]:443 ssl http2;server_name  kube.bdeet.top;ssl_certificate "/root/cert/kube.bdeet.top.pem";ssl_certificate_key "/root/cert/kube.bdeet.top.key";ssl_session_cache shared:SSL:1m;ssl_session_timeout  10m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {proxy_pass https://kube.bdeet.top:31501;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
...
...

7.2 配置runner

修改values文件

...
...runner:registrationToken:secret: gitlab-gitlab-runner-secret  # gitlab-runner的secret
...
...
gitlab-runner:install: truegitlabUrl: https://kube.bdeet.top  #修改gitlab的域名rbac:create: truerunners:privileged: true #开启特权locked: falseconfig: |[[runners]][runners.kubernetes]image = "ubuntu:18.04"{{- if .Values.global.minio.enabled }}[runners.cache]Type = "s3"Path = "gitlab-runner"Shared = true[runners.cache.s3]#ServerAddress = {{ include "gitlab-runner.cache-tpl.s3ServerAddress" . }}ServerAddress = "https://minio.bdeet.top:31501" #接入对象存储BucketName = "runner-cache"BucketLocation = "us-east-1"Insecure = false
...
...

7.3 更新gitlab

Upgrade 更新gitlab

helm upgrade gitlab gitlab-jh/gitlab \
--version 6.8.0 \
--timeout 600s  \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false  \
--set global.ingress.tls.enabled=true \
--set gitlab.webservice.ingress.tls.secretName=gitlab-jihulab-cn-ssl \
--set registry.ingress.tls.secretName=registry-jihulab-cn-ssl \
--set minio.ingress.tls.secretName=minio-jihulab-cn-ssl \
--set nginx-ingress.service.type=NodePort \
--set global.shell.port=31475 \
--values values.yaml -n jihulab

7.4 测试runner

gitlab上创建一个pipeline项目,然后commit提交后触发。
.gitlab-ci.yml文件如下

image: busybox:latestbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"build1:stage: buildscript:- echo "Do your build here"test1:stage: testscript:- echo "Do a test here"- echo "For example run a test suite"- echo 1 > index.htmlartifacts:paths:- index.htmltest2:stage: testscript:- echo "Do another parallel test here"- echo "For example run a lint test"deploy1:stage: deployscript:- echo "Do your deploy here"environment: production

可以发现minio上有artifacts文件(5/6/9 分别是job的artifacts文件、meta元数据、日志)
在这里插入图片描述
在这里插入图片描述## 8. 邮箱验证

可以验证项目创建、提交代码、pipeline测试、runner测试、minio测试

修改个人邮箱

在这里插入图片描述
设置通知 - 自定义全部勾选
在这里插入图片描述
运行pipeline
在这里插入图片描述

邮箱查看
在这里插入图片描述

8. minio功能验证

查看artifacts
在这里插入图片描述

9. ldap功能验证

查看用户属性
在这里插入图片描述
在这里插入图片描述

相关文章:

基于helm的方式在k8s集群中部署gitlab - 部署(一)

文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…...

flask web开发学习之初识flask(二)

文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…...

利用异或、取反、自增bypass_webshell_waf

目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件: function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…...

K8s Docker实践三

单主机创建多个node 在Mac桌面上部署多个Kubernetes节点可以使用Minikube工具。Minikube是一个轻量级的Kubernetes工具,它可以在单个主机上创建一个虚拟集群。以下是在Mac桌面上使用Minikube部署多个Kubernetes节点的步骤: 安装Minikube,运…...

记录 | pip加速配置

以下方法不仅适用于linux,也适用于mac 临时加速配置: pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib3.4.0其中可选源有: https://pypi.douban.com/simple http://mirrors.aliyun.com/pypi/sim…...

HarmonyOS开发—Arkts循环渲染(ForEach)深入运用详解【鸿蒙专栏-16】

文章目录 ArkTS ForEach接口详解与应用示例ForEach接口概述介绍接口描述参数说明键值生成规则默认规则组件创建规则首次渲染非首次渲染使用场景高级用法条件渲染逻辑LazyForEach的性能优化渲染结果预期ForEach的错误使用案例与性能降低渲染结果非预期渲染性能降低结语ArkTS For…...

uniapp挽留提示2.0

项目需求:有时候挽留的ui是全屏的,用page-container也可以。后来产品提了个问题,手机侧滑的时候没那么顺畅(就是一用侧滑,就显示出来,产品要的方案是如下图,emmm大概是这个意思) 后面…...

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽,只是可能性的一个子集。目的是描述基于Arm组件的SoC…...

[Linux] 正则表达式及grep和awk

一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…...

ssm+java车辆售后维护系统 springboot汽车保养养护管理系统+jsp

以前汽车维修人员只是在汽车运输行业中从事后勤保障工作,随着我国经济的发展,汽车维修行业已经从原来的从属部门发展成了如今的功能齐备的独立企业。这种结构的转变,给私营汽修企业和个体汽修企业的发展带来了契机,私营企业和个体维修企业的加入也带动了整个汽修行业的整体水平…...

HNU练习七 字符串编程题7. 机器人游戏

【问题描述】 有人建造了一些机器人,并且将他们放置在包含n个单元的一维网格上,一个长度为n的字符串s代表了他们的编排方式,字符串中的字符既可以是.,也可以是0~9之间的一个数字字符,字符.表示开始时在相应的单元上无机…...

【Linux】bash 终端指令

bash # 查看当前使用的shell $ echo $SHELL /bin/bash# 查看当前发行版可以使用的shell $ cat /etc/shells 或 chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh /bin/tcsh /bin/csh# 切换bash $ chsh -s /bin/bash# 切换zsh $ chsh -s /bin/zsh进程 $ ps aux | grep pwd w…...

基于SpringBoot高校心理教育辅导设计与实现

摘 要 随着Internet技术的发展,心理教育辅导系统应运而生,心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以,为了充分满足高校学生心理教育辅导的需求,特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…...

关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法

vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…...

5. 链表

内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势…...

OSI七层模型与TCP/IP四层模型的区别(计算机网络)

一、OSI七层网络模型 OSI 网络模型共有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。 应用层,负责给应用程序提供统一的接口;表示层,负责把数据转换成兼容另一个系统能识别的格式;会话…...

Other--什么是 CGI,FastCGI、asp、jsp

文章目录 1. 了解什么是动态网页2. 什么是 CGI2.1 CGI 概念2.2 CGI 功能2.3 CGI 作用2.4 CGI 分类2.5 CGI 程序的工作原理2.6 CGI 程序的特点2.7 CGI 程序的应用领域4. 什么是 FastCGI4.1 FastCGI 概念4.2 FastCGI 程序工作原理4.3 FastCGI 对进程的管理方式4.4 FastCGI 的特点…...

sql关联另一个表,update表的值

sql示例: update student_score ss set ss.names.name from student s where ss.codes.code 最常见的学生成绩表 student_score通过学生student_code关联学生信息表student 学生信息表(student): code name age gender 1001 …...

Python基础:JSON保存结构化数据(详解)

1. JSON概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生产。   虽然JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解…...

抑郁症日常如何调节?

抑郁症是一种常见的心理障碍,影响患者的情绪、思维和身体健康。以下是一些建议,帮助抑郁症患者进行日常调节: 保持积极心态:积极的心态是应对抑郁症的关键。尝试保持乐观、积极的态度,看待生活中的困难和挑战。尽管抑…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...