日期:2014-05-16  浏览次数:20732 次

mysql读写分离

近来公司做了一个计费系统,每天产生的CDR数据较多,数据读写要求比较高,在此基础上,采用了数据读写分离策略,来缓解数据库的压力。

应用环境

1、mysql-proxy,采用了开发框架amoeba,mysql-proxy负责管理client实际访问database的路由策略,实现数据的读写分离。

2、数据库集群环境,database集群采用了mysql的master-slave的replication方案。

3、客户端的应用程序,基于c3p0连接mysql-proxy。


结构示意图



?

实战

一、搭建mysql的master-slave环境

1、分别在192.168.1.132(master)和192.168.1.128(slave)安装mysql数据库,本实例在CentOS5.3的环境下,mysql数据库为mysql-5.1.51.tar.gz版本。

2、配置master

??? a、修改master的/etc/my.cnf文件,添加

????????? log-bin=mysql-bin????????????????????????????????????????????? #slave会基于此log-bin来做replication
????????? server-id=1??????????????????????????????????????????????????????? #master的标示
????????? binlog-do-db = billing???????????????????????????????????????? #用于master-slave的具体数据库

?

????b、开启mysql的日志文件,方便排错(可选)

????????? log-error=/usr/local/mysql/log/error.log?????????????????????? #错误日志?
????????? log=/usr/local/mysql/log/mysql.log?????????????????????????????? #查询日志
????????? long_query_time=2??????????????????????????????????????????????????????#慢查询日志,指执行超过多久的sql会被log下来,这里是2秒
????????? log-slow-queries=/usr/local/mysql/log/slowquery.log??#将查询返回较慢的语句进行记录

??? c、为slave添加一个replication用户,授权

???????? mysql>grant replication slave on *.* to repl@192.168.1.128 identified by '123456'

??? d、重启mysql服务,查看master的状态

mysql> show master status;
+-----------------------+------------+-------------------+-----------------------+
| File                        | Position   | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------------+------------+-------------------+-----------------------+
| mysql-bin.000005 |      106     | billing              |                              |
+-----------------------+------------+-------------------+-----------------------+
1 row in set (0.00 sec)

??

3、配置salve

?? a、修改slave的/etc/my.cnf文件,添加
????????? server-id=2??????????????????????????????????????????????????????? #slave的标示

?

???b、开启mysql的日志文件,方便排错(可选)

????????? log-error=/usr/local/mysql/log/error.log?????????????????????? #错误日志?
????????? log=/usr/local/mysql/log/mysql.log?????????????????????????????? #查询日志
????????? long_query_time=2??????????????????????????????????????????????????????#慢查询日志,指执行超过多久的sql会被log下来,这里是2秒
????????? log-slow-queries=/usr/local/mysql/log/slowquery.log??#将查询返回较慢的语句进行记录

?? c、重启mysql服务,配置与master的连接

mysql> CHANGE MASTER TO
?? ?-> MASTER_HOST='192.168.1.132',
?? ?-> MASTER_USER='repl',
?? ?-> MASTER_PASSWORD='123456',
?? ?-> MASTER_LOG_FILE='mysql-bin.000005',
?? ?-> MASTER_LOG_POS=106;

注:MASTER_HOST是master机的ip,MASTER_USER和MASTER_PASSWORD就是我们刚才在master上添加的用户,MASTER_LOG_FILE和MASTER_LOG_POS对应与master status里的信息

?? d、启动slave

mysql>start slave;

?

4、验证master-salve环境是否搭配成功

通过查看slave日志(/usr/local/mysql/log/error.log)

有如下信息则表示成功

100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@192.168.1.132:3306',? replication started in log 'mysql-bin.000005' at position 106

没有成功则通过日志文件查看并解决问题

?

二、搭建mysql-proxy环境

本实例采用了amoeba作为mysql的代理服务器,版本为amoeba-mysql-1.2.0-GA,下装与安装详细参见官方本档,proxy服务器的IP为192.168.1.120

配置amoeba,/usr/local/amoeba-mysql-1.2.0-GA/conf/amoeba.xm

a、提供客户端应用程序的数据库配置

	<server>
		<!-- proxy server绑定的端口 -->
		<property name="port">8066</property>
		
		<!-- proxy server绑定的IP -->
		<!-- 
		<proper