mysql-proxy的读写分离学习和疑问

回复 收藏
本帖最后由 wsw13640218682 于 2016-4-21 17:40 编辑

公司实验环境:   192.168.2.158
                        192.168.1.226  
                        192.168.2.159  
                        192.168.0.240

说明:  1.226作为mysql主数据库(家里:192.168.0.165)
          2.159作为mysql从数据库.(家里:192.168.0.111)
          2.158作为mysql-proxy.(家里:192.168.0.7)
          0.240作为测试机器.

一、由于是第一次弄,所以找来几台虚拟机作为首次mysql-proxy的实验,首先对两个mysql做好主从来实验(这里的操作不写出来,省略掉)
二、编译mysql-proxy配置文件
[mysql-proxy]
keepalive=true                    #mysql-proxy崩溃时,尝试重启
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug                 #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
max-open-files = 1024
daemon=true                                    #以守护进程方式运行
plugins = admin,proxy                #开启mysql-proxy加载的模块
user = root                          #运行mysql-proxy用户
#
#Proxy Configuration
proxy-address=192.168.2.158:4040           #mysql-proxy运行ip和端口,不加端口,默认4040
proxy-backend-addresses =192.168.1.226:3306          #后端mysqlmaster ip和端口
proxy-read-only-backend-addresses =192.168.2.159:3306     #后端mysqlslave ip和端口
#proxy-lua-script =
#proxy-skip-profiling = true
#
# Admin Configuration
admin-address = 192.168.2.158:4041            #管理端口
admin-lua-script =/usr/lib/mysql-proxy/lua/admin.lua
proxy-lua-script =/home/mysql-proxy/mysql-proxyrm-splitting.lua     #读写分离脚本路径
admin-username = proxy                   #主从mysql共有的用户
admin-password = 123456                 #主从mysql共有用户的密码

[root@home ~]#cat  /usr/lib/mysql-proxy/lua/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



rw-splitting.lua.jpg

mysql-splitting.lua(公司更改).png

三、在master上对proxy的用户授权
mysql> grant all on *.* to 'proxy'@'192.168.2.158' identified by ‘123456’;
四、远程连接去proxy创建或修改内容:
[root@user3 12:52:30 ~]# mysql   -uproxy  -p123456   -P 4040   -h192.168.2.158
mysql> create table user (number INT(10),name VARCHAR(255));
mysql> insert into user values(01,'zhangsan');
mysql> insert into user values(02,'lisi');
如此类推的可以插入表里的值...

五、登陆masterslave查看是不是数据可同步,同步了的就实现了读写分离
   
mysql-proxy操作1.jpg
mysql-proxy操作2.jpg
master.jpg
slave.jpg
mysql-proxy日志.jpg
    做到这里起初是通过远程连接到mysql-proxy上增删改查操作,返回主从上看看是能同步了,这样我以为可以了,后来我查看多几个的实例看到http://blog.itpub.net/22039464/viewspace-1708258/,到这里的倒数最后一步:这是因为rw-splitting.lua脚本默认有4个链接才启用分离;这是啥意思,我打开4个putty来进入链接去mysql-proxy都是up不了
slave(unkown).jpg
slave(unkown).jpg




PShttp://blog.jobbole.com/94606/  这个最后二步,我实现不了他的效果
          http://www.jb51.net/article/50178.htm  接上面的连接混合使用
mysql-splitting.lua(公司更改).png slave都是up不了.png
2016-04-20 23:25 举报
已邀请:
0

ilinux

赞同来自:

学霸!!!!
0

lin19890913

赞同来自:

你居然成功了!我当初实验了3次都失败了,你的mysql-proxy是编译安装的吗?这个需要的依赖包有些多,各个包又有版本限制
0

渐行渐远

赞同来自:

学习了,以前做过不过没成功
0

ilinux

赞同来自:

proxy用户是连接admin管理接口的,你是又建立了一个数据用户proxy吗?
0

ilinux

赞同来自:

lin19890913 发表于 2016-4-21 13:04
你居然成功了!我当初实验了3次都失败了,你的mysql-proxy是编译安装的吗?这个需要的依赖包有些多,各个包 ...

我是直接二进制包。。。。
0

wsw13640218682

赞同来自:

lin19890913 发表于 2016-4-21 13:04
你居然成功了!我当初实验了3次都失败了,你的mysql-proxy是编译安装的吗?这个需要的依赖包有些多,各个包 ...

mysql-proxy我也试过用源码安装0.8.3不成功,但一直都提示欠缺东西(在百度搜出来原因并下载相应的依赖包源码安装后都不行,都是一直提示)
225212cpto51tcllppzix7.jpg
225314zxfmfnz06syks0m3.jpg


后来铭哥建议我用yum来安装,所以我这个mysql-proxy是用yum安装(这个是0.8.5),我觉得应该还不是完全成功的,在proxy:4041上执行select * from backends;的mysql-slave始终up不起来..

0

wsw13640218682

赞同来自:

ilinux 发表于 2016-4-21 16:13
proxy用户是连接admin管理接口的,你是又建立了一个数据用户proxy吗?

不在master上对mysql-proxy的授权一个账号来远程连接是连不上的,你说的这个我试过了,你是如何使用源码安装二进制包的,我怎样源码安装都不成功
0

lin19890913

赞同来自:

ilinux 发表于 2016-4-21 16:14
我是直接二进制包。。。。

成功了吗?成功的话能分享下具体的步骤,所要安装的版本及依赖吗
0

ilinux

赞同来自:

lin19890913 发表于 2016-4-21 17:41
成功了吗?成功的话能分享下具体的步骤,所要安装的版本及依赖吗

http://www.apelearn.com/bbs/fo ... 49332  我刚发的,你看看
0

庄宇辰

赞同来自:

  你好大致看了下你的过程,大致觉得你的配置没有问题(可能有细节性问题,我没有发现),下面我说一下,我个人的一点看法(为什么配置没有问题,但实验却没成功);
  1:你做测试的时候要多开几个链接,也就是多打开几个客户端来链接mysql_proxy,因为mysql_proxy的负载均衡与读写分离算法是基于 连接来做的(你开一个客户端,也就是只有一个连接,无论你怎么操作都都只连到一台后端的mysql)
  2:min idel-connections=1;
    max idel-connections=1;
   这两个参数的大致是,有多少个连接的时候我们才做读写分离,你都改成1,之后开5个客户端再做实验试试,应该可以!
0

wsw13640218682

赞同来自:

庄宇辰 发表于 2016-4-27 18:14
你好大致看了下你的过程,大致觉得你的配置没有问题(可能有细节性问题,我没有发现),下面我说一下,我个 ...

嗯,好的,有空的就去试试您的看法..min/max idel-connections的值本来就是1,后来我将数值改大而已
0

Yajun

赞同来自:

你这个   (二、编译mysql-proxy配置文件) 在什么地方啊   我也是 二进制 装的i_f12.gif

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: