1 / 27

百度实习经历报告以及 OnlineSchemaChange 项目和 ddbs 的简介

百度实习经历报告以及 OnlineSchemaChange 项目和 ddbs 的简介. chenqi05@baidu.com 2011-10. 百度大厦生活照. 大纲. OnlineSchemaChange 项目 OSC 的背景和需求 OSC 的实现 OSC 可能的问题和改进建议 百度 ddbs 系统 ddbs 的系统架构和功能模块的介绍 ddbs 中的基本策略. 大纲. OnlineSchemaChange 项目 OSC 的背景和需求 OSC 的实现 OSC 可能的问题和改进建议 百度 ddbs 系统 ddbs 的系统架构和功能模块的介绍

Download Presentation

百度实习经历报告以及 OnlineSchemaChange 项目和 ddbs 的简介

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 百度实习经历报告以及OnlineSchemaChange项目和ddbs的简介百度实习经历报告以及OnlineSchemaChange项目和ddbs的简介 chenqi05@baidu.com 2011-10

  2. 百度大厦生活照

  3. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  4. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  5. OnlineSchemaChange项目---- 背景和需求 • 未作修改的Mysql做Schema Change时候的流程: • 对源表加读锁或者写锁以阻塞新的访问请求 • 按照新的schema建立临时目标表 • 将源表的数据拷贝到临时目标表 • 将源表改名为临时表,将临时目标表改名为源表  • 删除临时表(源表) • 释放读锁或者写锁 • 问题:整个拷表的过程是锁表的;线上业务不可接受! • 需求: • 对于使用Innodb引擎的表,进行schema change的时候,从功能上看不会影响对该表的读、写访问。 • MySQL参数中可以配置Schema change 批量拷贝的速度,用来控制Online Schema Change的I/O对线上应用的冲击。 • 对一个表,可以将多个schema的修改请求合在一个Alter SQL语句中。 当一个schema change正在进行时,对同一个表的后继schema change请求将被阻塞。在当前schema change完成后,后继的schema change请求才会被执行。 • 对不同表的schema change操作可以并发进行。

  6. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  7. OnlineSchemaChange项目---- OSC的实现1 • 初始数据结构和运行环境的初始化 需要锁表,但是时间很短的 • 源表的拷贝(非常耗时的部分) • 为了不影响线上业务的IO拷贝一定数量的记录后会睡眠; • 在这个过程中对源表的查询访问可正常进行。 • 在这个过程中,对源表的插入、删除、更改操作也会正常进行,但会被额外的记录在OSC日志中,并且定期刷入磁盘。 • 在线日志重演 • 为了不影响线上业务的IO拷贝一定数量的记录(一个block)后会睡眠; • 在这个过程中对源表的查询访问可正常进行,对源表的插入、删除、更改操作也会正常进行,但会被额外的记录在OSC日志中,并且定期刷入磁盘。【同上】 • 离线日志重演 • 需要锁表; • 先处理日志文件中可能存在的记录,再处理内存中的记录。

  8. OnlineSchemaChange项目---- OSC的实现2 • 前期的判断: • 只有需要进行表的拷贝的时候才会触发OSC(像rename table这样的才做就不会触发OSC) • 判断是否属于OSC的支持类型: • 1、对于表的修改,只能处理增加(删除)一列或若干列。 • 2、对于所增加的列,必须可为空。 • 3、对于索引的增删改没有限制。 当schema的变化超出了Online Schema Change当前设计所能处理的范围,则退出,继续MySQL默认的schema change流程。 • 日志机制: • 内存数组+日志文件:内存数组满了之后会刷到磁盘;每次刷到文件的记录,组成一个block,有osc_env->header指定记录条数和大小。 • 日志重演与操作的添加有互斥锁同步,日志重演的位置会被记录在osc_env->log_file_offset中,它指向下次日志重演的文件偏移。

  9. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  10. OnlineSchemaChange---- 可能的问题和建议 • Mysqld停掉,log_in_memory[OSC_LOG_CAPACITY]会立即被刷到磁盘吗?【schema-change没有做完,innodb会自动回滚重做】。 • 两次更改的问题,在旧表中的操作被记录在日志中以后,又会在新表中重演; • 暂停拷表的时间间隔osc_io_interval是否可考虑随着线上服务请求的繁忙程度而动态改变; • 内存日志记录容量OSC_LOG_CAPACITY是否也可以动态;以便适应复杂的环境;

  11. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  12. ddbs系统框架 ---- 整体架构 客户端 客户端 5 dbproxy tablet_server_cluster tablet_server_cluster tablet_server 1tablet_server 2 zookeeper ts_agent 4 ts_agent 管理员 3 cli

  13. 目前在使用的百度产品线 • 百度百科 • 音乐电台——百度听 • Linkcache——百度新闻的缓存 • Logdata——某产品的日志文件 • 等等

  14. ddbs系统框架 ---- 系统接口 • 支持的命令 • 有限制select/insert/update/delete/replace/ • 如果只涉及到单机表,且在同一个ts上,无论多复杂都可以支持。 • 分布式表,不支持嵌套子查询。 • 如果是单表单机或者多表单机,支持order by / group by / limit/ 单机事务。 • 如果是单表多机的情况,支持order by / group by,支持不带offset的limit,不支持分布式事务。 • 事务命令start transaction/beigin/commit/rollback,不支持分布式事务 • set命令 • use命令 • 不支持的命令 • prepare,正在开发中… • 调用存储过程、 show、kill • CREATE 类、ALTER类的DDL命令

  15. ddbs系统框架 ---- 数据划分 • 数据划分:在DDBS中,将一张分布式表按照指定的Partition Key和Partition Mode分成多个数据片(称为Tablet),分散在多个数据存储节点中,一般情况下,一个cluster里面只有一个Tablet。 • Partition Key:是 DDBS 中用于数据划分和定位的属性,该属性是应用创建的分布式表中的一个字段。Partition Key 的选择决定了数据按照哪个字段来进行数据分布和组织,一张分布式表只能有一个 Partition Key。 Partition Key 与 Tablet的索引并无强制对应关系。 • Partition Mode:是 DDBS 中用于数据划分的方式,常用的数据划分方式包括基于Partition Key 的按范围划分、按散列取模划分、按时间划分、按枚举/列表划分、以及前几种划分方式的组合(称为组合划分)等。

  16. ddbs系统框架 ---- 数据划分(例子) • CREATE DISTRIBUTED TABLE IF NOT EXISTS disIntRange1 • ( • intIDINT NOT NULL PRIMARY KEY, • name VARCHAR(1000) • )ENGINE = InnoDB • PARTITION KEY (intIDINT) • PARTITION BY RANGE • { • ([MIN, 1000], 'tablet__fengchao__disIntRange1__0' TO 'tablet_server_cluster__fengchao__1'), • ([1001, 10000], 'tablet__fengchao__disIntRange1__1' TO 'tablet_server_cluster__fengchao__2'), • ([10001, MAX], 'tablet__fengchao__disIntRange1__2' TO 'tablet_server_cluster__fengchao__3') • };

  17. ddbs各模块功能介绍(zookeeper) • zookeeper:主要用于存储元数据,包括表信息、划分信息、权限信息等等。 • /ddbs/sys_usertsagent的帐户相关信息; • /ddbs/machine 集群机器; • /ddbs/command_status/clicli登录信息; • /ddbs/product/产品名/ tablet_servermysql信息; • /ddbs/product/产品名/ tablet_server_clustermysql_cluster信息; • /ddbs/product/产品名/ tablet_server_agent管理代理信息; • /ddbs/product/产品名/ table 表信息; • /ddbs/product/产品名/ tablet 表的分片信息; • /ddbs/product/产品名/ dbproxydbproxy的配置信息; • /ddbs/product/产品名/ product_user应用用户帐户信息;

  18. ddbs各模块功能介绍(cli常用命令) table:create/register single/distributed; truncate; remove; alter distributed; tablet_server:show; add; set; remove; tablet_server_agent:show; add; set; remove; sys_user:show; add; set; remove; machine:show; add; set; remove; tablet_server_cluster:show; add; set; remove; product_user:show; add; set; remove; dbproxy:show available_dbproxy/dbporxy_conf/dbproxy; set dbproxy_conf; 其它:install ddbs; install product; show product list;

  19. ddbs各模块功能介绍(dbproxy) 配置文件更新,及重启服务 服务框架 客户端网络:连接,认证,读,写 后端网络:conn_pool管理数据库连接,负载均衡 用户权限认证,连接数管理 日志分析和定期上传 sql协议的实现,mysql internal protocol sql语句解析:解析sql的类型,各部分 处理请求 sql语句分解:分解原sql到为多个sql语句 sql路由:将分解后的sql转发到相应的ts,包括读写分离; 穿透指定数据库服务器功能 缓存命令处理 结果合并:按不同策略合并结果

  20. ddbs各模块功能介绍(tsagent) DBA控制命令 传递cli传递过来SQL命令给ts:包括DDL命令、SHOW命令。 监控Tablet Server的运行情况 监控Tablet Server是否存活, 监控主从同步是否正常, 监控Table Server的数据量, 监控Table Server的负载,主从切换等。 监控Tablet Server所在机器的运行情况 检查本机的资源状况,例如:内存情况,网卡流量情况,磁盘空间情况、磁盘I/O情况、CPU 情况,并计算本机的负载估计值。

  21. 大纲 • OnlineSchemaChange项目 • OSC的背景和需求 • OSC的实现 • OSC可能的问题和改进建议 • 百度ddbs系统 • ddbs的系统架构和功能模块的介绍 • ddbs中的基本策略

  22. 重要策略----主从分离 query->args 是 当前是否在事务中 是 上次query在事务中 是 写操作 是 读,但时间未到; 是 读操作 MS_SLAVE MS_MSTER

  23. 重要策略----load balance • 如果当前连接池中有干净的连接实例,那就从中取出。如果没有,或者连接失败了,需要重新建立一个新的连接。 • 如果一条命令落在主库上,因为只有一个节点,所以不需要负载均衡处理; • 如果一条读命令落在从库上,有多个从库可选,那么从中选出 当前连接数/权值(权值是配置的) 最小的一个slave。

  24. 重要策略----tsagent的单点切换 • 当检测到master不存在时,开始单点切换(由leader来控制,当前cluster中nodes中id最小的为leader) • 查找tinker,并与tinker进行出具补齐; • 在slave节点中查找并选举master • leader节点向集合R集合查询各个节点的权值,找到权值最大的节点,记为master。 • 通知R+S新master,R+S各结点都change master到新master • 完成单点切换并清理 • Leader通知master完成切换 • Mater如果存在parent则尝试加入 • master写running_info/master • master删running_info/status • Leader回到S4状态

  25. 重要策略----结果合并 • 检查结果是否都执行成功; • 如果是单机命令,返回单机结果;否则, • 对insert, update, replace, delete操作,执行merge_without_result_set,超过500个分片时候,有问题; • 对select操作执行merge_with_result_set,具体如下:

  26. 百度实习的收获 • 1、工程经验——段错误的处理,core文件; • 2、做事的专业程度——执行力; • 3、与同事的沟通;

  27. Q&A 谢谢!

More Related