以前文章介绍了MySQL的主从同步复制,了解了主从同步的架构及搭建过程。主从同步一方面用来作数据库的数据备份,另一个很重要的因素是用来解决网站的读写瓶颈,本篇文章将介绍MySQL读写分离的原理,架构,而后使用mysql-proxy中间件搭建一个简单的mysql读写分离集群架构!
1、读写分离的含义
简单来讲,数据库的读写分离就是有多个数据库,这些数据库划分为读写库和只读库,读写库能够提供数据的读服务和写服务,只读库只能提供读服务。这种经过将数据库按照职责划分的架构,称为数据库的读写分离架构。mysql
2、读写分离做用
一、安全,读写分离一般是给数据库链接方提供一个代理服务器的IP地址和端口,能够有效隐藏数据库的真实IP和端口
二、将读写请求分担到不一样的服务器上执行,让多个数据库各司其职,共同分担压力,可以有效提高数据库的读写性能
三、扩展简单,当数据库读压力过大时,能够迅速扩展从库,提升数据库的读性能linux
3、读写分离架构示意图sql
4、常见的实现方式
一、自研发程序实现代理中间件
二、使用开源的数据库读写分离中间件,常见的有:MyCat,mysql-proxy数据库
5、使用mysql-proxy实现MySQL读写分离
一、环境准备
主库:192.168.0.4:3306(主机名:mysql-server01)
从库:192.168.0.5:3306(主机名:mysql-server02)
代理服务器:192.168.0.6:3306
mysql版本:mysql-5.6.39
mysql-proxy下载地址:https://downloads.mysql.com/a...
二、搭建MySQL主从环境,以前文章详细介绍过,此处再也不赘述,可参考文章:https://segmentfault.com/a/11...
三、将mysql-proxy代理软件上传至代理服务器192.168.0.6上,而后解压重命名vim
[root@mysql-proxy ~]# tar xf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz [root@mysql-proxy ~]# mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy-0.8.5
四、配置mysql-proxy的环境变量,方便直接使用mysql-proxy命令segmentfault
#编辑/etc/profile文件 [root@mysql-proxy ~]# vim /etc/profile #添加以下内容 MYSQL_PROXY_HOME=/usr/local/mysql-proxy-0.8.5 PATH=$PATH:$MYSQL_PROXY_HOME/bin #使配置文件生效 [root@mysql-proxy ~]# source /etc/profile
五、建立mysql-proxy的配置文件目录和日志目录安全
[root@mysql-proxy ~]# mkdir -pv /usr/local/mysql-proxy-0.8.5/{logs,conf}
六、编辑mysql-proxy配置文件,写入配置内容,而后保存退出服务器
[root@mysql-proxy ~]# vim /usr/local/mysql-proxy-0.8.5/conf/mysql-proxy.conf #写入以下内容 [mysql-proxy] plugins=admin,proxy admin-username=admin admin-password=admin admin-lua-script=/usr/local/mysql-proxy-0.8.5/lib/mysql-proxy/lua/admin.lua proxy-backend-addresses=192.168.0.4:3306 proxy-read-only-backend-addresses=192.168.0.5:3306 proxy-lua-script=/usr/local/mysql-proxy-0.8.5/share/doc/mysql-proxy/rw-splitting.lua log-file=/usr/local/mysql-proxy-0.8.5/logs/mysql-proxy.log log-level=debug daemon=true keepalive=true
参数解释:架构
plugins:要加载的插件,admin表示管理插件,能够查看所代理服务器的状态信息,proxy表示代理插件 admin-username:管理用户的用户名 admin-password:管理用户的密码 admin-lua-script:表示要加载的lua脚本,admin.lua是用来查看被代理服务器状态的脚本 proxy-backend-addresses:表示所代理读写库的ip地址和端口,用来配置主从中的主库,可读可写 proxy-read-only-backend-addresses:表示所代理读库的ip地址和端口,用来配置主从中的从库 rw-splitting.lua:该脚本是用来实现读写分离的脚本,mysql-proxy中自带,能够直接使用 log-file:表示mysql-proxy服务的日志文件路径 log-level:表示日志级别 daemon:表示是否之后台进程启动 keepalive:当mysql-proxy崩溃时,是否尝试重启
注意:admin插件功能启动以后默认监听在TCP的4041端口,proxy插件默认监听在TCP的4040端口
七、检查主从库的防火墙是否关闭,若是未关闭,也能够配置防火墙规则,使得MySQL代理服务器能够访问主从库上TCP的3306端口tcp
[root@mysql-server01 ~]# service iptables status [root@mysql-server01 ~]# service iptables status
八、开启mysql-proxy
#启动mysql-proxy [root@mysql-proxy ~]# mysql-proxy --defaults-file=/usr/local/mysql-proxy-0.8.5/conf/mysql-proxy.conf #查看日志是否正常,以下日志输出表示启动正常 [root@mysql-proxy ~]# tail -f /usr/local/mysql-proxy-0.8.5/logs/mysql-proxy.log 2018-05-07 07:28:09: (critical) plugin proxy 0.8.5 started 2018-05-07 07:28:09: (debug) max open file-descriptors = 1024 2018-05-07 07:28:09: (message) admin-server listening on port :4041 2018-05-07 07:28:09: (message) proxy listening on port :4040 2018-05-07 07:28:09: (message) added read/write backend: 192.168.0.4:3306 2018-05-07 07:28:09: (message) added read-only backend: 192.168.0.5:3306 #查看端口是否启动,4040端口和4041端口 [root@mysql-proxy ~]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 10095/mysql-proxy tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 10095/mysql-proxy
九、查看代理服务器上主从库的当前状态
#使用管理用户链接代理,代理上的admin管理服务默认监听在tcp的4041端口 [root@mysql-proxy ~]# mysql -uadmin -padmin -P4041 #使用查看被代理服务器的状态 mysql> SELECT * FROM backends \G *************************** 1. row *************************** backend_ndx: 1 address: 192.168.0.4:3306 state: up #表示被代理服务器的状态,可能得值有:up,unkonwn,down type: rw uuid: NULL connected_clients: 0 *************************** 2. row *************************** backend_ndx: 2 address: 192.168.0.5:3306 state: unknown #此时没有查询操做,因此状态可能为unkown type: ro uuid: NULL connected_clients: 0 2 rows in set (0.00 sec)
十、在主库上建立读写分离用户
mysql> GRANT ALL ON *.* TO 'proxy'@'192.168.0.%' IDENTIFIED BY 'proxy'; mysql> FLUSH PRIVILEGES;
十一、能够看到上述的从库状态为unknown,表示未知状态,在主库上建立用于增删改查的帐户,而后在代理服务器上执行建库、建表和插入数据操做,查看是否可以正常同步
[root@mysql-proxy ~]# mysql -uproxy -pproxy -P4040 mysql> CREATE DATABASE proxy_db; Query OK, 1 row affected (0.13 sec) #查看是否建立成功 mysql> SHOW DATABASES; #在主库和从库中分别查看proxy_db库是否正常建立和同步,此处不演示,可直接登录主从库查看
十二、上述测试正常以后,须要验证读和写是否分离。能够经过在主库和从库上执行建库和查询操做,而后在主从库上分别经过tcpdump抓包操做完成验证,tcpdump的抓包操做此处不作详解,可查阅资料
(1)修改MySQL读写分离lua脚本中的以下内容,使其链接数不多时依然使用读写分离
[root@mysql-proxy ~]# vim /usr/local/mysql-proxy-0.8.5/share/doc/mysql-proxy/rw-splitting.lua if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { #如下两处将默认的值改成1,表示链接数为多少时使用读写分离 min_idle_connections = 1, max_idle_connections = 1, is_debug = false } end
(2)链接主库192.168.0.4,而后启动抓包操做,并链接代理服务器,而后执行create database操做
#在主库上执行抓包操做 [root@mysql-server01 ~]# tcpdump -i eth0 -s0 -nn -XX tcp dst port 3306 and dst host 192.168.0.4 #链接代理服务器 [root@mysql-proxy ~]# mysql -uproxy -pproxy -P4040 #执行数据库建立操做 mysql> CREATE DATABASE test1; #执行完成create操做以后,能够看到主服务器上打印出的相似以下数据包信息 10:46:06.909236 IP 192.168.0.6.47684 > 192.168.0.4.3306: Flags [P.], seq 1552605453:1552605479,... ... 10:46:06.911517 IP 192.168.0.5.48496 > 192.168.0.4.3306: Flags [.], ack 2392886444... ... 10:46:06.911535 IP 192.168.0.6.47684 > 192.168.0.4.3306: Flags [.], ... 从上述的输出结果能够看出,执行DDL写操做时,操做的数据库为主库。 #在从库上执行抓包操做 [root@mysql-server02 ~]# tcpdump -i eth0 -s0 -nn -XX tcp dst port 3306 and dst host 192.168.0.5 #链接代理服务器 [root@mysql-proxy ~]# mysql -uproxy -pproxy -P4040 #执行查询操做 mysql> SELECT user FROM mysql.user; #执行完成select操做以后,能够看到从服务器上打印出相似以下的数据包信息 04:13:31.854981 IP 192.168.0.6.56506 > 192.168.0.5.3306: Flags ... 04:13:31.866803 IP 192.168.0.6.56506 > 192.168.0.5.3306: Flags [.], ack 3371... ... 04:13:31.877291 IP 192.168.0.6.56506 > 192.168.0.5.3306: Flags [.], a... ... #从上述的输出结果能够看出,执行DDL写操做时,操做的数据库为从库。
(3)使用管理用户链接带来服务器,而后查看被代理主从服务器的当前状态
[root@mysql-proxy ~]# mysql -uproxy -pproxy -P4040 #查询被代理服务器的当前状态 mysql> SELECT * FROM backends; #此时能够看到两个被代理服务器的状态都为up,表示读写分离配置成功。
至此,MySQL读写分离原理及使用mysql-proxy中间件实现的主从分离架构搭建过程介绍完毕,下篇文章将介绍另一种经常使用的实现读写分离的中间件产品MyCat!欢迎评论转发!
后续文章将更新在我的小站上,欢迎查看。