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的状态
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://192.168.1.120:8066/billing" />
<property name="user" value="root" />
<property name="password" value="123abc" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="1" />
<property name="maxIdleTime" value="1800" />
<property name="acquireIncrement" value="1" />
<property name="maxStatements" value="0" />
<property name="initialPoolSize" value="1" />
<property name="idleConnectionTestPeriod" value="1800" />
<property name="acquireRetryAttempts" value="6" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="false" />
</bean>?
b、测试插入数据
Hibernate: select this_.id as id6_0_, this_.name as name6_0_, this_.password as password6_0_ from tf_user this_?
查看slave日志文件
写道110513 12:00:11 5 Query SELECT @@session.tx_isolation
5 Query select this_.id as id6_0_, this_.name as name6_0_, this_.password as password6_0_ from tf_user this_?
综上所述,一个简单的mysql读写分离项目已经完成。
1 楼 oolala 2011-12-13 已经在生产环境了吗?