amoeba实现mysql数据库读写分离

来源:互联网 发布:淘宝在哪里领取优惠卷 编辑:程序博客网 时间:2024/05/01 11:22
最近学习分布式数据库,想做一个只使用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-binlog-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=2relay-log-index=slave-relay-bin.indexrelay-log=slave-relay-bin 

3.主从连接问题

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

change master to master_host='192.168.0.104', //Master 主数据库电脑Ipmaster_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版本的,测试成功.

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

原创粉丝点击