SQL高阶之读写分离

文章目录

  • 一、读写分离
        • 1.1原理
        • 1.2读写分离
        • 1.3 读写分离的优点
        • 1.4 实现方式
        • 1.5Amoeba简介
  • 二、搭建MySQL读写分离
        • 2.1准备五台虚拟机
        • 2.2 amoeba(192.168.10.133)安装
        • 2.3 优化环境变量
        • 2.4 安装amoeba软件
        • 2.5 修改amoeba主配置文件
        • 2.6然后设置服务器文件/usr/local/amoeba/conf/dbServers.xml
        • 2.7、 开启amoeba
        • 2.8 验证
        • 2.9 测试
            • 测试一
            • 测试二
            • 测试三:
  • 三. 总结
        • 3.1 读写分离是什么?
        • 3.2 读写分离解决的问题:

一、读写分离

1.1原理

  1. 读写分离就是只在主服务器上写,只在从服务器上读
  2. 基本的原理是让主数据库处理事务性查询,
  3. 而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库

1.2读写分离

  1. 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
  2. 但是数据库的“读”(读10000条数据可能只要5秒钟)。
  3. 所以读写分离,解决的是,数据库的写入,影响了查询的效率

1.3 读写分离的优点

  • 数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。
  • 利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能

1.4 实现方式

常见的MySQL读写分离分为以下两种

  1. 基于程序代码内部实现
    在代码中根据select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
    ① 优点:性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;
    ② 缺点:需要开发人员来实现,运维人员无从下手。
    但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
  2. 基于中间代理层实现
    代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库;
    • MySQL-Proxy:MySQL-Proxy 为MySQL开源项目,通过其自带的lua脚本(脚本语言)进 行SQL判断。
    • Atlas:由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
    • Amoeba:由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

1.5Amoeba简介

  • Amoeba: 是一 个以MySQL为底层数据存储,并对应提供MySQL协议接口的proxy(代理),外号变
    • 读取请求发送给从服务器是,采用轮询调度算法
    • amoeba使用的java语言编写,配置文件为xml
    • amoeba主要负责对外的一个代理IP
    • 访问这个IP时,发送的请求为“写"请求,则会转给主服务器
      • 当发送的请求为“读"时,会通过调度转发给从服务器,使用轮询算法,轮流分配给两台从服务器
      • amoeba可以视为调度器,如果主服务器挂掉(单点故障),则会有MHA解决这个问题

二、搭建MySQL读写分离

2.1准备五台虚拟机

客户端client(测试) IP地址
mysql-master 192.168.10.131
mysql-slave1 192.168.10.132
mysql-slave2 192.168.10.136
mysql-amoeb 192.168.10.133

2.2 amoeba(192.168.10.133)安装

  1. 安装java环境,安装jdk(因为amoeba是基于jdk1.5开发的,所以官方推荐使用jkd1.5/jdk1.6,高版本不建议使用)
将amoeba-mysql-binary-2.2.0.tar.gz和jdk-6u14-linux-x64.bin上传到opt目录下
[root@amoeba opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba opt]# chmod +x jdk-6u14-linux-x64.bin 
[root@amoeba opt]# ./jdk-6u14-linux-x64.bin  			##enter往下翻页--yes--enter
mv jdk1.6.0_14/ /usr/local/jdk1.6		##重命名为了便于环境变量的设置

SQL高阶之读写分离_第1张图片
SQL高阶之读写分离_第2张图片

2.3 优化环境变量

[root@amoeba local]# 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/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba local]# source /etc/profile
[root@amoeba local]# echo $PATH
/usr/local/jdk1.6/lib:/usr/local/jdk1.6/jre/bin/:/usr/java/jdk1.8.0_201-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/amoeba/bin
vim /etc/profile
	unset i
	unset -f pathmunge
	export JAVA_HOME=/usr/local/jdk1.6			##指定jdk的位置
	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/amoeba		##amoeba文件的位置
	export PATH=$PATH:$AMOEBA_HOME/bin		##调用家目录识别amoeba的bin文件
source /etc/profile
java -version

在这里插入图片描述

2.4 安装amoeba软件

[root@amoeba local]# mkdir /usr/local/amoeba
[root@amoeba local]# cd /opt
[root@amoeba opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba opt]# chmod -R 755 /usr/local/amoeba/
[root@amoeba opt]# /usr/local/amoeba/bin/amoeba
amoeba start|stop

在这里插入图片描述

4.1三台数据库服务器进行提权
mysql> grant all on *.* to test@'192.168.10.%' identified by '123.com';
Query OK, 0 rows affected (0.01 sec)
#放权给amoeba进行访问

myslave ——》用于slave来同步
test ——》用于amoeba访问数据库
amoeba ——》用于client端访问amoeba的身份

2.5 修改amoeba主配置文件

[root@amoeba conf]# cd /usr/local/amoeba/conf
[root@amoeba conf]# cp amoeba.xml amoeba.xml.bak  #修改配置文件记得先备份
[root@amoeba conf]# ls
access_list.conf  amoeba.xml      dbserver.dtd   function.dtd     log4j.dtd  rule.dtd             rule.xml
amoeba.dtd        amoeba.xml.bak  dbServers.xml  functionMap.xml  log4j.xml  ruleFunctionMap.xml
[root@amoeba /opt]# cd /usr/local/amoeba/conf/
[root@amoeba amoeba]# vim amoeba.xml 
                                        <property name="user">amoeba</property>
 #30行,这里是外部访问amoeba服务器时使用的账号

                                          <property name="password">123123</property>
 #32行,这里是数据库或者外部访问amoeba服务器时使用账号时用的密码 
                 <property name="defaultPool">master</property>  #修改默认池

                <!-- -->		#17添加-->,删掉下面那个-->,取消注释的作用
                <property name="writePool">master</property>    
                 <property name="readPool">slaves</property>    #119行设置读写的两个账户名
                <property name="needParse">true</property>

在这里插入图片描述

SQL高阶之读写分离_第3张图片

2.6然后设置服务器文件/usr/local/amoeba/conf/dbServers.xml

cp dbServers.xml dbServers.xml.bak			##备份数据库配置文件
vim dbServers. xml			##修改数据库配置文件
23	<property name="schema">mysql</property>		##将text修改为mysql;Mysql所有数据库信息( show databases )
26	<property name="user">test</property>		##amoeba访 问三台mysql数据库的账户和密码(账户为test)
29	<property name="password">123456</property>	##取消注释,修改访问数据库的密码
45	<dbServer name="master"  parent="abstractServer">	##修改数据库主服务器名/地址
48	<property name="ipAddress">192.168.35.40</property>	##修改master服务器ip 
52	<dbServer name="slave1"  parent="abstractServer">		##修改从服务器名slave1
55	<property name="ipAddress">192.168.35.10</property>		##修改从服务器地址
紧接复制52-57行,粘贴,添加第二台服务器名
59	<dbServer name="slave2"  parent="abstractServer">		##修改从服务器名为slave2
62	<property name="ipAddress">192.168.35.20</property>		##修改第二台服务器IP
66	<dbServer name="slaves" virtual="true">

SQL高阶之读写分离_第4张图片
SQL高阶之读写分离_第5张图片

这时可以复制会话另开一个页面查看一下配置文件(因为amoeba需要一直开启才能查询到端口)

vim amoeba.xml
cd /usr/local/amoeba/conf/amoeba.xml			##查询发现端口是8806
netstat -antp | grep 8806

SQL高阶之读写分离_第6张图片

2.7、 开启amoeba

[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start &
[1] 114206
[root@amoeba conf]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2020-01-09 09:43:01,367 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2020-01-09 09:43:01,883 INFO  net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2020-01-09 09:43:01,918 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:52838.

查看端口验证,8066端口已开

[root@amoeba ~]# netstat -natp | grep java
tcp6       0      0 :::8066                 :::*                    LISTEN      114206/java 

2.8 验证

①此时确保四台服务器的防火墙已经关闭,然后去client客户端去验证

[root@client ~]# systemctl start firewalld
[root@client ~]# setenforce 0
[root@client ~]# yum install mysql -y
//安装mysql去连接即可,client不需要安装数据库取存储数据
[root@client ~]# mysql -u amoeba -p123123 -h 192.168.10.144 -P8066
//连接amoeba服务器
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 494299142
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

SQL高阶之读写分离_第7张图片

2.9 测试

测试一

client端远程访问amoeba的地址,并进入数据库创建新的数据库,验证master和slaves是否同步
client端进入数据库创建表aa,发现master+slave1+slave2已同步创建数据表SQL高阶之读写分离_第8张图片SQL高阶之读写分离_第9张图片
SQL高阶之读写分离_第10张图片SQL高阶之读写分离_第11张图片

测试二

测试mysql的读写分离,2台从服务器关闭主从同步,在客户端数据库的数据表内插入数据验证amoeba读写分离

stop slave		##2台从服务器关闭主从同步
show slave status\G	##查询从服务器的状态;已是NO
use bb			##client进入数据库
insert into aa values(1);			##client端插入数据

在这里插入图片描述
master处理写的任务,可以查询到数据表bb
SQL高阶之读写分离_第12张图片
从服务器处理读的任务,查询看不到数据
在这里插入图片描述

测试三:

在从服务器上更改表数据,使用客户端验证从服务器读,和轮询的方式读

insert into bb values(2);		##slave1插入数据
insert into bb values(3);		##slave2插入数据
MySQL [player]> select * from test;			##client端查询验证轮询

SQL高阶之读写分离_第13张图片

三. 总结

3.1 读写分离是什么?

说简单点,就是将数据库的读,写两个操作分开实现。由一台Master服务器来实现MySQL写的操作,由另一台slave服务器来实现MySQL读的操作。

3.2 读写分离解决的问题:

因为在对数据库进行“写”的操作是比较耗时的,但数据库的“读”操作只需要很短的时间,数据库的写入就会很大
程度上影响查询的效率。那么此时就需要通过将数据库的“写”和“读”分开,来减轻数据库的压力,提高性能。

你可能感兴趣的:(Web服务器集群,sql,数据库,服务器)