Client To Server Redirection in MySQL Proxy
Pierre asked if clients could be redirected to different servers by client address in MySQL Proxy. The answer is clearly yes, and that’s one of the reasons why MySQL Proxy is designed for. Moreover, you can set the connection’s backend (proxy.connection.backend_ndx) to what you want in the connect_server() stage, according to your own rules.
I wrote a simple Lua script to do this job. Here is the scirpt:
-- -- author: Joshua Zhu (http://www.zhuzhaoyuan.com) -- local string = require("string") local is_debug = true local cli_svr_map function get_server(client) -- initialize the map table if not cli_svr_map then -- note: you should modify the client IPs and the backend addresses below!!! cli_svr_map = { ["192.168.0.189"] = { address = "192.168.0.192:3306", backend_ndx = -1 }, ["192.168.0.192"] = { address = "192.168.0.189:3306", backend_ndx = -1 }, } for _, v in pairs(cli_svr_map) do for i = 1, #proxy.global.backends do local backend = proxy.global.backends[i] if v.address == backend.address then v.backend_ndx = i break end end end if is_debug then print("map table: ") for k, v in pairs(cli_svr_map) do print(" [" .. k .. "] = {" .. v.address .. ", " .. v.backend_ndx .. "}") end end end local host = string.match(client, "([^:]+):") if cli_svr_map[host] then return cli_svr_map[host].backend_ndx end return -1 end function connect_server() if is_debug then print("[connect_server] " .. proxy.connection.client.address) print("we have " .. #proxy.global.backends .. " backends:") for i = 1, #proxy.global.backends do local backend = proxy.global.backends[i] print(" [" .. i .. "].connected_clients = " .. backend.connected_clients) print(" [" .. i .. "].address = " .. backend.address) print(" [" .. i .. "].state = " .. backend.state) print(" [" .. i .. "].type = " .. backend.type) print(" [" .. i .. "].uuid = " .. (backend.uuid or "(nil)")) end end local index = get_server(proxy.connection.client.address) if index > 0 and index <= #proxy.global.backends then if proxy.global.backends[index].state ~= proxy.BACKEND_STATE_DOWN then if is_debug then print("redirect the client to backends[" .. proxy.global.backends[index].address .. "]") end proxy.connection.backend_ndx = index end end end
Download the script.
If you find bugs in this script, please correct me