存档

‘MySQL’ 分类的存档

MySQL5.5复制/同步的新特性及改进

2010年12月2日 谭俊青 2 条评论

半年之前我有幸参加了MySQL2010用户大会,Oracle/Sun在会上公布了MySQL5.5的新特性,这次MySQL5.5改进的地方非常之多,当中引入的Google patch for MySQL中的半同步Semi-synchronous Replication,一个可用于高可用解决方案的新特性。谭俊青@MySQL实验室

MySQL5.5的在复制/同步方面的改进:

  • 保证主从服务器上数据的一致性(同步)
  • 能立检测到复制的异常
  • Crashed Salve能自动从错误中恢复同步
  • 在环形复制中用户能够指定跳过某实例事件
  • 主从复制中能自动适应字段类型的转换

MySQL半同步复制(semi-synchronous replication)

默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。
MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。
Master:
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
SET GLOBAL rpl_semi_sync_master_enabled=1;
SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, default 10s)
Slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
SET GLOBAL rpl_semi_sync_slave_enabled=1;

复制心跳(用户检测复制是否中断)

MySQL5.5提供的新的配置master_heartbeat_period,能够在复制停止工作和出现网络中断的时候帮助我们迅速发现问题。

启用方法:

STOP SLAVE;

CHANGE MASTER TO master_heartbeat_period= milliseconds;

START SLAVE;

Slave自动恢复同步

在MySQL5.5版本之前,MySQL Slave实例在异常终止服务之后,可能导致复制中断,并且relay binlog可能损坏,在MySQL再次启动之后并不能正常恢复复制。在MySQL5.5中这一问题得到了解决,MySQL可以自行丢弃顺坏的而未处理的数据,重新从master上获取源数据,进而回复复制。

跳过指定复制事件

在多Master或环形复制的情况下,处于复制链条中间的服务器异常,可以通过

CHANGE MASTER TO MASTER_HOST=xxx IGNORE_SERVER_IDS=y

跳过出问题的MySQL实例。

自动转换字段类型

MySQL5.1在基于语句的复制下,支持部分的字段转换,但是行级的会报错。MySQL5.5语句和行级复制都已支持。还可以通过 SLAVE_TYPE_CONVERSIONS 控制转换的方向。

Handler-Socket Plugin for MySQL – SQL的功能、NoSQL的性能

2010年11月24日 谭俊青 6 条评论

记得半年多前写过MySQL vs NoSQL ,且一直以来我比较坚持用数据库存储K/V数据,因为不只是对数据安全等能提供保障,主要是发现大部分系统的qps根本就没那么高,能上4k的水平已经很少了,这点MySQL完全可以满足,因为优化好的K/V请求,在MySQL的SQL层上能实现每核心5k左右的qps,而这一数据在HandlerSocket出来之后,得到了更大的提升。

HandlerSocket plugin for MySQL 已经出来一段时间了, 鉴于HandlerSocket和InnoDB的健壮、安全性, 可以预见HandlerSocket取代Memcached等NoSQL存储/Cache,已经是大势所趋。

HandlerSocket 是MySQL的一个插件,用于跳过MySQL的SQL层面,直接访问内部的InnoDB存储引擎,从而充分发挥InnoDB的性能优势;此外,InnoDB的ACID特性,可以保障数据的安全。

初步对比了下,HandlerSocket Plugin for MySQL性能跟Memcached差不多,原文中的测试数据显示更胜Memcached一筹,接下来准备跟ndbapi的性能进行对比测试,为系统构架提供参考。

                           approx qps     server CPU util
MySQL via SQL                105,000      %us 60%  %sy 28%
memcached                    420,000      %us  8%  %sy 88%
MySQL via HandlerSocket      750,000      %us 45%  %sy 53%

HandlerSocket源码地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/

HandlerSocket的客户端:

HandlerSocket Client for Perl

HandlerSocket Client for Python

HandlerSocket Client for PHP

HandlerSocket Client for Java

– ————————————-
update: 2011/04/08
在Dell R710 双四核 E5620 下,mysql版本为5.1.54,未修改任何源码,采用php的handler-socket扩展,测试结果稳定在33万+QPS,其中mysqld占用cpu约为50%

分类: MySQL, nosql 标签: ,

MySQL在多核心服务器上的性能表现

2010年11月11日 谭俊青 3 条评论

手头上有一份9个月前的测试数据,当时帮一位朋友讲服务器换成小机之后,性能没法达到预计的目标,在优化的过程中在128线程的小机上做了简单的测试,发现MySQL在多核心机器上并发性能表现还不错。

当中红色的是 MySQL 5.1.44, 蓝色的是MySQL 5.5.2-m2.

要说明的是测试TPS不高,主要是sun的小机cpu主频太低。

分类: MySQL 标签:

Google 2011校园招聘笔试题

2010年10月12日 谭俊青 2 条评论
刚在群里发现朋友发的,据说是Google的招聘笔试题,不知道真假,觉得有趣,分享下。
Google的2011年校园招聘宣讲会分别在北大和清华举行,其中北大本来是350人的会场,去了大约600多人,爆满,那场面绝对是人山人海,彩旗飘飘。经过了大约一个小时多的宣讲和问答,开始现场笔试环节,一共10个选择题和三个算法题,只有选择题答对了6个以上的人才有机会让面试官看你后面的算法题。然后明天下午会通知笔试通过的人进行面试,google的效率就像其搜索引擎一样迅速,效率可见一般。
其中前10个选择题中有一个特别雷人的,题如下:
现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能赚40万。如果他想买这套房子,不贷款,不涨工资,没有其他收入,每年不吃不喝不消费,那么他需要几年才能攒够钱买这套房子?
a, 5年
b, 7年
c, 8年
d, 9年
e, 永远买不起
==========================================================
y1 = 1.1^x * 200
y2 = 40 * x
用中学的作图解题,上面的曲线和下面的直线是没有交点的。
———-
另外不作图简单计算也方便
1:200/40=5, 1.1^5*200 >322
2: 322/40>8, 1.1 ^8*200>400
3: 400/40 >10, 1.1 ^10*200>500
已经看出来了,后面的增长每年已经超过40,因此可知道答案
———-
f(x)=y1-y2
求导,得解
———-
如果将题目改一下呢?如果每年的工资也已10%的速率增长呢?是否有交点?
分类: MySQL 标签:

MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)

2010年9月1日 谭俊青 1 条评论

MySQL实验室

1. MySQL中并发和隔离控制机制

  • Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作。一种特别的meta-data元数据类型,叫Name Lock。(SQL层)
  • 表级table-level数据锁(SQL层)
  • 存储引擎特有机制 — row locks行锁,page locks页锁,table locks表级,版本控制(在引擎中实现)
  • 全局读锁 — FLUSH TABLES WITH READ LOCK(SQL层)

【阅读全文·MySQL实验室】

分类: MySQL 标签: , , ,

MySQL Cluster Manager(集群管理器) 工作原理、安装及使用

2010年8月27日 谭俊青 11 条评论

MySQL Cluster使用不那么广泛,除了自身构架因素、适用的业务有限之外,另一个重要的原因是其安装配置管理相对复杂繁琐,总共有几十个操作步骤,需要DBA花费几个小时才能搭建或完成升级。MySQL Cluster 7.1推出了MySQL Cluster Manager,MySQL Cluster的安装、升级管理等操作,将DBA原本需要几个小时的工作,节省到通过若干个命令即可完成,还能避免操作的失误。MySQL Cluster Manager的基本工作原理如下图所示:

MySQL Cluster将要被部署的机器上安装好 MySQL Cluster Manager Agent之后,通过现有的mysql客户端即可连接操作使用。可以连接任何一台机器上的Agent,它们之间能相互通信。Agent默认连接端口为:1862,即可如此连接: mysql -h hostname -u username -p -P 1862

连接之后即可通过Agent对集群系统进行交互、管理。

【阅读全文·MySQL实验室】

DMB(For MySQL)数据库监控备份工具

2010年8月22日 谭俊青 没有评论

因为初学Python, 花费了几个礼拜的周末休息时间, DMB的雏形已经出来, 并提供下载使用(适合新手和偷懒的人高手跳过),有Bug和建议请及时发聩给我。

因为是初学,在编写DMB的时候,当中遇到一些问题,花费了不少时间来解决,这里总结下,也许能给后进者节约些宝贵的时间。

  • 涉及GUI多线程编程的时候,使用wx.CallAfter(), 如:wx.CallAfter(self.AfterRun);
  • 调用 subprocess.popen, 当子进程已经推出之后 stdin.close()调用会报错, 这时候可以用 try: process.stdin.close()  exception 来屏蔽错误;
  • gzip.GzipFile 对数据流压缩很方便,可以避免临时文件的产生,解压读取方便,效率也不错;
  • 获取硬件指纹 wmi 是个好东东;
  • 加密解密可以用 pyDES, M2Crypto;
  • 用py2exe生成.exe可执行文件的时候的icon可以用过 img2py 生成,然后在程序中设置,可以避免调用win32api,避免在 vista/win7下出错;
  • wx.wizard.Wizard的 finish按钮也可以通过 wizard.FindWindowById(wx.ID_FORWARD).Disable() 来屏蔽,这个浪费了我很长时间。

这次使用wxpython,算是对桌面程序的尝试,不过趋势还是采用B/S,也方便维护和管理人员远程监控和操作管理。如果有必要,会将DMB改造成B/S构架,准备用cherrypy提供web服务,跟系统进行交互。

【阅读全文·MySQL实验室】

分类: MySQL, news / tools, python 标签: , , ,

致歉好耶开发人员

2010年8月3日 谭俊青 3 条评论

在这里给好耶参加MySQL性能调优培训的朋友们致歉。继上上周培训课程结束之后,因个人原因,未能继续给大家上课,还让大家在周六等了那么长时间,向大家说声:“对不起”。

PS1: 陆续有朋友问及MySQL高可用方案,这里提下:当前MySQL高可用方案自动化程度和靠谱的算是DRBD和Semi-sync-replication。在此基础上扩展slave做负载均衡(比如lvs)需要注意,另外需要monitor监控Slave状态,及时将失效节点从pool中剔除。

PS2: 这次有个项目,因为开发过程中经历了大量的需求变更,开发人员为了方便,采用了大量试图,导致后续出现严重问题(SQL查询时间过长),而在此基础之上做SQL调优能发挥的地方有限,所以开发的同志们注意了,在涉及到web开发,特别是对页面响应时间要求很高的时候,避免复杂join操作,适当添加冗余字段。救急办法:将涉及到的中间试图换成base表,在原始表上添加触发器。

PS3:前几天又有朋友问到session管理,我给的方案还是用 MySQL Cluster NDB 管理,其中我还发布过一个PHP 实现的 DbSession类,为了提高性能可以不记录任何日志信息(重启之后数据消失),”SET GLOBAL ndb_table_no_logging = 1;”。

PS4:据说这个是史上最牛的MySQL补丁,非堵塞是的网络IO,可以让32核心的机器跑上18万QPS。

MySQL Cluster Checkpointing

2010年7月14日 谭俊青 没有评论

因为MySQL Cluster的分布式构架,考虑到整个MySQL Cluster的启动和恢复效率问题,MySQL Cluster的日志跟传统的事务数据库(比如InnoDB)有很大的差别。

MySQL ClusterRedo log不再是直接记录更改的page内容,而采用记录操作日志,以用于全局恢复数据用。整个用于Revocery的日志采用 LCP+GCP协作完成。当中LCP只针对当前数据节点,在一定数据量(数据量大小)被更改之后,同步一次内存(DataMemory)和磁盘内容,每个节点保留3份(新版保留2份);而GCP是全局日志,默认是2秒(时间)中将Redo Log Buffer的内容同步到所有的数据节点的磁盘上,用于突发事件恢复使用。 … 【阅读全文·MySQL实验室】

TCP keep-alive & connection pool

2010年7月9日 谭俊青 没有评论

作者:谭俊青@MySQL实验室,转载请注明链接和出处。

要理解TCP keep-alive/persistent connection, 得从TCP协议说起。

TCP flow:

    _____                                                     _____
   |     |                                                   |     |
   |  A  |                                                   |  B  |
   |_____|                                                   |_____|
      ^                                                         ^
      |--->--->--->-------------- SYN -------------->--->--->---|
      |---<---<---<------------ SYN/ACK ------------<---<---<---|
      |--->--->--->-------------- ACK -------------->--->--->---|
      |--->--->--->-------------- ... -------------->--->--->---|
      |---<---<---<-------------- ... --------------<---<---M---|

建立TCP链接需要经过3步,SYN、SYN/ACK、ACK,关闭则需要4步

约定:

当用户通过浏览器打开一个页面的时候,最小情况下,只需要2个packet,一次是请求(http get request),一次是回应(response from server)。但是这里没有计入TCP链接的建立(3 packets)和关闭(4packets),当然每个packet都需要ACK,但是ACK信息一般直接包含在回应的packet里,为了量化方便,这里忽略掉。 … 【阅读全文·MySQL实验室】

Web前端优化

2010年7月2日 谭俊青 没有评论

各浏览器并发下载数列表:

Browser HTTP/1.1 HTTP/1.0
IE 6,7 2 4
IE 8 6 6
Firefox 2 2 8
Firefox 3 6 6
Safari 3,4 4 4
Chrome 1,2 6 ?
Chrome 3 4 4
Opera 9.63,10.00alpha 4 4

随着宽带的普及,为充分利用用户的带宽,提升用户体验,可设置多个子域名。

Javascript和css尽可能从页面中分离出去,作为独立的文件。

为了减小header头大小,静态文件尽量用其他不带cookie的域名提供下载(当然还要兼顾到DNS解析时间)。
如:www.mysqlab.net用到

http://s0.mysqlab.net.cdn007.com/css/base.css

http://s1.mysqlab.net.cdn007.com/js/global.js

MySQL连接、memcache连接尽量在echo之前断开连接。

使用DBSession保持用户在线状态,方便负载均衡、统计、定位用户在线情况及跨域访问。

当前绝大部分memcached可以通过MySQLD来存储实现,具有更多的特性,如:安全、高可用等。
(MySQL基于主键查询可实现5000+qps每核心)

浏览器并发下载数参考:

http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/

分类: MySQL, Web前端, php 标签: , , ,

使用SSD跑InnoDB注意事项及解决方案

2010年6月22日 谭俊青 11 条评论

相信有不少同仁已经做过过SSD作为存储对IO瓶颈的数据库性能测试,在得到可喜的成绩之余,在用于生产环境之前需要解决一些问题。

InnoDB共享表空间包含:
Data dictonary
Double write buffer
Insert buffer
Rollback segments
UNDO space … 【阅读全文·MySQL实验室】

MySQL UC 2010回顾:开源软件的活力

2010年5月25日 谭俊青 2 条评论

ivan-mysql-uc-2010

前端时间写过一篇博客:竞争给MySQL带来的压力和动力,现整理下。–谭俊青@ MySQL实验室
【阅读全文·MySQL实验室】

分类: MySQL, news / tools 标签:

MySQL RAC构想

2010年4月29日 谭俊青 没有评论

距离Matthew Yonkovit发布Waffle Grid已经有一年多了,最近看到qlks发布了Secondary Buffer Pool in InnoDB,又让我想起来了waffle。waffle做的事情也是InnoDB的二级缓存,但是用的不是SSD,而是Memcached。如果将所有的buffer都用memcached实现,进一步就可以实现内存的分布式共享,进而实现MySQL RAC。需要做的工作会不少,但应该是个可行的办法… … 【阅读全文·MySQL实验室】

竞争给MySQL带来的压力和动力

2010年4月28日 谭俊青 没有评论

这次2010 MySQL UC上MySQL在MySQL5.5-m3发布没多久之后紧急发布了MySQL5.5-m4及InnoDB Plugin 1.0.7 (GA) 和 InnoDB Plugin 1.1。敏感的人应该发现了这点,其实这背后是因为 Percona给了MySQL官方和InnoDB Team太多的压力。早在InnoDB Plugin 1.0.7 和 1.1发布之前,XtraDB的性能一度超越Built InnoDB及InnoDB plugin高达30%。让我们先看看Percona XtraDB之前都已经具备了哪些些特性:By ivan@mysqlab.net … 【阅读全文·MySQL实验室】

分类: InnoDB Plugin 标签:
Pages: Prev 1 2 3 4 5 6 Next