基于mysql-proxy读写分离

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

一、可以使用rpm包安装,需要安装epel软件包库,或者直接从官网下载rpm包;

二、安装配置mysql-proxy:

wKiom1Tl5ByRPughAAIPgA9lPVw679.jpg


2.1 下载所需要的版本

    这里的系统平台为rhel6.4 32位系统,因此就以mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit.tar.gz为例。

1
2
3
tar  xf mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit. tar .gz -C  /usr/local
cd  /usr/local
ln  -sv mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit  mysql-proxy

添加代理用户

1
useradd  mysql-proxy

2.2 为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
#!/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

    将上述内容保存为/etc/rc.d/init.d/mysql-proxy,给予执行权限,而后加入到服务列表。

1
2
chmod  +x  /etc/rc .d /init .d /mysql-proxy
chkconfig --add mysql-proxy

2.3 为服务脚本提供配置文件/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"

    其中最后一行,需要按实际场景进行修改,例如:

1
PROXY_OPTIONS= "--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.21:3306 --proxy-read-only-backend-addresses=192.168.1.211:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

    其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。

2.4 mysql-proxy的配置选项

    mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--help
--help-admin
--help-proxy
--help-all ———— 以上四个选项均用于获取帮助信息;
--proxy-address=host:port ———— 代理服务监听的地址和端口;
--admin-address=host:port ———— 管理模块监听的地址和端口;
--proxy-backend-addresses=host:port ———— 后端mysql服务器的地址和端口;
--proxy- read -only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name ———— 完成mysql代理功能的Lua脚本;
--daemon ———— 以守护进程模式启动mysql-proxy;
--keepalive ———— 在mysql-proxy崩溃时尝试重启之;
--log- file = /path/to/log_file_name  ———— 日志文件名称;
--log-level=level ———— 日志级别;
--log-use-syslog ———— 基于syslog记录日志;
--plugins=plugin,.. ———— 在mysql-proxy启动时加载的插件;
--user=user_name ———— 运行mysql-proxy进程的用户;
--defaults- file = /path/to/conf_file_name  ———— 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling ———— 禁用profile;
--pid- file = /path/to/pid_file_name  ———— 进程文件名;

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
--[[ $%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


4、测试

4.1 管理功能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mysql -uadmin -padmin -192.168.1.22 --port=4041 
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection  id  is 1
Server version: 5.0.99-agent-admin
 
Type  'help;'  or  '\h'  for  help. Type  '\c'  to  clear  the buffer.
 
mysql> SELECT * FROM backends;
+-------------+--------------------+---------+------+------+-------------------+
| backend_ndx | address            | state   |  type  | uuid | connected_clients |
+-------------+--------------------+---------+------+------+-------------------+
|           1 | 192.168.1.21:3306  | up      | rw   | NULL |                 0 |
|           2 | 192.168.1.211:3306 | unknown | ro   | NULL |                 0 |
+-------------+--------------------+---------+------+------+-------------------+
2 rows  in  set  (0.00 sec)

4.2 读写分离测试

1
mysql -uroot  -h192.168.1.22 --port=4040 -p






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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 关系型数据库 MySQL
MySQL 读写分离原理
MySQL 读写分离原理
66 0
MySQL 读写分离原理
|
5月前
|
SQL 关系型数据库 MySQL
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
73 0
|
4月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
87 0
|
8月前
|
SQL 存储 关系型数据库
MySQL主从复制、读写分离
MySQL主从复制、读写分离
138 0
|
7月前
|
关系型数据库 MySQL 中间件
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
|
7月前
|
存储 SQL 关系型数据库
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
数据库魔法师:使用ShardingSphere实现MySQL读写分离与分片指南跟着爆叔的节奏稳了!
66 0
|
8月前
|
SQL 关系型数据库 MySQL
MySQL搭建主从备份读写分离(MySQL5.7案例)
MySQL搭建主从备份读写分离(MySQL5.7案例)
119 0
|
14天前
|
负载均衡 关系型数据库 MySQL
MySQL-Proxy实现MySQL读写分离提高并发负载
MySQL-Proxy实现MySQL读写分离提高并发负载
|
5月前
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
42 0
|
2月前
|
关系型数据库 MySQL 数据库
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
68 0