Wednesday, December 2, 2015

分布式存储介绍 + SSD调研



http://www.zenlife.tk/aerospike.slide
Part1 分布式存储

单机存储引擎
分布式存储 = 单机存储引擎 + 分布式存储架构
存储引擎要做到的,是关于存储性能,网络性能
要充分考虑存储介质的物理特性

存储介质
内存
SSD
磁盘
顺序读1M内存需要多久?
磁盘平均寻道时间?
磁盘顺序读写速度?

硬件性能
L1 cache reference 0.5ns
Branch mispredict 5ns
L2 cache reference 7ns
Mutex lock/unlock 100ns
Main memory reference 100ns
Send 1M bytes over 1Gbps network 10ms
Read 1M sequentially from memory 0.25ms
Round trip within data center 0.5ms
Disk seek 8~10ms
Read 1MB sequentially from disk 20~25ms

数据结构

B树
hash
SkipList
LSM
fractal tree
merkle tree
bloom filter
存储的本质是数据结构

B树
Log_B(N/B)
读优化
硬盘速度100MB/s,4K页大小,读取只需要0.04ms,但寻道10ms,实际读取速率仅0.4MB/s。 另一方面,更大的页意味着B值更大,也就是更少的IO次数。所以优化读,应该选择更大的页大小,比如4M。是不是页越大越好?
写放大
读到内存,修改数据,写回磁盘。写一个记录,而实际需要IO的大小为一整页,写放大倍数非常高!
顺序读、写性能好
随机写性能差

LSM
Log-structured merge-tree
只追加写
垃圾回收
内存索引
为写优化、随机读性能一般

网络/线程模型

网络性能对分布式存储是很重要的
epoll
基于事件
actor
reactor
不展开了...c10k问题

分布式存储架构
分布式存储 = 单机存储引擎 + 分布式存储架构
一致性(consistent),可用性(avaliable),扩展性(scalable)
延迟、并发、吞吐量

数据分布
按数据范围
简单哈希
一致性哈希
难点:分布均匀
难点:增删结点时数据迁移

副本
以机器为单位:优点简单,缺点恢复效率低
数据切片为单位:恢复效率高,容错性强,可扩展性好

一致性
强一致性
单调一致性
会话一致性
最终一致性

读写方式
quorum
primary-secondary
强一致性方案一:始终只读primary可以实现强一致性
思考问题:主从是否会造成资源浪费?
强一致性方案二:由primary控制secondary节点的可用性
难点:CAP中的C和A的处理
难点:同步

集群信息维护
lease
paxos/raft
gossip

冰山一角
错误:成功/失败/超时
日志:undo日志 redo日志
事务:乐观锁 两阶段提交
schema...
CAP/BASE/ACID

Part2 SSD特性
基本
无寻道时间
随机读非常快
写前需要先擦除
擦除次数上限

进阶
若干(128)个页构成一个块(512KB)
读是页对齐的
写是页对齐的
擦除是块对齐的

高级
写入放大--写4k,需要先读擦除块(512K),修改,整块写入。放大系数是128倍。
FTL(Flash Transport Layer)作用类似磁盘控制器
逻辑块映射
日志写
垃圾回收
损耗平衡
随使用率增加性能下降

Part3 Aerospike
feature
1亿记录10秒内热重启
99% < 1ms

支持的存储形式
索引都是全内存的
SSD
内存
内存+HDD持久化
HDD

数据模型
namespace(database)
set(table)
record(row)
bin(field)
set可以没有

record由key+metadata+bins构成。hash(key)用于寻址,metadata提供record版本信息和ttl
bin是一个name和一个value,不指定类型,但是value是有类型的
支持自定义数据类型

架构

客户层:
集群状态 向上层提供api

分布式层:
数据分布 集群管理 数据迁移

数据存储层:
碎片回收 数据过期

内部实现-数据分布
partition map
每个key哈希到20字节的字符串。
这个hash加上一些额外数据,64字节,存到内存索引
其中12字节用于计算partition的id
4096个糟
将partition id映射到各个node id

内部实现-结点挂掉/添加结点
重建Partition Map,迁移数据
难点:如果让重建映射后,需要迁移的数据量最小
难点:迁移期间的一致性如何保证

内部实现-集群维护
广播心跳信息
gossip协议:发现新的结点
paxos协议:投票决定新的数据分布

内部实现-读写一致性
写主,主负责写到从
副本数据可配置

为SSD优化
多线程IO :SSD跟磁盘不一样,有多个控制器,并行可以发挥出性能。北桥并行度为8,南桥16。
跳过文件系统:页缓存造成有些请求在16-32ms才完成,以及3%-5%超过1ms
写大块读小块:低的写放大和读延迟
全内存索引,减少ssd的损耗
后台碎片整理
Log structured file system, "copy on write"

Aerospike是一个为SSD优化的,牛逼的数据库

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts