从0开始学架构-高性能架构模式

目录

存储高性能

关系型数据库

NoSql

缓存

计算高性能

单服务器高性能

集群高性能



存储高性能

关系型数据库

读写分离
一主多从,一主一从
主从复制延迟解决方案
1.写操作后的读操作指定发给数据库主服务器
2.读从机失败后再读一次主机
3.关键业务读写操作全部指向主机,非关键业务采用读写分离

分库分表
业务分库
join操作问题,事务问题,成本问题(分库后还需要备份机)
单库可以支持10W用户量级的业务

分表
垂直拆分
引入的复杂性体现在表操作的数量要增量原来一次操作现在需要多次

水平拆分
单表超过5000W行就必须分表
分表后需要路由,某条数据具体属于哪个切分后的子表,常见路由算法
1.范围路由,1-1W放到A表,1W-2W放到B表,分段一般在100W-2000W之间
2.Hash路由,分布均匀,但扩充新表很麻烦需要重分布
3.配置路由,增加一个路由表,由user_id找到对应的table_id,但会多一次查询甚至可能成为瓶颈

join操作,查询多个表后在业务或中间件层做合并
count操作,多个表count相加,增加记录数表
oderby操作,分别查询每个子表再进行汇总排序

实现方式
程序代码封装,TDDL
中间件封装,mysql-proxy,MySQL Router,奇虎360的Atlas

 

NoSql

  1. 关系型数据库存储的是行记录,无法存储数据结构
  2. 关系数据库的schema扩展很不方便
  3. 关系数据库再大数据场景下I/O较高
  4. 关系数据库的全文搜索功能比较弱

常见的NoSQL方案有

  • KV存储,解决关系数据库无法存储数据结构的问题,如Redis
  • 文档数据库,解决关系数据库强schema约束的问题,如MongoDB
  • 列式数据库,解决关系数据库大数据场景下的I/O问题,如HBase
  • 全文搜索引擎,解决关系数据库的全文搜索性能问题,如ElasticSearch

 

K-V存储

Redis不支持完整的ACID事务,只能保证隔离性和一致性
Redis的RDB持久化会丢数据,AOF最好的aways也会丢一条数据

 

文档数据库

为了解决关系数据库schema带来的问题,文档数据库应用而生,其特点是no-schema
可以存储和读取任意的数据,目前大部分文档数据库的数据格式是JSON
优势
1.新增字段简单
2.历史数据不会出错
3.可以很容易存储复杂数据
文档数据库的特点适合电商和游戏业务,因为冰箱和笔记本电脑的属性差异非常大
文档数据库缺点是不支持事务,无法实现join操作
电商网站中,可以用关系数据库存储商品库存信息,订单基础信息,用文档数据库存储商品详细信息

 

列式数据库

列式数据库是按照列来存储数据的数据库,与之对应的传统关系数据库被称为行式数据库
优势
1.业务同时读取多个列时效果高,因为这些列都是按行存储在一起的,一次磁盘操作就可以读取出来
2.能够一次性完成对一行中的多个列的写操作,保证了针对行数据写操作的元咨询和一致性
行存储压缩比为3:1或5:1,列数据库压缩比率为8:1到30:1


全文搜索引擎

数据库的缺陷
全文搜素的条件可以随意排列组合,如果通过索引来满足,则索引数量会非常多
全文搜索的模糊匹配方式,索引无法满足,只能用like查询,而like查询是整表扫描效率低

基本原理
倒排索引,建立单词到文档的索引

与数据库结合
为了让全文搜索引擎支持关系型数据库的全文搜索,需要做一些转换操作,即将关系型数据库转换为文档数据
ElasticSearch是分布式的文档存储方式,它能存储和检索复杂的数据结构--序列化成为JSON文档,以实时的方式
在ElasticSearch中,每个字段的所有数据都是默认被索引的,即每个字段都有为了快速检索设置的专用倒排序,而且不像其他多数的数据库,它能在相同的查询中使用所有倒排索引,并以惊人的速度返回结果

 

缓存

虽然能大幅度减轻存储系统的压力,但同时也带来了更多复杂性,架构设计如果没有针对缓存的复杂性进行处理,某些场景下甚至会导致整个系统崩溃

缓存穿透
指缓存没有发挥作用,业务查缓存没有结果于是再去存储系统中查询数据
1.存储数据不存在,如黑客攻击
2.存储数据生成耗费大量时间或资源,生成缓存耗时如果正好过期缓存就不起作用
  如爬虫去爬历史数据,这些数据是不被缓存的

缓存雪崩
指当缓冲失效后,引起系统性能继续下降的情况,解决方案
1.更新锁
2.后台更新
  设置缓存不过期,后台线程定时读取,但会有一段时间业务读不到数据情况
  消息队列通知,业务读不到数据后触发消息队列,后台线程更新缓存

缓存热点
对于特别热点的数据也会导致瓶颈
对于微博粉丝数量超过100W的人,发微博后会生产100份缓存,通过缓存的key里面加上编号进行区分,每次读取缓存时都随机读取其中某份缓存
 

 


计算高性能

单服务器高性能

  1. PPC process per connection
  2. prefork模式,预先创建若干进程
  3. TPC thread per connection
  4. prethread,线程池模式

I/O多路复用模式

  • 单Reactor单进程/线程
  • 单Reactor多线程
  • 多Reactor多进程/线程
  • Proactor模式


集群高性能

负载均衡分类

  • DNS负载均衡
  • 硬件负载均衡
  • 软件负载均衡

负载均衡架构
整个系统的负载均衡分为三层

  1. 地理级别负载均衡通过DNS实现
  2. 集群级别负载均衡用硬件实现
  3. 机器级别负载均衡用软件实现

负载均衡算法

  1. 任务平均分类,轮询/加权轮询
  2. 负载均衡类,CPU负载/网络负载
  3. 性能最优类,根据响应时间分配
  4. Hash类,源地址,目标地址,session_id


 

你可能感兴趣的:(系统)