设为首页 收藏本站
查看: 763|回复: 0

[经验分享] Ubuntu下MySQL搭建Amoeba_读写分离

[复制链接]

尚未签到

发表于 2016-4-22 09:45:50 | 显示全部楼层 |阅读模式
  一、背景知识
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
要想搭建Amoeba读写分离,首先需要知道MySQL的主从配置,可参考:Ubuntu下MySQL搭建Master/Slave,更好的情况下是你还需要了解MySQL-Proxy,可参考:Ubuntu下搭建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
DSC0000.jpg
(图1:安装成功)
  2.      启动amoeba:/usr/local/amoeba/bin/amoeba start
DSC0001.jpg
(图2:启动成功)
 
  (三) Amoeba读写分离配置
  1.      修改amoeba.xml,设置登陆amoeba的帐号密码。
<property name="user">testuser</property>
<property name="password">password</property>
  2.      测试使用上面帐号是否正常登陆,如果出现上面的图2界面说明设置的帐号密码成功。
#mysql -u testuser -p -h 192.168.1.147 -P 8066
  3.      修改dbServers.xml,设置数据库、登陆MySQL的帐号和密码。
<property name="schema">dba_db</property>
<property name="user">test</property>
<property name="password">123456</property>
  4.      修改dbServers.xml,设置数据库服务器的IP地址和服务器别名。
    <dbServer name="Master"  parent="abstractServer">
       <factoryConfig>
           <property name="ipAddress">192.168.1.25</property>
       </factoryConfig>
    </dbServer>
    <dbServer name="Slave1"  parent="abstractServer">
        <factoryConfig>
            <property name="ipAddress">192.168.1.30</property>
        </factoryConfig>
    </dbServer>
    <dbServer name="Slave2"  parent="abstractServer">
         <factoryConfig>
              <property name="ipAddress">192.168.1.35</property>
         </factoryConfig>
</dbServer>
  5.      修改dbServers.xml,设置ROUNDROBIN(轮询策略);
<dbServer name="virtualSlave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<property name="poolNames">Slave1,Slave2,Slave2</property>
</poolConfig>
</dbServer>
  6.      修改amoeba.xml,设置读写分离,修改queryRouter标签下的;
<property name="LRUMapSize">1500</property>
<property name="defaultPool">Master</property>
<property name="writePool">Master</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>
  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;
DSC0002.jpg
(图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分别验证数据的分布,四个地方看到数据都如下图所示:
DSC0003.jpg
(图4)
四个地方的数据都如图4的意思是搭建的replication成功了;Amoeba作为透明的代理已经基本成功,程序只需要知道Amoeba的地址就可以,完全不需要理会后台的处理;接下来我们验证Amoeba读写是否是分离的。
  3.      停止Slave1上的Slave,删除id为3的记录:
mysql>stop slave
mysql>DELETE FROM label WHERE id =3;
DSC0004.jpg
(图5:Slave1)
  4.      停止Slave2上的Slave,添加一条新的记录:
mysql>stop slave
DSC0005.jpg
(图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 取消日志文件生成(太大了,磁盘很容易满),<param name="file" value="${amoeba.home}/logs/project.log"/>改成:<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
  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(轮询策略):<property name="poolNames">Slave1,Slave2</property>,删除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读写分离
 
  五、参考文献
在Master/Slave结构下的读写分离
Amoeba使用指南
Amoeba新版本MYSQL读写分离配置log4j.xml设置
Amoeba for mysql读写分离比较多的测试
MYSQL之--amoeba 实现读写分离,负载均衡
Mysql 基于 Amoeba  读写分离
Amoeba搞定mysql主从读写分离
Amoeba for Mysql 试用小结

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-207224-1-1.html 上篇帖子: Ubuntu下载编译Android源码全过程 下篇帖子: Ubuntu更新会引起grub丢失多系统信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表