MySQL Proxy 实现MySQLDB 读写分离
一、简述
二、对MariaDB做主从复制
关于如何对MariaDB做主从复制,请移步本人博客MariaDB 主从复制
三、安装
1.可以通过rpm安装,其会提供配置文件及服务脚本,但是没有读写分享脚本
2.通过编译安装
①、源码安装时,MySQL proxy的依赖关系:
libevent 1.x or higher (1.3b or later is preferred).
lua 5.1.x or higher.
glib2 2.6.0 or higher.
pkg-config.
libtool 1.5 or higher.
MySQL 5.0.x or higher developer files.
②、下载源码包,编译安装
- # tar zxf mysql-proxy-0.8.2.tar.gz
- # cd mysql-proxy-0.8.2
- # ./configure
- # make
- # make check
- 如果管理员有密码,上面的步骤则需要使用如下格式进行:
- # MYSQL_PASSWORD=root_pwd make check
- # make install
- 默认情况下, mysql-proxy安装在/usr/local/sbin/mysql-proxy,而Lua示例脚本安装在/usr/local/share目录中。
3.通过通用二进制格式安装
①、下载解压。这里的系统平台为rhel6.5 64位系统
- [root@httpweb ~]# wget http://mirror.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
- [root@httpweb ~]# tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
- [root@httpweb ~]# mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
②、添加代理用户
- [root@httpweb mysql-proxy]# useradd mysql-proxy
③、为mysql-proxy提供SysV服务脚本
- #!/bin/bash
- #
- # mysql-proxy This script starts and stops the mysql-proxy daemon
- #
- # chkconfig: -
- # 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
- # 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=
- 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 ]; then
- touch /var/lock/subsys/mysql-proxy
- fi
- }
- stop() {
- echo -n $"Stopping $prog: "
- killproc -p $PROXY_PID -d $prog
- RETVAL=$?
- echo
- if [ $RETVAL -eq ]; 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=
- ;;
- esac
- exit $RETVAL
将上述内容保存为/etc/init.d/mysql-proxy,给予执行权限,而后添加至服务列表
- [root@httpweb mysql-proxy]# vi /etc/init.d/mysql-proxy
- [root@httpweb mysql-proxy]# chmod +x /etc/init.d/mysql-proxy
- [root@httpweb mysql-proxy]# chkconfig --add mysql-proxy
④、为服务脚本提供配置文件/etc/sysconfig/mysql-proxy
- #Options for mysql-proxy
- ADMIN_USER="firefox"
- ADMIN_PASSWORD="firefox"
- 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 --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.200:3306 --proxy-read-only-backend-addresses=192.168.1.202:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
- 其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。
⑤、mysql-proxy的配置选项
- mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍它们。
- --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 ———— 进程文件名;
⑥、提供admin.lua文件,将其保存至/usr/local/mysql-proxy/share/mysql-proxy/中
- --[[ $%BEGINLICENSE%$
- Copyright (c) , , 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 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., Franklin St, Fifth Floor, Boston, MA
- - 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()
- 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 = , #proxy.global.backends do
- local states = {
- "unknown",
- "up",
- "down"
- }
- local types = {
- "unknown",
- "rw",
- "ro"
- }
- local b = proxy.global.backends[i]
- rows[#rows + ] = {
- i,
- b.dst.name, -- configured backend address
- states[b.state + ], -- the C-id is pushed down starting at
- types[b.type + ], -- the C-id is pushed down starting at
- 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 + ] = { "SELECT * FROM help", "shows this help" }
- rows[#rows + ] = { "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
⑦、测试
启动服务;
- service mysql-proxy start
管理功能测试
可以看到4041端口和3306端口以及处于监听状态
我们在主服务器上授予201数据库写的权限
- MariaDB [(none)]> grant all on *.* to 'firefox'@'192.168.1.201' identified by 'firefox';
- MariaDB [(none)]> flush privileges;
- [root@httpweb mysql-proxy]# mysql -ufirefox -pfirefox -h192.168.1. --port=
- 我们可以看到我们在mysql-proxy的可以登录数据库了
查看是否配置成功
- [root@httpweb ~]# mysql -ufirefox -pfirefox -h192.168.1. --port=
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is
- Server version: 5.0.-agent-admin
- Copyright (c) , , 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.
- mysql> select * from backends;
- +-------------+--------------------+---------+------+------+-------------------+
- | backend_ndx | address | state | type | uuid | connected_clients |
- +-------------+--------------------+---------+------+------+-------------------+
- | | 192.168.1.200: | up | rw | NULL | |
- | | 192.168.1.202: | up | ro | NULL | |
- +-------------+--------------------+---------+------+------+-------------------+
我们的程序就可以实现真正意义上的读写分离了,大功告成,由于本人水平有限,请各位大神多多批评指正
MySQL Proxy 实现MySQLDB 读写分离的更多相关文章
- MySql的主从复制以及读写分离详解
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中, ...
- 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)
基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双 ...
- 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)
基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番 ...
- MySQL主从复制技术与读写分离技术amoeba应用
MySQL主从复制技术与读写分离技术amoeba应用 前言:眼下在搭建一个人才站点,估计流量会非常大,须要用到分布式数据库技术,MySQL的主从复制+读写分离技术.读写分离技术有官方的MySQL-pr ...
- MySQL中间件之ProxySQL_读写分离/查询重写配置
MySQL中间件之ProxySQL_读写分离/查询重写配置 Posted on 2016-12-25 by mark blue, mark Leave a comment MySQL 1.闲扯几句 读 ...
- Mysql 高可用(MHA)-读写分离(Atlas)-分布式架构(Mycat)
Mysql 高可用(MHA)-读写分离(Atlas) 1. 搭建主从复制(一主两从) 1.1 准备环境 1 主库:10.0.0.51/db01 2 从库:10.0.0.52/db02,10.0.0.5 ...
- mysql数据库主从同步读写分离(一)主从同步
1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做? 不往从服务器去写了 ...
- MySQL主从同步、读写分离配置步骤、问题解决笔记
MySQL主从同步.读写分离配置步骤.问题解决笔记 根据要求配置MySQL主从备份.读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记: 现在使用的两台服务器已经 ...
- redis 作为 mysql的缓存服务器(读写分离)
redis 作为 mysql的缓存服务器(读写分离) 一.redis简介 Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会 ...
随机推荐
- Android图片异步加载
原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...
- python网络编程-Select\Poll\Epoll异步IO
首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select ...
- 简单ORACLE分区表、分区索引
前一段听说CSDN.COM里面很多好东西,同事建议看看合适自己也可以写一写,呵呵,今天第一次开通博客,随便写点东西,就以第一印象分区表简单写第一个吧. ORACLE对于分区表方式其实就是将表分段存储, ...
- thinkphp框架if标签条件表达式
eq 等于neq 不等于gt 大于egt 大于等于lt 小于elt 小于等于
- 防止一个exe被打开多次
mutex有一个名字,如果这个exe已经打开了,createNew返回的就是false,程序就退出了. 这是个wpf application的例子 protected override void On ...
- GUC-6 Callable 接口
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...
- python处理汉字转拼音pypinyin
主要是pypinyin 包,官网: http://pypinyin.readthedocs.io/zh_CN/master/index.html jieba包,主要是用来分词的,我之前的博文有介绍:h ...
- java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
在使用 Hibernate 进行数据库操作的时候,在启动 Tomcat 服务器后,Console 控制台可能会打印出这样的异常:java.lang.NoClassDefFoundError: java ...
- oracle中vsize和length
其实LENGTH与VSIZE这两个函数联系不大,区别很大.虽然都是“取长度”,但是LENGTH函数结果是“有多少个字符”,VSIZE结果是“需要多少bytes”.简单看一下这两个函数. 1.创建表T并 ...
- JDK源码分析(四)——LinkedHashMap
目录 LinkedHashMap概述 内部字段及构造方法 存储元素 取出元素 删除元素 迭代器 利用LinkedHashMap简单实现LRU算法 总结 LinkedHashMap概述 JDK对Li ...