Posts tagged ‘mariadb’

MariaDB 新特性介绍-nonblock client

IO有同步IO和异步IO的区别,如果SQL也能异步,你就可以避免数据库查询时间长而导致页面响应慢的问题了。MariaDB就提供了这个特性:Non-blocking client library。该功能只需要替换客户端库,服务器端完全没有影响。

非阻塞client library和非阻塞IO有点类似,应用程序在提交一个查询或者进行一个数据库操作以后,就可以去做其他的事情了。当数据库把结果准备好以后,应用程序再回来处理数据就行了。

非阻塞client library的实现在客户端,跟数据库server没有任何关系。也正因为如此,由于MySQL协议限制,client libary的一个连接也只能服务于一个query。如果你需要用多个非阻塞query,那么你就需要进行多次MySQL连接了。这样的话,向一个数据库发起多个请求,或者向多个数据库发起请求时,就需要进行多次连接了。当然,你也可以自己在应用程序中开启多个线程来实现类似的功能,但是,如果你基于某种非阻塞框架,比如:libevent,你就必须用到这种特性;来避免用户请求由于数据库操作时间过长被阻塞,导致响应时间非常长。 非阻塞API在客户端库中是独立的函数,完全不影响现有的应用程序,也不会带来任何性能上的降低。

举个例子:mysql_real_query()是一个典型的阻塞SQL请求。对应的非阻塞请求为:mysql_real_query_start(),  mysql_real_query_cont()。具体信息参考:http://kb.askmonty.org/en/non-blocking-client-library/

MariaDB 新特性介绍-group commit

如果你的业务场景要求非常高,不能丢任何数据,就需要设置innodb_flush_logs_at_trx_commit=1和sync_binlog=1。并发度陡降!MariaDB利用它的新特性:group commit,把多个fsync操作合并起来,提高系统并发度,解决了这个问题。

group commit在并发非常大的时候特别有用。如果你的系统对一致性(“durability”, the “D” in ACID)要求特别高。那么你为了尽量少的丢数据,会设置innodb_flush_logs_at_trx_commit=1和sync_binlog=1。否则就有可能在主机crash时产生事务丢失或者造成主备数据不一致。

这样的话fsync()或者fdatasync()的系统调用就会非常多,系统的并发度急剧下降。因为你在每次commit的时候都需要刷transaction log和binary log。而fsync()可以理解为刷盘的操作,强制将内存中的数据同步到磁盘上去。MySQL和操作系统做了非常多的缓存,就是为了能够缓解数据库对底层磁盘的IO次数,而这两个参数设置为1无疑让这些缓存都成了泡影。MySQL的吞吐量和QPS将急剧下降,相关的测试非常多,性能损失也非常大。 MariaDB有一个简单的解决的办法:如果10个事务并发,基本上同时提交commit;那么就把这些fsync()合到一起做,而不是每个事务排队一个一个的做,达到的目的也是一样的——把缓存的数据刷到磁盘上去。当然,在分时的操作系统上,没有同时的概念,那么实现机制就是,当第一个fsync()还没有完成的时候,查看一下排队的,需要做fsync()的操作,把他们全部合并到一起,脏的数据一块儿刷到磁盘上去。一次fsync完成了所有排队fsync()的需求。这样的话,大大提高了并发的效率。

group commit在MariaDB里面是默认开启的。并且可以通过binlog_commits 和 binlog_group_commits 两个状态值来确定group commit对fsync()调用减少的效果。 具体信息可以参考:http://kb.askmonty.org/en/group-commit-for-the-binary-log/

MariaDB 新特性介绍-thread pool

我们按照性能、功能、管理、NoSQL扩展各个方面来一一介绍MariaDB的新特性。首先是性能方面的线程池。如果你短连接较多,如果你的数据库CPU压力过高,如果你想降低多个sleep线程白白占用机器内存,thread pool都能够缓解。
MySQL会给每个过来的客户端连接分配一个线程,专门用于跟这个客户端交互。但是,随着并发连接的增加,线程会越来越多。CPU的上下文切换,cache命中率下降以及锁的竞争都会加剧。为了缓解这个问题,MariaDB引入的线程池的概念。这个对业务开发人员来说并不是一个陌生的概念,甚至有些开发人员会说,这个特性早就应该加上了!其实这个特性在MySQL的Enterprise早就有了这个特性,需要付费才能使用。但是MariaDB是开源免费的。当然线程池好处很多:
  • 可以让MySQL维护的线程数降下来。很多MySQL DBA在show processlist的时候,经常会看到一堆不做事,一直sleep在那里的线程,如果使用了线程池,这个数量可以明显减少。
  • 对于那些短连接,CPU bound的MySQL来说,是一个非常好的特性。MySQL不用每次在客户端发起连接的时候,临时申请一个新的线程,并且立刻就需要把这个连接的资源全部释放掉。
  • 节省MySQL内存占用。线程多了,内存占用当然比较多。用线程池,可以把有限的内存让给更需要内存的buffer pool或者keycache使用。减少磁盘IO,提高系统的响应时间。
  • 避免MySQL连接数不够。当mysql达到max_connections时,会拒绝连接。使用线程池的话,就可以不用担心这个问题了。
但是,事情总是有利有弊的,使用线程池在某些场景下并不会有多少性能的提升:
  • 线程池技术要求相对较高。线程池在连接太多的时候怎么动态扩展,在链接减少的时候怎么收缩;线程池本身的开销怎样控制;是否能够利用OS原生的线程池来直接提供服务等一系列问题都是引入线程池需要考虑的。
  • 线程相互等待的问题。如果有长链接和短链接同时存在,那么短链接可能要等到长链接执行完所有操作,才能被轮到,执行时间不可控。

MariaDB充分考虑和优化了thread pool的实现,并提供了一系列参数给用户调整线程池的配置(thread_pool_size, thread_pool_stall_limit, thread_pool_idle_timeout, thread_pool_oversubscribe )和一些状态值(threadpool_threads,threadpool_idle_threads)提供给用户查询线程池使用情况。从实现方面来看,MariaDB相对MySQL Enterprise的线程池会使用原生的系统提供的线程池,并且考虑到各个系统OS的特点,优化多路IO(IO multiplexing)接口的使用。 具体信息可以参考:http://kb.askmonty.org/en/thread-pool-in-mariadb-55/

MariaDB新特性简介

随着Oracle计划把MySQL搞成闭源的声音越来越多,对MySQL何去何从的讨论也越来越多。由于MySQL是遵循GPL协议的,那么Oracle需要分发、传播和发布的时候就必须要开源。但是如果Oracle一定要把MySQL变得封闭起来,它也不是没有办法,比如:逐渐把开源社区里不亲近oracle的清理出去;或者让MySQL必须依赖的一些oracle闭源的软件和功能,使得MySQL不配合这些功能就变得非常难以使用等。最近,MySQL的新版本里面就去掉了对bug修复后进行验证的测试用例;这样,社区的人就无法保证自己以后发布的版本,在下一个版本里不会出现之前用户之前report过的bug。

商业毕竟是商业,Sun花了10亿美元收购MySQL,然后Oracle花了74亿美元收购Sun,这些钱都是白花花的银子。Larry. Ellison,Oracle的CEO,曾经明确表示不会放弃MySQL,换言之,也就是说,不会放过MySQL这块蛋糕。因为Oracle是按照CPU核数来计算licence的,这个不能改变,也无法改变。这也限制了Oracle在分布式领域的发展,而MySQL在分布式领域的贡献有目共睹。据小道消息,Oracle已经把它的一部分核心源码开放给了MySQL的部分核心开发人员,以促进MySQL 5.6进一步的稳定和扩大影响力。我们不知道Oracle有什么样的商业企图,但是,你如果认为MySQL会一直这样白白给你使用的话,那么Larry. Ellison就是一个傻子。

Larry. Ellison不是傻子,所以后来涌现了MySQL的很多分支,包括MariaDB,Drizzle,goole,facebook,阿里集团等维护的自己的分支版本。除了MariaDB,Drizzle以外,这些分支版本都是各个商业公司为了满足各自公司的需求而对源码进行修改和调整的版本,适合不适合你的业务场景我无从分辨。Drizzle是2008年从MySQL 6.0分支出来的,并且它明确申明了,部分MySQL的蹩脚(Gotchas)特性,它都不会保留,也就是说它和MySQL是不完全兼容的。

MySQL前CTO,被称为MySQL之父的Michael “Monty” Widenius在2009年2月,创办了Monty Program AB,并建立了mariaDB这个MySQL高性能的分支。MariaDB是发展最快的MySQL分支版本,与MySQL兼容并且有很多新的功能。

MariaDB有个很性感的中文名玛莉亚DB,对宅男型的DBA来说,终于有一个女性DB陪伴了。下面就让我们来看看这些功能到底有哪些。   (MariaDB目前有时候会被墙,不过沃趣科技已经搭建好了镜像(mariadb.woqutech.com),将部分文档和资料搬到国内的服务器上来,以解各位技术男的相思之苦。)

MariaDB5.5有,而MySQL5.6没有的功能包括:

简单列表如下:

High Performance Developers DBAs NoSQL
Thread pool Microsecond precision & type Segmented MyISAM keycache HandleSocket
Group commit in the binary log SphinxSE for full-text search Authentication plugins – PAM, Active Directory Dynamic columns
Non-blocking client library Subqueries materialize LIMIT ROWS EXAMINED
GIS functionality Progress reporting

后面我们会详细分析一下这些新特性。