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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

 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



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 存储 关系型数据库
MySQL的主从复制&主从同步
MySQL的主从复制&主从同步
30 0
|
4月前
|
SQL 关系型数据库 MySQL
面试官:说一下MySQL主从复制的原理?
面试官:说一下MySQL主从复制的原理?
94 0
面试官:说一下MySQL主从复制的原理?
|
3月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
76 0
|
16天前
|
负载均衡 容灾 关系型数据库
mysql主从复制
mysql主从复制
31 1
|
1月前
|
SQL 存储 运维
MySQL高可用性:主从复制和集群
MySQL高可用性:主从复制和集群
36 0
|
1天前
|
负载均衡 关系型数据库 MySQL
MySQL-Proxy实现MySQL读写分离提高并发负载
MySQL-Proxy实现MySQL读写分离提高并发负载
|
15天前
|
SQL 关系型数据库 MySQL
mysql主从复制
mysql主从复制
|
1月前
|
关系型数据库 MySQL 数据库
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
63 0
|
1月前
|
SQL 网络协议 关系型数据库
【怒怼大厂面试官】听说你精通MySQL?来说说MySQL主从复制
面试官:MySQL主从复制了解吧?嗯嗯了解的。主要是利用了MySQL的Binary Log二进制文件。那我把二进制文件丢给从库,从库复制整个文件吗。噢噢不是的。
48 1
【怒怼大厂面试官】听说你精通MySQL?来说说MySQL主从复制
|
1月前
|
监控 负载均衡 关系型数据库