高并发系统设计总结
2020-09-22 21:40:02 3 举报
AI智能生成
高并发架构设计知识总结
作者其他创作
大纲/内容
数据库性能提升方案
池化技术
数据库连接池
最小连接数
最大连接数
线程池
coreThreadCount
最小连接数
maxThreadCount
最大连接数
子主题
使用注意事项
最大,最小连接数设置
任务队列
线程池,连接池的初始化
主从分离
一个是数据的拷贝,我们称为主从复制
执行流程
在主从分离的情况下,我们如何屏蔽主从分离带来的访问数据库方式的变化,让开发同
学像是在使用单一数据库一样
学像是在使用单一数据库一样
当从库比较多的情况下,主库上的IO线程比较多,这样导致主库资源消耗比较高,一般建议主库最多挂3~5个从库
存在的问题
主从可能存在数据暂时数据不一致的情况
主从数据同步延迟大概在毫秒级别
架构图
子主题
分库分表
背景
当单表的数据量超过千万,甚至上亿了
主从模式下,一旦主库出现宕机,系统不可用
单库的数量过大,造成系统磁盘无法存储
分库分表提升单机的读写性能
垂直拆分
业务相关性
水平拆分
拆分规则
以某些主键为维度采用hash或者取模的方式
以时间为范围分割方式
拆分之后对应的问题
单表多个过滤查询的问题
建立分区间与过滤字段的映射表
多表join问题
单库的时候多表的join通过一个sql可以完成,拆分之后无法跨库执行SQL
架构图
使用NOSQL
在存储选择方面考量的因素
提升存储读写性能
应对大数量量的存储需求
NOSQL
kv存储
Redis
LevelDB
列式存储
Cassandra
Hbase
文档型
MongoDB
CouchDB
优点
弥补了传统关系型数据库的不足
数据库变更方便,不需要更改原来的数据结构
倒排序
elasticsearch
SQL与NoSQL性能差异分析
关系型数据库虽然做了很多的优化,但是还是存在一定概率的随机IO
插入更新时由于采用B+树,存在随机IO
NoSQL采用基于 LSM 树的存储引擎
NoSQL特殊功能
在性能方面,NoSQL 数据库使用一些算法将对磁盘的随机写转换成顺序写,提升了写的
性能
性能
在某些场景下,比如全文搜索功能,关系型数据库并不能高效地支持,需要 NoSQL 数
据库的支持
据库的支持
在扩展性方面,NoSQL 数据库天生支持分布式,支持数据冗余和数据分片的特性
缓存提升系统性能
http缓存
机制
分布式缓存
缓存策略
cache aside
Read/Write Through(读穿 / 写穿)策略
Write Back(写回)策略
高可用
客户端方案
缓存分片
Hash 分片算法
增加节点时会导致原来的hash寻址失效
一致性 Hash 分片算法
将hash值空间组织一个既定的虚拟圆环,redis实力挂载这些虚拟节点上
中间代理层方案
codis
服务端方案
哨兵模式
Redis集群(Redis-Cluster)
Redis高可用方案
主从复制(Replication模式)
子主题
哨兵模式
Redis集群(Redis-Cluster)
缓存问题
缓存穿透
缓存雪崩
子主题
热点本地缓存
热点本地缓存主要部署在应用服务器的代码
中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。
中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。
CDN缓存
如何将用户的请求映射到 CDN 节点上
CDN的ip地址发生变化,怎么屏蔽这种变化
采用DNS解析来解决
DNS域名解析原理
如何根据用户的地理位置信息选择到比较近的节点。
GSLB
缓冲区
缓冲区则是一块临时存储数据的区域,这些数据后面会被传输到其他设备上
架构
静态缓存
缓存在web服务器上的内容
缓存的不足
首先,缓存比较适合于读多写少的业务场景,并且数据最好带有一定的热点属性
其次,缓存会给整体系统带来复杂度,并且会有数据不一致的风险
再次,之前提到缓存通常使用内存作为存储介质,但是内存并不是无限的
最后,缓存会给运维也带来一定的成本
数据迁移方案
数据迁移应该满足的几个目标
迁移应该是在线的迁移,也就是在迁移的同时还会有数据的写入
数据应该保证完整性,也就是说在迁移之后需要保证新的库和旧的库的数据是一致的
迁移的过程需要做到可以回滚,这样一旦迁移的过程中出现问题,可以立刻回滚到源
库,不会对系统的可用性造成影响
库,不会对系统的可用性造成影响
数据一致
回滚
双写方案
基于同步写新库和旧库方案
基于Canal的迁移方案
迁移上云需要注意减少跨网络的读操作
级联同步方案
数据迁移时如何预热缓存
Redis数据迁移
redis-shake
redis-check
rabbitmq数据迁移
元数据重建
Shovel
MySQL迁移
canal
分布式服务组件分析
RPC调用框架
注册中心
提供了服务地址的存储
当存储内容发生变化时,可以将变更的内容推送给客户端
感知服务变化
检测服务的异常
服务状态管理
服务发送心跳
注册中台主动检测
中间件
Zookeeper
Eureka
Consul
Nacos
负载均衡
代理类负载均衡
架构图
子主题
中间件
LVS
ngnix
haproxy
客服端负载均衡
架构图
中间件
常用注册中心就支持客服端负载均衡
Ribbon可以实现比较细粒度的客服端负载均衡
负载均衡策略
静态策略
也就是说负载均衡服务器在选择服务节点时,不会参考后端服务的实
际运行的状态。
际运行的状态。
轮询的策略
有权重的轮询策略
动态策略
也就是说负载均衡服务器会依据后端服务的一些负载特性,来决定要
选择哪一个服务节点
选择哪一个服务节点
故障点检测
ngnix检测方式
nginx_upstream_check_module
API网关
网关分类
按照所处位置分
入口网关
它提供客户端一个统一的接入地址
可以承担服务熔断,降级,流量控制和分流的服务治理功能
客户端的认证与授权
白名单机制
请求记录
出口网关
为系统对第三方系统的依赖提供统一的出口
第三方账号登录
第三方支付工具
第三方短信接入
目的对系统对外部API的调用做统一认证,授权,审计与访问控制
按照职责划分
流量网关
全局性流控;
日志统计
防止SQL注入
防止Web攻击
屏蔽工具扫描
黑白名单控制
业务网关
架构
WAF
网关中间件
Zuul1.0
同步阻塞 I/O 模型
Zuul2.0
I/O 多路复用的模型
Kong
Nginx 中运行的 Lua 程序
多机房部署
难点
跨机房间的数据延迟
延迟数据同城专线延迟1ms ~3ms
国内异地双机房之间的专线延迟会在 50ms 之内
定义
在不同的 IDC 机房中,部署多套服务,这些服务共享同一份业务数
据,并且都可以承接来自用户的流量。
据,并且都可以承接来自用户的流量。
解决方案
原则
减少跨机房之间RPC调用
避免跨机房的数据库和缓存访问
部署方案
同城双活
架构
异地多活
两个机房不能离得太近,不然难以达到容灾的目的
异地延迟比较大,数据写只能选择写本地机房
数据同步方案
主从复制
消息队列
架构
Service Mesh
微服务监控
监控分类
功能分类
延迟,响应时间
D:duration
通讯量,吞吐量
R:Request rate
错误
访问错误
业务错误
异常
E:error
饱和度
CPU利用率
内存使用率
磁盘使用率
缓存数据库的链接数等
汇总
子主题
指标型
日志
metric
数据采集
Agent
代码中埋点
日志采集
Apache flume
Fluentd
Filebeat
监控数据的处理与存储
解析数据格式,尤其是日志格式
对数据做一些聚合运算。
架构
监控展示
访问趋势报表
性能报表
资源报表
APM
全链路压测
注意事项
最好使用线上的数据和线上的环境
压力测试时不能使用模拟的请求,而是要使用线上的流量
不要从一台服务器发起流量,这样很容易达到这台服务器性能瓶颈,从而导致压力测试
的 QPS 上不去,最终影响压力测试的结果
的 QPS 上不去,最终影响压力测试的结果
如何搭建全链路压测平台
关键点
一点是流量的隔离
另一点是风险的控制
架构
子主题
流量构筑和生产模块
压测数据隔离模块
系统健康度检查和压测流量干预模块
压测流量构造模块
将正式的入口流量拷贝一份,经过清洗、过滤之后将数据存储起来,用于后续的压测环境上的流量回放
构造方式有
直接拷贝负载均衡服务器的访问日志
使用开源工具GoReplay
数据如何隔离
读取数据
针对不能压测的服务做mock
写入数据
为避免影响到系统的统计数据,推荐信息等,在压测时需要将这类统计针对性关闭
对于写MySQL,Redis等存储的数据,需要构造影子存储
放在不同的存储中
或者标识出来
配置管理
分布式系统配置管理对象
子主题
分布式配置中心
配置信息如何存储
变更推送如何实现
一种是轮询查询的方式;
怎么避免大量配置拉取时占用网络带宽,按变化来传输,对信息进行md5处理来辨别数据是否变化
一种是长连推送的方式
由服务端配置变化时,通知
如何保证配置中心高可用
客户端缓存配置数据
内存缓存
文件缓存
降级熔断限流
作用
避免局部问题导致全局不可用的情况发生
避免并发超预期导致系统不可用
隔离
降级
服务调用链过程中的雪崩问题
熔断
断路器模式
0 条评论
下一页