一,读写分离的重要性!
-
可以达到数据读取负载均衡
-
读写分离就是实现主数据服务器上写,从服务器上只能读
-
主数据库处理事务性的查询,而从数据库处理查询操作
-
数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二,图示流程
可以看到图中,咱们应用客户端访问时,是通过Amoeba调度,可以对数据进行读写分离的操作。
读写分离是以主从复制为基础!!
三,演示读写分离操作!
主机 | 操作系统 | ip | 软件 |
---|---|---|---|
5台 | centos 7.6 | 20.0.0.25-29 | mysql-boost-5.7.20.tar.gz,amoeba-mysql-3.0.5-RC-distribution.zip, jdk-8u144-linux-x64.tar.gz |
主 | 20.0.0.25 | ||
从 | 20.0.0.26 | ||
从 | 20.0.0.27 | ||
Amoeba | 20.0.0.28 | ||
应用客户端 | 20.0…29 |
1
- 主从服务器,防火墙,核心防护已关闭!
2
都已经,安装mysql数据库,主从复制也已搭建!
- 如未安装,请看博主之前博客:
mysql–超链接
mysql主从复制–超链接
3
- Amoeba搭建java环境
准备软件:
jdk-8u144-linux-x64.tar.gz
amoeba-mysql-3.0.5-RC-distribution.zip
上传到指定的目录;
搭建java环境,Amoeba依靠java环境!!
1.到指定目录下解压
cd /opt
tar xzvf jdk-8u144-linux-x64.tar.gz
cp -rv jdk1.8.0_144/ /usr/local/java
2.在全局配置文件中,添加java环境变量
vi /etc/profile
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
source /etc/profile
3.查看java环境是否安装成功
java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
4
- 搭建Amoeba
1.解压软件包, 移动到目录并更改目录权限
cd /opt
yum -y install unzip ###如果unzip命令没有,必须装下,如果装了,此步骤跳过##
unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
chmod -R 755 /usr/local/amoeba/
2.更改配置文件信息
vi /usr/local/amoeba/jvm.properties #将配置文件中原有的行,更改为下面!
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"
3.制作Amoeba 管理脚本
vi /etc/init.d/amoeba
#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoeba
case "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
chmod +x /etc/init.d/amoeba
chkconfig --add amoeba #自定义脚本服务,可以用chkconfig来管理
service amoeba start
ctrl + c #中止下
netstat -anpt | grep 8066 //默认监听在8066端口
注意:这里可能会遇到问题,开启服务是显示状态不太对,(no pid flie 没有找到相应的进程,是出现错误了,需要查看下amoeba服务进程,ps -ef |grep amoeba 然后kill -9 pid号,再试)
5
- 在三台数据库服务器中为amoeba授权
1.在主服务器创建个test库;授权!
mysql> create database test;
mysql> grant all on *.* to test@'20.0.0.%' identified by'abc123';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.两个从服务器做授权
mysql> grant all on *.* to test@'20.0.0.%' identified by'abc123';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
6
- 配置Amoeba文件,读写分离
1.到配置文件所在目录
cd /usr/local/amoeba/conf
2.修改amoeba.xml
vi amoeba.xml
#配置文件中找到下面所在位置,并修改连接amoeba前端服务器使用过的用户名和密码,自定!
<property name="user">amoeba</property>
<property name="password">123456</property>
#连接主从服务器配置修改,<!-- --> 这种注释一定要去掉
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
<property name="needParse">true</property>
3.修改dbServers.xml
vi dbServers.xml
<property name="user">test</property>
<property name="password">abc123</property>
<!-- mysql schema -->
<property name="schema">test</property> //数据库中要有此处定义的数据库,否则客户端连接后会报如下错误:
# 添加主从服务器地址,修改如下
<!-- mysql schema -->
<property name="schema">test</property> #####数据库中要有此处定义的数据库,否则客户端连接后会报错,默认我用test数据库,创建是test数据库不要弄错了
<dbServer name="master" parent="abstractServer"> #####name后面改成 master
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.25</property> ####ipAddress加上主mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> #####name后面改成 slave1
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.26</property> ###ipAddress加上从1mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer"> #####name后面改成 slave2
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.27</property> ###ipAddress加上从2mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true"> #####name后面改成 slaves
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1,slave2</property> #####poolNames后面改成 slave1,slave2
</poolConfig>
</dbServer>
7
- 重启服务
service amoeba restart
netstat -anpt | grep java #查看
8
- 应用客户端测试登录amoeba
关闭防火墙,核心防护!
数据库也已搭建,如没搭建,咱们可以简单测试用yum下载下
yum install -y mysql
mysql -u amoeba -p123456 -h 192.168.100.41 -P8066 ##### 登录192.168.100.45 amoeba服务端
登录成功说明可以进行!
9
- 实现读取数据的负载均衡!!
1.在主服务器创建表的结构
mysql> use test;
Database changed
mysql> create table zhang1 (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.05 sec)
2.从服务器26的关闭主从同步,并在表中写入数据
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Database changed
mysql> insert into zhang1 values('2','zhang1','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
3.从服务器27的关闭主从同步,并在表中写入数据
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Database changed
mysql> insert into zhang1 values('3','zhang1','this_is_slave2');
Query OK, 1 row affected (0.00 sec)
4.再在主服务器上表中插入数据
mysql> use test;
Database changed
mysql> insert into zhang1 values('1','zhang','this_is_master');
Query OK, 0 rows affected (0.05 sec)
5.应用客户端登录验证
mysql -u amoeba -p123456 -h 192.168.32.14 -P8066
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bdqn |
| db_test |
| mysql |
| performance_schema |
| sys |
| test | #####发现数据库test
+--------------------+
7 rows in set (0.01 sec)
MySQL [(none)]> use test; ####进入数据库test
Database changed
MySQL [test]> select * from zhang1; ###查看zhang信息 发现进入slave1 数据中的数据
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
MySQL [test]> select * from zhang; ###查看zhang信息 发现进入slave2 数据中的数据
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)
#可以看到只能读到从服务器上的数据,并且是来回切换的,实现读取负载均衡
10
- 验证数据的读写分离,在客户端写入数据,只有主服务器可以看到,从服务器是看不到数据!
1.应用客户端增加数据
MySQL [(none)]> use test;
Database changed
MySQL [test]> insert into zhang1 values('4','zhang','write_test');
Query OK, 1 row affected (0.01 sec)
2.在主服务器验证
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
| 4 | zhang | write_test |
+------+-------+----------------+
2 rows in set (0.00 sec)
3.从服务26查看验证
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
4.从服务27验证
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.00 sec)
# 可以看到读写的操作分离开的!!