介绍一下mysql-proxy:

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 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

       10.关闭proxy进程添加提供管理接口的选项

              #killall 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" --plugins="admin" --admin-username="admin" --admin-password="admin" --admin-lus-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

              新添加的管理接口选项

             --plugins=admin ———— 在mysql-proxy启动时加载的插件;
             --admin-username="admin" 运行mysql-proxy进程管理的用户;
             --admin-password="admin" 密码
             --admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.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                                          //查看日志和端口确认服务是否启动

        tcp       0     0.0.0.0:4040       0.0.0.0:*

         tcp        0     0.0.0.0:4040       0.0.0.0:*

              #mysql -uadmin -p -h10.10.5.100 --port=4041          //登录管理接口

               mysql>selset * from backends;                                 //查看读写状态

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

               |  backend_ndx        |addrese                      |  state      |      type     | uuid        |connected_clients              |

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

               |                      1       |   10.10.5.10:3306     |unknown  |        rw     |  null         |                                     0    |

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

                |                     2        |    10.10.5.11:3306     |unkoown  |        ro     |  null          |                                     0   |

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

                 2 rows  in set   (0.00   sec)

              11.创建mysql-proxy启动脚本和配置文件

               #vim //etc/sysconfig/mysql-proxy

               [mysql-proxy]

            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"
            plugins=admin
            admin-username= "admin"
            admin-password= "admin"

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

           

            # vim /etc/rc.d/init.d/mysql-proxy


            12.赋予脚本执行权限

            # chmod +x /etc/rc.d/init.d/mysql-proxy
            # chkconfig --add mysql-proxy

      #service mysql-proxy     (start| stop |   restart )