博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql-proxy实现读写分离脚本
阅读量:5923 次
发布时间:2019-06-19

本文共 5610 字,大约阅读时间需要 18 分钟。

  1. 将以下脚本保存为/etc/init.d/mysql-proxy ,赋予权限

    chmod 755 /etc/init.d/mysql-proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/bash
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon for mysql
 
# Source function library.
/etc/rc
.d
/init
.d
/functions
 
prog=
"/usr/local/mysql-proxy/bin/mysql-proxy"
 
# Source networking configuration.
if 
[ -f 
/etc/sysconfig/network 
]; 
then
    
/etc/sysconfig/network
fi
 
# Check that networking is up.
[ ${NETWORKING} = 
"no" 
] && 
exit 
0
 
# Set default mysql-proxy configuration.
ADMIN_USER=
"admin"
ADMIN_PASSWD=
"admin"
ADMIN_LUA_SCRIPT=
"/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_OPTIONS=
"--daemon"
PROXY_PID=
/var/run/mysql-proxy
.pid
PROXY_USER=
"mysql-proxy"
 
# Source mysql-proxy configuration.
if 
[ -f 
/etc/sysconfig/mysql-proxy 
]; 
then
    
/etc/sysconfig/mysql-proxy
fi
 
RETVAL=0
 
start() {
    
echo 
-n $
"Starting $prog: "
    
daemon $prog $PROXY_OPTIONS --pid-
file
=$PROXY_PID --proxy-address=
"$PROXY_ADDRESS" 
--user=$PROXY_USER --admin-username=
"$ADMIN_USER" 
--admin-lua-script=
"$ADMIN_LUA_SCRIPT" 
--admin-password=
"$ADMIN_PASSWORD"
    
RETVAL=$?
    
echo
    
if 
[ $RETVAL -
eq 
0 ]; 
then
        
touch 
/var/lock/subsys/mysql-proxy
    
fi
}
 
stop() {
    
echo 
-n $
"Stopping $prog: "
    
killproc -p $PROXY_PID -d 3 $prog
    
RETVAL=$?
    
echo
    
if 
[ $RETVAL -
eq 
0 ]; 
then
        
rm 
-f 
/var/lock/subsys/mysql-proxy
        
rm 
-f $PROXY_PID
    
fi
}
# See how we were called.
case 
"$1" 
in
    
start)
        
start
        
;;
    
stop)
        
stop
        
;;
    
restart)
        
stop
        
start
        
;;
    
condrestart|try-restart)
        
if 
status -p $PROXY_PIDFILE $prog >&
/dev/null
then
            
stop
            
start
        
fi
        
;;
    
status)
        
status -p $PROXY_PID $prog
        
;;
    
*)
        
echo 
"Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"
        
RETVAL=1
        
;;
esac
 
exit 
$RETVAL

2.为服务脚本提供配置文件/etc/sysconfig/mysql-proxy,内容如下所示:

1
2
3
4
5
6
7
8
# Options for mysql-proxy 
ADMIN_USER=
"admin"
ADMIN_PASSWORD=
"admin"
ADMIN_ADDRESS=
""
ADMIN_LUA_SCRIPT=
"/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_ADDRESS=
""
PROXY_USER=
"mysql-proxy"
PROXY_OPTIONS=
"--daemon --log-level=info --log-use-syslog"

#注意最后一行,需要根据实际生产场景进行修改,比如;

PROXY_OPTIONS="--daemon --log-level=info --log-file=/var/log/mysql-proxy.log --plugins=proxy

 --plugins=admin --proxy-backend-addresses=192.168.141.101:3306 --proxy-read-only-backend-ad

dresses=192.168.141.102:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy

/rw-splitting.lua"

3.复制如下内容建立admin.lua文件,将其保存至/usr/local/mysql-proxy/share/doc/mysql-proxy/目录中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
--[[ $%BEGINLICENSE%$
 
Copyright (c) 2007, 2012, Oracle and
/or 
its affiliates. All rights reserved.
 
 
This program is 
free 
software; you can redistribute it and
/or
 
modify it under the terms of the GNU General Public License as
 
published by the Free Software Foundation; version 2 of the
 
License.
 
 
This program is distributed 
in 
the hope that it will be useful,
 
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 
GNU General Public License 
for 
more 
details.
 
 
You should have received a copy of the GNU General Public License
 
along with this program; 
if 
not, write to the Free Software
 
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 
02110-1301  USA
 
 
$%ENDLICENSE%$ --]]
  
  
 
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[i]
 
            
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

      本文转自limingyu0312  51CTO博客,原文链接:http://blog.51cto.com/limingyu/1933927,如需转载请自行联系原作者

你可能感兴趣的文章
可汗学院超经典、超实用概率论总结——商女不知忘国恨,隔江犹看概率论
查看>>
ftoa浮点型转换成字符串
查看>>
使用Costura.Fody将源DLL合并到目标EXE
查看>>
今年暑假不AC
查看>>
算法学习之路|A除以B
查看>>
《驾驭大数据》一3.6 博彩业:筹码跟踪数据的价值
查看>>
Resx 文件无效,未能加载 .RESX 文件中使用的类型
查看>>
[J2MEQ&A]WTK初始化WMAClient报错XXX has no IP address的解释
查看>>
29.Flutter与原生解耦式混合开发
查看>>
编码 GBK 的不可映射字符
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
oracle创建dblink
查看>>
深入理解Java的接口和抽象类
查看>>
fail2ban 帮助postfix 过滤恶意IP
查看>>
Simple Proxy Server (Java)
查看>>
Kafka消费的几种方式--low-level SimpleConsumer
查看>>
解决mysql数据库不能支持中文的问题
查看>>
VMware14虚拟机秘钥
查看>>
JVM -verbose参数详解
查看>>
CentOS LInux启动关闭和服务管理
查看>>