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