最近学习分布式数据库,想做一个只使用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是默认用户只能在本机访问的,所以需要给用户赋权才能远程访问。(强烈建议新建用户赋权)
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%' IDENTIFIED BY '密码';
以为这就完了?还有坑!Linux下的mysql在配置文件里绑定本机ip访问,所以必须要找到它,解除绑定。
我的配置文件是在/etc/mysql/mysql.conf.d/mysql.cnf 下,编辑它
里面有一句:
bind-address=127.0.0.1 在它前面加上#注解掉!
然后修改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
然后让从数据库连接上主数据库,从数据库登录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很强大,这里只是示范,不深究哈
代理原理,我们不再直接访问mysql,只是以访问mysql的格式在访问amoeba,它替我们进行读写分离.
(conf目录下)
amoeba.xml中找到下面这句话,代理
<property name="port">8066property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="writePool">server1property>
<property name="readPool">server2property>
然后是这个文件dbServers.xml,对数据库进行管理,需要配置项就是你每个数据库的连接,一个dbserver是一个数据库,不过最新版本已经做了优化,抽象出不变的配置,只需要配一次即可,只有ipAddress需要单独配置,当然如果有不与父类配置相同的,重写一遍即可(未测试):
<property name="port">3306property>
<property name="schema">amoeba1property>
<property name="user">slaveproperty>
<property name="password">1234property>
<dbServer name="server2" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">10.10.10.152property>
factoryConfig>
dbServer>
还有一个数据库负载均衡的配置:
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1property>
<property name="poolNames">server1,server2property>
poolConfig>
dbServer>
这样基本就OK了,如果需要深究,建议阅读官方文档:
http://docs.hexnova.com/amoeba/
测试方法:双击bin/launcher.bat允许,没报错说明启动成功:
新开一个cmd,以访问mysql的方式访问amoeba:
mysql -uroot -h127.0.0.1 -P8066 -proot
改成自己的用户名密码端口号,访问成功.
然后,我用eclipse搭了个框架,用mybatis访问了一下,报错了….
问题出在mysql驱动上,amoeba有点老了,新的驱动跟它连不上,于是我换了一个5.1.21版本的,测试成功.
至于测试是否真的实现读写分离了,可以参考其他博主的文章,这里不再赘述.
当然,如果发现我这样还没有真正达到读写分离的话,我还会回来的…
谢谢观看~