Mysql-proxy实现MariaDB读写分离

Mysql Proxy 简介

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

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

MySQL Proxy更强大的一项功能就是实现"读写分离",基本原理就是让主数据库处理事务性查询,让从服务器进行SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群的从库中。

MySQL Proxy安装方式

一、源码安装

1、源码安装时,MySQL proxy的依赖关系:

libevent 1.x or higher

lua 5.1x or higher

glib2 2.6.0 or higher

pkg-config.

libtool 1.5 or higher

MySQL 5.0.x or higher developer files

2、安装

# tar xf mysql-proxy-0.8.2.tar.gz

# cd mysql-proxy-0.8.2

# ./configure

# make

# make check

如果管理员有密码,上面的步骤则需要使用如下格式进行:

#MYSQL_PASSWORD=root_pwd make check

# make install

默认情况下,mysql-proxy安装在/usr/local/sbin/mysql-proxy,而Lua示例脚本安装在/usr/local/share目录中

二 、通用二进制格式安装

1、下载,当前系统架构为 Centos6.5 64位系统

http://mirrors.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz

2、解压

#tar  xf mysql-proxy-0.8.4-linux-e16-x86-64bit.tar.gz

#mv mysql-proxy-0.8.4-linux-e16-x86-64bit /usr/local/mysql-proxy

3、添加代理用户

# useradd mysql-proxy

4、为mysql-proxy提供SysV服务脚本

5、为mysql-proxy脚本提供配置文件

MySQL Proxy实现读写分离

环境搭建

如上图所示

MySQL Master 主服务器 172.16.13.13 MariaDB-5.5.36
MySQL Slave  从服务器 172.16.13.14 MariaDB-5.5.36
MySQL  Proxy 代理服务器 172.16.13.2 mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz

一、MySQL主从复制架构的实现

关于MySQL主从复制的实现详情请参考我的博客:

http://jungege.blog.51cto.com/4102814/1396276

二、MySQL Proxy服务器配置

1、下载所需要的版本,这里的系统平台为CentOS6.5 64系统

#wget http://mirrors.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
# tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
# mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy

2、添加代理用户

# useradd mysql-proxy

3、为mysql-proxy提供SysV服务脚本

# vim /etc/rc.d/init.d/mysql-proxy
内容如下
#!/bin/bash
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon for mysql
# Source function library.
. /etc/rc.d/init.d/functions
prog="/usr/local/mysql-proxy/bin/mysql-proxy"
# Source networking configuration.
if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Set default mysql-proxy configuration.
ADMIN_USER="admin"
ADMIN_PASSWD="admin"
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_OPTIONS="--daemon"
PROXY_PID=/var/run/mysql-proxy.pid
PROXY_USER="mysql-proxy"
# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
    . /etc/sysconfig/mysql-proxy
fi
RETVAL=0
start() {
    echo -n $"Starting $prog: "
    daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD"
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        touch /var/lock/subsys/mysql-proxy
    fi
}
stop() {
    echo -n $"Stopping $prog: "
    killproc -p $PROXY_PID -d 3 $prog
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        rm -f /var/lock/subsys/mysql-proxy
        rm -f $PROXY_PID
    fi
}
# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    condrestart|try-restart)
        if status -p $PROXY_PIDFILE $prog >&/dev/null; then
            stop
            start
        fi
        ;;
    status)
        status -p $PROXY_PID $prog
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"
        RETVAL=1
        ;;
esac
exit $RETVAL
#chmod +x /etc/rc.d/init.d/mysql-proxy  赋予执行权限
#chkconfig --add mysql-proxy           添加到系统服务列表中
#chkconfig mysql-proxy on          开机启动

4、为mysql-proxy服务脚本提供配置文件

#vim  /etc/sysconfig/mysql-proxy  内容如下

# Options for mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD="admin"
ADMIN_ADDRESS=""
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_ADDRESS=""
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog"
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=172.16.13.13:3306 --proxy-read-only-backend-addresses=172.16.13.14:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。

mysql-proxy的配置选项

mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍他们

--help

--help-admin

--help-proxy

--help-all ——以上四个选项均用于获取帮助信息;

--proxy-address=host:port   ——代理服务监听的地址和端口

--admin-address=host:port   ——管理模块监听的地址和端口

--proxy-backend-address=host:port ——后端mysql服务器的地址和端口

--proxy-read-only-backend-addresses=host:port ——后端只读mysql服务器的地址和端口

--proxy-lua-script=file_name ——完成mysql代理功能的Lua脚本

--daemon   ——以守护进程模式启动mysql-proxy

--keepalive ——在mysql-proxy崩溃时尝试重启之

--log-file=/path/to/log_file_name  ——日志文件名称

--log-level=level  ——日志级别

--log-use-syslog   ——基于syslog记录日志

--plugins=plugin,..——在mysql-proxy启动时加载的插件

--user=user_name   ——运行mysql-proxy进程的用户

--defaults-file=/path/to/confi_file_name ——默认使用的配置文件路径;其配置段使用[mysql-proxy]标识

--proxy-skip-profiling ——禁用profile

--pid-file=/path/to/pid_file_name  ——进程文件名

5、复制一下内容建立admin.lua文件,将其保存至/user/local/mysql-proxy/share/doc/mysql-proxy

#vim  /usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua
内容如下
--[[ $%BEGINLICENSE%$
 Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License as
 published by the Free Software Foundation; version 2 of the
 License.
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 02110-1301  USA
 $%ENDLICENSE%$ --]]
function set_error(errmsg)
    proxy.response = {
        type = proxy.MYSQLD_PACKET_ERR,
        errmsg = errmsg or "error"
    }
end
function read_query(packet)
    if packet:byte() ~= proxy.COM_QUERY then
        set_error("[admin] we only handle text-based queries (COM_QUERY)")
        return proxy.PROXY_SEND_RESULT
    end
    local query = packet:sub(2)
    local rows = { }
    local fields = { }
    if query:lower() == "select * from backends" then
        fields = {
            { name = "backend_ndx",
              type = proxy.MYSQL_TYPE_LONG },
            { name = "address",
              type = proxy.MYSQL_TYPE_STRING },
            { name = "state",
              type = proxy.MYSQL_TYPE_STRING },
            { name = "type",
              type = proxy.MYSQL_TYPE_STRING },
            { name = "uuid",
              type = proxy.MYSQL_TYPE_STRING },
            { name = "connected_clients",
              type = proxy.MYSQL_TYPE_LONG },
        }
        for i = 1, #proxy.global.backends do
            local states = {
                "unknown",
                "up",
                "down"
            }
            local types = {
                "unknown",
                "rw",
                "ro"
            }
            local b = proxy.global.backends[i]
            rows[#rows + 1] = {
                i,
                b.dst.name,          -- configured backend address
                states[b.state + 1], -- the C-id is pushed down starting at 0
                types[b.type + 1],   -- the C-id is pushed down starting at 0
                b.uuid,              -- the MySQL Server‘s UUID if it is managed
                b.connected_clients  -- currently connected clients
            }
        end
    elseif query:lower() == "select * from help" then
        fields = {
            { name = "command",
              type = proxy.MYSQL_TYPE_STRING },
            { name = "description",
              type = proxy.MYSQL_TYPE_STRING },
        }
        rows[#rows + 1] = { "SELECT * FROM help", "shows this help" }
        rows[#rows + 1] = { "SELECT * FROM backends", "lists the backends and their state" }
    else
        set_error("use ‘SELECT * FROM help‘ to see the supported commands")
        return proxy.PROXY_SEND_RESULT
    end
    proxy.response = {
        type = proxy.MYSQLD_PACKET_OK,
        resultset = {
            fields = fields,
            rows = rows
        }
    }
    return proxy.PROXY_SEND_RESULT
end

6、测试

6.1 管理功能测试

#service mysql-proxy start

#ss  -ntl

管理端口:4041

读写分离端口:3306

[[email protected] ~]# mysql -uadmin -padmin -h172.16.13.2 --port=4041
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql>

6.2 读写分离测试

在MySQL 主服务器上授权一个用户
MariaDB [(none)]> grant all on *.* to ‘root‘@‘172.16.13.2‘ identified by ‘123‘;

6.2.1接下来我们在MySQL Proxy服务器(172.16.13.2)上测试

###########多次读写操作,这样效果才能明显如下所示:

[[email protected] mysql-proxy]# mysql -uroot -h172.16.13.2 -p123 --port=3306 -e "select user from mysql.user"
[[email protected] mysql-proxy]# mysql -uroot -h172.16.13.2 -p123 --port=3306 -e "select user from mysql.user"
[[email protected] mysql-proxy]# mysql -uroot -h172.16.13.2 -p123 --port=3306 -e "create database testdb"
注意:--port=3306不需要带,默认侦听的读写分离连接端口就是3306.
如果将mysql-proxy安装在了一台mysql服务器上,那么MySQL侦听的端口要改为其他端口,否则会冲突(直接在my.cnf配置文件改就行)

6.2.2 多次读写操作后,我们去管理端口查看读写分离情况

[[email protected] ~]# mysql -uadmin -h172.16.13.2 -padmin --port=4041
mysql> select * from backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address           | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
|           1 | 172.16.13.13:3306 | up    | rw   | NULL |                 0 |
|           2 | 172.16.13.14:3306 | up    | ro   | NULL |                 0 |
+-------------+-------------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)

基于mysql-proxy实现了MariaDB主从复制架构中读写分离!

总结:整个实例中不难发现,如果架构为LAMP的架构,那么PHP程序代码直接与MySQL Proxy地址相连即可,MySQL Proxy会将读写代理至后端的MySQL主从复制架构中,MySQL主服务器负责读写,从服务器只负责读,从而实现读写分离架构,如果担心Mysql proxy单点故障,可以建立冗余,多建立几个。

PS:水平有限,如有不妥请指出,MariaDB的MMM架构即将推出,敬请期待!!!

Mysql-proxy实现MariaDB读写分离

时间: 2024-10-10 06:57:10

Mysql-proxy实现MariaDB读写分离的相关文章

MySQL Proxy 实现MySQLDB 读写分离

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

搭建mysql的主从复制和读写分离

搭建mysql的主从复制和读写分离   +--------+                          (write)        +--------+                    | client |                 +---------------------+| master |     +--------+|                   |                        +--------+|           |      

基于Keepalived高可用集群的MariaDB读写分离机制实现

一 MariaDB读写分离机制 在实现读写分离机制之前先理解一下三种主从复制方式:1.异步复制:MariaDB默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果挂掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整.2.全同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端.因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番配置直接可以实现,而读写分离则需要一些软件的支持,基本上读写分离的实现有两种: Amoeba(变形虫):是由前阿里员工实现的一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.但是由于没人维护了,而且据说作者也不再回答开发者的问题,所以不予考虑. Mysql-Proxy:是一

Mysql高级集群-读写分离Amoeba

一.环境介绍Master-IP:10.0.0.201Slave- IP:10.0.0.202Amobea-IP:10.0.0.203 二.安装JDK# mkdir /Amoeba# tar -xvf jdk-7u40-linux-x64.tar.gz -C /Amoeba/# vim /etc/profileJAVA_HOME=/Amoeba/jdk1.7.0_40export JAVA_HOME PATH=$JAVA_HOME/bin:$PATHexport PATH CLASSPATH=.:

mysql基于amoeba配置读写分离

                     Mysql高级集群-读写分离Amoeba                          mysql在配置好主从复制之后,已经达到双机热备和容灾的效果.此博客是建立在主从复制的前提上 ,mysql基于amoeba的配置读写分离在我看来:就是为了达到数据库高可用性,安全性以及高并发,达到 负载均衡的效果.说简单点,我个人觉得意思就是让主服务器轻松点,不易挂掉.还有就是充分利用从服务器.  本人水平有限,望各位大神多多指点指点.我非常乐意听取意见. 此版本

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双机热备,特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状

【纯干货】Amoeba实现MySQL主从同步与读写分离

[纯干货]Amoeba实现MySQL主从同步与读写分离 一.简介 amoeba简介 Amoeba(变形虫)项目,该开源框架于2008年开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发.座落与 Client.DB Server(s)之间,对客户端透明.具有负载均衡.高可用性.SQL 过滤.读写分离.可路由相关的到目标数据库.可并发

MySQL主从同步、读写分离配置步骤

现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,