共计 939 个字符,预计需要花费 3 分钟才能阅读完成。
数据的存储
存储——性能(存储介质,数据格式,数据组织,索引,cache)
——扩展性
——功能(索引,事务)
——一致性
——可靠性
——成本(物理,维护)
性能
存储介质
特点
数据组织
磁带
内存
map,set,list,skip-list,memory-table,stm(支持内存事务)
磁盘
顺序读写强,随机读写差,block
-Tress =>B+ 层数一样,性能稳定,中间节点只有索引,容易缓存,数据只在子节点,数据可以扫描
SSD
随机性能高,并行度高,擦除影响寿命
SST(sst 为何适合 SSD)
PCM
扩展性
分片,元数据 hash(事先分多),range(hbase 热点),一致性 hash(不推荐,写不好) 一般三个副本可以保证 11 个 9,两副本大规模下 3 个 9 必丢数据
可靠性
复制,同步,故障恢复,故障发现,主动上报 / 心跳 /lease
一致性
CAP 是针对一条数据的 ACID,最终一致性,sessioin 一致性,单调一致性
考虑高可用的备份,高性能的负载,地理就近,存储单机瓶颈等原因会从单机发展到分布式。架构(多主,单主等),困难:丢包 / 延迟,时钟不同步。会导致设计上再延时(同步,半同步,异步)和一致性(线性一致性,原子事务提交)上有一定取舍,并有通用调的方式来解决。这部分理论在后续案例后再讨论。先看存储的例子。
1.redis=>codis
redis 单机基础内存跳表 -list 无索引,基本不支持事务 redis 的分布式 1,代码中写;2,redis Cluster。请求不在的 key 要两次,先返回 ip 再请求一次 3,代理分片,比如 tuemproxy,codis
redis cluster
codis
架构
扩展性
分片:hash 元数据:codis-proxy 中,用 codis-dashboard 控制,zk 保持同步扩展: 固定 1024 个 slot。迁移是按照 slot 的维度迁移有两个阶段,第一阶段状态改为 pre_m。若 proxy 都确认,将状态改 m。向所在的 redis-server 发送迁移命
可靠性
codis-proxy 的用 zookeeper 保证。client 获取 zk 节点做负载均衡 codis-group 的主从用 redis 的哨兵模式
一致性
2.mysql=>proxy
3.fusion
4.leveldb/rockdb
5.mongodb