Mysql的主从复制的读写分离之Amoeba实现以前写过了一篇Mysql的主从复制,但没有实现Mysql的主从复制的读写分离。关于读写分离:读写分离(Read/WriteSplitting),
Mysql的主从复制的读写分离之Amoeba实现以前写过了一篇Mysql的主从复制,但没有实现Mysql的主从复制的读写分离。
关于读写分离:
读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增、改、删、操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
关于Mysql的读写分离实现大致有三种:
1、 程序修改Mysql操作类
就以程序来完成Mysql的读写操作,如以PHP程序、java程序等解决此需求。
优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配
缺点:自己维护更新,增减服务器上的代码处理。
2、 mysql-proxy
MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform)通信数据,它支持非常广泛的使用场景:
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用同一个账号
缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高
3、 Amoeba
参考官网:,meidusa.com/
优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案
以上是三种常见的Mysql的读写分离方法。在这建议用第三种也就是amoeba来实现
关于Amoeba
Amoeba(变形虫)项目,该开源框架于2008年开始发布一款Amoeba for Mysql软件。这个软件致力于Mysql的分布式数据库前端代理层,它主要在应用层访问Mysql的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。位于Client、DB Server(s)之间,虚拟主机,对客户透明。具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上使用。
下面就来把 Mysql的主从复制和读写分离完整的实现一下。
先来做Mysql的主从复制。
我实现的环境如下:
System:Centos 5.4 32bit
主:192.168.1.107
从:192.168.1.139
读写分离:192.168.1.183
拓扑图如下:
MySql的主从复制:
对主MysqL服务器,主要是开启二进制日志,这个默认是开启的,在配置文件中:
# vim /etc/my.cnf
server-id = 1 (默认为1)
log-bin = mysql-bin (这个也是默认开启的)
下面连接到mysql数据库中创建一个用户并赋予复制权限。
mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.139' IDENTIFIED BY "123456";
这样在主服务器上操作暂时完成了。
下面来在从服务器上操作:
修改主配置文件:my.cnf
因为在主mysql中已经有数据了,所以要把主服务器的数据导入到从服务器中,所以在主服务器上的操作:
以上操作完成后就可以做把主从连接在一起了。
在从服务器上进入数据库中
下面就可以在从服务器上开启复制了
mysql> start slave;
查看是否连接成功:
可在主服务器上创建一个数据库或表来在从服务器上来验证一下。
下面来进行最为核心的内容——读写分离
下面的操作要在读写分离的服务器上操作也就是:192.168.1.183
Amoeba的安装:
安装Amoeba前要先安装JDK,因为Amoeba是用java开发的所要有JDK支持。
如果没有安装JDK,要先安装,方法如下 :
安装完成后就可以安装Amoeba了
下载:
安装:
解压后就完成了。下面要做的就是配置。
下面就来配置一下。
# cd /usr/local/amoeba
# vim dbServer.xml
下面来配置amoeba.xml文件
配置完成后就可以启动amoeba了。
从上面的一些信息可以看到amoeba已经启动,下面就可以测试一下了。
下面来做一测试:
为了更好的看到测试结果,要做以下这些步骤:
测试之前要先保证amoeba-server有访问两个主从服务器test库的权限,在主mysql上执行:
下面开始测试:
先让主从开始复制,即在从服务器上执行:
mysql> slave start;
再从读写分离的服务器上登录:
# mysql -uroot -p123456 -h192.168.1.183 -P8066
进入之后,先来创建一个数据库zhou,然后在这个数据库中创建一个表test
mysql> create database zhou;
mysql> use zhou;
mysql> create table test (id int(10), name varchar(20),adress varchar(30));
做完这些,回到从服务器上执行:
mysql> slave stop;
接着在主从服务器上各加入一条不同的数据。
在主上:
mysql> use zhou;
mysql> insert into test ('1','zhou','this_is_master');
在从上:
mysql> use zhou;
mysql> insert into test ('2','zhou','this_is_slave');
完成后就可以在读写分离服务器上测试读写了
在读写分离服务器上:
mysql> use zhou;
mysql> select * from test;
+------+------+---------------+
| id | name | address |
+------+------+---------------+
| 2 | zhou | this_is_slave |
+------+------+---------------+
1 row in set (0.01 sec)
从结果可以看出数据是读的从服务器上的数据,然后我们直接插入数据,再来测试
mysql> insert into test values('3','hhh','test_write');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test;
+------+------+---------------+
| id | name | address |
+------+------+---------------+
| 2 | zhou | this_is_slave |
+------+------+---------------+
1 row in set (0.00 sec)
结果显示出的数据没有改变,网站空间,因为我们把主从复制停了,所以数据没有同步,从查询的结果可以看到,数据还是来自从服务器。
然后们再在主服务器上查询可以看到:
mysql> select * from test;
+------+------+--------------- +
| id | name | address |
+------+------+--------------- +
| 1 | zhou | this_is_master |
+------+------+--------------- +
| 3 | hhh | test_write |
+------+------+--------------- +
从上面的结果可以看出,数据的读写分离成功了。
以上就是mysql数据库的主从复制以及读写分离的整个过程。文中可能还存在不完整或者出错的地方,还请大家指出来,香港服务器,谢谢了。
本文出自 “linux学习” 博客,请务必保留此出处