Mysql读写分离--mysql-proxy

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

image.png


准备前提:


1、MySQL的安装与配置 --省略

版本:Server version: 5.6.35


1.1 系统版本:

[root@centos7-67 package]# lsb_release -a

LSB Version: :core-4.1-amd64:core-4.1-noarch

Distributor ID: CentOS

Description: CentOS Linux release 7.2.1511 (Core) 

Release: 7.2.1511

Codename: Core


2、场景描述

数据库Master主服务器:192.168.1.83

数据库Slave从服务器:192.168.1.66

MySQL-Proxy调度服务器:192.168.1.67

以下操作,均是在192.168.1.67即MySQL-Proxy调度服务器 上进行的。


   配置主从复制,并在192.168.1.66上开启 start slave;


   MySQL-Proxy上安装所需软件包

yum install -y gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig* libevent* glib* readline-devel*


3、编译安装lua

MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua


下载:

从http://www.lua.org/download.html下载源码包

wget http://www.lua.org/ftp/lua-5.3.4.tar.gz


3.1  tar xf lua-5.3.4.tar.gz

3.2  cd lua-5.3.4

3.3  vi src/Makefile

CFLAGS= -O2 -Wall -fPIC -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)

3.4   make linux

3.5   make install


下载:

https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz


4、tar xf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz

5、mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy

6、cd /usr/local/mysql-proxy

7、mkdir lua #创建脚本存放目录

   mkdir logs #创建日志目录

8、cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件

9、cp share/doc/mysql-proxy/admin-sql.lua ./lua #复制管理脚本

10、vi /etc/init.d/mysql-proxy   #创建mysql-proxy服务管理脚本

[root@centos7-67 ~]# cat /etc/init.d/mysql-proxy 

#!/bin/sh

# mysql-proxy This script starts and stops the mysql-proxy daemon

#

# chkconfig: - 78 30

# processname: mysql-proxy

# description: mysql-proxy is a proxy daemon to mysql

# Source function library.

. /etc/rc.d/init.d/functions

#PROXY_PATH=/usr/local/bin

PROXY_PATH=/usr/local/mysql-proxy/bin

prog="mysql-proxy"

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

#[ ${NETWORKING} == "no" ] && exit 0

# Set default mysql-proxy configuration.


PROXY_OPTIONS="--log-level=info \

--log-file=/var/log/mysql-proxy.log \

--plugins=proxy -b 192.168.1.83:3306 -r 192.168.1.66:3306 \

--proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua \

--plugins=admin --admin-username=admin \

--admin-password=admin \

--admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"


PROXY_PID=/usr/local/mysql-proxy/mysql-proxy.pid

# Source mysql-proxy configuration.


if [ -f /etc/sysconfig/mysql-proxy ]; then


        . /etc/sysconfig/mysql-proxy


fi

PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH

# By default it's all good

RETVAL=0


# See how we were called.

case "$1" in

  start)

        # Start daemon.

        echo -n $"Starting $prog: "

        $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql

        RETVAL=$?

        echo

        if [ $RETVAL = 0 ]; then

                touch /var/lock/subsys/mysql-proxy

        fi

       ;;

  stop)

        # Stop daemons.

        echo -n $"Stopping $prog: "

        killproc $prog

        RETVAL=$?

        echo

        if [ $RETVAL = 0 ]; then

                rm -f /var/lock/subsys/mysql-proxy

                rm -f $PROXY_PID

        fi

       ;;

  restart)

        $0 stop

        sleep 3

        $0 start

       ;;

  condrestart)

       [ -e /var/lock/subsys/mysql-proxy ] && $0 restart

      ;;

  status)

        status mysql-proxy

        RETVAL=$?

       ;;

  *)

        echo "Usage: $0 {start|stop|restart|status|condrestart}"

        RETVAL=1

       ;;

esac

exit $RETVAL



11、脚本更改说明:

PROXY_PATH=/usr/local/mysql-proxy/bin//定义mysql-proxy服务二进制文件路径 

--proxy-read-only-backend-addresses=192.168.1.66:3306       //定义从服务器可读

--proxy-backend-addresses=192.168.1.83:3306 //定义主服务器可写 --proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua"//定义lua读写分离脚本路径


PROXY_PID=/usr/local/mysql-proxy/mysql-proxy.pid//定义mysql-proxy PID文件路径

--daemon  //定义以守护进程模式启动

--keepalive //使进程在异常关闭后能够自动恢复

--pid-file=$PROXY_PID  //定义mysql-proxy PID文件路径

--user=mysql  //以mysql用户身份启动服务

--log-level=warning  //定义log日志级别,由高到低分别有(error|warning|info|message|debug)

--log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log //定义log日志文件路径


12、chmod 755  /etc/init.d/mysql-proxy

13、vi /usr/local/mysql-proxy/lua/rw-splitting.lua //修改读写分离脚本//修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离

-- connection pool

if not proxy.global.config.rwsplit then

        proxy.global.config.rwsplit = {

                min_idle_connections = 1,//默认为4

                max_idle_connections = 1,//默认为8


                is_debug = false

        }

end


14、启动mysql-proxy

/etc/init.d/mysql-proxy start


15、启动成功:

[root@centos7-67 ~]# netstat -nutlp| grep mysql

tcp        0      0 0.0.0.0:4040            0.0.0.0:*               LISTEN      18520/mysql-proxy   

tcp        0      0 0.0.0.0:4041            0.0.0.0:*               LISTEN      18520/mysql-proxy 


16、测试读写分离效果

创建用于读写分离的数据库连接用户

登陆主数据库服务器192.168.1.83,通过命令行登录管理MySQL服务器


mysql>  GRANT ALL ON *.* TO 'proxy1'@'192.168.1.67' IDENTIFIED BY 'password';

由于我们配置了主从复制功能,因此从数据库服务器172.16.1.66上已经同步此操作。


为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能;线上是需要主从同步的,这里只是做实验测试,需要关闭

登录从数据库服务器192.168.1.66

关闭Slave同步进程

mysql> stop slave;


连接到mysql-proxy

[root@centos7-67 ~]# mysql -uproxy1 -p'password' -P4040 -h192.168.1.67

插入2条数据

mysql> insert into t1 values (120,'third');

Query OK, 1 row affected (0.02 sec)


mysql> insert into t1 values (121,'for');

Query OK, 1 row affected (0.01 sec)



验证:

mysql-proxy:

mysql> select * from t1; //没有看到数据


master:

mysql> select * from t1; //可以看到数据


slave:

mysql> select * from t1; //没有看到数据


连接管理端口:

[root@centos7-67 ~]# mysql -uadmin -padmin -h192.168.1.67 -P4041

mysql> SELECT * FROM backends;

+-------------+-------------------+-------+------+------+-------------------+

| backend_ndx | address           | state | type | uuid | connected_clients |

+-------------+-------------------+-------+------+------+-------------------+

|           1 | 192.168.1.83:3306 | up    | rw   | NULL |                 0 |

|           2 | 192.168.1.66:3306 | up    | ro   | NULL |                 0 |

+-------------+-------------------+-------+------+------+-------------------+

2 rows in set (0.00 sec)


up:表示读写分离生效;unKnown:还没生效


结论:当在mysql-proxy插入数据时,写入到了master上,查询数据是从slave上查看,所以查询不到数据。当在slave上插入数据,在mysql-proxy上可以看到,说明读是从slave上,写是在master上。










本文转自 iekegz 51CTO博客,原文链接:http://blog.51cto.com/jacksoner/2084099,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL 读写分离原理
MySQL 读写分离原理
62 0
MySQL 读写分离原理
|
4月前
|
SQL 关系型数据库 MySQL
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
64 0
|
3月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
71 0
|
7月前
|
SQL 存储 关系型数据库
MySQL主从复制、读写分离
MySQL主从复制、读写分离
132 0
|
6月前
|
关系型数据库 MySQL 中间件
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
|
6月前
|
存储 SQL 关系型数据库
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
63 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL搭建主从备份读写分离(MySQL5.7案例)
MySQL搭建主从备份读写分离(MySQL5.7案例)
114 0
|
4月前
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
40 0
|
1月前
|
关系型数据库 MySQL 数据库
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
59 0
|
5月前
|
Java 关系型数据库 MySQL
数据库系列课程(04)-SpringBoot整合MySQL读写分离
数据库系列课程(04)-SpringBoot整合MySQL读写分离
71 0