• DBA是一个高危职业,因为接触的是最底层数据,一个很小很小的失误,足以放大到让整个系统崩溃。从来公司DBA系统组的第一天起,看过很多同事犯错,有犯大错,有犯小错的,有把公司网站搞挂的,也有只影响内部系统的。每次这种时候,我总对自己说,有一天我也是会犯错的,这会一天是哪一天呢?

    同事们都很小心,每次操作如履薄冰,每次变更反复检查,虽偶有懈怠,彼此也通过各种方式会相互提醒。这样我们能够避免多数错误,能够借此追求系统的稳定,追求我们的目标。

    人会犯错,偶尔的懈怠也终究有一天会演变成一次致命的故障。我总对自己说,有一天我也是会犯错的,这会一天是哪一天呢?今天有答案了。

    我想对自己说一句:对不起。

  • 如果用的引擎是InnoDB,每次敲下mysqladmin -uroot -p shutdown关闭数据库的时候,总是很难预测这个命令会执行多久,实际经验表明,短则五秒,长则三十分钟一小时都有可能。也分享一下我的经验吧。

    1. 为什么InnoDB关闭会慢?

    事实上,并不是每次关闭InnoDB都很慢的。Why?InnoDB较之MyISAM,一个重要特性是InnoDB会在内存中开辟一个Buffer Pool来存储最近访问的数据块/索引块,使得下次再次访问这个块时速度能够很快。当InnoDB对需要修改数据块的时候,会先记录修改日志,然后直接对Buffer_Pool中的数据块的操作。记录日志是顺序写,对数据块的操作是内存操作,这让InnoDB在很多场景下有这很好的速度优势。 (more…)

  • Truth Seeker

    我们生活在同样的蓝天下,脚踏着同样的土地,享受着同样的阳光,我们生活在同样的时间、空间,我们彼此相遇,聚集在一起歌唱、游戏、踢球,我们有很多的爱好、共同的习惯

    有时,我们却又着完全迥异的思维,有着完全不同的行事方式;有时我们相安无事,你吃你的面条,我吃我的大米;但我们也会因这些不同而争论,有时是争吵,有时是街头暴力,有时是军事冲突,有时候是世界混战

    在完全相同的时空中,我们都在追求真理(假设我们都在),即使我们有争论

    参考:

    1. 真理追求者

    2. Agreeing to Disagree

    3. Time Saving Truth from Falsehood and Envy, François Lemoyne, 1737

    Time_Saving_Truth_from_Falsehood_and_Envy

  • Flashcache配置

    前面写了两篇文章,分别介绍了Flashcache的基本原理和编译安装,本文介绍一下Flashcache的配置。

    假设现在你已经编译好了Flashcache,已经装好了ssd盘(假设是/dev/sdb)和sas盘(假设需要使用的是分区/dev/sda12,这可能是一个RAID组)。接下来,看看如何使用Flashcache将上面两个设备虚拟成一个带缓存的块设备。

    1. 首次创建Flashcach设备

    注:请备份你的数据先!!!特别是/dev/sdb,这个设备上的数据将会被清空;理论上/dev/sda12上的数据不会有任何丢失。

    首先确保sda12没有被挂载,如果挂载了,使用umount卸载之,然后使用flashcache_create创建设备:

    ./flashcache_create cachedev /dev/sdb /dev/sda12

    如果是sudo帐号可能会遇到如下的报错: (more…)

  • 入职已经489天了,新鲜事很多,不过更多应该是无趣、枯燥的日常:装很多的数据库、反复的测试、写很多的脚本…… 不过,在这繁忙工作中,还是希望自己能够保持一份趣味。

    下面这个perl函数就是帮你保持脚本有趣的一个办法。

    在你的Perl脚本中下面的函数,并在脚本的第一行调用之。函数会在你的输出前随机的输出一条“名言”,让你在枯燥的调试程序时,仍然保持一份清醒:

    use MIME::Base64; ####################################################### # This is a interesting function by orczhou@gmail.com # It outputs a random quote ####################################################### sub randomQuote{ my @quote; push(@quote,"S2VlcCBpdCBzaW1wbGUsIFN0dXBpZA=="); push(@quote,"VG9tb3Jyb3cgaXMgYW5vdGhlciBkYXk="); push(@quote,"TGlmZSBpcyBsaWtlIGEgYm94IG9mY2hvY29sYXRlcw=="); push(@quote,"VGhlIGFuZ3J5IGlzIHRoYXQgdGFraW5nIHRoZSBvdGhlcidzIG1pc3Rha2UgdG8gcHVuaXNoIG9uZXNlbGY="); push(@quote,"VGhlIGhvcGUgb2YgdG9tb3Jyb3cgbGV0cyB1cyBmb3JnZXQgdG9kYXkncyBwYWlu"); push(@quote,"VGhlIHBsYWNlIHdoaWNoIHRoZSBpZGVhbCBpcyBpbiwgdGhlIGhlbGwgbWF5YmUgYSBoZWF2ZW4="); push(@quote,"Rm9yIGhpcyBsb25nIGFuZCBub24tdmlvbGVudCBzdHJ1Z2dsZSBmb3IgZnVuZGFtZW50YWwgaHVtYW4gcmlnaHRzIGluIENoaW5h"); push(@quote,"V2hhdCBpcyBkb25lIGJ5IG5pZ2h0IGFwcGVhcnMgYnkgZGF5"); push(@quote,"SWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgcGVyZmVjdCBmcmllbmRzaGlwLCBwb3NzaWJseSB5b3UgbWF5IGZpbmQgbm8gZnJpZW5kIGZvciBhbGw gbGlmZXRpbWU="); push(@quote,"VGhlIGV4cGVyaWVuY2UgdGFrZXMgb3V0IGJ5IHRoZSBlc3NlbmNlIG9mIHBhaW4="); push(@quote,"VGhlIGJpZ2dlc3QgbWlzdGFrZSBpbiBsaWZlIGlzIHRoZSB1bmNlYXNpbmdseSB3b3JyaWVkIGFib3V0IG1ha2luZyBtaXN0YWtl"); push(@quote,"TGF6aW5lc3Mgd2lsbCBjYXVzZSB5b3UgcGFpbg=="); push(@quote,"S2VlcCB0aGUgcGFzc2lvbiBmb3IgeW91ciBqb2I="); push(@quote,"VGhlcmUgaXMgb2Z0ZW4gbGVzcyBkYW5nZXIgaW4gdGhlIHRoaW5ncyB3ZSBmZWFyIHRoYW4gaW4gdGhlIHRoaW5ncyB3ZSBkZXNpcmU="); push(@quote,"WW91IGNhbiB1c2Ugc2NyaXB0IGRvIG1vcmUgd29yayxidXQgc2FkZGx5IGl0IG1ha2UgbW9yZSBqb2JzIGNvbWUgdG8gdQ=="); push(@quote,"TXkgbmFtZSBpcyBteXNxbGRhdXRvLkkgd2FzIGNyZWF0ZWQgYnkgb3JjemhvdQ=="); #push(@quote,""); my $count = scalar(@quote); my $rand_num = int(rand($count)); print decode_base64($quote[$rand_num])."\n"; } randomQuote();

    如果觉得上面的代码,破坏了脚本的输出,可以使用参数控制其是否输出。

  • 很多人都讨论了这个问题,参数innodb_thread_concurrency限制了InnoDB内部线程的数量。例如当有query需要InnoDB处理时,InnoDB首先会检查一下当前的内部线程数是不是超过了innodb_thread_concurrency的限制,如果超出则会让当前线程sleep一会儿,再试,如果还是受限,则会进入一个FIFO的队列。如果innodb_thread_concurrency设置成0表示,内部线程数量将不受限制(注:innodb_thread_concurrency值在不同的版本意义略有不同)。

    1. 该参数设置成多少合适?

    我不知道多大合适。我的经验值设置成64就够了,正常情况,应用并发不会超过这个值。

    如果设置成0,会让InnoDB的内部线程不受限制,如果你高并发的IO-bound的应用,很可能在InnoDB内部累计很多的并发等待IO的线程,主机的Load会很高,但是数据库依然会正常运行。

    从5.1.11开始这个值的默认值是8,意味着,InnoDB会限制内部线程数不超过8。如果是高并发的应用,你的MySQL能力可能会受到这个参数的限制。对于很多情况这个值有偏小的,并发量可能会比8大,这时参数innodb_thread_concurrency就会成为InnoDB的瓶颈。对于一个16核的系统,处理的并发很多时候都会大于8,而受cpu核数限制,太多的线程会在CPU切换上消耗过多资源。

    但是如果你系统并发量始终都是小于8的,那么设置成一个大于8的值并没有意义。

    2. 高并发下实验

    通过supersmack模拟了128个线程并发,做了5组对比测试:

    innodb_thread_concurrency

    最后,提一下,没事不要在生产环境动态更改innodb_thread_concurrency,很危险:Bug 40760

    参考:

    1. MySQL Manual

    2. MySQL: innodb_thread_concurrency beast

    3. do we still need innodb_thread_concurrency

    4. Mess with innodb_thread_concurrency

    5. InnoDB线程并发检查机制

    6. MySQL Bugs