mysql-proxy 0.8.5_使用mysql-proxy-0.8.5实现MySQL读写分离

实验环境:RHEL6.6-x86-64

mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz

mysql-5.6.14-linux-glibc2.5-x86_64.tar.gz

为了减轻数据库负载,可以考虑使用读写分离来实现。目前实现读写分离的方式大约有两种:

基于程序代码实现              在程序代码中根据select、insert语句进行路由分类。读写分别由不同Server响应。

基于中间代理层实现               代理位于客户端与服务端之间,代理层接收客户端请求后,判断读写请求转发至不同Server。                   mysql-proxy便是其中一种。它可以监视,分析,改变它们的会话。他有多种用途,负载均衡,                 查询分析,查询过滤和修改等。

302bad67f9dda864b7616bad5169f95e.gif

wKioL1VVseXwo2JxAAC_k-1U82M451.jpg (25.51 KB, 下载次数: 0)

2015-5-18 13:18 上传

MySQL主从搭建,请参考我的另一篇文章,这里不再赘述。

安装mysql-proxy

# tar xf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local/

# cd /usr/local/

# ln  -s  mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit   mysql-proxy

1

2vim /etc/profile.d/mysql-proxy.sh

export PATH=$PATH:/usr/local/mysql-proxy/bin

为/etc/init.d/mysql-proxy提供参数

1

2

3

4

5

6

7

8

9

10

11# vim /etc/sysconfig/mysql-proxy

ADMIN_USER="admin"

ADMIN_PASSWORD="admin"

ADMIN_ADDRESS=""

PROXY_ADDRESS="0.0.0.0:3306"

PROXY_USER="mysql-proxy"

PROXY_PID=/var/run/mysql-proxy.pid

PROXY_OPTIONS="--daemon"

ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

RW_SPLITTING_LUA_SCRIPT=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

PROXY_OPTIONS="--daemon --log-level=info --log-file="/var/log/mysql-proxy.log" --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.5:3306 --proxy-read-only-backend-addresses=192.168.1.6:3306 --proxy-lua-script=$RW_SPLITTING_LUA_SCRIPT --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"

为mysql-proxy提供sysv风格脚本

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

78vim /etc/init.d/mysql-proxy

#!/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_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

#PROXY_OPTIONS="--daemon"

#PROXY_PID=/var/run/mysql-proxy.pid

# Source mysql-proxy configuration.

if [ -f /etc/sysconfig/network ]; then

. /etc/sysconfig/network

fi

# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 0

# 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

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

为管理提供lua脚本

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

73vim /usr/local/mysql-proxy/share/doc/mysql-proxy/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.backendsrows[#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

# chmod +x /etc/init.d/mysql-proxy

# service mysql-proxy start

连接至管理

# mysql  -uadmin -h192.168.1.7 --port=4041 -p

查看状态可看到state是unknown

1

2

3

4

5

6

7mysql> SELECT * FROM backends;

+-------------+------------------+---------+------+------+-------------------+

| backend_ndx | address          | state   | type | uuid | connected_clients |

+-------------+------------------+---------+------+------+-------------------+

|           1 | 192.168.1.5:3306 | unknown | rw   | NULL |                 0 |

|           2 | 192.168.1.6:3306 | unknown | ro   | NULL |                 0 |

+-------------+------------------+---------+------+------+-------------------+

连接至mysql-proxy

# mysql -uroot -p -h192.168.1.7

插入、查询各执行几次

再连接至管理查看状态,可看到状态是up。

1

2

3

4

5

6

7mysql> SELECT * FROM backends;

+-------------+------------------+-------+------+------+-------------------+

| backend_ndx | address          | state | type | uuid | connected_clients |

+-------------+------------------+-------+------+------+-------------------+

|           1 | 192.168.1.5:3306 | up    | rw   | NULL |                 0 |

|           2 | 192.168.1.6:3306 | up    | ro   | NULL |                 0 |

+-------------+------------------+-------+------+------+-------------------+

读写分离实现完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL-Proxy是一个用于MySQL数据库的代理服务器,它可以拦截和修改MySQL协议中的数据包,并允许你在数据包到达MySQL服务器之前或之后执行自定义操作。使用MySQL-Proxy可以实现很多有用的功能,如负载均衡、查询过滤、缓存优化等。下面介绍一下如何使用MySQL-Proxy,具体步骤如下: 1. 安装MySQL-Proxy MySQL-Proxy可以从官方网站下载,也可以使用包管理器进行安装。以Ubuntu为例,可以使用以下命令进行安装: ``` sudo apt-get install mysql-proxy ``` 2. 创建配置文件 MySQL-Proxy的配置文件为Lua脚本,需要在配置文件中指定监听端口、代理MySQL服务器的地址和端口、以及自定义的Lua脚本等。可以使用以下命令创建一个简单的配置文件: ``` sudo nano /etc/mysql-proxy.cnf ``` 然后在配置文件中添加以下内容: ``` [mysql-proxy] daemon = true proxy-address = 127.0.0.1:3306 proxy-backend-addresses = 127.0.0.1:3307 proxy-lua-script = /etc/mysql-proxy.lua ``` 其中,`proxy-address`是MySQL-Proxy监听的地址和端口,`proxy-backend-addresses`是要代理的MySQL服务器的地址和端口,`proxy-lua-script`是Lua脚本的路径。 3. 编写Lua脚本 MySQL-Proxy的Lua脚本可以拦截MySQL协议中的数据包,并对其进行修改或者过滤。可以根据实际需求编写自己的Lua脚本。以下是一个简单的例子,它会将所有的SELECT语句转换为SHOW TABLES语句: ``` function read_query(packet) if packet:byte() == proxy.COM_QUERY then if packet:sub(2, 7) == "SELECT" then local new_packet = packet:gsub("SELECT", "SHOW TABLES") proxy.queries:append(1, new_packet, {resultset_is_needed = true}) return proxy.PROXY_SEND_QUERY end end end ``` 4. 启动MySQL-Proxy 使用以下命令启动MySQL-Proxy: ``` sudo mysql-proxy --defaults-file=/etc/mysql-proxy.cnf ``` 然后就可以在客户端中连接MySQL-Proxy并进行查询了。 以上就是使用MySQL-Proxy的基本步骤。实际上,MySQL-Proxy还支持很多高级功能,如多个MySQL服务器的负载均衡、缓存优化、查询路由等,可以根据实际需求进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值