Transcript 百度实习经历报告
百度实习经历报告以及 OnlineSchemaChange项目和ddbs的简介 [email protected] 2011-10 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 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操作可以并发进行。 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 OnlineSchemaChange项目---- OSC的实现1 • 初始数据结构和运行环境的初始化 需要锁表,但是时间很短的 • • • 源表的拷贝(非常耗时的部分) – – – 为了不影响线上业务的IO拷贝一定数量的记录后会睡眠; 在这个过程中对源表的查询访问可正常进行。 在这个过程中,对源表的插入、删除、更改操作也会正常进行,但会被额外的记录 在OSC日志中,并且定期刷入磁盘。 在线日志重演 – – 为了不影响线上业务的IO拷贝一定数量的记录(一个block)后会睡眠; 在这个过程中对源表的查询访问可正常进行,对源表的插入、删除、更改操作也会 正常进行,但会被额外的记录在OSC日志中,并且定期刷入磁盘。【同上】 离线日志重演 – – 需要锁表; 先处理日志文件中可能存在的记录,再处理内存中的记录。 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中,它指向下次日志重演的文件偏移。 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 OnlineSchemaChange---- 可能的问题和建议 • Mysqld停掉,log_in_memory[OSC_LOG_CAPACITY]会立即被刷 到磁盘吗?【schema-change没有做完,innodb会自动回滚重做】。 • 两次更改的问题,在旧表中的操作被记录在日志中以后,又会在新表 中重演; • 暂停拷表的时间间隔osc_io_interval是否可考虑随着线上服务请求的 繁忙程度而动态改变; • 内存日志记录容量OSC_LOG_CAPACITY是否也可以动态;以便适应 复杂的环境; 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 ddbs系统框架 ---- 整体架构 客户端 客户端 5 dbproxy tablet_server_cluster tablet_server_cluster tablet_server ts_agent 管理员 1 tablet_server 2 zookeeper 3 cli 4 ts_agent 目前在使用的百度产品线 • 百度百科 • 音乐电台——百度听 • Linkcache——百度新闻的缓存 • Logdata——某产品的日志文件 • 等等 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命令 ddbs系统框架 ---- 数据划分 • 数据划分:在DDBS中,将一张分布式表按照指定的Partition Key和 Partition Mode分成多个数据片(称为Tablet),分散在多个数据存储 节点中,一般情况下,一个cluster里面只有一个Tablet。 • Partition Key:是 DDBS 中用于数据划分和定位的属性,该属性是 • Partition Mode:是 DDBS 中用于数据划分的方式,常用的数据划 应用创建的分布式表中的一个字段。Partition Key 的选择决定了数据按 照哪个字段来进行数据分布和组织,一张分布式表只能有一个 Partition Key。 Partition Key 与 Tablet的索引并无强制对应关系。 分方式包括基于Partition Key 的按范围划分、按散列取模划分、按时间 划分、按枚举/列表划分、以及前几种划分方式的组合(称为组合划分 )等。 ddbs系统框架 ---- 数据划分(例子) • • • • • • • • • • • • CREATE DISTRIBUTED TABLE IF NOT EXISTS disIntRange1 ( intID INT NOT NULL PRIMARY KEY, name VARCHAR(1000) )ENGINE = InnoDB PARTITION KEY (intID INT) 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') }; ddbs各模块功能介绍(zookeeper) • zookeeper:表括包,据数元储存于用要主 。等等息信限权、息信分划、息信 – /ddbs/sys_user tsagent的帐户相关信息; – /ddbs/machine 集群机器; – /ddbs/command_status/cli cli登录信息; – /ddbs/product/产品名/ tablet_server mysql信息; – /ddbs/product/产品名/ tablet_server_cluster mysql_cluster信息; – /ddbs/product/产品名/ tablet_server_agent 管理代理信息; – /ddbs/product/产品名/ table 表信息; – /ddbs/product/产品名/ tablet 表的分片信息; – /ddbs/product/产品名/ dbproxy dbproxy的配置信息; – /ddbs/product/产品名/ product_user 应用用户帐户信息; 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; ddbs各模块功能介绍(dbproxy) 配置文件更新,及重启服务 服 务 框 架 客户端网络:连接,认证,读,写 后端网络:conn_pool管理数据库连接,负载均衡 用户权限认证,连接数管理 日志分析和定期上传 sql协议的实现,mysql internal protocol 处 理 请 求 sql语句解析:解析sql的类型,各部分 sql语句分解:分解原sql到为多个sql语句 sql路由:将分解后的sql转发到相应的ts,包括读写分离; 穿透指定数据库服务器功能 缓存命令处理 结果合并:按不同策略合并结果 ddbs各模块功能介绍(tsagent) DBA控制命令 传递cli传递过来SQL命令给ts:括包DDL、令命SHOW。令命 控监Tablet Server况情行运的 控监Tablet Server活存否是,常正否是步同从主控监 ,控监 Table Server据数的 量,控监 Table Server载负的,主从切换等。 控监Tablet Server况情行运的器机在所 盘磁、况情间空盘磁,况情量流卡网,况情存内:如例,况状源资的机本查检I/O情 、况CPU 。值计估载负的机本算计并,况情 大纲 • OnlineSchemaChange项目 OSC的背景和需求 OSC的实现 OSC可能的问题和改进建议 • 百度ddbs系统 ddbs的系统架构和功能模块的介绍 ddbs中的基本策略 重要策略----主从分离 query->args 是 当前是否在事务中 是 上次query在事务中 是 写操作 是 读,但时间未到; 是 MS_SLAVE 读操作 MS_MSTER 重要策略----load balance • • • 如。出取中从就那,例实接连的净干有中池接连前当果如 。接连的新个一立建新重要需,了败失接连者或,有没果 需不以所,点节个一有只为因,上库主在落令命条一果如 ;理处衡均载负要 中从么那,选可库从个多有,上库从在落令命读条一果如 数接连前当 出选/个一的小最 (的置配是值权)值权slave 。 重要策略----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状态 重要策略----结果合并 • • • 检查结果是否都执行成功; 如果是单机命令,返回单机结果;否则, 对insert, update, replace, delete操作,执行merge_without_result_set,超过500个分片 时候,有问题; • 对select操作执行merge_with_result_set,具体如下: max/mi n/sum/c group by order 处理方法 by 0 0 0 直接合并输出; 0 0 1 归并排序输出; 0 1 0 归并,同key只输出一个; 0 1 1 发送命令去掉order by;结果归并,同key只输出一个;排序; 1 0 0 合并结果,只输出一行结果; 1 0 1 合并结果,只输出一行结果; 1 1 0 归并,再做max/min/sum/count处理; 1 1 1 发送时去掉order by,对结果做归并,最后做全结果排序; 百度实习的收获 • 1、工程经验——段错误的处理,core文件 • • ; 2、做事的专业程度——执行力; 3、与同事的沟通; Q&A 谢谢!