mysql读写分离amoeba_MySQL搭建Amoeba_读写分离

一、背景知识

Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

要想搭建Amoeba读写分离,首先需要知道MySQL的主从配置,可参考:Ubuntu10下MySQL搭建Master/Slave,更好的情况下是你还需要了解MySQL-Proxy,可参考:Ubuntu10下搭建MySQL Proxy读写分离

二、搭建过程

(一)测试环境

Amoeba for MySQL:192.168.1.147

Master:192.168.1.25

Slave1:192.168.1.30

Slave2:192.168.1.35

数据库为:dba_db,帐号密码统一为:test/123456

(二)前期准备

1.验证Amoeba是否安装成功的命令(如下图):/usr/local/amoeba/bin/amoeba

41d39d9b733dc50c8adfda75e9a25069.png

(图1:安装成功)

2.启动amoeba:/usr/local/amoeba/bin/amoeba start

b28c4284cf0bc60712be47834a902090.png

(图2:启动成功)

(三)Amoeba读写分离配置

1.修改amoeba.xml,设置登陆amoeba的帐号密码。

testuser

password

2.测试使用上面帐号是否正常登陆,如果出现上面的图2界面说明设置的帐号密码成功。

#mysql -u testuser -p -h 192.168.1.147 -P 8066

3.修改dbServers.xml,设置数据库、登陆MySQL的帐号和密码。

dba_db

test

123456

4.修改dbServers.xml,设置数据库服务器的IP地址和服务器别名。

192.168.1.25

192.168.1.30

192.168.1.35

5.修改dbServers.xml,设置ROUNDROBIN(轮询策略);

1

Slave1,Slave2,Slave2

6.修改amoeba.xml,设置读写分离,修改queryRouter标签下的;

1500

Master

Master

virtualSlave

true

7.重新启动amoeba,如果出现上面的图2界面说明设置成功;

8.如果你已经使用终端登陆了amoeba(#mysql -u testuser -p -h 192.168.1.147 -P 8066),那么你需要重启打开终端;如果你使用SQLyog的工具登陆了amoeba,那么你需要关闭链接,再重新链接amoeba。

(四)MySQL的Master/Slave配置

1.Master服务器/etc/mysql/my.cnf目录 [mysqld] 区块中加上:

log-bin=mysql-bin

server-id=1

innodb_flush_log_at_trx_commit=1

sync_binlog=1

binlog_do_db=dba_db

binlog_ignore_db=mysql

2.登陆Master的MySQL,新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限:(因为是有两个Salve,所以使用了%)

mysql>use mysql;

mysql>create user viajar@'192.168.1.%' identified by '123456';

mysql>grant replication slave on *.* to viajar@'192.168.1.%' identified by '123456';

3.重启Master的MySQL:

#service mysql restart

4.获取Master的binlog信息:(mysql-bin.000136,106)

mysql>SHOW MASTER logs;

18eb9eea3c8893bf236a5467f31d64ad.png

(图3)

5.Slave1服务器/etc/mysql/my.cnf目录 [mysqld] 区块中加上:

server-id=2

6.重启Slave1的MySQL:

#service mysql restart

7.登陆Slave1的MySQL,执行命令:

mysql> change master to master_host='192.168.1.25', master_user='viajar', master_password='123456', master_log_file='mysql-bin.000136', master_log_pos=106;

8.启动Slave1的Slave:

mysql>START SLAVE;

9.检查Slave1的Slave是否正常:

mysql>show slave status\G;

10.以同样的方式配置Slave2,唯一有不同的就是第5步的设置:server-id=3

(五)验证读写分离

1.登陆到amoeba(147),插入下面的测试数据

INSERT INTO label(Id,NAME,Description,AddOn)

VALUES (1,'viajar','我的博客',NOW());

INSERT INTO label(Id,NAME,Description,AddOn)

VALUES (2,'viajar','我的博客',NOW());

INSERT INTO label(Id,NAME,Description,AddOn)

VALUES (3,'viajar','我的博客',NOW());

INSERT INTO label(Id,NAME,Description,AddOn)

VALUES (4,'viajar','我的博客',NOW());

2.登陆Master、Slave1、Slave2、amoeba分别验证数据的分布,四个地方看到数据都如下图所示:

5cff3a6303a4e044a8f37ce0c3b4c04a.png

(图4)

四个地方的数据都如图4的意思是搭建的replication成功了;Amoeba作为透明的代理已经基本成功,程序只需要知道Amoeba的地址就可以,完全不需要理会后台的处理;接下来我们验证Amoeba读写是否是分离的。

3.停止Slave1上的Slave,删除id为3的记录:

mysql>stop slave;

mysql>DELETE FROM label WHERE id =3;

c835da18bf49d2f2ccd7718f5a0064cd.png

(图5:Slave1)

4.停止Slave2上的Slave,添加一条新的记录:

mysql>stop slave;

9b721dd108f08c809e3bb5770eaf693b.png

(图6:Slave2)

5.到Amoeba上执行多次查询,查询返回的结果集:

mysql>SELECT * FROM label;

发现Slave1,Slave2,Slave2这样的配置会返回:图5出现1次,图6出现2次的规律进行返回的。

到此Amoeba的读写分离已经测试完毕。

三、注意事项

1.在做Master/Slave的时候,当删除了master的帐号,如果想要看到slave的效果,那就需要重启master的数据库服务再去看slave的status;(但是当salve从不可用到master可用了,不用重启master的数据库服务,slave也能看到效果)

2.在做Master/Slave的时候,我们有两台Salve,而且是内网的机器,所以使用了“192.168.1.%”这样的方式来创建用户,在一定的程度上保障帐号的安全性,又方便管理,使用“*”是错误的;

3.对于多Slave的帐号问题,还可以有其它方式来创建帐号的,就是在Master为每个Slave创建独立的帐号和密码;

4.修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满),改成:

5.性能优化,打开bin/amoeba,DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"改成:DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"

6.loadbalance元素设置了loadbalance策略的选项,这里选择第一个“ROUNDROBIN”轮询策略,该配置提供负载均衡、failOver、故障恢复功能。poolNames定义了其中的数据库节点配置(当然也可以是虚拟的节点)。此外对于轮询策略,poolNames还定义了其轮询规则,比如设置成“Slave1,Slave1,Slave2”那么Amoeba将会以两次Slave1,一次Slave2的顺序循环对这些数据库节点转发请求。

四、疑问

1.修改dbServers.xml的时候,设置virtualSlave 为ROUNDROBIN(轮询策略):Slave1,Slave2,删除Slave1(30)一条数据,插入Slave2(35)一条数据,如图所示,到amoeba(147)执行多次Select,但是却没有出现负载均衡的效果,一直显示为Slave1的数据:(图5、图6)

Slave1,Slave2或者Slave1,Slave2,Slave1,Slave2这样的模式是无法达到轮询Slave1和Slave2的目的。当设置为Slave1,Slave1,Slave2或者Slave1,Slave2,Slave1或者Slave1,Slave2,Slave2就生效了。为什么呢?Amoeba for mysql读写分离

五、参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值