引子
关于文本编辑器,一直热衷于Sublime Text(以下简称ST)。不仅仅因为它清爽的界面,更离不开它强大的插件支持。最近用Octpress搭建个人博客,开始学习Markdown标记语言。理所当然,马上想到用ST完成日常Markdown编写。随便打开一个Markdown文件,发现ST并不支持语法高亮。网上搜了下,找到了Markdown Preview,也就是本文的主角。
当单机数据库无法满足Web应用的高并发需求时,就需要考虑对数据库做集群。目前,数据库集群主要关注点有两个方面:
最近使用Octopress进行rake deploy
时,控制台一直提示一堆如下警告信息:
The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in Gemfile.
The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in Gemfile.lock.
The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in README.
每次提交都要面对如此多的警告,确实忧伤。
今天机缘巧合和同事聊起Mysql主从复制,经他点拨才知道从数据库同步数据居然只是是单线程,当主数据库写入数据量庞大,数据同步延迟将十分明显。显然,这在生产环境中是不被允许的。既然知道主从同步延迟的根源在与单线程,那么思路就来了,采取多线程不就行了么?上网搜了下,追风刀·丁奇一直关注这个问题,并提供Mysql-Transfer作为Mysql原生主从同步延时的解决方案。说干就干,站在巨人的肩膀上。
最近在研究Web服务端负载均衡方面的技术,参考网上资料,总体思路可以分为如下几类:
本文主要关注数据库集群。
通过应用层对数据源做路由来实现读写分离,项目是SpringMVC+myBatis,SQL路由交给Spring,通过AOP或者Annotation由代码显示的控制Datasource。
优点是路由策略的扩展性和可控性较强。
缺点是耦合到Spring;需要加入控制代码。
通过mysql中间件做主从集群,Mysql Proxy、Amoeba、Atlas等中间件貌似都能符合需求。
优点是与应用层解耦。
缺点是增加一个服务维护的风险点,性能及稳定性待测试,需要支持代码强制主从和事务。
Mysql自带的ReplicationDriver提供主从库访问的驱动,是通过保持多个数据源的链接并根据ReadOnly True/False来选择数据源。相当于应用层解决方案的一个现有实现,扩展性更弱。并且貌似不能使用其他驱动。由于耦合较高暂不考虑。
综合上述分析,考虑到需要与应用层解耦,现采用中间件解决方案,使用Amoeba做SQL路由,实现数据库读写分离。
既然选择使用Amoeba,让我们先了解什么是Amoeba?它能做什么?要怎么做?最后再看看它不能做什么。