云服务器 ECS 配置:利用MySQL读写分离,提升应用数据吞吐性能

利用MySQL读写分离,提升应用数据吞吐性能

背景

一般情况下,对数据库的读和写都在同一个数据库服务器中操作时,业务系统性能会降低。为了提升业务系统性能,优化用户体验,可以通过读写分离来减轻主数据库的负载。本篇文章分别从应用层和系统层来介绍读写分离的实现方法。

应用层实现方法:

应用层中直接使用代码实现,在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。

优点:

1、多数据源切换方便,由程序自动完成。

2、不需要引入中间件。

3、理论上支持任何数据库。

缺点:

1、由程序员完成,运维参与不到。

2、不能做到动态增加数据源。

系统层实现方法:

方式一:使用DRDS实现

https://help.aliyun.com/document_detail/29681.html

方式二:使用中间件MySQL-proxy实现

本教程使用MySQL-proxy实现读写分离。

MySQL-proxy介绍:

MySQL Proxy是一个处于Client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。

MySQL-proxy原理:

MySQL Proxy是一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

优点:

1、源程序不需要做任何改动就可以实现读写分离。

2、动态添加数据源不需要重启程序。

缺点:

1、程序依赖于中间件,会导致切换数据库变得困难。

2、由中间件做了中转代理,性能有所下降。

操作步骤

环境说明:

主库IP:121.40.18.26

从库IP:101.37.36.20

MySQL-proxy代理IP:116.62.101.76

前期准备:

1、新建3台ECS,并安装mysql。

2、搭建主从,必须保证主从数据库数据一致。

主环境

1.修改mysql配置文件。

vim /etc/my.cnf
[mysqld]
server-id=202                  #设置服务器唯一的id,默认是1
log-bin=mysql-bin              # 启用二进制日志

从环境

[mysqld]
server-id=203

2.重启主从服务器中的MySQL服务。

/etc/init.d/mysqld restart

3.在主服务器上建立帐户并授权slave。

mysql -uroot -p95c7586783
grant replication slave on . to 'syncms'@'填写slave-IP' identified by '123456';
flush privileges;

4.查看主数据库状态。

mysql> show master status;

5.配置从数据库。

change master to master_host='填写master-IP', master_user='syncms',      master_password='123456', master_log_file='mysql-bin.000005', master_log_pos=602;

6.启动slave同步进程并查看状态。

start slave;
show slave status\G

7.验证主从同步。

主库上操作:

mysql> create database testproxy;
mysql> create table testproxy.test1(ID int primary key,name char(10) not null);
mysql> insert into testproxy.test1 values(1,'one');
mysql> insert into testproxy.test1 values(2,'two');
mysql> select * from testproxy.test1;

从库操作:

从库中查找testproxy.test1表的数据,与主库一致,主从同步成功

select * from testproxy.test1;

读写分离配置

1.安装MySQL-Proxy。

wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
mkdir /alidata
tar xvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/  /alidata/mysql-proxy-0.8.5

2.环境变量设置。

vim /etc/profile                     #加入以下内容
PATH=$PATH:/alidata/mysql-proxy-0.8.5/bin
export $PATH
source /etc/profile                  #使变量立即生效
mysql-proxy -V

3.读写分离设置。

cd /alidata/mysql-proxy-0.8.5/share/doc/mysql-proxy/
vim  rw-splitting.lua

MySQL Proxy会检测客户端连接, 当连接没有超过min_idle_connections预设值时, 不会进行读写分离默认最小4个(最大8个)以上的客户端连接才会实现读写分离, 现改为最小1个最大2个,便于读写分离的测试,生产环境中,可以根据实际情况进行调整。

调整前:

调整后:

4.将lua管理脚本(admin.lua)复制到读写分离脚本(rw-splitting.lua)所在目录。

cp /alidata/mysql-proxy-0.8.5/lib/mysql-proxy/lua/admin.lua /alidata/mysql-proxy-0.8.5/share/doc/mysql-proxy/

授权

1.主库中操作授权,因主从同步的原因,从库也会执行。

mysql -uroot -p95c7586783
grant all on . to 'mysql-proxy'@'填写MySQL Proxy IP' identified by '123456';
flush privileges;

2.开启MySQL-Proxy。

mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins=proxy -b 填写master-IP:3306 -r 填写slave-IP:3306 --proxy-lua-script="/alidata/mysql-proxy-0.8.5/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/alidata/mysql-proxy-0.8.5/share/doc/mysql-proxy/admin.lua"

3.启动MySQL-Proxy之后,查看端口和相关进程。

netstat -tpln

ps -ef | grep mysql

测试读写分离

1.关闭从复制

stop slave;

2.MySQL-Proxy上操作,登录mysql-proxy后台管理。

mysql  -u  admin -padmin -P 4041 -h MySQL-Proxy-IP
select * from backends;                #查看状态

第一次连接,会连接到主库上。

mysql -umysql-proxy -p123456 -h 116.62.101.76 -P 4040
insert into testproxy.test1 values(3,'three');             #新增一条数据,由于测试需要,关闭了从复制,因此该数据在主库中存在,在从库中不存在

多开几个连接进行测试,当查询testproxy.test1表的数据显示是从库的数据时,读写分离成功。

mysql -umysql-proxy -p123456 -h 116.62.101.76 -P 4040
select * from testproxy.test1;

原文链接

时间: 2024-11-02 18:15:53

云服务器 ECS 配置:利用MySQL读写分离,提升应用数据吞吐性能的相关文章

云服务器 ECS 数据恢复:使用快照策略和镜像备份数据

使用快照策略和镜像备份数据 很多客户在使用ECS,将应用部署到云端后,并不重视对数据的保护,几乎不采取任何有效的备份措施,因此我们经常遇到数据丢失无法找回的案例. 数据的丢失往往并不是云平台本身的问题,ECS提供的是底层硬件.虚拟化层面的可用性,并从物理层保证数据99.9999999%的可靠性,确保数据不会因为物理硬件的损坏而丢失,然而还有很多其他途径导致数据的丢失,例如误删除.勒索病毒.逻辑错误等等. 数据是最重要的资产之一,一旦发生数据的丢失,造成的损失难以预估和补救. 本文档介绍如何使用快

阿里云服务器ECS配置LNMP

刚刚买的阿里云服务器ECS镜像CentOS 6.5 64位. 准备配置个laravel跑,另外之前一直使用mysql,因为php7 & mariadb跟php5 & mysql开发的变化,没有使用最新版本. 参考此文使用yum install安装的lnmp版本为:nginx-1.10.2.php5.3.3.mysql5.1.装完后配置phpMyAdmin-4.6.3及最新版本都报不同错误,于是对php.mysql版本升级. 如果你yum或者rpm升级mysql中,可能跟我一样,遇到各种li

云服务器 ECS 快速入门:Linux 格式化和挂载数据盘

Linux 格式化和挂载数据盘 如果您已经为 ECS 实例配了数据盘,您需要先格式化数据盘并挂载文件系统后才能正常使用数据盘. 注意: 磁盘分区和格式化是高风险行为,请慎重操作.本文档描述如何处理一个新买的数据盘,如果您的数据盘上有数据,请务必对数据盘创建快照以避免可能的数据丢失. 云服务器 ECS 仅支持对 数据盘 进行分区,而不支持对 系统盘 进行分区.如果您强行使用第三方工具对系统盘进行分区操作,可能引发未知风险,如系统崩溃.数据丢失等. 本文描述如何用一个新的数据盘创建一个单分区数据盘并

云服务器 ECS 配置:ECS之Windows服务器时钟同步设置

ECS之Windows服务器时钟同步设置 简介 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议,对于一些对时间极度敏感的应用(例如,通信行业), 如果不同机器时间不一致,就有可能导致读取到值不同. 操作步骤 修改默认NTP服务器地址 Windows Server操作系统默认都配置了微软默认的NTP服务器(time.windows.com),但可能会因为网络的原因经常出现同步出错.这时我们可以将默认的NTP服务器更换成阿里的NTP服务器

云服务器 ECS 配置:阿里云ECS Windows Server 2012 搭建AD

阿里云ECS Windows Server 2012 搭建AD 简介 Active Directory(简称AD,即" 活动目录"的意思),是微软下面的核心组件,其主要优势是实现高效管理(例如,批量管理用户,部署应用,更新补丁等等),而且微软很多的套件(Exchange,故障转移群集)也是需要域环境支持. 安装 安装之前我们介绍域里面的几个常见名词以及必要条件. 名词解释 Domain Controllers(DC)域控制器 Organizational Unit(OU)组织单位 Di

云服务器 ECS 配置:Linux升级时不升级内核的配置说明

Linux升级时不升级内核的配置说明 RedHat/CentOS使用 yum update 更新时,默认会升级内核.但有些服务器硬件在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦.所以在生产环境中不要轻易的升级内核,除非您确定升级内核后不会出现麻烦的问题. 如果使用yum update更新时不升级内核,有两种方法: 方法一 直接在yum的命令后面加参数,这个命令只生效一次: # yum update --exclude=kernel* 方法二 修改yum命令的配置文件,永久生

Mysql主从配置,实现读写分离

原文:Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想.这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.Ok切入今天微博主题,利用MySQL主从

Magento数据库配置选项,以及mysql 读写分离

1.数据库配置 [mysqld] key_buffer = 512M max_allowed_packet = 64M table_cache = 512 sort_buffer_size = 4M read_buffer_size = 4M read_rnd_buffer_size = 2M myisam_sort_buffer_size = 64M tmp_table_size = 128M query_cache_size = 96M query_cache_type = 1 thread

MySQL读写分离技术

阅读目录 1.简介 2.基本环境 3.配置主从复制 4.MySQL读写分离配置 4.1.安装lua 4.2.安装mysql-proxy 5.MySQL读写分离测试 1).修改rw-splitting.lua文件 2).修改完成后,启动mysql-proxy 3).创建用于读写分离的数据库连接用户 4).测试登陆账号proxy1@192.168.95.13进行添加数据 5).关闭12mysql的从复制 6).证明写分离 7).证明读分离 6.建议 回到顶部 1.简介 当今MySQL使用相当广泛,随