MySQL读写分离
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL读写分离,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5612字,纯文字阅读大概需要9分钟。
内容图文
![MySQL读写分离](/upload/InfoBanner/zyjiaocheng/920/5f446849242f41de91724a2ddcd2f9a6.jpg)
MySQL读写分离的概述
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力这样的方案来进行部署与实施的。
读写分离工作原理:
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
数据内部交换过程:
为什么要读写分离:
面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
1、 主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
2、 从库可配置myisam引擎,提升查询性能以及节约系统开销
3、 增加冗余,提高可用性
实现读写分离的方式:
一般有两种方式实现
应用程序层实现,网站的程序实现
应用程序层实现指的是在应用程序内部及连接器中实现读写分离
优点:
A:应用程序内部实现读写分离,安装既可以使用
B:减少一定部署难度
C:访问压力在一定级别以下,性能很好
缺点:
A:架构一旦调整,代码要跟着变
B:难以实现高级应用,如自动分库,分表
C:无法适用大型应用场景
中间件层实现
中间件层实现是指在外部中间件程序实现读写分离
常见的中间件程序:
Mysql-proxy amoeba Atlas (360) Cobar(Alibaba) TDDL(Taobao)
优点:
A:架构设计更灵活
B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
C:可以依靠些技术手段提高mysql性能,
D:对业务代码的影响小,同时也安全
缺点:
需要一定的开发运维团队的支持
MySQL-Proxy概述
MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。
MySQL Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。
下载: mysql-proxy
http://dev.mysql.com/downloads/mysql-proxy/
端口: mysql-proxy 默认端口:4040
部署mysql-proxy实现读写分离
实验环境:
mysql-proxy服务端: mysql-proxy IP:172.16.0.200
mysql服务器(主,负责写)服务端:mysql-master IP:172.16.0.211
mysql服务器(从,负责读)客户端:mysql-salve IP:172.16.0.212
部署mysql-proxy服务端172.16.0.200:
安装前需要系统支持LUA语言环境:
[root@mysql-proxy ~]# yum install lua -y
安装mysql-proxy: (上传安装包到172.16.0.200)
[root@mysql-proxy ~]# tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@mysql-proxy ~]# cd /usr/local/
[root@mysql-proxy local]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy
修改系统环境变量:
[root@mysql-proxy local]# vi /etc/profile
export PATH=/usr/local/mysql-proxy/bin/:/usr/local/mysql/bin:$PATH
[root@mysql-proxy local]# source !$
source /etc/profile
mysql-proxy 脚本配置文件位置:
[root@mysql-proxy local]# ls /usr/local/mysql-proxy/share/doc/mysql-proxy/
修改配置文件实现读写分离:
[root@mysql-proxy local]# vi /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
改为
#修改默认连接,进行快速测试,默认最小4个以上的客户端连接才会实现读写分离,最大链接数为8。
注:为了验证试验效果将他改成1 .就是当有一个链接的时候,就实现读写分离的功能。为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能。
启劢服务 mysql-proxy 服务
[root@mysql-proxy ~]# mysql-proxy --proxy-read-only-backend-addresses=172.16.0.212:3306 --proxy-backend-addresses=172.16.0.211:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
测试主从分离:断开主从 从库 stop slave;
主库建立db数据库并插入数据: 172.16.0.211
mysql> create database db;
mysql> use db;
mysql> create table test(id int);
mysql> insert into test values(6363);
mysql> grant all on db.* to user1@'%' identified by '123456' ;
从库建立db数据库并插入数据: 172.16.0.212
mysql> create database db;
mysql> use db;
mysql> create table test(id int);
mysql> insert into test values(6464);
mysql> grant all on db.* to user1@'%' identified by '123456' ;
查看 proxy 是否启劢:
mysql>use db;
mysql> insert into test values(636363);
再打开一个客户端测试一下读。 测试读:
[root@mysql-proxy ~]# mysql -uuser1 -p123456 -P4040 -h172.16.0.210
mysql> select * from test;
注: 在这个地方多打开几个客户端测试一下读。(和修改的rw-splitting.lua文件两个1有关)
以上是测试了读写相关
------------------------------------------------------------------------------------------------------------------------------------------------------------
主从同步测试:
主库插入数据:
mysql> create database db;
Query OK, 1 row affected (0.00 sec)
mysql> use db;
mysql> create table test (id int );
mysql> insert into test values(63);
mysql> insert into test values(64);
mysql> insert into test values(65);
从库查看:
断开从库 主库再次插入数据:
mysql> insert into test values(66);
mysql> insert into test values(67);
mysql> insert into test values(68);
查看代理端:172.16.0.210
此时查看到的是从库的数据
开启从库 查看代理端:
从库数据
代理端数据
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
内容总结
以上是互联网集市为您收集整理的MySQL读写分离全部内容,希望文章能够帮你解决MySQL读写分离所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。