Mysql主从复制,读写分离之Mysql-proxy实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介:

 MySqL的主从复制和读写分离

前面写过mysql数据库的读写分离是用 Amoeba来实现的,下面来用Mysql-proxy来实现一下

1、 MySqL数据库的主从复制

在主服务器上的操作

修改配置文件/etc/my.cnf(也不用修改的主要看下面所提到的是否一样)

# vim /etc/my.cnf

/修改: 

server-id = 1 (默认是1) 开启二进制日志定位到:log-bin 

log-bin=mysql-bin 这个也是默认开启的 修改完成后重新启动mysql服务 

# service mysqld restart

连接到mysql数据库创建用户并赋于复制的权限

mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'172.16.%.%' IDENTIFIED BY '123456';

对从 服务器

vim /etc/my.cnf

修改:   

servier-id = 11   ## id号一定不能与主服务器的id号相同

关掉二进制日志

#log-bin=mysql-bin

添加如下内容:   ##这些是开启中继日志的

relay-log=relay-bin

relay-log-index=relay-bin.index

修改完成后重启一下服务

# service mysqld restart

好了,配置文件修改完成了,重启MySqL

因为主数据库上有数据,为了方便,可以把主mysql上的数据备份,然后把数据库清空只留下原始数据库(也就是刚安装好mysql后的数据库,然后全部备份下来,再导入从数据库中。这样做可以确保主从复制的准确性,也会防止数据在导入导出的时候不会出错。),然后继续下面的步骤。

在主从服务器上各自清空一下日志,也是同时用命令:

在主服务器上:mysql>flush master;

在从服务器上:mysql> flush slave;

这样做要使主从服务器的日志位于同一个结点,否则这样会易出错。

清空日志后就可以在从服务器上连接到主服务器上了

mysql>    CHANGE MASTER TO MASTER_HOST='172.16.35.1',MASTER_USER='repl',MASTER_PASSWORD='123456';

 

用命令:mysql> show slave status\G 来查看一下是否已经连接上

如果出现以下结果表明连接成功

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果有一个结果为No说明主从同步失败

失败的原因有多种:

最常见的情况分别是:

1、在主服务器上的用户可能出错

2、没有重新滚动一下主从服务器的日志,在连接前有必要重新滚动一下。

下面就可以测试了。

在主服务器上创建或者删除数据库、表,就可以同步到从服务器上了。

在从服务器上也可以查看到从服务器要比主服务器慢多少时间用命令:

mysql> show slave status\G

定位到:Second_Behind_Master0,表示时间说明没有延迟)

主从同步后就可以把前面备份的数据从主MySqL服务器上导入,这样从服务器会从主服务器上同步下来。数据导入之后就完成了。

 

 

 

 

 

 

下面来说一下MySqL的读写分离器MySql-Proxy

MySql Proxy是一个处于MySql Client端和MySql Server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡、故障分析、查询过渡和修改等。MySqL Proxy就是这么一个中间层代理,简单地说,MySql Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用Lua脚本,实现复杂的连接控制和过渡,从而实现读写分离和负载平衡。

对于应用来说,Mysql Proxy是完全透明的,应用则只是需要连接到MySql Proxy的监听端口即可。当然,这样Proxy机器可能成为单点失效,但完全可以使用多个Proxy机器作为冗余,在应用服务器的连接池配置中配置多个Proxy的连接参数即可。

MySql Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从数据库处理SELECT查询,数据复制(Replication)用来把主库的变更同步到集群中的从库上。在生成MySqlM-S结构后,实现读写分离,需要使用MySql Proxy。目前MySql Proxy版本为0.8.2

MySql Proxy0.8.2安装步骤

先从官方地址http://dev.mysql.com/downloads/mysql-proxy/下载源码包。安装之前的先决条件如下:

# libevent1.x或者更高

#glib2 2.6.0或者更高

#lua5.1.x或者更高

#pkg-config

#libtool 1.5或者更高

#mysql5.0.x或者更高的开发库

 

root用户

yum install gcc gcc-c++ autoconf libtool pkgconfig ncurses ncurses-devel

\\\这些都要提前安装好。

安装libevent-2.0.13-stable.tar.gz

# tar zxvf libevent-2.0.13-stable.tar.gz

# cd libevent-2.0.13-stable

# ./configure

# make

# make install

安装glib-2.18.4.tar.gz

# tar zxvf glib-2.18.4.tar.gz

# cd glib-2.18.4

# make

# make install

安装:redline-6.1.tar.gz

# tar zxvf redline-6.1.tar.gz

# cd redline-6.1

# ./configure

# make

# make install

完成后,为了让动态链接库为系统所共享,运行ldconfig命令。

# ldconfig

# ldconfig -v

\\\这个是显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。

安装lua-5.1.4.tar.gz

tar zxvf lua-5.1.4.tar.gz

cd lua-5.1.4

make linux

make install

cp etc/lua.pc /usr/local/lib/pkgconfig/

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

安装mysql-proxy-0.8.2.tar.gz

tar zxvf mysql-proxy-0.8.2.tar.gz

cd mysql-proxy-0.8.2

./configure --prefix=/usr/local/mysql-proxy

make && make install

cp lib/rw-splitting.lua /usr/local/lib/

cp lib/admin.lua /usr/local/lib/

创建mysql-proxy的启动配置文件

vim /etc/mysql-proxy.cnf

文件内容如下:

[mysql-proxy]

admin-username = admin

admin-password = oreilly

admin-lua-script = /usr/local/lib/admin.lua

proxy-read-only-backend-addresses = 172.16.35.2  \\\只读数据库

proxy-backend-addresses = 172.16.35.1   \\\\读写数据库

proxy-lua-script = /usr/local/lib/rw-splitting.lua  \\\读写分离脚本

log-file = /var/log/mysql-proxy.log  \\\日志文件

log-level = debug

daemon = true

keepalive = true

修改这个文件的权限为660否则无法启动。

# chmod 660 /etc/mysql-proxy.cnf

修改读写分离脚本,让测试更容易。

Lua脚本默认最小4个最大8个以上的客户连接才会实现读写分离(这是因为Mysql Proxy会检测客户端连接,当连接没有超过min_idle_connections预设的值时,不会进行读写分离,即查询操作会发生到Master上),现改为最小1个,最大2

vim /usr/local/lib/rw-splitting.lua

修改:

min_idle_connections = 1,

max_idle_connections = 2,

启动:

/usr/local/mysql-proxy/bin/mysql-proxy -P 172.16.35.2:8066 --proxy-fix-bug-25371 --defaults-file=/etc/mysql-proxy.cnf

 

#mysql-proxy选项说明

可以用 mysql-proxy –help-all来查看

管理功能选项:

--admin-address=host:port指定一个mysql-proxy的管理端口,默认是4041

--admin-username=<string> username to allow to log in

--admin-password=<string>password to allow to log in

--admin-lua-script=<filename>script to execute by the admin plugin

代理功能选项:

-P ,--proxy-address=<host:port>mysql-proxy服务器的监听端口,默认是4040

-r--proxy-read-only-backend-addresses=<host:port>只读Slave的地址和端口,默认为不设置。

-b--proxy-backend-addresses=<host:port>远程Master地址和端口,可设置多个failoverload balance

--proxy-skip-profiling关闭查询分析功能,默认是打开的

--proxy-fix-bug-25371修正mysqllibmysql版本大于5.1.12的一个#25371Bug

-s--proxy-lua-script=<file>指定一个Lua脚本控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改时将重新调用。

其他选项:

--defaults-file=<file>配置文件,可以把mysql-proxy的参数信息置入配置文件里,这样做比较方便。

--daemon mysql-proxy 以守护进程的方式运行。

--pid-flie=file设置mysql-proxy的存储PID文件的路径。

--keepalive try to restart the proxy if it crashed,保持连接启动进程会有个,一号进程用来监视二号进程,如果二号进程死掉自动重启Proxy,这是新版MySql Proxy 增加的Keepalived功能,它修正了以前的Mysql Proxy容易死掉的bug 开启此功能。

 

 

 

以上就是MysqL Proxy的全部过程。

 

 

 本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1085716



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
344
分享
相关文章
如何实现 MySQL 的读写分离?
本文介绍了 MySQL 读写分离的实现方式及其主从复制原理,解释了如何通过主从架构提升读并发能力。重点分析了主从同步延时问题及解决方案,如半同步复制、并行复制等技术手段,并结合实际案例探讨了高并发场景下的优化策略。文章还提醒开发者在编写代码时需谨慎处理插入后立即查询的情况,避免因主从延时导致的数据不一致问题。
325 44
如何实现 MySQL 的读写分离?
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
145 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
115 40
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
286 1
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
217 1
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
284 11
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
372 0
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
165 14
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
148 24
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
418 1
MySQL主从复制原理和使用
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等