0
点赞
收藏
分享

微信扫一扫

智能互联网之数据存储实践

Sky飞羽 2022-08-26 阅读 70

前言

1、NewSQL TiDB数据库应用与实践
2、数据库数据无缝迁移方案设计
3、缓存数据一致性实践
4、深度解析Redis Cluster和Codis

NewSQL数据库应用与实践

NewSQL产品

智能互联网之数据存储实践_缓存

Mysql+MongoDB

​现状​

智能互联网之数据存储实践_数据_02

​亟待解决的问题​

智能互联网之数据存储实践_缓存_03

为何选择NewSQL

智能互联网之数据存储实践_数据_04

天然支持监控、Online DDL

TiDB特点

智能互联网之数据存储实践_redis_05

TiDB整体架构

智能互联网之数据存储实践_缓存_06

​架构图​

智能互联网之数据存储实践_redis_07

1、TiDB计算层 做SQL解析 类比MongoDB的mongos
2、TiKV RocksDB是facebook开源的存储引擎
3、PD 类比MongoDB的config server
4、TiKV至少3个副本 至少有一个副本是不工作的 提供给TiSpark做计算
5、支持HTAP H是混合事务和交易型数据

​访问逻辑​

智能互联网之数据存储实践_缓存_08

功能测试

智能互联网之数据存储实践_数据_09

性能测试

智能互联网之数据存储实践_数据_10

  • TiDB Server节点服务器

智能互联网之数据存储实践_数据_11

16核开启超线程就是32核

  • TiKv服务器

智能互联网之数据存储实践_redis_12

SSD盘

测试方案

智能互联网之数据存储实践_数据_13

测试结果

  • 不同场景的QPS

智能互联网之数据存储实践_数据_14

在CPU 50%的情况下128个线程达到3万QPS是没有问题的

  • 不同场景的响应时间

智能互联网之数据存储实践_缓存_15

1、基本上在10几毫秒(95%的情况)
2、更新会慢一些 因为需要保证 3副本都写成功才返回

​压力测试总结​

智能互联网之数据存储实践_缓存_16

​使用场景建议​

智能互联网之数据存储实践_数据_17

1、顺序写核读效率高些 随机写和读效率低些
2、适当的线程数少一些 响应时间、性能会提高一些
线程开64个线程就够了

预上线方案

智能互联网之数据存储实践_redis_18

线上业务接入步骤

测试验证

智能互联网之数据存储实践_redis_19

​流程图​

智能互联网之数据存储实践_redis_20

TiDB Proxy就是数据访问层

同步数据

智能互联网之数据存储实践_redis_21

​流程图​

智能互联网之数据存储实践_数据_22

切流量

智能互联网之数据存储实践_数据_23

​流程图​

智能互联网之数据存储实践_redis_24

部署结构图

智能互联网之数据存储实践_数据_25

1、LB即LBS
2、TiKv和TiDB都至少3台机器
3、TiDB和PD混用
4、至少6台机器 全都是物理机

线上监控

数据请求延时情况

智能互联网之数据存储实践_redis_26

​Mysql波动很大​

智能互联网之数据存储实践_redis_27

​TiDb波动稳定​

智能互联网之数据存储实践_缓存_28

业务请求队列等待情况

​Mysql抖动大​

智能互联网之数据存储实践_redis_29

​TiDB恒为1​

智能互联网之数据存储实践_缓存_30

业务延时和错误量情况

​业务延时​

智能互联网之数据存储实践_redis_31

接入TiDB后业务服务接口耗时稳定无抖动

​错误量​

智能互联网之数据存储实践_数据_32

数据访问层服务队列堆积Mysql发生请求丢弃
TiDB没有发生丢失情况

数据库数据无缝迁移方案设计

时效性数据

​MongodDB数据迁移到Mysql​

智能互联网之数据存储实践_redis_33

黑线表示从某一个时间点双写
比如优惠券数据时效性一个月
从1号开始双写 到下个月1号MongoDB数据失效
就需要关注MongoDB数据了

智能互联网之数据存储实践_数据_34

永久性数据

智能互联网之数据存储实践_缓存_35

1、MongodDB和消息队列双写
2、MongoDB从库和主库脱离
3、MongoDB从库数据同步到Mysql
4、同步好之后 执行消息队列中的命令

智能互联网之数据存储实践_数据_36

5、在Mysql执行消息队列的命令时候 所有写请求写到内存中
6、消息队列中的消息消费完之后 去掉消息队列 将内存中的请求同步到Mysql
7、如果服务挂了 内存中缓存的请求丢失 用户会重试

缓存数据一致性实践

缓存数据即非持久化数据

​缓存作用​

  • 降低请求的响应时间 提升用户体验
  • 减少对固化存储(DB)的读压力

使用场景

​适合场景​

智能互联网之数据存储实践_数据_37

​不适合场景​

  • 频繁更新
  • 读少写多

缓存类别

本地缓存

Google Guava Cache

智能互联网之数据存储实践_缓存_38

分布式缓存

​使用场景​

智能互联网之数据存储实践_redis_39

技术选型

智能互联网之数据存储实践_数据_40

​Memcached特性​

智能互联网之数据存储实践_数据_41

​Redis特性​

智能互联网之数据存储实践_redis_42

redis 持久化对性能影响很大

​如何选择​

Redis首选

智能互联网之数据存储实践_redis_43

单机容量比如192G内存

Redis Cluster

​特点​

智能互联网之数据存储实践_数据_44

分片逻辑在客户端

​集群架构​

智能互联网之数据存储实践_数据_45

Codis

​特点​

智能互联网之数据存储实践_缓存_46

​架构​

智能互联网之数据存储实践_缓存_47

1、codis-group即Redis集群 每一个group代表一主两从Redis(主从模式) 主从切换是哨兵模式
2、codis-proxy是go语言编写
3、proxy注册到zk中

后台管理功能

​proxy​

智能互联网之数据存储实践_数据_48

可以看到每秒请求情况

​Slot情况​

智能互联网之数据存储实践_redis_49

如上图
a、集群中有4个节点
b、每个节点存储所有槽点的1/4
c、codis最多分片1024个(槽点)

​group​

智能互联网之数据存储实践_redis_50

​哨兵​

智能互联网之数据存储实践_缓存_51

深度解析

Redis Cluster

Redis Cluster深度分析

​CAP分析​

Redis Cluster属于AP模型

​数据分布​

智能互联网之数据存储实践_redis_52

​Redis Cluster Master-Slave模式​

智能互联网之数据存储实践_缓存_53

​节点 Node​

智能互联网之数据存储实践_数据_54

​分片Sharding​

智能互联网之数据存储实践_redis_55智能互联网之数据存储实践_redis_56

​slot计算方式​

CRC16(key)%16384

智能互联网之数据存储实践_redis_57

命令执行

智能互联网之数据存储实践_数据_58

  • 槽位正确

智能互联网之数据存储实践_数据_59

  • 槽位不正确

智能互联网之数据存储实践_数据_60智能互联网之数据存储实践_redis_61

每个节点上都存了全量的映射关系
redis集群之间通过Gossip协议进行通讯

Gossip协议通讯

智能互联网之数据存储实践_数据_62智能互联网之数据存储实践_redis_63

Redirection实现槽表(slot table)

智能互联网之数据存储实践_缓存_64智能互联网之数据存储实践_缓存_65

故障转移(Failover)

智能互联网之数据存储实践_数据_66智能互联网之数据存储实践_redis_67

环境搭建

智能互联网之数据存储实践_数据_68

Slot有多大 是否可以承载mget大小

智能互联网之数据存储实践_redis_69

slot迁移服务可用性

智能互联网之数据存储实践_redis_70

机器超时重试

智能互联网之数据存储实践_缓存_71

Redis Master Slave作用

智能互联网之数据存储实践_缓存_72

Redis Cluster fail over

智能互联网之数据存储实践_数据_73

Codis

​环境搭建​

稍显复杂 需要go、Zookeeper、proxy、redis

​slot有多大 是否可以承载mget大小​

mget的实现是在proxy层面做并行归并 已实现好

​slot概念​

智能互联网之数据存储实践_数据_74

​节点挂了怎么办?​

智能互联网之数据存储实践_缓存_75

​负载均衡​

智能互联网之数据存储实践_redis_76

​总结​

智能互联网之数据存储实践_缓存_77

分布式缓存高可用

思路一 高可用

智能互联网之数据存储实践_redis_78

多了一份缓存 数据不一致的概率就会增大

思路二 不高可用

智能互联网之数据存储实践_数据_79

缓存高可用意义不大
除非超大流量

缓存数据一致性

​数据不一致的根源​

多份数据存储 (数据库、缓存)

​如何解决​

智能互联网之数据存储实践_数据_80

​时序控制是否可行​

1、先更新数据库 再更新缓存
2、先更新缓存 再更新数据库

时序控制不可行 无法保证数据一致性

​数据最终一致性保证​

智能互联网之数据存储实践_缓存_81

1、第一次删除失败则会
写到mq 延迟2秒钟
数据访问层订阅mq 再次删除缓存项
一旦第二次删除失败 会记录日志
通过脚本多次删除
(若过期时间1个小时 才最终一致性 时间太长)
2、写数据库不缓存 是因为写了不知道什么时候会读
所以读的时候才缓存 懒加载方式


举报

相关推荐

0 条评论