mysql proxy 配置文件_mysql-proxy学习之配置文件 | 学步园

MySQL Proxy在启动时需要配置文件,用于指定代理地址、后端服务器地址等。配置文件可以简化启动操作,例如设置`--proxy-address`、`--proxy-backend-addresses`等。此外,配置文件还可用于重写特定函数,如连接服务器、读取握手信息、读取认证信息和查询请求等,实现读写分离和负载均衡等功能。
摘要由CSDN通过智能技术生成

mysql-proxy启动时需要一个配置文件,你可以将你的全部选项放在你的配置文件里面,这样启动时比较方便,比如下面这样:

/usr/local/sbin/mysql-proxy

--proxy-address=192.168.0.2:3306

--proxy-backend-addresses=127.0.0.1:3000

--proxy-backend-addresses=192.168.0.2:4000

--proxy-lua-script= /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua

当然你可以将--proxy-address=192.168.0.2:3306

--proxy-backend-addresses=127.0.0.1:3000

--proxy-backend-addresses=192.168.0.2:4000

放在一个文件中,而不是每次都输入,放在一个文件中然后在admin.lua包含进来就可以。

mysql-proxy配置文件除了对集群的IP和监听端口配置外主要完成以下几个函数的重写:

下面以一个别人的例子说明

local commands    = require("proxy.commands")//需要包含库,和C++有点相似

local tokenizer   = require("proxy.tokenizer")

local lb          = require("proxy.balance")

if not proxy.global.config.rwsplit then

proxy.global.config.rwsplit = {

max_idle_connections = 30,

is_debug = false

}

end

--local is_in_transaction       = false

function connect_server()//初始化连接服务器函数

local is_debug = proxy.global.config.rwsplit.is_debug

local rw_ndx = 1

local min_cur_idle_connections=1000000

-- init all backends

for i = 1, #proxy.global.backends do

local s        = proxy.global.backends[i]

local pool     = s.pool -- we don't have a username yet, try to find a connections which is idling

local cur_idle = pool.users[""].cur_idle_connections

if min_cur_idle_connections > cur_idle

then

min_cur_idle_connections=cur_idle

rw_ndx=i

end

end

proxy.connection.backend_ndx = rw_ndx

if is_debug then

print()

print("[connect_server] " .. proxy.connection.client.src.name)

print("[server] " .. proxy.global.backends[proxy.connection.backend_ndx].dst.name)

end

end

function   read_handshake()//初始化连接产生后(通过connect_server()函数),握手(handshake)信息由server发送到client。

function read_auth()              // 读取Client的认证信息时调用

function read_auth_result( auth )

//读取Client的认证信息时调用

local is_debug = proxy.global.config.rwsplit.is_debug

if is_debug then

print("[read_auth_result] " .. proxy.connection.client.src.name)

end

if auth.packet:byte() == proxy.MYSQLD_PACKET_OK then

-- auth was fine, disconnect from the server

proxy.connection.backend_ndx = 0

elseif auth.packet:byte() == proxy.MYSQLD_PACKET_EOF then

-- we received either a

--

-- * MYSQLD_PACKET_ERR and the auth failed or

-- * MYSQLD_PACKET_EOF which means a OLD PASSWORD (4.0) was sent

print("(read_auth_result) ... not ok yet");

elseif auth.packet:byte() == proxy.MYSQLD_PACKET_ERR then

-- auth failed

end

end

function read_query( packet )//读取Client的query请求时调用

local is_debug = proxy.global.config.rwsplit.is_debug

local cmd      = commands.parse(packet)

local c        = proxy.connection.client

local tokens

-- looks like we have to forward this statement to a backend

if is_debug then

print("[read_query] " .. proxy.connection.client.src.name)

print("  current backend   = " .. proxy.connection.backend_ndx)

print("  client default db = " .. c.default_db)

print("  client username   = " .. c.username)

if cmd.type == proxy.COM_QUERY then

print("  query             = "        .. cmd.query)

end

end

if cmd.type == proxy.COM_QUIT then

-- don't send COM_QUIT to the backend. We manage the connection

-- in all aspects.

proxy.response = {

type = proxy.MYSQLD_PACKET_OK,

}

if is_debug then

print("  (QUIT) current backend   = " .. proxy.connection.backend_ndx)

end

return proxy.PROXY_SEND_RESULT

end

proxy.queries:append(1, packet, { resultset_is_needed = true })

if not is_in_transaction and

cmd.type == proxy.COM_QUERY then

tokens     = tokens or assert(tokenizer.tokenize(cmd.query))

local stmt = tokenizer.first_stmt_token(tokens)

if stmt.token_name == "TK_SQL_SELECT" then

local is_insert_id = false

for i = 1, #tokens do

local token = tokens[i]

local utext = token.text:upper()

if token.token_name == "TK_LITERAL"

then

if utext == "@@LAST_INSERT_ID" then

is_insert_id = true

end

elseif token.token_name == "TK_FUNCTION"

then

if utext == "LAST_INSERT_ID" then

is_insert_id = true

end

end

end

if not is_insert_id

then local backend_ndx = lb.idle_ro()

if backend_ndx > 0 then

proxy.connection.backend_ndx = backend_ndx

end

else

print("   found a SELECT LAST_INSERT_ID(), staying on the same backend")

end

end

end

if proxy.connection.backend_ndx == 0 then

-- we don't have a backend right now

--

-- let's pick a master as a good default

--

proxy.connection.backend_ndx = lb.idle_failsafe_rw()

end

-- by now we should have a backend

--

-- in case the master is down, we have to close the client connections

-- otherwise we can go on

if proxy.connection.backend_ndx == 0 then

return proxy.PROXY_SEND_QUERY

end

local s = proxy.connection.server

if cmd.type ~= proxy.COM_INIT_DB and

c.default_db and c.default_db ~= s.default_db then

print("    server default db: " .. s.default_db)

print("    client default db: " .. c.default_db)

print("    syncronizing")

proxy.queries:prepend(2, string.char(proxy.COM_INIT_DB) .. c.default_db, { resultset_is_needed = true })

end

-- send to master

if is_debug then

if proxy.connection.backend_ndx > 0 then

local b = proxy.global.backends[proxy.connection.backend_ndx]

print("  sending to backend : " .. b.dst.name);

print("    is_read_only[slave server]         : " .. tostring(b.type == proxy.BACKEND_TYPE_RO));

print("    server default db: " .. s.default_db)

print("    server username  : " .. s.username)

end

print("    in_trans        : " .. tostring(is_in_transaction))

print("    COM_QUERY       : " .. tostring(cmd.type == proxy.COM_QUERY))

end

return proxy.PROXY_SEND_QUERY

end

function read_query_result( inj ) //读取query结果时调用

local is_debug = proxy.global.config.rwsplit.is_debug

local res      = assert(inj.resultset)

local flags    = res.flags

if inj.id ~= 1 then

-- ignore the result of the USE

-- the DB might not exist on the backend, what do do ?

--

if inj.id == 2 then

-- the injected INIT_DB failed as the slave doesn't have this DB

-- or doesn't have permissions to read from it

if res.query_status == proxy.MYSQLD_PACKET_ERR then

proxy.queries:reset()

proxy.response = {

type = proxy.MYSQLD_PACKET_ERR,

errmsg = "can't change DB ".. proxy.connection.client.default_db ..

" to on slave " .. proxy.global.backends[proxy.connection.backend_ndx].dst.name

}

return proxy.PROXY_SEND_RESULT

end

end

return proxy.PROXY_IGNORE_RESULT

end

is_in_transaction = flags.in_trans

local have_last_insert_id = (res.insert_id and (res.insert_id > 0))

if not is_in_transaction and

not have_last_insert_id then

-- release the backend

proxy.connection.backend_ndx = 0

elseif is_debug then

print("(read_query_result) staying on the same backend")

print("    in_trans        : " .. tostring(is_in_transaction))

print("    have_insert_id  : " .. tostring(have_last_insert_id))

end

end

function disconnect_client()

local is_debug = proxy.global.config.rwsplit.is_debug

if is_debug then

print("[disconnect_client] " .. proxy.connection.client.src.name)

end

-- make sure we are disconnection from the connection

-- to move the connection into the pool

if proxy.connection.backend_ndx == 0

then

for i = 1, #proxy.global.backends do

local s = proxy.global.backends[i]

local pool     = s.pool

local cur_idle = pool.users[""].cur_idle_connections

pool.max_idle_connections = proxy.global.config.rwsplit.max_idle_connections

if is_debug then

print ("cur_idle="..cur_idle )

print ("pool.max_idle_connections = "..pool.max_idle_connections)

end

if s.state ~= proxy.BACKEND_STATE_DOWN and

cur_idle > pool.max_idle_connections then

-- try to disconnect a backend

proxy.connection.backend_ndx = i

return

end

end

end

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值