热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql读写分离(mysql-proxy)

MySQL-Proxy是一个处于你的client端和MySQLserver端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询

MySQL-Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。

MySQL-Proxy就是这么一个中间层代理,简单的说,MySQL-Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL-Proxy是完全透明的,应用则只需要连接到MySQL-Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

MySQL-Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。

mysql-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 ———— 完成mysql代理功能的Lua脚本

  • --daemon ———— 以守护进程模式启动mysql-proxy

  • --defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径

  • --log-file=/path/to/log_file_name ———— 日志文件名称

  • --log-level=level ———— 日志级别

  • --log-use-syslog ———— 基于syslog记录日志

  • --user=user_name ———— 运行mysql-proxy进程的用户

 

本文以下内容是在上一篇博客(mysql主从复制)基础上完成。

http://www.cnblogs.com/Eivll0m/p/3776496.html

1.环境及系统软件版本介绍:

系统版本:CentOS 6.3_x86_64

Mysql版本:mysql-5.6.17

mysql-proxy版本:mysql-proxy-0.8.4(下载地址:http://cdn.mysql.com/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz

2.部署mysql-proxy,以下操作未经特殊说明,均表示在mysql-prxoy(172.16.10.60)服务器上进行。

2.1检查是否安装了lua包,mysql-proxy需要用到lua脚本,以下表示已经安装过。

# rpm -q lua
lua
-5.1.4-4.1.el6.x86_64

2.2创建代理用户

# useradd -r mysql-proxy

2.3下载通用的压缩包mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz(直接解压使用)

# wget http://cdn.mysql.com/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz
# tar xf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local
# cd
/usr/local/
#
ln -sv mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit mysql-proxy

2.4设置mysql-proxy相关文件权限

chown -R root:mysql-proxy /usr/local/mysql-proxy/*

2.5更新环境变量

# vi /etc/profile.d/mysql-proxy.sh
export PATH
=$PATH:/usr/local/mysql-proxy/bin
# .
/etc/profile

2.6启动mysql-proxy

# mysql-proxy  --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="172.16.10.72:3306" --proxy-read-only-backend-addresses="172.16.10.61:3306"

2.7检查mysql-proxy是否正常启动

通过命令netstat -antpl|grep mysql-prxoy或tail /var/log/mysql-proxy.log进行查看

2.8在master服务器(172.16.10.72)上创建测试账号

mysql> GRANT ALL ON *.* TO proxy@'172.16.10.%' IDENTIFIED BY '123456';        
Query OK,
0 rows affected (0.22 sec)

mysql
> FLUSH PRIVILEGES;
Query OK,
0 rows affected (0.03 sec)'

2.9在slave服务器(172.16.10.61)上测试是否能通过代理端口4040 端口连接到 mysql-proxy(以下表示测试成功)

root@mysql_slave ~]# mysql -uproxy -p -h172.16.10.60 -P 4040             
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id is 456
Server version:
5.6.17-log Source distribution

Copyright (c)
2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and
/or its
affiliates. Other names may be trademarks of their respective
owners.

Type
'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql
>

2.10配置读写分离,mysql-proxy 的安装目录中有一个名为rw-splitting.lua的 脚本,通过它可以实现读写分离,路径是/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua。

# ls /usr/local/mysql-proxy/share/doc/mysql-proxy/|grep rw-splitting.lua 
rw
-splitting.lua

杀掉当前mysql-proxy进程,然后把lua脚本加入到启动选项里面重新启动mysql-proxy,实现读写分离

# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="172.16.10.72:3306" --proxy-read-only-backend-addresses="172.16.10.61:3306" --proxy-lua-script=" /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

查看日志

# tail /var/log/mysql-proxy.log 
2014-06-13 16:23:04: (message) added read/write backend: 172.16.10.72:3306
2014-06-13 16:23:04: (message) added read-only backend: 172.16.10.61:3306
2014-06-13 16:40:11: (message) Initiating shutdown, requested from signal handler
2014-06-13 16:40:11: (message) shutting down normally, exit code is: 0
2014-06-13 16:40:17: (debug) chassis-path.c.122: adjusting relative path ( /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua) to base_dir (/usr/local/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit). New path: /usr/local/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit/ /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
2014-06-13 16:40:17: (critical) plugin proxy 0.8.4 started
2014-06-13 16:40:17: (debug) max open file-descriptors = 1024
2014-06-13 16:40:17: (message) proxy listening on port :4040
2014-06-13 16:40:17: (message) added read/write backend: 172.16.10.72:3306
2014-06-13 16:40:17: (message) added read-only backend: 172.16.10.61:3306

2.11为mysql-proxy 提供一个管理接口,方便以后随时查看后端mysql 服务器的状态和访问类型,实现管理功能

 

# vi /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.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

2.12重新启动mysql-proxy

注,这次启动要添加以下启动选项 ,因为我们添加了额外的插件,把新加功能添加进来,选项如下。

  • --plugins=admin  在mysql-proxy启动时加载的插件;

  • --admin-username="admin" 运行mysql-proxy进程管理的用户;

  • --admin-password="admin" 密码

  • --admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua" 插件使用的配置文件路径;

# killall mysql-proxy
# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="172.16.10.72:3306" --proxy-read-only-backend-addresses="172.16.10.61:3306" --proxy-lua-script=" /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

查看mysql-proxy是否启

# netstat -antpl|grep mysql
tcp
0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 9511/mysql-proxy
tcp
0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 9511/mysql-proxy #4041为新生成的管理端口

2.13在slave服务器(172.16.10.61)上进行测试,使用管理端口4041 登陆,密码是admin。(测试成功!)

Bye
[root@mysql_slave
~]# mysql -uadmin -p -h172.16.10.60 -P 4041
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id is 1
Server version:
5.0.99-agent-admin

Copyright (c)
2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and
/or its
affiliates. Other names may be trademarks of their respective
owners.

Type
'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql
>

2.14测试是否可以连接

root@mysql_slave ~]# mysql -uadmin -p -h172.16.10.60 -P 4041                 
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id is 1
Server version:
5.0.99-agent-admin

Copyright (c)
2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and
/or its
affiliates. Other names may be trademarks of their respective
owners.

Type
'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql
> select * from backends;
+-------------+-------------------+---------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-------------------+---------+------+------+-------------------+
| 1 | 172.16.10.72:3306 | unknown | rw | NULL | 0 |
| 2 | 172.16.10.61:3306 | unknown | ro | NULL | 0 |
+-------------+-------------------+---------+------+------+-------------------+
2 rows in set (0.00 sec)

mysql
>

由于此时没有进行任何操作,所以主从状态都是unknown。

2.15配置启动脚本,并修连接端口(连接mysql-proxy时,原来用的端口是4040,下面修改为3306)

# vi /etc/sysconfig/mysql-proxy
# 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
="0.0.0.0:3306"
PROXY_USER
="mysql-proxy"
PROXY_OPTIONS
="--daemon --log-level=info --log-file="/var/log/mysql-proxy.log" --plugins=proxy --plugins=admin --proxy-backend-addresses=172.16.10.72:3306 --proxy-read-only-backend-addresses=172.16.10.61:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

添加sysV脚本

# vi /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_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
# chmod +x /etc/rc.d/init.d/mysql-proxy
# chkconfig
--add mysql-proxy
# chkconfig mysql
-proxy on

2.16重启mysql-proxy并查看端口(4040端口已消失)

# service mysql-proxy restart
# netstat
-antpl|grep mysql
tcp
0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 12427/mysql-proxy
tcp
0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 12427/mysql-proxy

2.17测试读写分离

执行读写操作

[root@mysql_slave ~]# mysql -uproxy -p -h172.16.10.60 -e "show databases;"     
Enter password:
+--------------------+
| Database |
+--------------------+
| information_schema |
| eivll0m |
| mysql |
| performance_schema |
| test |
+--------------------+
[root@mysql_slave
~]# mysql -uproxy -p -h172.16.10.60 -e "create database mydb1;"
Enter password:
mysql> select * from backends;
+-------------+-------------------+---------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-------------------+---------+------+------+-------------------+
| 1 | 172.16.10.72:3306 | up | rw | NULL | 0 |
| 2 | 172.16.10.61:3306 | unknown | ro | NULL | 0 |
+-------------+-------------------+---------+------+------+-------------------+
2 rows in set (0.00 sec)

由于master是支持读写的,所以只发现master状态变为了up是正常现象,要想观看到从的状态,可以执行多次查询。

# mysql -uproxy -p -h172.16.10.60 -e "select user,host from mysql.user"
Enter password:
+-------+--------------+
| user | host |
+-------+--------------+
| root | 127.0.0.1 |
| proxy | 172.16.10.% |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql\_slave |
| root | mysql\_slave |
+-------+--------------+

mysql
> select * from backends;
+-------------+-------------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-------------------+-------+------+------+-------------------+
| 1 | 172.16.10.72:3306 | up | rw | NULL | 0 |
| 2 | 172.16.10.61:3306 | up | ro | NULL | 0 |
+-------------+-------------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)

现在,主从状态全部变成了up状态。

 


推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • 本文介绍在使用vmware中配置centos6.5时遇到的网络问题,包括host-only和natip的配置,以及无法上网的原因。同时提供了解决方法,包括去掉host-only配置文件中的gateway。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
author-avatar
dsafdasdfddsa_459
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有