orczhou

  • 以前虽也想过出国旅行,但从不曾实践,感谢LallaNingoo的分享和鼓励,让我和Kiki在预算允许的情况下,好好享受了东南亚海岛的阳光。经历了出国前的忐忑,旅途中的惊喜,十天马来西亚旅程算是尽兴而归。打算写下整个历程,这会是一个系列文章,一则留念,再则也写给那些曾和我一样”担心”、”犹豫”的朋友:买好机票,一切就水到渠成了

    机票购买

    简单版本

    简单版本:打开亚航网站http://www.airasia.com/,搜索,预订,付款。

    详细版本

    本文是一个较复杂版本,如果你从未在亚航预订过机票,建议阅读。

    机票是在亚洲航空(亚航)预订的,亚航是一家马来西亚的廉价航空,从中国到东南亚各个国家都很方便,只要提前预订总能购买到非常便宜的机票,亚航的口号是:”Now everyone can fly”

    机场 (more…)

  • 以前虽也想过出国旅行,但从不曾实践,感谢LallaNingoo的分享和鼓励,让我和Kiki在预算允许的情况下,好好享受了东南亚海岛的阳光。经历了出国前的忐忑,旅途中的惊喜,十天马来西亚旅程算是尽兴而归。打算写下整个历程,会是一个系列文章,一则留念,再则也写给那些曾和我一样”担心”、”犹豫”的朋友:买好机票,一切就水到渠成了

    初到大马

    此次旅行主要目的地是兰卡威,先到吉隆坡(Kuala Lumpur),次日转机到兰卡威岛上,回城时也在吉隆坡住了一晚上,这两天也稍微逛了一下吉隆坡。

    吉隆坡夜景

    比起国内的城市,吉隆坡绿化率非常高,城市零散在植被中:

    吉隆坡夜晚
    (more…)

  • MySQL/InnoDB和Group Commit(2)

    ·

    今天发现Percona Release的Percona-Server-5-5-18-23-0已经完成了Group Commit工作,而且是用最优雅的方式(移植了MariaDB的实现,而不是workaround),心里难掩激动。

    这篇文章接前篇继续介绍一下问题的背景:什么是Group Commit,现在的官方版本Group Commit做到了什么程度?

    1. 什么是Group Commit

    MySQL/InnoDB在做事务的时候使用的日志先行(Write-ahead logging)的方式保证事务的快速和持久,所以每次事务完成都要求日志必须持久化到磁盘,在Linux上对应的操作就是“write and fsync”,write速度是很快的,一般对应的写Page Cache,而fsync则要求文件系统把对应文件的哦Page Cache必须持久化到磁盘上,而对于传统磁盘一次写操作大约需要1~3ms(不说BBU),这意味着对于传统磁盘1秒钟最多最多做333~1000个事务,这是不理想的,对硬件的利用率(吞吐量)也是非常低。

    所以,这里就有了Group操作的概念,即当好几个线程都要fsync同一个日志文件时,我们将这些fsync合并到一次来做。简单举例:我们让系统每2ms做一次fsync,这样如果这2ms内有100个线程都需要做fsync,那就赚到了,原本100个fsync都独立来做那耗时会非常多的。

    你肯定会说,难道这不是很简单的想法吗?是的,这就是原本是很简单、也很自然的想法。

    但对MySQL来说却变成了一种奢求(看看这个Bug讨论)。

    2. 为啥MySQL一直没有实现?

    MySQL是不是太弱了,这么简单的事情都搞不定?不是的。

    MySQL从开源到现在,成功的一个非常重要的原因,就是MySQL的插件式架构。如果MySQL只是MyISAM估计不会有现在的流行程度,插件式的架构让诸如Heikki Tuuri有了发挥空间,在InnoDB和MySQL一起时,MySQL才能算是一个真正的DBMS。再到后来,有Infobright、 FEDERATED、PBXT等等。

    插件式的架构给MySQL带来了活力,做出牺牲便是在上层(MySQL)和下层(存储引擎)交互时带来的额外消耗,有时甚至上层和下层需要做一些重复工作。无法做Group Commit就是这其中的牺牲之一。

    (more…)

  • 这里介绍一个最近用得很多的一个小工具:tbdba-restore-mysqldump.pl

    主要有两个功能:

    (1) 尽可能快的从一个非常大的mysqldump文件的分离出某个单表的备份文件

    (2) 可以帮你把一个大的mysqldump文件,切割成非常小的单表备份文件(可继续做并行恢复)

    1. 什么时候需要这么做

    (1) 如果把MySQL中某一个表数据弄丢了,需要从很大的mysqldump备份文件中恢复这个表

    (2) 如果你想并行恢复整个mysqldump备份文件时,这个脚本可以帮你把大文件切割成多个小的单表备份文件,然后就可以方便并行恢复多个文件了

    2. 如何使用这个脚本

    这里以实例的方式介绍如何使用该脚本:

    (1) 从backup.sql文件中获取表process的备份:

    tbdba-restore-mysqldump.pl -t process -f backup.sql

    (2) 从backup.sql文件中获取数据库monitor中的表process的备份:

    tbdba-restore-mysqldump.pl -t process -s monitor -f backup.sql

    (more…)

  • TCP/IP重传超时–RTO

    ·

    概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包。主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO。本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现。本文旨在分享:当遇到了TCP层问题改如何去查找、阅读文档,该如何去在Linux源码中寻求答案。

    起源

    在分析MySQL Semi-sync故障时,我们用Tcpdump+Wireshark(感谢淘宝雕梁)抓住当时的网络包传送细节,观察到了一次TCP重传最终导致了Semi-sync超时:

    第一次传输
    13:55:11.893291 master => slave	Binlog pos:319890197
    重传:
    13:55:12.094596	master => slave	Binlog pos:319890197

    看到两次传送间隔约201毫秒,即第一次传输201毫秒后,还没有收到ACK响应,TCP认为传输超时,开始重传。

    疑问:host和host之间的RTT大约是0.5毫秒,为什么第一次重传需要等200毫秒?(我希望是<20ms)socket程序可以配置吗RTO吗?TCP有参数可配置RTO吗?

    Google/书籍/RFC

    翻开TCP/IP详解找到关于TCP Retransmission章节,较详细的介绍TCP的超时机制,书中是个概述,于是又找到RFC1122。

    RFC1122的4.2.2.15和4.2.3.1都介绍了Retransmission Timeout的处理(说来惭愧,这是第一次阅读TCP相关RFC)。

    RFC中搜索Retransmission发现RFC 793 1122 2988 6298都有对重传算法、和初次重传超时的描述。于是开始阅读这个四个RFC,耗时约2小时,了解了大致的重传超时算法。

    (more…)
  • 这又是一篇介绍Semi-sync的文章。

    Semi-sync主库在一定时间内(可配置的超时时间),如果没有收到备库的响应,则会超时从而降级为普通的replication复制。如果超时发生,有时需要查清什么原因导致备库没有及时响应,一方面可以从备库的日志着手,另一方面,如果需要更细致的信息则需要从备库端的网络包查找原因。这里介绍如何分析一个Semi-sync备库响应主库的数据包。

    概述:先使用tcpdump抓取正确(主要是src和dst都正确)的数据包;然后借助wireshark玻璃TCP/IP等层的头信息,仅保留发送的MySQL数据包;再分析MySQL Semi-sync Slave响应的协议。

    1. tcpdump原始数据包

    通过如下tcpdump抓取主机的网络包:

    nohup tcpdump -n -nn -tttt -i bond0 -s 65535 'port 3306 and ((dst host master.host and src host slave.host and len < 100) or (dst host slave.host and src host master.host))' -w tcpdump.ret -C 50 &

    参数简单说明:

    -n 表示ip不要转换为主机名 -nn表示端口号,不要转为为服务名(例如3306会被转换为mysql) -tttt 打印出完成的格式化的时间戳 -C 50 表示抓取的结果放到文件中,文件大小不超过50MB
    2. 使用wireshark找到对应的包

    (more…)