Archive

Posts Tagged ‘mysql’

mysql binlog的row模式数据解析

September 16th, 2011 No comments

drc-mysql是一种支持多master多slave的快速并行复制的解决方案,基于mysql的binlog,目前支持binlog的STATEMENT模式。为了实现drc-mysql对ROW模式的支持,本文对此展开研究,分析了binlog的事件格式,并针对不同的数据类型进行解析。

本文的目的是为了展示如何从row模式事件中解析数据,因此事件中一些记录其他信息的字节会直接略过,感兴趣的同学可以看看log_event.h以及log_event.cc两个文件。

 

获取Binlog事件:

Mysql对Binlog的处理是以事件为单位的,每一次DML操作可能会产生多次事件,例如对于innodb存储引擎,会额外产生一条QUERY_EVENT(事务的begin语句)以及XID_EVENT(事务提交)。

通过调用libmysql.so库中的cli_safe_read()函数可以获取一次binlog事件:

cli_safe_read(mm);   // mm类型为MYSQL*

net =  &mm->net;

buf = (const char*) net->read_pos + 1; Read more…

Categories: 数据库 Tags: ,

2011产品DBA全新招聘

July 21st, 2011 2 comments

2011年,淘宝产品DBA团队全新定位,现面向社会招聘,岗位要求如下:

产品DBA

1、熟悉MySQL数据库体系结构与性能优化
2、熟悉关系数据库原理与设计,有大型项目的数据库设计和支持经验优先
3、精通SQL调优
4、熟悉unix/linux操作系统的使用
5、熟悉shell&perl编程
6、大学本科以上,计算机相关专业

我们更希望你具有如下的能力或潜质:
1、良好的C,C++或者java编程能力
2、了解分布式Cache,或者一些NoSQL产品的源代码
3、对Hadoop大数据量计算,或者对HBase在线应用有一些尝试,或者对这方面感兴趣

如果你具有如下的能力,我们将更加欢迎:
1、良好的产品领悟能力,以及系统架构,分析能力
2、恰当合理的利用各种技术,解决业务系统瓶颈,以及未来发展问题

在淘宝,可以接触大量实际的业务需求,海量数据,高并发,每天都在面对挑战,至身这样的环境,你每天不得不去思考,每天去解决各种各样的问题,如果自己长时间解决不了,你可以寻求淘宝牛人的帮助。开放,相互帮助是淘宝的氛围。这是一条快速成长的捷径,快点加入我们吧。 简历请发送至 danchen(#)taobao.com ,将(#)换成@

Categories: 招聘 Tags: ,

增量日志迭代同步和阿基里斯悖论

April 21st, 2011 6 comments

假设我们有一套数据量庞大的前台系统需要从MySQL上转到Hbase上,比较粗糙的数据同步方法有:
1、将整个前台系统变为只读
2、全量dump MySQL数据
3、将MySQL数据导入到Hbase上
4、将前台系统切换到Hbase上,并打开更新
该方案比较简单,易于维持数据一致性,但是缺点是影响了所有用户的写入,并且时间过长。

用户体验看起来比较友好的数据同步方法有:
1、全量dump某个时间点之前的数据,并记录期间的增量日志A
2、apply日志A内的数据,并记录期间的增量日志B
3、apply日志B内的数据,并记录期间的增量日志C
4、不断重复第3步,直到日志C足够小
5、将整个前台系统变为只读,apply日志C内的数据
6、将前台系统切换到Hbase上,并打开更新
该方案实现比较复杂,迭代日志的做法看起来没完没了,而且容易引起少部分用户数据不一致。但是只读的时间非常短,大部分用户都能在数据同步期间自由使用应用。
Read more…

MySQL如何避免使用swap(二)

December 23rd, 2010 2 comments

之前介绍了MySQL如何避免使用swap的四个方法。这里需要补充一下原理和实现机制,对于Linux api不感兴趣的同学可以直接跳过。

一、操作系统设置swap的目的
程序运行的一个必要条件就是足够的内存,而内存往往是系统里面比较紧张的一种资源。为了满足更多程序的要求,操作系统虚拟了一部分内存地址,并将之映射到swap上。对于程序来说,它只知道操作系统给自己分配了内存地址,但并不清楚这些内存地址到底映射到物理内存还是swap。
物理内存和swap在功能上是一样的,只是因为物理存储元件的不同(内存和磁盘),性能上有很大的差别。操作系统会根据程序使用内存的特点进行换入和换出,尽可能地把物理内存留给最需要它的程序。但是这种调度是按照预先设定的某种规则的,并不能完全符合程序的需要。一些特殊的程序(比如MySQL)希望自己的数据永远寄存在物理内存里,以便提供更高的性能。于是操作系统就设置了几个api,以便为调用者提供“特殊服务”。

二、Linux提供的几个api
1、mlockall()和munlockall()
这一对函数,可以让调用者的地址空间常驻物理内存,也可以在需要的时候将此特权取消。mlockall()的flag位可以是MCL_CURRENT和MCL_FUTURE的任意组合,分别代表了“保持已分配的地址空间常驻物理内存”和“保持未来分配的地址空间常驻物理内存”。对于Linux来说,这对函数是非常霸道的,只有root用户才有权限调用。

2、shmget()和shmat()
这一对函数,可以向操作系统申请使用大页内存(Large Page)。大页内存的特点是预分配和永驻物理内存,因为使用了共享内存段的方式,page table有可能会比传统的小页分配方式更小。对于多进程共享内存的程序(比如ORACLE),大页内存能够节省很多page table开销;而对于MySQL来说,性能和资源开销都没有显著变化,好处就在于减少了内存地址被映射到swap上的可能。至于为什么是减少,而不是完全避免,之后再讲解。
Read more…

Categories: 数据库 Tags: , , ,