服务 - 容器化,可伸缩,架构部署
2025-03-04 17:19:41 13 举报
AI智能生成
容器:环境问题,镜像打包,容器问题,网络问题,高效封装 部署:弹性部署,分布式部署,有效做到高并发和高可用 应用架构设计,前后端的设计,数据库, 数据库的设计,分块分区,索引优化 docker,docker-compose,docker-swarm, kubernetes(k8s)
作者其他创作
大纲/内容
部署设计
使用docker容器
Docker 架构
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
镜像(Image):Docker Image就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小的文件系统。
容器(Container):Image 是静态的定义,Container是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Docker 安装
ubuntu
centos
systemctl
images
基础命令
docker build 创建容器
Dockerfile 文件来创建镜像
命令基本用法
构建镜像的基本语法
指定Dockerfile路径
指定镜像名称和标签
构建上下文路径
使用相对路径
使用绝对路径
构建过程中的输出信息
构建步骤的详细信息
构建过程中的警告信息
构建过程中的错误信息
构建成功后的提示信息
命令常用选项
--file选项
指定自定义Dockerfile路径
使用默认Dockerfile路径
多阶段构建中的Dockerfile
指定特定阶段的Dockerfile
--tag选项
为镜像指定名称和标签
多标签的指定方式
使用最新标签
自动生成最新标签
--build-arg选项
传递构建参数
默认参数的覆盖
多参数的传递方式
参数之间的依赖关系
--no-cache选项
禁用缓存构建
部分缓存的使用
缓存失效的场景
手动清除缓存
常见问题与解决方案
构建失败的原因分析
Dockerfile语法错误
依赖项缺失
网络连接问题
网络代理配置错误
镜像体积过大的问题
未使用多阶段构建
包含不必要的文件
未清理临时文件
临时文件的清理策略
构建速度慢的优化
缓存未有效利用
构建上下文过大
网络延迟问题
网络优化策略
镜像安全性问题
使用基础镜像的安全性
镜像中的漏洞扫描
镜像的签名与验证
签名验证的流程
docker commit 通过修改容器来创建镜像
-m 镜像信息 --author 作者信息
docker images 列出镜像
docker pull 拉取镜像
docker push 推送镜像
docker rmi 删除镜像
docker search 查找镜像
docker tag 为镜像打上新标签
docker history 查看镜像构建过程
docker save 命令将 Docker 镜像导出为一个 .tar 文件
docker save -o my-image.tar my-image:tag
-o my-image.tar: 指定输出文件名为 my-image.tar。
my-image:tag: 要导出的镜像名称和标签。
my-image:tag: 要导出的镜像名称和标签。
docker load 命令将 .tar 文件加载为 Docker 镜像
docker load -i /path/to/my-image.tar
构建参数
# 注释
FROM 指定基于哪个镜像
ENV 设置镜像构建过程中的环境变量
USER 指定容器以什么用户运行
MAINTAINER 指定作者信息
WORKDIR 指定工作目录
镜像创建过程中RUN的工作目录
ADD 将文件复制到镜像中
如果添加的为本地的压缩文件,则docker会自动进行解压缩
COPY 类似与ADD,不同之处在于不会做解压工作
RUN 执行命令构建镜像层
EXPOSE 指定容器将对外公开的端口
CMD 指定容器启动时要运行的命令 (只能指定一条CMD指令)
ENTRYPOINT 接收容器创建是传递过来的参数
可以与CMD命令合起来用,来设置默认参数
VOLUME 挂载目录
ONBUILD 镜像触发器
只在直接子镜像中触发
ARG 指定一个变量,在构建期间可以使用
docker build 参数 -build-arg 可以指定变量值
containers
docker run 创建一个容器
-it 创建一个可交互的shell
-d 放到后台运行
-p 容器和宿主机之间的端口映射
-w 覆盖指定的工作目录
-e 设置环境变量,只在运行时有效
-u 指定容器以什么用户运行
--network 设置网络
--restart 设置容器是否自动重启
--name xxx 容器命名
docker rm 删除容器
容器匹配删除 docker rm `docker ps -a | grep [0-9a-z] | awk '{print $1}'`
docker ps 列出容器列表
-a 列出所有容器
-q 只列出容器ID
docker logs 查看容器日志
-f 监听实时日志
-t 显示时间
docker start 启动容器
docker stop 停止容器
docker inspect 查看容器详细信息
--format 查看具体配置
docker attach 重新附着到容器
docker exec 在容器内部运行进程
Ctrl+P/Q 退出不关闭容器
network
docker网络有四种类型 - bridge模式, host模式, none模式, container模式
docker network ls - 列出网络
docker network inspect 网络名 - 显示网络信息
docker network create -d 网络类型 网络名 - 创建网络
docker network connect 网络名 容器名 - 将容器添加到网络
docker network disconnect 网络名 容器名 - 将容器移出网络
docker network rm - 删除网络
Docker 操作技巧
加入docker组
sudo gpasswd -a ${USER} docker
国内镜像仓库加速站
Daocloud http://hub.daocloud.io/
时速云 https://hub.tenxcloud.com/
阿里云 https://dev.aliyun.com/
容器、镜像删除
容器批量删除 docker rm $(docker ps -a | grep "none" | awk '{print $1}')
镜像批量删除 docker rmi $(docker images | grep "none" | awk '{print $3}')
所有容器删除 docker rm $(docker ps -a -q)
容器IP地址查看
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
docker 导入导出
操作容器
docker export 容器ID > 文件.tar
docker import 文件.tar 镜像名
操作镜像
docker save 镜像ID -o /path/文件.tar
docker load -i 文件.tar
docker 瘦身
https://www.cnblogs.com/e2tox/p/4027756.html
http://www.dockerinfo.net/3328.html
docker 挂载
挂载目录无法访问时,添加参数 --privileged=true
挂载目录失败 https://blog.csdn.net/rznice/article/details/52170085
使用docker-compose编排
introduction
python YML 定义和运行多个容器的工具
https://www.cnblogs.com/Yuanbangchen/p/16892589.html
https://blog.csdn.net/liguangxianbin/article/details/79556008
command
build #从docker-compose 构建(重新构建)项目中的服务容器
bundle #从当前 docker compose 文件生成一个以当前目录为名称的从 Compose 文件生成一个分布式应用程序捆绑包(DAB)
config #查看当前配置,没有错误不输出任何信息
create #创建服务
down #停止并删除容器、网络、图像和卷
events #从容器接收实时事件,可以指定 json 日志格式,如 docker-compose events --json
exec #进入指定容器进行操作
help #获取有关命令的帮助
images #显示当前服务器的 docker 镜像信息
kill #强制终止运行中的容器
logs #查看容器的日志
pause #暂停服务
port #打印端口绑定的公共端口
ps #列出容器
pull #拉取服务映像
push #推送服务映像
restart #重新启动服务
rm #删除停止的容器
run #运行一次性命令,等于 docker run --rm
scale #设置指定服务运行的容器个数 docker-compose scale nginx=2
start #启动服务
stop #停止服务
top #显示正在运行的进程
unpause #取消暂停服务
up #创建和启动容器(使用新的配置文件)
version #显示Docker Compose版本信息
bundle #从当前 docker compose 文件生成一个以当前目录为名称的从 Compose 文件生成一个分布式应用程序捆绑包(DAB)
config #查看当前配置,没有错误不输出任何信息
create #创建服务
down #停止并删除容器、网络、图像和卷
events #从容器接收实时事件,可以指定 json 日志格式,如 docker-compose events --json
exec #进入指定容器进行操作
help #获取有关命令的帮助
images #显示当前服务器的 docker 镜像信息
kill #强制终止运行中的容器
logs #查看容器的日志
pause #暂停服务
port #打印端口绑定的公共端口
ps #列出容器
pull #拉取服务映像
push #推送服务映像
restart #重新启动服务
rm #删除停止的容器
run #运行一次性命令,等于 docker run --rm
scale #设置指定服务运行的容器个数 docker-compose scale nginx=2
start #启动服务
stop #停止服务
top #显示正在运行的进程
unpause #取消暂停服务
up #创建和启动容器(使用新的配置文件)
version #显示Docker Compose版本信息
docker-compose -f
version
services
image 指定镜像名
container_name 指定容器名
depends_on 指定依赖的容器
ports 端口
volumes 挂载
env_file *.env 指定环境变量文件
environment 环境变量配置
expose 指定暴露的端口
external_links 连接外部容器
links 连接内部容器
extra_hosts 添加host
networks 指定网络
restart 是否重启
command 指定容器启动后的默认执行命令
entrypoint 容器启动后执行的命令
networks
使用docker swarm编排
introduction
Docker Swarm 和 Docker Compose 一样都是 Docker 官方容器编排项目。但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
https://www.cnblogs.com/xishuai/p/docker-swarm.html
frame
manager
docker swarm init --advertise-addr
docker swarm join-token manager
node
docker swarm join
docker swarm join-token worker
docker-machine 常用命令
docker-machine create 创建一个 Docker 主机(常用-d virtualbox)
docker-machine ls 查看所有的 Docker 主机
docker-machine ssh SSH 到主机上执行命令
docker-machine env 显示连接到某个主机需要的环境变量
docker-machine inspect 输出主机更多信息
docker-machine kill 停止某个主机
docker-machine restart 重启某台主机
docker-machine rm 删除某台主机
docker-machine scp 在主机之间复制文件
docker-machine start 启动一个主机
docker-machine status 查看主机状态
docker-machine stop 停止一个主机
docker-machine ls 查看所有的 Docker 主机
docker-machine ssh SSH 到主机上执行命令
docker-machine env 显示连接到某个主机需要的环境变量
docker-machine inspect 输出主机更多信息
docker-machine kill 停止某个主机
docker-machine restart 重启某台主机
docker-machine rm 删除某台主机
docker-machine scp 在主机之间复制文件
docker-machine start 启动一个主机
docker-machine status 查看主机状态
docker-machine stop 停止一个主机
docker node 常用命令
docker node ls 查看所有集群节点
docker node rm 删除某个节点(-f强制删除)
docker node inspect 查看节点详情
docker node demote 节点降级,由管理节点降级为工作节点
docker node promote 节点升级,由工作节点升级为管理节点
docker node update 更新节点
docker node ps 查看节点中的 Task 任务
docker node rm 删除某个节点(-f强制删除)
docker node inspect 查看节点详情
docker node demote 节点降级,由管理节点降级为工作节点
docker node promote 节点升级,由工作节点升级为管理节点
docker node update 更新节点
docker node ps 查看节点中的 Task 任务
docker service 常用命令
docker service create 部署服务
docker service inspect 查看服务详情
docker service logs 产看某个服务日志
docker service ls 查看所有服务详情
docker service rm 删除某个服务(-f强制删除)
docker service scale 设置某个服务个数
docker service update 更新某个服务
docker service inspect 查看服务详情
docker service logs 产看某个服务日志
docker service ls 查看所有服务详情
docker service rm 删除某个服务(-f强制删除)
docker service scale 设置某个服务个数
docker service update 更新某个服务
docker stack 常用命令
docker stack deploy 部署新的堆栈或更新现有堆栈
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除堆栈
docker stack services 列出堆栈中的服务
docker stack down 移除某个堆栈(不会删除数据)
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除堆栈
docker stack services 列出堆栈中的服务
docker stack down 移除某个堆栈(不会删除数据)
使用kubernetes编排
架构
Master
图示
API 服务
Kubernetes控制面的中心组件,所有的操作都通过API服务器进行交互。它提供了RESTful API,允许管理员和开发人员与Kubernetes集群进行通信。
Informer 通知
Admission Plugin 权限控制插件
RBAC plugin 基于角色的访问控制
Custom Resource Defintion 自定义对象
APIServer aggregator
Controller 控制管理器
控制器管理器(Controller Manager):运行一系列控制器,用于确保集群中的期望状态与实际状态一致,例如ReplicaSet、Deployment、Namespace等。
云控制器管理器(Cloud Controller Manager):与特定云平台集成的控制器,用于管理云资源,如负载均衡器、块存储卷等。
Scheduler 调度
负责监视新创建的Pod,并将它们分配到集群中的工作节点上,根据资源需求、亲和性和反亲和性规则等因素进行智能调度。
Scheduling algorithm
Scheduler extendder
Etcd
一个分布式键值存储系统,用于存储集群的配置信息、状态和元数据。
Nodes
图示
container
Kubernetes支持多种容器运行时,如docker、containerd等来用于实际运行容器。
pod
最小的可部署单元,通常包含一个或多个容器,它们共享相同的网络命名空间和存储卷。Pod可以被水平扩展,但其IP地址是临时分配的。
kube-proxy
Kube Proxy负责维护工作节点上的网络规则,实现服务的负载均衡、服务发现,负载均衡,代理请求到正确的Pod。
Kube Proxy使用iptables规则或其他网络技术来实现这些功能,确保Pod之间和外部的通信正常。
kubelet
在每个工作节点上运行,负责与Master节点通信,并确保Pod按照期望状态运行。它会监视Pod的生命周期,启动、停止和删除容器。
系统命令
1. kubectl create:创建资源对象
2. kubectl apply:应用配置文件
3. kubectl delete:删除资源对象
4. kubectl get:查看资源对象
5. kubectl describe:查看资源对象的详细信息
6. kubectl edit:编辑资源对象的配置信息
7. kubectl logs:查看容器日志
8. kubectl exec:在容器中执行命令
9. kubectl port-forward:将容器中的端口映射到本地端口
10. kubectl rollout:管理应用的多个版本之间的变更
11. kubectl scale:调整部署的副本数
12. kubectl label:给资源对象添加标签
13. kubectl annotate:给资源对象添加注释
14. kubectl config:管理Kubernetes集群的配置
15. kubectl cluster-info:查看Kubernetes集群的信息
16. kubectl version:查看Kubernetes版本信息。
2. kubectl apply:应用配置文件
3. kubectl delete:删除资源对象
4. kubectl get:查看资源对象
5. kubectl describe:查看资源对象的详细信息
6. kubectl edit:编辑资源对象的配置信息
7. kubectl logs:查看容器日志
8. kubectl exec:在容器中执行命令
9. kubectl port-forward:将容器中的端口映射到本地端口
10. kubectl rollout:管理应用的多个版本之间的变更
11. kubectl scale:调整部署的副本数
12. kubectl label:给资源对象添加标签
13. kubectl annotate:给资源对象添加注释
14. kubectl config:管理Kubernetes集群的配置
15. kubectl cluster-info:查看Kubernetes集群的信息
16. kubectl version:查看Kubernetes版本信息。
查询命令
1. 查看集群中运行的所有节点:
kubectl get nodes
2. 查看集群中的所有命名空间:
kubectl get namespaces
3. 查看某个特定命名空间中运行的所有Pod:
kubectl get pods -n <namespace>
4. 查看某个特定Pod的详细信息:
kubectl describe pod <pod-name> -n <namespace>
5. 查看某个特定Pod的日志:
kubectl logs <pod-name> -n <namespace>
6. 查看集群中运行的所有服务:
kubectl get services
7. 查看某个特定服务的详细信息:
kubectl describe service <service-name>
8. 查看集群中运行的所有部署:
kubectl get deployments
kubectl get nodes
2. 查看集群中的所有命名空间:
kubectl get namespaces
3. 查看某个特定命名空间中运行的所有Pod:
kubectl get pods -n <namespace>
4. 查看某个特定Pod的详细信息:
kubectl describe pod <pod-name> -n <namespace>
5. 查看某个特定Pod的日志:
kubectl logs <pod-name> -n <namespace>
6. 查看集群中运行的所有服务:
kubectl get services
7. 查看某个特定服务的详细信息:
kubectl describe service <service-name>
8. 查看集群中运行的所有部署:
kubectl get deployments
runtime 运行时
CRI(Container Runtime Interface) 容器运行时接口
运行时插件
Networking 网络
CNI(Container Network Interface)容器网络接口
Linux Network Namespace
Networking plugins
Storage 存储
CSI(Container Storage Interface) 容器存储接口
Persistent Volume
Volume plugins
Service
用于暴露一组Pod的稳定网络终结点,可以实现负载均衡。Service通过标签选择器将流量路由到相应的Pod。
Volume
用于在Pod中提供持久性存储,可以与容器共享数据。Kubernetes支持各种存储后端,如本地存储、网络存储、云存储等。
Namespace
用于对集群资源进行逻辑隔离,不同的Namespace之间可以有不同的资源配额、访问控制策略和命名空间范围的对象。
搭建
基于官方kubeadm搭建Kubernetes集群
步骤:
1. 在所有节点上安装Docker(或其他容器运行时软件)和kubeadm、kubelet、kubectl等Kubernetes组件。
2. 在Master节点上执行`kubeadm init`命令来初始化Master节点。
3. 根据命令行输出的引导指示,将kubectl的配置文件拷贝到合适的位置,并配置环境变量。
4. 在其他节点上执行`kubeadm join`命令,将它们加入到Kubernetes集群。
5. 在Master节点上执行`kubectl get nodes`命令来验证节点是否成功加入集群。
1. 在所有节点上安装Docker(或其他容器运行时软件)和kubeadm、kubelet、kubectl等Kubernetes组件。
2. 在Master节点上执行`kubeadm init`命令来初始化Master节点。
3. 根据命令行输出的引导指示,将kubectl的配置文件拷贝到合适的位置,并配置环境变量。
4. 在其他节点上执行`kubeadm join`命令,将它们加入到Kubernetes集群。
5. 在Master节点上执行`kubectl get nodes`命令来验证节点是否成功加入集群。
注意事项:
1. 在部署节点上确保正确的网络配置,确保节点之间可以互相通信。
2. 确保在初始化Master节点时正确配置了网络插件,例如Calico、Flannel等。
3. 在加入节点时确保使用了与Master节点相同的版本的Kubernetes组件。
1. 在部署节点上确保正确的网络配置,确保节点之间可以互相通信。
2. 确保在初始化Master节点时正确配置了网络插件,例如Calico、Flannel等。
3. 在加入节点时确保使用了与Master节点相同的版本的Kubernetes组件。
使用云厂商服务搭建Kubernetes集群
步骤:
1. 选择一个公有云提供商,例如AWS、Azure、Google Cloud等,进入其Kubernetes托管服务的控制台。
2. 创建一个新的Kubernetes集群,并指定所需的配置,如节点数量、实例类型、网络配置等。
3. 根据提供商的指导,等待集群创建完毕,并获取集群的访问凭证。
4. 配置本地的kubectl工具,使用上一步获取的访问凭证连接到托管的Kubernetes集群。
5. 使用kubectl命令验证集群是否正常工作。
1. 选择一个公有云提供商,例如AWS、Azure、Google Cloud等,进入其Kubernetes托管服务的控制台。
2. 创建一个新的Kubernetes集群,并指定所需的配置,如节点数量、实例类型、网络配置等。
3. 根据提供商的指导,等待集群创建完毕,并获取集群的访问凭证。
4. 配置本地的kubectl工具,使用上一步获取的访问凭证连接到托管的Kubernetes集群。
5. 使用kubectl命令验证集群是否正常工作。
注意事项:
1. 按照所选云服务提供商的要求,确保正确配置网络、存储、安全组等相关资源。
2. 理解云服务提供商的计费模式,并合理规划资源的使用,以避免不必要的开销。
3. 在使用托管服务时,一些高级功能可能受到限制,需要与提供商了解相关限制和约束。
1. 按照所选云服务提供商的要求,确保正确配置网络、存储、安全组等相关资源。
2. 理解云服务提供商的计费模式,并合理规划资源的使用,以避免不必要的开销。
3. 在使用托管服务时,一些高级功能可能受到限制,需要与提供商了解相关限制和约束。
Minikube(用于本地开发和测试)
步骤:
安装 kubectl:
安装kubectl,Kubernetes的命令行工具:
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt install kubectl
安装 Docker:
如果尚未安装Docker,您可以使用以下命令安装Docker:
sudo apt install docker.io
sudo systemctl enable docker
sudo systemctl start docker
安装 Minikube:下载和安装Minikube二进制文件:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
安装 kubectl:
安装kubectl,Kubernetes的命令行工具:
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt install kubectl
安装 Docker:
如果尚未安装Docker,您可以使用以下命令安装Docker:
sudo apt install docker.io
sudo systemctl enable docker
sudo systemctl start docker
安装 Minikube:下载和安装Minikube二进制文件:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
注意事项:
安装虚拟化技术支持。
与在Ubuntu上一样,您需要确保虚拟化技术已启用。这可能需要在BIOS或UEFI设置中进行配置。
安装虚拟化技术支持。
与在Ubuntu上一样,您需要确保虚拟化技术已启用。这可能需要在BIOS或UEFI设置中进行配置。
应用配置
Pod
作业管理
Deployment
用于管理Pod副本集,提供滚动更新和回滚功能。自动处理Pod的创建、更新、删除等操作。
适用于大多数Web服务、API服务等无状态服务。
StatefulSet 有状态任务
用于有状态的应用,每个Pod都有唯一的标识符。有利于数据持久性和状态的维护。
适用于有状态的应用程序,如数据库(例如MySQL、PostgreSQL)
ReplicaSet
用于确保指定数量的Pod副本正在运行。是Deployment和StatefulSet的底层实现,通常不直接使用。
一般不直接使用,而是由高级控制器(如Deployment)来管理。
DaemonSet
确保在每个节点上运行一个Pod的副本。用于在集群的每个节点上运行守护进程。
适用于在每个节点上运行一些基础服务,如日志收集、监控等。
Job 一次性任务
用于运行一次性任务,确保任务成功完成。
重启策略
CronJob 定时任务
生命周期
Pending(悬决)
Running(运行中)
Succeeded(成功)
Failed(失败)
Unknown(未知)
容器状态
Waiting (等待)
Running(运行中)
Terminated(已终止)
容器重启策略
Always(默认值)
OnFailure
Never
容器探针
探测类型
livenessProbe
readinessProbe
startupProbe
检查机制
exec
grpc
httpGet
tcpSocket
Service 服务发现
服务类型
ClusterIP(默认)
NodePort
LoadBalancer
ExternalName
无头服务(Headless Services)
ConfigMap 应用配置管理
Ingress 7层负载
Secret 加密信息管理
网络策略(NetworkPolicy)
架构设计
数据库优化
数据库架构优化
数据库配置参数优化
mysql
innodb_buffer_pool_size
innodb_log_file_size
max_connections
log设置
数据库范式设计
第一范式(1NF):
定义: 数据表中的每一列都是不可再分的原子数据项。
应用场景: 1NF主要解决的是列的原子性问题,确保每一列都包含单一的值。这有助于防止数据的重复和混淆。应用场景包括基本的数据存储如学生信息表
定义: 数据表中的每一列都是不可再分的原子数据项。
应用场景: 1NF主要解决的是列的原子性问题,确保每一列都包含单一的值。这有助于防止数据的重复和混淆。应用场景包括基本的数据存储如学生信息表
第二范式(2NF):
定义: 数据表必须符合1NF,并且不存在部分依赖,即非主键属性完全依赖于主键。
应用场景: 2NF解决的是主键中包含多个字段的问题,确保非主键字段对整个主键的完全依赖。
定义: 数据表必须符合1NF,并且不存在部分依赖,即非主键属性完全依赖于主键。
应用场景: 2NF解决的是主键中包含多个字段的问题,确保非主键字段对整个主键的完全依赖。
第三范式(3NF):
定义: 数据表必须符合2NF,并且不存在传递依赖,即非主键属性不应该依赖于其他非主键属性。
应用场景: 3NF解决的是非主键属性之间的依赖关系问题,确保数据表中的每个非主键属性都直接依赖于主键。
定义: 数据表必须符合2NF,并且不存在传递依赖,即非主键属性不应该依赖于其他非主键属性。
应用场景: 3NF解决的是非主键属性之间的依赖关系问题,确保数据表中的每个非主键属性都直接依赖于主键。
数据表结构优化
垂直拆分
热数据,冷数据,分区数据
水平拆分
年报归档,失效数据
遵循范式
合理使用范式规范,1NF能减少数据冗余和混淆,2NF能保证数据列数据的有效性
冗余字段
标记字段,计数字段
如一个style下有多少sku,动态变化,查询比增删多
ORM优化
生产环境优化配置
关闭sql显示和追踪变化等 -- 'SQLALCHEMY_ECHO','SQLALCHEMY_TRACK_MODIFICATIONS'
合理使用存储过程
有资源的时候跑异步任务
合理使用框架触发器
联动计算,空间换取效率
合理使用模型类字段关联
一对一
冷热数据
一对多
小表驱动大表
多对多
主表驱动详情表
部分使用原生sql替换复杂语句
复杂的查询往往语法比较复杂 (可以使用原生sql替换)
更新和删除基于过滤条件
一条语句被网络IO影响程度低, 执行效率更高
事务有保证
索引优化
唯一键
查询的标识
约束需求,避免冗余
而唯一键则只要求值唯一,可以为空
普通索引
频繁查询,注意避免函数使用
大量写入,无效索引,注意删除维护
注意隐式类型
注意模糊匹配
使用limit能减少游标的移动
组合索引
左前原则,索引覆盖
使用覆盖索引,减少回表查询
(a,c,b)
建立组合索引的列不要为NULL
全文索引
对大文本字段进行高效的关键词搜索
show variables like '%ft%';
select * from people where match(name) against('aaa');
select * from people where match(name) against('aaa*' in boolean mode);
SQL优化
考虑:ORM优化/索引优化
后端程序优化
应用拆分
model模型拆分
view视图拆分
引入缓存机制
缓存穿透
缓存雪崩
缓存击穿
缓存的预热
缓存淘汰策略
缓存更新策略
提交RDB的数据事务后,删除缓存,设置较短的过期时间
提交RDB事务的前后都进行删除redis.del(key)操作,设定合理的间隔时间
读取binlog后分析,利用消息队列,推送更新各台的redis缓存数据
引入熔断组件
通过项目内部增加中间件(通用基类)控制的方式
通过外部增加API网关的方式
微服务拆分
引入服务注册/服务发现组件
同步服务
HTTP服务
异步服务
RPC服务
前端程序优化
功能模块拆分
功能拆分
打包拆分
代码优化
算法和编码优化
请求数量和请求类型优化
静态资源
压缩
异步
客户端:响应式
服务器:走CDN缓存
集成持续
git
pull
push
commit
log
git lfs
安装
apt/deb repos
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
yum/rpm repos
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
git lfs install
git lfs clone https://link_url

收藏

收藏
0 条评论
下一页