目录
一:mysql读写分离
1.1:mysql读写分离概述
1、what 什么是读写分离?
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。
数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
2、why 为什么要读写分离呢?
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
1.2:mysql读写分离原理
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。
无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。
因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
二:mysql读写分离配置
2.1:mysql中间件-Amoeba
Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件。
该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql服务器时充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关SQL的到目标数据库、可并发请求多台数据库全并结果的作用。
通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能。
目前Amoeba已在很多企业的生产线上面使用;其版本可在官网进行下载。其工作原理图如下:
2.2:mysql读写分离的服务器配置
1:安装 gcc 环境
yum -y install gcc*
2:安装jdk
rpm -ivh jdk-8u131-linux-x64_.rpm
设置环境变量:
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH
环境变量生效:
source /etc/profile
3:安装amoeba
下载软件包:
wget https://jaist.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-RC-distribution.zip
unzip amoeba-mysql-3.0.5-RC-distribution.zip
重命名:
mv amoeba-mysql-3.0.5-RC /usr/local/amoeba-mysql
4:配置amoeba
amoeba 的配置文件位于安装目录下的conf目录中,实现读写分离功能,只需修改两个配置文件,dbServers.xml和amoeba.xml。
主从节点上执行添加授权用户(amoeba:123):
MariaDB [(none)]> grant all on *.* to amoeba@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
编辑amoeba.xml配置文件:
访问amoeba的用户名和密码(amoeba:123456)
设置访问地址池:
写操作指向master地址池
读操作指向slaves地址池
修改dbServers.xml配置文件:
配置登录mysql的用户名和密码。
25 <!-- mysql user -->
26 <property name="user">amoeba</property>
27
28 <property name="password">123</property>
43 <dbServer name="master" parent="abstractServer">
44 <factoryConfig>
45 <!-- mysql ip -->
46 <property name="ipAddress">192.168.10.130</property>
47 </factoryConfig>
48 </dbServer>
49
50 <dbServer name="slave1" parent="abstractServer">
51 <factoryConfig>
52 <!-- mysql ip -->
53 <property name="ipAddress">192.168.10.131</property>
54 </factoryConfig>
55 </dbServer>
56
57 <dbServer name="slaves" virtual="true">
58 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
59 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
60 <property name="loadbalance">1</property>
61
62 <!-- Separated by commas,such as: server1,server2,server1 -->
63 <property name="poolNames">slave1</property>
64 </poolConfig>
65 </dbServer>
修改jvm.properties:
vim amoeba-mysql/jvm.properties
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"
启动服务:
[root@localhost ~]# nohup /usr/local/amoeba-mysql/bin/launcher &
[2] 37937
[root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"
2.3:mysql读写分离测试
1:停掉主从复制
slave stop;
为了测试读和写必须,先把mysql的主从复制停掉,才能更清楚地看出读写的服务器是哪台
2: 登录amoeba服务
[root@localhost local]# mysql -uamoeba -p123456 -h192.168.10.130 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1326836667
Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
3:插入一条测试数据
MySQL [test]> insert into s1 values (2,'haha');
Query OK, 1 row affected (0.00 sec)
#读的是从库
MySQL [test]> select * from s1;
+------+------+
| id | name |
+------+------+
| 1 | hehe |
+------+------+
1 row in set (0.00 sec)
4:登录到主库上,执行
#新增数据已经在master节点了
MariaDB [test]> select * from s1;
+------+------+
| id | name |
+------+------+
| 1 | hehe |
| 2 | haha |
+------+------+
2 rows in set (0.01 sec)
实验结果显示:写只在主上进行,读在从上进行