百度实习经历报告

Download Report

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
谢谢!