这年头,但凡是搞开发的,都要和互联网挂上边儿,但凡是搞互联网的,都要和大数据挂上钩儿,我们也不例外~~哇哈哈哈哈!

这里我们不谈什么高大上的数据挖掘分析(为什么看到“挖掘”就不自觉地联想到山东呢?),今次我们要聊的是应用中要如何处理海量数据的数据库存储和使用。说的更详细一些,就是如何保证面对应用所需的海量数据,我们如何确保mysql数据库高可用和高性能:

  • 高可用,自然是做冗余备份,并能做到Failover;
  • 高性能,一般就是数据库调优,读写分离,分库分表。

在此我们不考虑更复杂的方案,例如:引入nosql,缓存,等等。

其实现存的数据库高可用的开源解决方案中,已经有很多现成模块足够我们选择的了。

就我个人而言,是比较亲近阿里的。本来以为会毫不犹豫的选择cobar,不过出于复杂度的考虑,我目前可能更倾向于Atlas~~还是自己搭建一下运行环境测试测试再做最后的决定吧。

Atlas

我比较欣赏的是它的简单,非常适合中小型项目或者刚起步的创业公司。正是由于它的简单,所以不需要什么耗时的学习和调优就可以快速投入使用。

我在虚拟机中测试安装,步骤很简单,我使用是rpm安装:

rpm -ivh Atlas-2.2.el6.x86_64.rpm

一切是如此的顺利,接下来就是按照说明书修改配置文件。最后,执行

sudo ./mysql-proxyd test start

搞定。接下来就是在终端中以管理员的身份连接Atlas:

mysql -h127.0.0.1 -P2345 -uadmin -p123456

注意,上面的参数是需要和配置文件保持一致的。然后在终端中执行:

mysql> select * from help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |
| SELECT * FROM backends     | lists the backends and their state                      |
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id     | online backend server, ...                              |
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
| SAVE CONFIG                | save the backends to config file                        |
+----------------------------+---------------------------------------------------------+
10 rows in set (0.00 sec)

可以看到管理员可以使用的运维命令。

我们可以只使用它提供的读写分离,但是你的mysql主从配置还是需要自己在mysql中配置好的。

Atlas的这种中间代理的设计架构,不可避免的会损失掉一部分性能,主要是数据转发引起的,就看你是否接受了。

至于分库分表功能,Atlas并不是非常的强大,细节可以看这里。还是那句话,中小项目足矣!

目前我能想到的Atlas的代码侵入性也就是在分库分表中如果想要指定sql执行的服务器,需要加入:

/*master*/

另外的侵入性体现在分库分表需要用户自己创建固定个数的数据表,而且表名也有硬性规则。别的应该木有啦~~

对于我们目前的项目来说,完全足够了~

Cobar

有人说,阿里开源出来的东西里,cobar算是一个非常成功的项目之一(还有LVS,Dubbo等)!这也是我一直比较亲睐阿里的原因之一,毕竟能够回馈开源,展示国人实力,是一件非常伟大的使命,阿里做到了。不说废话,先来学习一下Cobar的基础知识:传送门(万万没想到github上Cobar的wiki现在还在完善中,只能通过下载“其他”栏目中的原来的wiki资料学习了!)

简单的总结一下就是说,Cobar在分库分表和提高SQL查询上做了非常多的工作,所以不可避免的引入了复杂性!如果项目足够大,确实可以考虑使用,不过小项目还是算了。