本篇概述了常见分布式存储,包括文件系统,KV系统,数据库的最主要特性。Dynamo分布式理论涉及较多。不过这个文章就是看过很多个之后总结的小点。
分布式文件系统
GFS
chunck服务器:按照每个chunck授权刚给CS租约
成为主chuck(多副本都成功才行),chunck内部修改
客户端 库文件形式,从master获取路由,直接访问chunck服务器,缓存元数据
master 元信息,所有控制(chubby主备),文件到chunck还是在主
文件追加:流水线;分离数据流和控制流
。S1,S2,S3,1,2同机房,控制流1=》2=》3而不是1=》3=》2
master单点瓶颈?
每个chuck 64M(一般都是大文件,K~M,id为64b),3份,压缩后chunk元数据小于64B。1PB:1PB3/64M64=3G。
chunck分配,迁移,负载均衡都要限速。分配:磁盘利用率低+最近频次防止压垮+多机架分配
——————
TFS
写少读多,每次修改在master无压力
小文件问题。读目录超级快,inode,实际内容=》逻辑图片共享一个物理文件
,抛弃目录树,直接blockid+offset定位。
去重:单独键值系统MD5客户端返回带着blockiid去nameserver查机器
。再带着offset去机器定位
——————
haystack 2000亿图片
haystack目录(照片id到物理卷轴路由)=》haystack物理卷轴100G,只追加(单机元数据内存中,每个占用20字节:8T/80K*20=2g)
目录量太大,memcache+mysql sharing集群
——————
CDN
L1chache->l2chache->服务器本身cache->tfs。LVS+NGINX=》
——————————
上述基本都是单层路由。若不够可以两层
——————————————————————————————
分布式KV
数据分布和负载均衡:自治gossip,种子节点
若机器被判定临时失效,选一台机器新数据分到这儿,恢复后将数据回传。若永久失效,则进行数据同步,利用merkle树(每一段一个merkle树,只需要同步从根到叶子节点不同的,叶子节点为文件内容的hash值,非叶子节点为其子节点组合的hash值)
NWR机制:N为副本数量,W为写至少几份,R为读至少几份。R读出来有多份情况,冲突用向量时钟由客户端解决或者覆盖,异步读取覆盖
——————————————————————————————
分布式table
dbproxy
proxy:解析dql,路由,读写分离,排序,分组
zk:维护db路由,选主
常驻进程:实时监控等
扩容:成倍扩
——————————
bigtable
数据:每行的每一个列(或列簇)构成一个cell
架构:在GFS上添加一层分部署索引层+chubby分布式锁
客户端:从chubby获取元数据,与子表直连(缓存和prefetch
。过期需要取六次,正常三次)
master:分配子表给子表服务器,指挥合并/分裂/监控/负载均衡/故障恢复(只有主在chubby的互斥锁失效才能切换)
子表:
chubby:保整只有一个master,配合master发现子表,存储访问控制信息(两地三数据中心五副本)
元数据也存表中,二级:子表128M,元信息1K。量级:(128M128m/1k)128m/1k=2048PB。引导信息(根表位置)=》根表=》元数据(子表位置,sstable及操作日志文件编号,日志回放点)
复制一致(全局唯一id去重)与容错(定期检查锁有木有问题之类的)。单机存储:sst(想为啥分多层就是写入更快,合并怕影响,写少的话一层,都的话多层)
————————————
megastore
在bigtable上支持sql
客户端:映射操作,事务,并发控制,基于paxos的复制,请求发送给复制服务器
复制服务器:接收客户端请求转发到所在机房的biftable实例(用于解决跨机房连接数过多问题)协调者:存储是否处于最新状态,用于实现快速读
事务:redolog写完就可以算成功,若写失败读之前要回放。夸实体组用两阶段+分布式队列
写事务流程:同一实体组乐观锁串行化(同一实体组同时更新少,同一个uid之类的)
协调者单点(从chubby获取锁,失效忽略协调者)
单副本,协调者较复杂,SSD不支持,只有实体组内部ACID
————————————
spanner
数据模型。主表包含附表。比如
部署:协调者(主备,paxos),参与者(主备,paxos)
同步:每个子表上运行一个paxos状态机
,主副本默认寿命10s全局事务id
:oracle数据库生成,谷歌时钟器,会返回误差-4~4e,时间每个都加4e即可
事务读写:夸paxos组两阶段提交
:
prepare:客户端发往多个paxos,协调者主发起prepaare协议,参与者主需要锁住数据。
commit:协调者主发起commit,参与者主执行提交并解除锁定数据,当前时间戳作为提交版本
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。