amoeba实现mysql数据库读写分离

最近学习分布式数据库,想做一个只使用mysql读写分离的小demo,发现问题挺多的,虽然有很多前辈都有相关讲解,但是由于一些版本原因,导致坑比较多,在这里记一下。
本文主要参考博客:
http://www.cnblogs.com/alvin_xp/p/4162249.html

一、准备工作

本次demo在windows和Ubuntu上安装了两个mysql,计划以windows上的做主数据库,用于写操作;虚拟机上的作为从数据库,用于读,以减少单个数据库的压力。(安装过程这里不再赘述,需要的可以自行百度)
下载amoeba客户端 https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/ (解压在windows上即可)

二、mysql主从关系建立

1.远程访问问题

首先,第一点,mysql是默认用户只能在本机访问的,所以需要给用户赋权才能远程访问。(强烈建议新建用户赋权)

GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%' IDENTIFIED BY '密码';

以为这就完了?还有坑!Linux下的mysql在配置文件里绑定本机ip访问,所以必须要找到它,解除绑定。
我的配置文件是在/etc/mysql/mysql.conf.d/mysql.cnf 下,编辑它
里面有一句:

bind-address=127.0.0.1 在它前面加上#注解掉!

2.日志输出问题

然后修改windows下的配置文件,让它支持日志输出(从数据库需要这个),
找到my.ini文件,又是巨坑.你以为它是在C:\Program Files\MySQL\MySQL Server 5.7文件夹下,一看只有一个my-default.ini ,以为版本变更改名了?
其实人家不是,真正的在C:\ProgramData\MySQL\MySQL Server 5.7 文件夹下.在[mysqld]这句话后面加上:

server-id=1  
log-bin=master-bin
log-bin-index=master-bin.index

测试一下:重启mysql服务,cmd登陆进去,执行这一句:
SHOW MASTER STATUS;
有结果返回就算成功了.

然后去改Ubuntu上的,一般会放在/etc/my.cnf,/etc/mysql/my.cnf
实在找不到就查找吧:

find / -name my.cnf

然后在里面加上:

[mysqld]
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin 

3.主从连接问题

然后让从数据库连接上主数据库,从数据库登录mysql,执行如下代码:

change master to master_host='192.168.0.104', //Master 主数据库电脑Ip
master_port=3306,
master_user='repl',//主数据库用户名
master_password='mysql',//密码
master_log_file='master-bin.000001',//主数据库产生的日志
master_log_pos=0;

没报错就是执行成功了,执行下面这段代码启动重启数据库:
start slave;
如果不行重启下服务

这样就执行成功了,想检验下是否成功,可以再主数据库上添加一个数据库看看:
主数据库执行:create database hello;
从数据库执行:show databases;
查看到就说明成功了.

以上,主从数据库配置完成.
再次建议,新手结合这篇博文使用:
http://www.cnblogs.com/alvin_xp/p/4162249.html

三、使用amoeba代理进行读写操作的分离工作。

amoeba很强大,这里只是示范,不深究哈

代理原理,我们不再直接访问mysql,只是以访问mysql的格式在访问amoeba,它替我们进行读写分离.

(conf目录下)

1.amoeba.xml

amoeba.xml中找到下面这句话,代理

<!--默认端口号,不冲突别动-->
<property name="port">8066</property>
<!--下面把root改成你的用户名和密码-->
<property name="user">root</property>
<property name="password">root</property>
<!--进行读写分离,这个被注释的内容要打开,这里的服务名后面将-->
<property name="writePool">server1</property>
<property name="readPool">server2</property>

2.dbServers.xm

然后是这个文件dbServers.xml,对数据库进行管理,需要配置项就是你每个数据库的连接,一个dbserver是一个数据库,不过最新版本已经做了优化,抽象出不变的配置,只需要配一次即可,只有ipAddress需要单独配置,当然如果有不与父类配置相同的,重写一遍即可(未测试):

<!-- mysql 端口号 -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">amoeba1</property>
<!-- mysql 用户名密码 -->
<property name="user">slave</property>
<property name="password">1234</property>
<!-- 配置每个数据库的名称,ip -->
<dbServer name="server2"  parent="abstractServer">
<factoryConfig>
    <!-- mysql ip -->
    <property name="ipAddress">10.10.10.152</property>
</factoryConfig>
</dbServer>

还有一个数据库负载均衡的配置:

<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!--1代表轮询,2代表权重,3... -->
<property name="loadbalance">1</property>

<!-- 把你的数据库名都填进去 -->
<property name="poolNames">server1,server2</property>
</poolConfig>
</dbServer>

这样基本就OK了,如果需要深究,建议阅读官方文档:
http://docs.hexnova.com/amoeba/

3.测试

测试方法:双击bin/launcher.bat允许,没报错说明启动成功:
新开一个cmd,以访问mysql的方式访问amoeba:
mysql -uroot -h127.0.0.1 -P8066 -proot
改成自己的用户名密码端口号,访问成功.

然后,我用eclipse搭了个框架,用mybatis访问了一下,报错了….
问题出在mysql驱动上,amoeba有点老了,新的驱动跟它连不上,于是我换了一个5.1.21版本的,测试成功.

至于测试是否真的实现读写分离了,可以参考其他博主的文章,这里不再赘述.
当然,如果发现我这样还没有真正达到读写分离的话,我还会回来的…
谢谢观看~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值