MySQL 兼容性可以做到什么程度you can look forward.也从阿里巴巴的“去IOE”运动说起 业务驱动下的分布式技术实践之路 5月17日,支付宝最后一台小型 机下线标志去IOE落下帷幕 首次双十一大考卡顿半分钟后稳 定度过 7月,TDDL+AliSQL首次验证支 持核心库 无法弹性扩展 成本高 去 IOE 商品库去O TDDL首次双十一 “去IOE完成” 天价账单 上云 2009 2011 2012 Answer:No and NO ONE Does进入 Kubernetes 生态 04 When in Rome, do as the Romans do.参数设置 容灾部署 CDC 备库重搭 备库重搭 SQL审计 只读实例0 码力 | 18 页 | 3.02 MB | 6 月前3
Curve设计要点总体设计 系统特性 近期规划背景 • 多个存储软件:SDFS、NEFS、NBS • 已有的开源软件:Ceph • 不能胜任性能、延迟敏感的场景 • 异常场景抖动较大(比如慢盘场景) • 去中心节点设计在集群不均衡的情况下需要人工运维 • 基于通用分布式存储构建上层存储服务背景 01 02 03 04 总体设计 系统特性 近期规划基本架构 • 元数据节点 MDS 管理元数据信息 MDS、Snapshotcloneserver 通过 etcd 选主,实现高可用高可用 chunkserver 使用raft,2N + 1 个副本允许 N 副本异常自治 • 自动故障恢复 • 多对多,恢复时间短 • 精确的流量控制,对io几乎无影响自治 • 集群负载和资源均衡 • leader copyset scatter-width • 无需人工干预 • 对io影响几乎无影响易运维 • 升级秒级影响0 码力 | 35 页 | 2.03 MB | 6 月前3
Curve元数据节点高可用MDS1退出后,MDS2收到MDS1的key被删除的消息,Campagin成功© XXX Page 13 of 30 异常情况1:备MDS2中途退出 step1:MDS3收到MDS2的key被删除的消息 step2: MDS3重新获取到有相同前缀Leader的key为{ [Leader/MDS1, revision:2]}, 因此watch Leader/MDS1© XXX Page 14 of 30 异常情况2:Etcd /3的LeaseTime nextKeepAlive := time.Now().Add((time.Duration(karesp.TTL) * time.Second) / 3.0) ②定期去etcd server中get leader/MDS1,看是否还存在。这里涉及到定期get的时间 PeriodicGetTime, 以及get超时的时间 GetTimeout ③使用Observe监 租约的keepalive间隔为LeaseTime/3 etcd server端限制LeaseTime >= 1.5 * ElectionTimeout 10s PeriodicGetTime mds当选leader之后,去etcd集群get Leader/MDS1的时间间隔 2s GetTimeout get Leader/MDS1失败的时间间隔 10s ElectionTime etcd集群leader失效,到重新选举出leader的耗时0 码力 | 30 页 | 2.42 MB | 6 月前3
Curve质量监控与运维 - 网易数帆控制用例时间(考虑一些折中方案) Case独立性 Case通用性(兼顾curve、ceph等) Tag规范(优先级、版本、运行时间) 最大化覆盖率(打乱操作顺序、随机 sleep) 精确性(checkpoint) 稳定性(避免环境因素、其他模块干扰) Curve使用Robotframework框架进行异常自动化测试, 相关代码见curve/robot at opencurve/curve 30/33网络丢包10% 自动故障恢复 Curve可在多种软硬件故障场景(如单mds故障、单ChunkServer故障、硬盘故障、网络丢包等) 实现自动恢复,保障存储服务高可用性。 多对多,恢复时间短 精确的流量控制,对io影响很小 Kill一个节点所有ChunkServer进程 31/33快照克隆工具snaptool Curve_ops_tool 查询Curve状态 管理Curve文件0 码力 | 33 页 | 2.64 MB | 6 月前3
CurveFS Copyset与FS对应关系id。创建meta partition的时候,选择的3个meta node组成一个复制组。如何选择?论文上写的是按照存储节点的memory和disk usage来选的,通常选择内存和disk使用率最低的节点。 并去对应的meta node上去创建对应的meta partition。 如何选择partition的host,通过这个函数去选择。 func (c *Cluster) (excludeZone robin的方式,遍历尝试去所有的partition中,直到找到一个partition可以创建inode。 创建dentry,去parent inodeid所在的meta partition进行创建就好了。 查找inode和partition的时候,通过inodeid去查询应该由哪个partition进行处理。inode是拿着inodeid查询,dentry是拿着parent的inode id去查询。© XXX 3、curvefs的copyset和fs的对应关系 curvefs的元数据的分片,需要考虑到在创建inode的时候,其实是不知道inodeid的,在创建完成之后,才有inodeid。inodeid的分配最好下放到各个分片去进行处理。否则整个集群的inode都去一个地方获取id会 造成巨大的锁开销,这个是不能接受的。 curve块设备的元数据管理,在分配数据的时候,offset一开始就是知道的,这是和curvefs分配很大的一个不同点。0 码力 | 19 页 | 383.29 KB | 6 月前3
CurveFS Client 概要设计fuse_conn_info *conn); 根据挂载信息,从mds获取文件系统信息(或superblock),块分配器(bitmap)和root inode所在的copyset、 metaserver ip等信息 去metaserver获取文件系统信息(super block),缓存到client端。 destroy void (*destroy) (void *userdata); 清理init缓存的文件系统信息。 *name, mode_t mode, dev_t rdev); 这两个函数的功能是类似,都用来创建文件。 根据parent inode id 和name,向mds查询创建dentry和inode的位置,去meta server创建dentry和inode 预分配一些空间?可先不做 mkdir© XXX Page 7 of 11 void (*mkdir) (fuse_req_t req, fuse_ino_t fuse_ino_t parent, const char *name, mode_t mode); 根据parent inode id 和name,向mds查询创建dentry和inode的位置,去meta server创建dentry和inode forget void (*forget) (fuse_req_t req, fuse_ino_t ino, uint64_t nlookup);0 码力 | 11 页 | 487.92 KB | 6 月前3
curvefs client删除文件和目录功能设计当内核移除其inode cache时,会调用forget,此时lookup count需要减nlookup(forget的参数) 当umount时,所有lookup count减至0 不应该完全依赖forget接口去实现inode的移除,因为forget接口可能不会被内核调用(例如client崩溃) 相关调研 moosefs moosefs 未对接forget moosefs 实现了在mds上open,因此删除时可以判断文件是否被打开 ofs的成熟方案,说明是已经被验证过是可行的方案。 缺点: 由于link、unlink等接口涉及跨服务器的两个请求的处理,可能会存在孤儿inode的问题,这一情况,chubaofs是通过运维手段去修复,见遗留问题。moosefs由于单mds,不存在这个问题。 方案设计思考 首先我们可以确定以下几个设计点: 删除的大致过程如下,首先移除dentry,然后移除inode,可以容忍只 必须要实现(至少)一个trash机制,以作为回收站,不论是后续做UNDEL,还 。 是应对打开的文件被其他进程删除的情况 必须实现某种机制,可以查看清理trash中的inode。 孤儿节点只能在metaserver去定期清理,不会在client端,因为client会崩溃,也可能下线了,永远不再起来。所以实际的内存和外存中的inode的删除机制,必须是在metaserver中实现的。client端只是 进行nlink-1的操作。0 码力 | 15 页 | 325.42 KB | 6 月前3
Curve文件系统元数据管理场景二:业务运行过程中,元数据的增删改查。 如果采用raft的方式对元数据持久化进行保证,所有元数据的处理都是先写WAL,再修改内存结构。那么任何对元数据的增删改查,对应着一条记录,根据记录去修改内存数据。 按照之前的讨论,curve文件系统的元数据管理采取先写log的方式。这里先不考虑log的组成形式。 那么curve文件系统的应该是先写log,log落盘之后,更新内存。 场景三:系统退出的时候,元数据的持久化 这个时候,可以通过parent 200 + name "E"在server2上查到E的inodeid为300,但是在server2上,找不到对应的id为300的Inode的结构体。 这个问题可以有两个解决办法: 一、 ,去所有的metaserver上查询id为300的inode信息。 遍历所有的metaserver 二、通过一个额外的缓存,缓存inode id和partition的映射关系。这个缓存可以在挂载文件系统 of 24 这种分片方式的,inode和dentry的分布没有任何关系,查找inode和查找dentry的大概率需要不同的分片进行处理。这样第一步通过parentid和name去查询inodeid,第二步通过inodeid去查询inode结构体,这两 步就必须通过两次请求。相对于分片方式一,这种方式,client向metaserver进行查询的时候,rpc请求的个数近似翻倍,多一倍的查询,对性能上的影响能否接受。0 码力 | 24 页 | 204.67 KB | 6 月前3
BRPC与UCX集成指南Socket对象 ●brpc最终的网络通讯都集中在socket对象里面 ●读socket通过EventDispatcher触发 ●上层发送网络数据通过写socket完成,不能立刻完成的,则去启动后台bthread去完成。11 BRPC SocketMap ●根据EndPoint作为一个map的Key,Value是Socket对象 ●Socket对象引用计数,多个Channel可以共享一个Socket对象0 码力 | 66 页 | 16.29 MB | 6 月前3
CurveFS方案设计moosefs空间分配调研 polarfs: CurveFS文件存储设计参考方案(元数据存储在卷上方案)#PolarFS 上述fs可以分为两类 chubaofs/moosefs 属于利用本地文件系统去构建分布式fs。一个文件的数据对应本地文件系统上的一个文件,通过本地文件系统的打洞功能实现部分空间的回收。 blustore/polarfs 直接在块设备上构建分布式fs。一个文件的数据对应块设备上某 当前curve已经实现了块设备。curve的数据节点采用了chunkfilepool实现性能优化,同时也绕过了文件系统的空间管理,通过mds的segment/chunk实现了简单的空间管理。 利用本地文件系统去构建curvefs,采用分布式文件和本地文件系统相对应的方式,curve当前数据节点需要变更。因为chunk16MB的定长不适用于文件系统。另外快照逻辑无法复用。 利用已有的块设备构建curvefs,0 码力 | 14 页 | 619.32 KB | 6 月前3
共 16 条
- 1
- 2













