1. MySQL读写分离概念
MYSQL读写分离的原理其实就是让Master数据库处理事务性增加、删除、修改、更新操作(create、insert、update、delete),而让Slave数据库处理查询(select)操作,MySQL读写分离前提是基于MySQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端的数据。
1.1 读写分离实现方式
实现MySQL读写分离可以基于第三方插件,也可以通过开发修改代码实现,具体实现的读写分离的常见方式有如下四种:
Amoeba:是阿里08年开源的以MySQL为底层数据存储,并对WEB、APP应用提供MySQL协议接口的Proxy。它集中地响应WEB应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行,基于此可以实现负载均衡、读写分离、高可用性等需求。
MySQL-Proxy:是MySQL官方提供的MySQL中间件服务,支持无数客户端连接,同时后端可连接若干台MySQL-Server服务器,MySQL-Proxy自身基于MySQL协议,连接MySQL-Proxy的客户端无需修改任何设置, 跟正常连接MySQL Server没有区别,无需修改程序代码。
MyCAT:是基于阿里12年开源的cobar开发的一个数据库中间件,在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,它可实现读写分离,分库分表。
2. 基于MySQL-Proxy实现读写分离
Proxy: 192.168.48.182
Master: 192.168.48.183
Slave: 192.168.48.184
Slave: 192.168.48.185
2.1 工作原理图解
2.2 配置Proxy
Proxy可以选择和mysql部署在同一台服务器,也可以选择单独部署在另一台独立服务器。
# 下载MySQL-Proxy:
[root@node02 ~]# cd /usr/src/
[root@node02 src]#
[root@node02 src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
# 解压:
[root@node02 src]# tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
[root@node02 src]#
[root@node02 src]# mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
# 配置环境变量:
[root@node02 src]# echo "export PATH=/usr/local/mysql-proxy/bin:$PATH" > /etc/profile.d/mysql-proxy.sh
[root@node02 src]#
[root@node02 src]# . /etc/profile.d/mysql-proxy.sh
[root@node02 src]# echo $PATH
/usr/local/mysql-proxy/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node02 src]#
# 启动MYSQL-Proxy中间件:
[root@node02 src]# useradd -r mysql-proxy
[root@node02 src]#
[root@node02 src]# mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.48.183:3306" --proxy-read-only-backend-addresses="192.168.48.184:3306" --proxy-read-only-backend-addresses="192.168.48.185:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
[root@node02 src]#
# 查看端口/日志:
[root@node02 src]# netstat -ntlp |grep 404
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 11803/mysql-proxy
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 11803/mysql-proxy
[root@node02 src]#
2.3 启动的相关参数
# Mysql-Proxy的相关参数详解如下:
--help-all # 获取全部帮助信息;
--proxy-address=host:port # 代理服务监听的地址和端口,默认为4040;
--admin-address=host:port # 管理模块监听的地址和端口,默认为4041;
--proxy-backend-addresses=host:port # 后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port # 后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name # 完成mysql代理功能的Lua脚本;
--daemon # 以守护进程模式启动mysql-proxy;
--keepalive # 在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name # 日志文件名称;
--log-level=level # 日志级别;
--log-use-syslog # 基于syslog记录日志;
--plugins=plugin # 在mysql-proxy启动时加载的插件;
--user=user_name # 运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name # 默认使用的配置文件路径,其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling # 禁用profile;
--pid-file=/path/to/pid_file_name # 进程文件名;
2.4 启动master/slave
[root@node03 ~]# systemctl start mariadb
[root@node04 ~]# systemctl start mariadb
[root@node05 ~]# systemctl start mariadb
2.5 查看读写分离状态
基于4041端口MySQL-Prox