读写分离----MySQL数据的高级运用
文章目录
前言
一、读写分离原理
1.1: 为什么需要读写分离
1.2: 如何进行读写分离
二、读写分离的基础----主从分离
三、读写分离试验
3.1: 实验环境
3.2: 试验拓扑图
3.3: 实验目的
3.4: 实验步骤
3.4.1: 搭建MySQL数据库
3.4.2: Amoebe服务安装
3.4.3: 配置Amoebe服务
3.4.4: 启动Amoebe服务
3.5: 实验验证
前言
我们上次已经提出了MySQL数据库的主从分离,但是也提出了一个读写分离的更高级的组从分离方案。
一、读写分离的原理
1.1: 为什么要读写分离
- 在企业应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
我们就需要着手解决这个可能存在的问题
- 配置多台数据库服务器以实现读写分离
- 读写分离实在主从分离的基础上进行的
1.2: 如何进行读写分离
读写分离的原理
- 读写分离就是只在服务器上写,从服务器上读
- 主数据库处理事务性查询,而从数据库处理select查询
- 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二、读写分离的基础----主从分离
关于这段可以参考我之前的博客
https://blog.csdn.net/weixin_48185204/article/details/108612411
三、读写分离实验
3.1: 实验环境
- 5台安装了CentOS7.6的虚拟机5台
- 1台做服务客户端client,需安装mysql数据库
- 1台做Amoebe服务器,需安装Amoeba软件
- 1台做MySQL主服务器
- 2台做MySQL从服务器
3.2 :实验拓扑图
3.3: 实验目的
通过虚拟机实验,来了解Amoebe配置
3.4: 实验步骤
3.4.1: 搭建MySQL数据库
关于这段可以参考我之前的博客
https://blog.csdn.net/weixin_48185204/article/details/108612411
3.4.2: Amoeba服务安装
-
安装Amoeba服务需要JAVA环境所以我们需要准备2个软件包
- amoeba-mysql-3.0.5-RC-distribution.zip
- jdk-8u144-linux-x64.tar.gz
-
安装JAVA环境
[root@amoeba ~]# cd /opt
[root@amoeba opt]# tar xzvf jdk-8u144-linux-x64.tar.gz ####解压安装包
[root@amoeba opt]# cp -rv jdk1.8.0_144/ /usr/local/java ####复制安装包到指定目录
[root@amoeba opt]# 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
[root@amoeba opt]# source /etc/profile ####刷新服务
[root@amoeba opt]# java -version ####查看JAVA版本,说明环境安装完成
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)
- 安装Amoeba服务
[root@amoeba opt]# yum -y install unzip
[root@amoeba opt]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@amoeba opt]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@amoeba opt]# chmod -R 755 /usr/local/amoeba/
[root@amoeba opt]#vi /usr/local/amoeba/jvm.properties
省略字段... ####移动到第32行,修改配置文件
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" ####新的配置文件
3.4.3: 开启Amoebe服务
- 配置amoeba脚本,开启服务
[root@amoeba opt]# 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
[root@amoeba opt]# chmod +x /etc/init.d/amoeba
[root@amoeba opt]# chkconfig --add amoeba ####指定检查amoeba服务
service amoeba start
ctrl + c
netstat -anpt | grep 8066 ####amoeba默认监听端口
3.4.4: 配置Amoebe服务
- 分别在3台MySQL服务器上进行amoeba服务授权
[root@mysqlmaster ~]# mysql -u root -p
Enter password:
mysql> create database text
mysql> GRANT ALL ON *.* TO text@'20.0.0.%' IDENTIFIED BY 'Abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
- 配置Amoeba文件
[root@amoeba amoeba]# vi conf/amoeba.xml
---28行-----设置客户端连接amoeba前端服务器时使用的用户名和密码----
<property name="user">amoeba</property>
----30行---------
<property name="password">12345</property>
------------------------------------以上配置用于客户端连接用户名密码-------------
---83-去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
######上面修改后如下#### <!-- --> 这种注释一定要去掉
82 <property name="LRUMapSize">1500</property>
83 <property name="defaultPool">master</property>
84 <property name="writePool">master</property>
85 <property name="readPool">slaves</property>
86 <property name="needParse">true</property>
[root@amoeba amoeba]# vi conf/dbServers.xml
省略字段...
<!-- mysql schema -->
<property name="schema">text</property> ####数据库中要有此处定义的数据库
<!-- mysql user -->
<property name="user">text</property> #####user 后面改成text 这边是mysql数据库授权账户
<property name="password">Abc123</property> ###password 后面改成Abc123 这是mysql数据库授权密码
</factoryConfig>
<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">1</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="master" parent="abstractServer"> #####name后面改成 master
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.31</property> ####ipAddress加上主mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> #####name后面改成 slave1
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.32</property> ###ipAddress加上从1mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer"> #####name后面改成 slave2
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.33</property> ###ipAddress加上从2mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> #####name后面改成 slaves
<!-- 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>
[root@amoeba ~]# service amoeba restart ####重启amoeba服务
3.5: 实验验证
- 进入主数据库20.0.0.31,数据库中创建一个数据表用于测试,并写入数据
[root@mysqlmaster ~]# mysql -uroot -p
Enter password:
mysql> use text;
Database changed
mysql> create table zhang1 (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into zhang1 values('1','zhang','this_is_master');
Query OK, 1 row affected (0.00 sec)
- 进入从1服务器20.0.0.32,关闭同步服务,然后在数据表中写入测试数据
[root@mysqlsalve ~]# mysql -u root -p
Enter password:
mysql> use text;
Database changed
mysql> insert into zhang1 values('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
- 登入客户机20.0.0.35,进入amoeba服务,接着在数据库内写入数据,再查看数据表中的数据
[root@client ~]# mysql -u amoeba -h 20.0.0.34 -P 8066 -p
Enter password:
mysql> use text;
Database changed
mysql> insert into zhang1 values('4','zhang','write_test');
Query OK, 1 row affected (0.00 sec)
mysql> select * from text.zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
- 接着切换到主数据库,查看表中的数据
mysql> select * from text.zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
| 4 | zhang | write_test |
+------+-------+----------------+
2 rows in set (0.00 sec)
- 再在从1数据库中查看表的数据
mysql> select * from text.zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
-
实验验证成功!
- 主数据库可以看到客户机写入的数据以及原本的数据
- 从数据库只能看到原本的数据,无法看到数据库上的数据以及客户机写入的数据
- 客户机只能看到从1数据库的数据,无法看到写入的数据以及主数据的数据
ct * from text.zhang1;
±-----±------±---------------+
| id | name | address |
±-----±------±---------------+
| 2 | zhang | this_is_slave1 |
±-----±------±---------------+
1 row in set (0.00 sec)
- 实验验证成功!
- 主数据库可以看到客户机写入的数据以及原本的数据
- 从数据库只能看到原本的数据,无法看到数据库上的数据以及客户机写入的数据
- 客户机只能看到从1数据库的数据,无法看到写入的数据以及主数据的数据