当前位置:Gxlcms > 数据库问题 > MySQL proxy读写分离

MySQL proxy读写分离

时间:2021-07-01 10:21:17 帮助过:12人阅读

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

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

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

环境准备:

            操作系统:redhat 6.4

            MySQL版本:mysql-5.6.10-linux-glibc2.5-i686.tar.gz

              mysql-proxy版本:mysql-proxy-0.8.3-linux-rhas4-x86.tar.gz

              lua版本:lua-5.2.0.tar.gz

              mysql-proxy服务器:10.10.5.100

              mysql读写服务器:10.10.5.10

              mysql读服务器:10.10.5.11

mysql-proxy的配置选项

mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类

--help
--help-admin
--help-proxy
--help-all ———— 以上四个选项均用于获取帮助信息;
--proxy-address=host:port ———— 代理服务监听的地址和端口;
--admin-address=host:port ———— 管理模块监听的地址和端口;
--proxy-backend-addresses=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/conf_file_name ———— 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling ———— 禁用profile;
--pid-file=/path/to/pid_file_name ———— 进程文件名;

安装过程:

              1.安装配置mysql-proxy,首先要安装lua

               #yum -y install readline-level ncursea-dvel                          //解决依赖关系

               #tar zxf lua-5.2.0.tar.gz -C /usr/local

               #cd /usr/local/lua-5.2.0

        #make

               #make linux

               #make install

              2.安装mysql-proxy

              #useradd -r mysql-proxy

              #tar zxf mysql-proxy-0.8.3-linux-rhas4-x86.tar.gz -C /usr/local/

             #cd /usr/local/

             #ln -sv mysql-proxy-0.8.3-linux-rhas4-x86 mysl-proxy

             #cd mysql-proxy

             #vim /etc/profile.d/mysql-proxy.sh                   //修改PATH环境变量,让系统可以直接使用mysql的相关命令

              export PATH=$PATH:/usr/local/mysql-proxy/bin

             #. /etc/profile.d/mysql-proxy.s

             #ls /usr/local/mysql-proxy

             bin    include    lib   libexec    licenses     share

             #ls /usr/local/nysql-proxy/share/doc/mysql-proxy                    //存放脚本目录

              active-transations.lua             commit-obfuscator.lua         rw-splitting.lua              .........

             3.启动mysql-proxy

             #mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="10.10.5.10:3306" --proxy-read-only-backend-addresses="10.10.5.11:3306"

             #tail /var/log/mysql-proxy.log                                       //查看日志是否启动成功

             .............

             2014-10-15 15:29:20: (message)  proxy listioning on port :4040

             2014-10-15 15:29:20: (message) added read/write backend :10.10.5.10:3306

             2014-10-15 15:29:20: (message) added read-only  backend :10.10.5.11:3306

             4.主服务器上创建授权账号和密码

              MySQL>grant all on *.* to proxyuser@‘10.10.5.%‘identfied by ‘proxyuser‘;

              mysql>fiush privileges;

              5.测试是否能连接到mysql-proxy代理服务器

              #MySQL -uproxyuser -p -h 10.10.5.100 --prot=4040

              Enter password:

               welcome to the mysql momitor.  commands end with  ; or \g.

               ..........

               mysql>                                                                //成功连接

到此mysql-proxy完成,但是还不具备读写分离能力,读写分离功能主要靠lua脚本实现,接下来通过lua脚本实现读写分离

               6.通过lua脚本实现读写分离,首先在proxy服务器上

               #killall mysql-proxy

               7.通过其他MySQL服务器,健在lua脚本来连接mysql-proxy代理服务器

               #mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="10.10.5.10:3306" --proxy-read-only-backend-addresses="10.10.5.11:3306"  --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

               #tail /var/log/mysql-proxy.log

               2014-10-15 15:29:20: (message)  proxy listioning on port :4040

               2014-10-15 15:29:20: (message) added read/write backend :10.10.5.10:3306

               2014-10-15 15:29:20: (message) added read-only  backend :10.10.5.11:3306

               #netstat -anput |grep 4040                                  //查看日志和端口确认服务是否启动

               8.可以为mysql-proxy提供一个管理接口,方便以后查看后端MySQL服务器的状态和访问类型,也是一个lua脚本,要放在和读写分离脚本同一个目录下              

            # vim /usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua             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           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

人气教程排行