一.Mysql 读写分离原理
- 读写分离就是只在主服务器上写,只在从服务上读;
- 主数据库处理事务性查询,从数据库处理 select 查询;
- 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二.关于 Amoeba
(1)Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。
(2)Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。需要结合使用MySQL的 Replication等机制来实现副本同步等功能。
三、配置实例
环境说明:
- 准备三台 Mysql服务器(一台为主服务器,其余两台为从服务器);
- 一台 Amoeba,用来实现读写分离,写的操作交给主服务器,读的操作发给两台从服务器;
1.配置安装amoeba
先关闭防火墙
[root@amb ~]# systemctl stop firewalld.service
[root@amb ~]# setenforce 0
安装jdk1.6环境
[root@amb mnt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@amb mnt]# cd /usr/local/
./jdk-6u14-linux-x64.bin
空格 --输入yes开始安装
//重命名
mv jdk1.6.0_14/ jdk1.6
//添加环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:/$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeab
export PATH=$PATH:$AMOEBA_HOME/bin
//使添加的环境变量生效
source /etc/profile
安装ambeoa
//创建amoeba工作目录,解压缩包
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
//添加权限
chmod -R 755 /usr/local/amoeba
[root@amb mnt]# chmod -R 755 /usr/local/amoeba
[root@amb mnt]# /usr/local/amoeba/bin/amoeba
amoeba start|stop //显示amoeba start | stop则安装成功
修改三台mysql服务器的权限
//更改三台服务器的权限,开放amoeba访问
grant all on *.* to test@'192.168.179.%' identified by '123.com'; //使用test用户从179段网络输入123.com密码登录
grant all on *.* to test@'192.168.179.%' identified by '123.com';
Query OK, 0 rows affected (0.02 sec)
grant all on *.* to test@'192.168.179.%' identified by '123.com';
Query OK, 0 rows affected (0.02 sec)
grant all on *.* to test@'192.168.179.%' identified by '123.com';
Query OK, 0 rows affected (0.02 sec)
更改aomeba服务的权限设置,实现读写分离功能
1.修改主配置文件
//修改amobea服务的配置
cd /usr/local/amoeba/conf
vim amoeba.xml
//30行修改,客服端访问amoeba服务的身份
//32行修改.客户端访问amoeba服务的密码
30 <property name="user">amoeba</property>
31
32 <property name="password">123456</property>
//117行去掉注释,添加
115 <property name="defaultPool">master</property>
116
117 <!-- -->
118 <property name="writePool">master</property>
119 <property name="readPool">slaves</property>
2.修改数据主配置文件
amoeba服务访问mysql服务权限设置
vim dbServer.xml
//26-29去掉注释
26 <property name="user">test</property>
27
28 <!-- mysql password -->
29 <property name="password">123.com</property>
30
##45行指定主服务IP地址
45 <dbServer name="master" parent="abstractServer">
48 <property name="ipAddress">192.168.179.188</property>
##52行指定从服务器(slave1)IP地址
52 <dbServer name="slave1" parent="abstractServer">
55 <property name="ipAddress">192.168.179.194</property>
##复制从服务器1的设置,修改服务名称和IP地址
59 <dbServer name="slave2" parent="abstractServer">
62 <property name="ipAddress">192.168.179.128</property>
//查找name="multiPool"(地址池)
更改name=slaves
72 <property name="poolNames">slave1,slave2</property>
3.开启amoeba服务并调入后台运行
[root@amb conf]# /usr/local/amoeba/bin/amoeba start &
开启新的终端查看服务运行状态
[root@amb conf]# netstat -ntap | grep java
tcp6 0 0 127.0.0.1:60816 :::* LISTEN 4524/java
tcp6 0 0 :::8066 :::* LISTEN 4524/java
tcp6 0 0 192.168.179.133:34010 192.168.179.188:3306 ESTABLISHED 4524/java
tcp6 0 0 192.168.179.133:39112 192.168.179.194:3306 ESTABLISHED 4524/java
tcp6 0 0 192.168.179.133:34006 192.168.179.188:3306 ESTABLISHED 4524/java
验证读写分离功能
1.安装客户端mysql服务
//安装客户段测试
yum install mysql -y
mysql -u amoeba -p123456 -h 192.168.179.133 -P8066
//创建新的表并插入数据
2.创建新的表,并插入数据
MySQL [(none)]> use info;
Database changed
MySQL [info]> create table yu (
-> id int(4) not null primary key,
-> name char(10) not null);
Query OK, 0 rows affected (0.03 sec)
MySQL [info]> insert into yu (id,name) values (1,'pan'),(2,'yun');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL [info]> select * from yu;
+----+------+
| id | name |
+----+------+
| 1 | pan |
| 2 | yun |
+----+------+
2 rows in set (0.00 sec)
3.关闭从服务同步功能,添加新的数据,验证写入的数据是在主服务器中
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
MySQL [info]> insert into yu (id,name) values (3,'qi');
Query OK, 1 row affected (0.02 sec)
//主服务器查看表中数据
mysql> select * from yu;
+----+------+
| id | name |
+----+------+
| 1 | pan |
| 2 | yun |
| 3 | qi |
+----+------+
3 rows in set (0.00 sec)
//从服务器查看表中数据
mysql> select * from yu;
+----+------+
| id | name |
+----+------+
| 1 | pan |
| 2 | yun |
+----+------+
2 rows in set (0.00 sec)
说明写入的数据是在主服务器中,而从服务是通过同步功能的开启,去同步主服务器中的数据
在客户端查看表中的数据
MySQL [info]> select * from yu;
+----+------+
| id | name |
+----+------+
| 1 | pan |
| 2 | yun |
+----+------+
2 rows in set (0.01 sec)
查看不到新添加的数据,证明读的数据是从从服务器读取,从而实现了读写分离
接下来是验证读的操作:
(1)在两台从服务器上的各自也创建一个 info 表,也都各自写入两条信息。
//从服务器1
mysql> insert into info (id,name) values (1,'tom');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+------+
| id | name |
+----+------+
| 1 | tom |
+----+------+
1 row in set (0.00 sec)
//从服务器2
mysql> insert into info (id,name) values (2,'lol');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+------+
| id | name |
+----+------+
| 2 | lol |
+----+------+
1 row in set (0.00 sec)