介绍
OneProxy是由原支付宝首席架构师楼方鑫开发,目前由楼方鑫创立的杭州平民软件公司(@平民架构)提供技术支持。它保留了 MySQL-Proxy 0.8.4官方版本上其协议处理和软件框架,然后对软件做了大量优化,极大增强了系统的并发能力。目前已有多家公司在生成环境中使用,其中包括了支付、电 商等行业。
OneProxy的主要功能有:
1. 垂直分库
2. 水平分表
3. Proxy集群【暂无文档】
4. 读高可用
5. 读写分离(master不参与读)
6. 读写分离(master参与读)
7. 写高可用
8. 读写随机
9. SQL检查
10. SQL统计【暂无文档】
11. 任务队列监控【暂无文档】
12. 连接池管理【暂无文档】
最新博文在http://www.cnblogs.com/youge-OneSQL/articles/4208583.html
重要概念
Server Group
在OneProxy中,一组主从复制的MySQL集群被称为Server Group。如图. A所示,有Server Group A和Server Group B。
图. A
在OneProxy中,垂直分库和水平分表的实现思路都是建立在Server Group的概念上。为了更好地说明,我们假设以下场景。
A)Server Group A中有三张表table X, table Y, table Z,其中应用对table X操作非常频繁,占用大量I/O带宽,严重影响了应用对tableY, tableZ的操作效率。
图. B
解决方案1.0:把table X移到另一组数据库,即Server Group B中(如图C所示),然后通过修改OneProxy的配置来改变table X的路由规则,无须改动应用。
图. C
B)在使用了解决方案1.0后,系统的I/O压力得到缓解。由于后期业务越来越多,Server Group B的写入压力越来越大,响应时间变慢。
解决方案2.0 : 把Server Group B中的table X水平拆分,将X_00, X_01留在Server Group B中,把X_02,X_03留在Server Group C中,如图D所示
图. D
支持的平台
Redhat5.x_X64,Redhat6.x_X64
安装步骤
1)从http://pan.baidu.com/s/1mgJpukg#path=%252FOneSQL%252FOneProxy处下载最新版OneProxy
本文档写作时,最新版本为oneproxy-rhel5-linux64-v5-ga.tar.gz
2)cd /usr/local/
3)tar zxvf oneproxy-rhel5-linux64-v5-ga.tar.gz
4)cd oneproxy/
5)修改demo.sh
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.128.128.238:3306 \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3@test \
–proxy-group-policy=default:4 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:
proxy-address proxy绑定的IP和端口
proxy-master-addresses 后端可写DB
proxy-user-list 分别为数据库用户名,加密后的数据库密码(用bin/mysqlhash加密),连接的数据库
proxy-group-policy Server Group组与策略,默认的组为default,策略值为4,见后面描述
6)./demo.sh
7)检查是否成功启动。
ps aux | grep mysql-proxy | grep -v grep
如有输出,则启动成功。
若无输出,请检查运行日志/usr/local/oneproxy/log/oneproxy.log
8)通过mysql client连接OneProxy
mysql -u test -h 127.0.0.1 -P3307 -p
应用场景与配置范例
下面给出在以下几种场景下,如何正确的配置OneProxy
1. 垂直分库
以图. E为例,
图. E
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-master-addresses=10.0.0.12:3306@B \
–proxy-slave-addresses=10.0.0.11:3306@A \
–proxy-slave-addresses=10.0.0.13:3306@B \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:4 \
–proxy-group-policy=B:4 \
–proxy-table-map=X:B
–proxy-table-map=Y:A
–proxy-table-map=Z:A
–event-threads=16 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:具体参数含义参考附录
2. 水平分表
以图. F为例
图. F
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-master-addresses=10.0.0.12:3306@B \
–proxy-master-addresses=10.0.0.14:3306@C \
–proxy-slave-addresses=10.0.0.11:3306@A \
–proxy-slave-addresses=10.0.0.13:3306@B \
–proxy-slave-addresses=10.0.0.15:3306@C \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:4 \
–proxy-group-policy=B:4 \
–proxy-group-policy=C:4 \
–proxy-table-map=X_00:B
–proxy-table-map=X_01:B
–proxy-table-map=X_02:C
–proxy-table-map=X_03:C
–proxy-table-map=Y:A
–proxy-table-map=Z:A
–event-threads=16 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:具体参数含义参考附录
3. Proxy集群
4. 读高可用
该方案是为了解决重要配置库的单点问题。在master不可用时,OneProxy会自动读取slave。
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-slave-addresses=10.0.0.11:3306@A \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:1 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:10.0.0.10为只读主库,10.0.0.11为只读丛库
5. 读写分离(master不参与读)
读写分离能有效的解决应用读负载较重且能忍受一定延迟的场景。此种模式下,读负载只能由slave承担,写与事务负载只能由master承担。
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-slave-addresses=10.0.0.11:3306@A \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:2 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:10.0.0.10为主库,10.0.0.11为丛库
6. 读写分离(master参与读)
这是另一种读写分离模式,所有类型的负载(读、写、事务)都有可能由master承担。
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-slave-addresses=10.0.0.11:3306@A \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:4 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:10.0.0.10为主库,10.0.0.11为丛库
7. 写高可用
这是专门针对XtraDB Cluster集群设计的一种模式。这种模式,只允许将一个节点作为写,而所有节点平均的承担所有的读负载。如图G所示。
图. G
以图. G为例,若Node 1节点不可用,则任意选择另一台机器作为新的节点。如下图所示。
图. H
OneProxy在切换时,没有考虑数据的一致性,需要XtraDB Cluster本身来保证。其它类型的集群慎用。
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-master-addresses=10.0.0.11:3306@A \
–proxy-master-addresses=10.0.0.12:3306@A \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:3 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
注:目前写入节点是由OneProxy自动选择的,无法手动指定。
8. 读写随机
这是专门针对XtraDB Cluster集群设计的一种模式。这种模式,所有的节点都平均的承担读写负载。
OneProxy的启动脚本如下:
###############################
#/bin/bash
#
if [ -e “/usr/local/oneproxy/log/oneproxy.pid” ]
then
kill -INT $(cat /usr/local/oneproxy/log/oneproxy.pid)
fi
sleep 2
ulimit -c 10000
export LD_LIBRARY_PATH=/usr/local/oneproxy/lib
/usr/local/oneproxy/bin/mysql-proxy \
–proxy-address=:3307 \
–proxy-master-addresses=10.0.0.10:3306@A \
–proxy-master-addresses=10.0.0.11:3306@A \
–proxy-master-addresses=10.0.0.12:3306@A \
–proxy-user-list=test/A94A8FE5CCB19BA61C4C0873D391E987982FBBD3 \
–proxy-database=test \
–proxy-group-policy=A:5 \
–event-threads=8 \
–log-file=/usr/local/oneproxy/log/oneproxy.log \
–pid-file=/usr/local/oneproxy/log/oneproxy.pid
#####################################
9. SQL检查
OneProxy拥有部分的SQL检查功能。当前版本可以检查SQL语句在操作某个表时,是否带了某个列。
比如有一张大表X,其定义如下
mysql> show create table X\G
*************************** 1. row ***************************
Table: X
Create Table: CREATE TABLE X (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL DEFAULT ”,
value varchar(100) NOT NULL DEFAULT ”,
PRIMARY KEY id,
KEY idx_name name
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
如果在操作时,SQL语句中没带id列或者name列,那么则不允许其操作。
只要在OneProxy启动脚本中加入如下配置即可,
–proxy-sql-review=X:id \
–proxy-sql-review=X:name \
最新的文档在cnblogs上
http://www.cnblogs.com/youge-OneSQL/articles/4208583.html
文章原文http://blog.mysqldba.cn/archives/136