小米Hbase实践_刘绍辉


小米HBase实践 刘绍辉 小米云存储组 China Hadoop Summit 2013 提纲 1. HBase简介 2. HBase在小米的使用 3. 小米开发的重要特性 4. 未来开发计划 2 / 38 提纲 1. HBase简介 2. HBase在小米的使用 3. 小米开发的重要特性 4. 未来开发计划 3 / 38 HBase是什么? I Google Bigtable系统的开源实现 I 分布式的,可扩展的,一致性的,半结构化数据存储系统 I 稀疏的, 一致性的,分布式的, 多维有序的映射表 4 / 38 数据模型 I 表 I 行 I 列簇 I 列 I 版本(时间戳) 多维映射表: (行key, 列簇, 列, 版本) → 值 5 / 38 逻辑架构 参考: http://www.slideshare.net/xefyr/h-base-for-architectspptx 6 / 38 系统架构 HMaster负责控制流 HRegionServer负责数据流 7 / 38 提纲 1. HBase简介 2. HBase在小米的使用 3. 小米开发的重要特性 4. 未来开发计划 8 / 38 支持的业务 I 米聊消息全存储 I MiCloud: 短信, 通话记录同步 I 小米Push服务 I 其他一些离线分析业务 9 / 38 典型的HBase集群 配置 节点类型 数量 CPU Memory Disk 控制节点 3 - 5 16核 64G 6 * 600G SAS, RAID10 数据节点 5 - N 16核 64G 12 * 2T SATA/SAS 10 / 38 典型的HBase集群 I 控制节点:ZooKeeper, NameNode/ZKFC/JournalNode, HMaster I 数据节点: DataNode, RegionServer 11 / 38 Minos:自动化部署 命令行工具 I 初始化: deploy.py install/bootstrap hbase bjsrv-test I 启/停: deploy.py start/stop hbase bjsrv-test I 展示: deploy.py show hbase bjsrv-test I 升级: deploy.py restart/rolling update hbase bjsrv-test I 删除: deploy.py cleanup hbase bjsrv-test 12 / 38 Minos:监控和报警 Dashboard 13 / 38 Minos:监控和报警 Dashboard 14 / 38 Minos:监控和报警 性能指标: 分类展示 基于OpenTSDB: http://opentsdb.net/ 15 / 38 Minos 开源 https://github.com/xiaomi/Minos 16 / 38 最佳实践 HBase Client 封装 I 线程安全 I 自动添加性能指标 I 跨表、跨集群对用户 透明 I 动态更新客户端配置 17 / 38 最佳实践 跨机房:双主复制 I 中途添加一个复制 add peer + CopyTable I 复制数据一致性验证 VerifyReplication 18 / 38 最佳实践 主备集群自动切换 19 / 38 最佳实践 I 平滑升级 基于move region脚本, 减少不可用时间 I Full GC 每天低峰期触发Full GC: jmap -histo:live $pid I Compaction hbase.offpeak.start/end.hour I Shortcircuit Read dfs.client.read.shortcircuit I 安全 Kerberos + HBase ACL 20 / 38 提纲 1. HBase简介 2. HBase在小米的使用 3. 小米开发的重要特性 4. 未来开发计划 21 / 38 反向scan 正向scan的基本过程 eg: scan [r1, r3] 1. 顺序读取当前行数据后, 自 然读到下一行开头 2. 选取最小行作当前行的“下 一个行”, 重复上述过程 22 / 38 反向scan 正向scan的基本过程 eg: scan [r1, r3] 1. 顺序读取当前行数据后, 自 然读到下一行开头 2. 选取最小行作当前行的“下 一个行”, 重复上述过程 22 / 38 反向scan 正向scan的基本过程 eg: scan [r1, r3] 1. 顺序读取当前行数据后, 自 然读到下一行开头 2. 选取最小行作当前行的“下 一个行”, 重复上述过程 22 / 38 反向scan 正向scan的基本过程 eg: scan [r1, r3] 1. 顺序读取当前行数据后, 自 然读到下一行开头 2. 选取最小行作当前行的“下 一个行”, 重复上述过程 22 / 38 反向scan 基本过程: eg: 反向scan [r2, r0] 1. 顺序读取完当前行数据后, 2. 构造当前行的最小kv, 对每 个HFile, SeekBefore → 获 取这个最小kv的上一个kv 3. 选取所有kv中最大行作为当 前行的“上一个行”, 构造 并seek到上一个行的最 小kv位置 23 / 38 反向scan 基本过程: eg: 反向scan [r2, r0] 1. 顺序读取完当前行数据后, 2. 构造当前行的最小kv, 对每 个HFile, SeekBefore → 获 取这个最小kv的上一个kv 3. 选取所有kv中最大行作为当 前行的“上一个行”, 构造 并seek到上一个行的最 小kv位置 23 / 38 反向scan 基本过程: eg: 反向scan [r2, r0] 1. 顺序读取完当前行数据后, 2. 构造当前行的最小kv, 对每 个HFile, SeekBefore → 获 取这个最小kv的上一个kv 3. 选取所有kv中最大行作为当 前行的“上一个行”, 构造 并seek到上一个行的最 小kv位置 23 / 38 反向scan 基本过程: eg: 反向scan [r2, r0] 1. 顺序读取完当前行数据后, 2. 构造当前行的最小kv, 对每 个HFile, SeekBefore → 获 取这个最小kv的上一个kv 3. 选取所有kv中最大行作为当 前行的“上一个行”, 构造 并seek到上一个行的最 小kv位置 23 / 38 对比 相同点:读取每一行内数据过程,正/反向scan是一致的 区别:如何当前行的”下一行” 正向scan自然的滑到下一行的开头。 反向scan需要多一次seekBefore和一次seek操作, 才能定位到上一 行开头。性能损失大约在30%左右 24 / 38 新写模型 现在的写线程模型 问题: handler线程对sync操作前的锁竞争严重 25 / 38 新写模型 参见:JIRA HBASE-8755 单独的Write/Sync/Notify线程,消除锁竞争 26 / 38 新写模型 性能对比 27 / 38 表/列族级别复制 参见: jira HBASE-8751 add peer时指定表名和列族名 eg: add peer ’1’, peer addr, ’tableA:cf1’ 28 / 38 局部二级索引 1. HBase只支持行Key上的的索引 2. 其他的索引需要用户自己建 3. 怎么保证数据和索引之间的一致性? 29 / 38 局部二级索引 场景: 用户为中心的数据, 只需要局部二级索引. 类型 行 列族 列 版本 值 数据行 UserId-xxx data c ... value 索引行 UserId-value c-index ... ... UserId-xxx I 索引建立: 客户端建索引,将数据行和索引行作为一个批量 写,写入HBase I 查询: 先查询索引行获取数据行的Row Key, 在根据Row Key查询实际数据 30 / 38 局部二级索引 怎么保证数据和索引一致性? I Region分割策略 前缀分割策略(KeyDelimiterPrefixRegionSplitPolicy) 123123-34141 → 123123- 保证同一个用户数据不会被分割在不同的region上 I Region内批量写的原子性 修改multi操作,对特定的表的multi操作,取到所有Row的行锁 后才能继续, 保证所有操作有相同的mvcc, 并且写在hlog里面 在同一个记录里面。 JIRA状态: 即将提交 31 / 38 名字服务 HBase集群的标识: zkQuorum:zkClientPort:hbaseZnodeParent 例如: bjsrv-test集群 bjsrv.hadoop.srv:2181:/hbase/bjsrv-test 32 / 38 名字服务 扩展集群标识: hbase://$zkName-$hbaseName:$zkPort 映射规则 例如: hbase://bjsrv-test:2181/TestTable I bjsrv → bjsrv.hadoop.srv I 2181 → 2181, 默认是2181 I bjsrv-test → /hbase/bjsrv-test 使用 HTable table = new HTable(conf, ”hbase://bjsrv-test/TestTable”); 优势 简化客户端配置,集群配置对业务透明 33 / 38 名字服务 其他支持 I HBase Shell eg: bin/hbase-cluster hbase://bjsrv-test shell I Replication eg: add peer ’1’, ’hbase://bjsrv-test’, ’TestTable:CF’ I Mapreduce eg: ./hbase CopyTable –peer.adr=hbase://bjsrv-test TestTable JIRA状态: 即将提交 34 / 38 提纲 1. HBase简介 2. HBase在小米的使用 3. 小米开发的重要特性 4. 未来开发计划 35 / 38 开发计划 I 同步复制 I 跨行跨表的原子性(参考:Google Percolator) I 全局二级索引 I Compaction优化. 参见: JIRA HBASE-9528 I Failover相关的优化. 参见:JIRA HBASE-9873 I 多租户共享集群与共有云 I HMaster重构. 参见:JIRA HBASE-5487 I... 36 / 38 与社区共同发展 I HBase修改反馈回社区(问题抽象/可配置) I 紧跟社区最新进展 I 积极参与社区方案设计和讨论 37 / 38 谢谢! 问题? 邮箱: liushaohui@xiaomi.com 微博: lshmouse
还剩43页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

lxj2008

贡献于2014-01-20

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf