ts7758258 发表于 2018-10-11 07:21:03

[笔记] mysql-proxy 实现主从读写分离

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(" 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, -- the C-id is pushed down starting at 0
  
                              types,   -- 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


页: [1]
查看完整版本: [笔记] mysql-proxy 实现主从读写分离