介绍

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

                                                            图. A

     在OneProxy中,垂直分库和水平分表的实现思路都是建立在Server Group的概念上。为了更好地说明,我们假设以下场景。

     A)Server Group A中有三张表table X, table Y, table Z,其中应用对table X操作非常频繁,占用大量I/O带宽,严重影响了应用对tableY, tableZ的操作效率。

              B

                                                                      图. B

     解决方案1.0:把table X移到另一组数据库,即Server Group B中(如图C所示),然后通过修改OneProxy的配置来改变table X的路由规则,无须改动应用。

C

                                                                      图. 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

                                                                                图. 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

                                                                      图. 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

                                                                          图. 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

以图. G为例,若Node 1节点不可用,则任意选择另一台机器作为新的节点。如下图所示。

H

                                                                      图. 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