Hi 你好,欢迎访问!登录
当前位置:首页 - Linux - 正文 君子好学,自强不息!

OneProxy简明使用手册

2016-04-07Linux撒加9981°c
A+ A-

 

撰写日期

201641

文档版本

v1.0

作者

李强

阅读人群

运维、DBA

联系方式

QQ1164258114

文档声明

本手册以作者生产环境为参考,对OneProxy的常用功能使用进行简单的说明;

手册中的groupnameusernamepassword等均为虚构的;

本手册暂不涉及OneProxy的分库分表功能;

本手册中不涉及Percona的编译安装过程;

本手册中假定每个集群的数据库主从都已做好

本手册结合Oneproxy官方文档结合阅读更好

变更记录

 2016.6.6
1、更新oneproxy 5.8.3中的参数
2、更新set stats_interval隐含参数的设置

 

一、背景说明

随着业务的不断发展,原来3MySQL做主从提供多个库(>5个库)并通过jdbc实现简单读写分离的结构已不足以支撑公司的业务发展,需要对原有的十几个库进行分类,分为核心应用1(包含1个库),核心应用2(包含2个库)以及非核心应用(包含多个库),并且使用数据库中间件对各个应用进行分组读写分离。

经过筛选,候选的中间件有360AtlasKingshard以及OneProxy,通过进一步了解发现Kingshard在架构改造时还处于核心功能开发阶段,所以pass360Atlas有一定的群众基础,所以优先选择它进行测试,在测试环境测试OK后很快便应用到了生产环境中的非核心应用,结果Atlas多次出现了假死现象导致业务无法正常访问。最后对OneProxy进行了1周的测试随即上线到生产环境,在非核心业务跑了2周后将公司业务全线切换到OneProxy。以下内容便是在数据库架构调整过程中整理出的OneProxy使用教程。

二、OneProxy简介

OneProxy是平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件。采用与MySQL Proxy一致的反向协议输出模式,对应用非常简单和透明易用,让用户畏惧的分库分表(Horizontal Partitioning)工作变得极其简单可控!基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群。

互联网企业在开源软件的基础之上打造了足以支撑每天十亿笔交易、支付处理能力的在线系统,其中分布式架构在其中发挥了关键的作用。在架构里面又分为应用层架构和数据层架构,应用层架构着重于解决应用之间的远程调用、服务的发现、消息的流转,数据层架构着重于解决底层数据库、缓存等的透明扩展。关系数据库的水平扩展,或者说MySQL数据库的水平扩展能力是架构中的关键所在,OneProxy是一款构建在MySQL数据库之上的透明数据访问中间件,由在互联网行业(电商、互联网金融)工作多年的资深架构师精心打造,旨在降底对上层应用开发要求,实现对应用基本透明的底层数据库单点切换(Failover)、读写分离、水平拆分功能,使任何公司都可以轻松地拥有与大型互联网企业一样底层数据库扩展能力,也不用受制于开发语言的限制,以帮助业务实现再一次腾飞。

 

三、OneProxy被使用的功能

«  读写分离

«  高可用

«  主从服务器延时检测

«  动态扩容

«  性能统计

«  连接池

四、环境说明

4.1、网络环境

接入交换机:华为CE5810

核心/汇聚交换机:华为 CE6810

网线类型:泛达6类线

服务器网卡类型Intel X350I QP

服务器与交换机互联带宽2G(2*1GE BONDING)

接入交换机与核心交换机互联带宽40G(4*10GB Eth-Trunk)

服务器网卡BOND主要参数

DEVICE="bond0"

BONDING_OPTS="mode=802.3ad miimon=100 xmit_hash_policy=2 lacp_rate=1"

BOOTPROTO="static"

IPV6INIT="no"

MTU="9000"

NM_CONTROLLED="no"

ARPCHECK=no

NOZEROCONF=yes

IPADDR=

NETMASK=

GATEWAY=

服务器网卡eth0主要配置

DEVICE="eth0"

IPV6INIT="no"

MASTER="bond0"

NM_CONTROLLED="no"

ONBOOT="yes"

SLAVE="yes"

ETHTOOL_OPTS="-G ${DEVICE} rx 4096 tx 4096"

MTU="9000"

服务器网卡eth1配置

DEVICE="eth1"

IPV6INIT="no"

MASTER="bond0"

NM_CONTROLLED="no"

ONBOOT="yes"

SLAVE="yes"

ETHTOOL_OPTS="-G ${DEVICE} rx 4096 tx 4096"

MTU="9000"

交换机配置要点

1、与服务器相连的网口做Eth-Trunk,并启用巨型帧功能(如果OneProxy与数据库不在同一交换机下,在数据传输的链路上均要开启巨型帧功能)

2、链路聚合模式一定要是动态lacp(华为非CE系列交换机不支持动态lacp,只有静态lacpH3C、思科、Juniper交换机均支持动态lacp

 

4.2、硬件环境


4.3、软件环境

操作系统:CentOS 6.5 x86_64 with 2.6.32-431.29.2.el6.x86_64

OneProxyoneproxy-rhel6-linux64-v5.8.2-ga.tar.gz

Percona Serverpercona-server-5.6.29-76.2.tar.gz源码编译

flashcachemaster版本

4.4、软件目录规划

安装目录

OneProxy/opt/websuite/oneproxy

Percona Server/opt/websuite/percona

配置文件目录

OneProxy/opt/config/oneproxy

Percona Server/etc/my.cnf

日志目录

OneProxy/opt/logs/oneproxy

PID目录

OneProxy/opt/run/oneproxy

Percona Server/opt/run/percona

Percona其他目录

/database/percona/{binlog,relaylog,data,undolog,ibdata,iblogs,logs}

启动脚本

OneProxy/etc/init.d/rc.oneproxy {start|stop|restart} groupname

Percona Server/etc/init.d/rc.percona {start|stop|restart}

4.5IP地址及数据库信息

ü  表格中GroupNameOneProxy配置文件的名称一致。例如,

GroupNamecisco,则OneProxy配置文件中的集群名称也为cisco,且OneProxy的配置文件名称为cisco.conf(此种约定为单个管理脚本管理多个不同业务的Group

ü  设定每一个数据库的访问用户密码均为netemu(实际生产环境中千万不要这样设置)

ü  用于检测主从延时的用户为repuser@’172.16.4.%’,密码为repuser(该用户需在每个Group的所有数据库服务器上进行创建)

数据库服务器及OneProxy访问入口相关信息

GroupName

OneProxy VIP/DEV

DB服务器Bond0 IP

DB Port

业务端口

管理端口

cisco

172.16.4.100/bond0:0

172.16.4.1/23

3306

3306

4041

172.16.4.2/23

3306

172.16.4.3/23

3306

juniper

172.16.4.101/bond0:1

172.16.4.4/23

3306

3307

4042

172.16.4.5/23

3306

172.16.4.6/23

3306

huawei

172.16.4.102/bond0:2

172.16.4.7/23

3306

3308

4043

172.16.4.8/23

3306

172.16.4.9/23

3306

OneProxy服务器相关信息

 

服务器Bond0 IP

OneProxy1

172.16.4.98/23

OneProxy2

172.16.4.99/23

数据库及访问用户相关信息

GroupName

数据库名

用户

用户权限

cisco

item1

item@’172.16.4.%’

select

update

insert

delete

juniper

netemu

netemu@’172.16.4.%’

51auto

51auto@’172.16.4.%’

huawei

data1

user1@’172.16.4.%’

data2

user2@’172.16.4.%’

data3

user3@’172.16.4.%’

data4

user4@’172.16.4.%’








 

4.6TOP

 

五、OneProxy部署

5.1OneProxy安装

下载OneProxy

wget https://www.onexsoft.com/software/oneproxy-rhel6-linux64-v5.8.2-ga.tar.gz

解压

mkdir -p /opt/{logs,run,websuite.config}/oneproxy

tar zxf oneproxy-rhel6-linux64-v5.8.2-ga.tar.gz -C /opt/websuite/

生成启动脚本并实现单一脚本管理多个不同业务的集群服务脚本见附录

cp /opt/websuite/oneproxy/oneproxy.service /etc/init.d/rc.oneproxy

生成3groupname对应的配置文件

touch /opt/config/oneproxy/{cisco.conf,juniper.conf,huawei.conf}  配置文件内容见附录

在任意一台数据库服务器上通过OneProxy管理口生成加密后的数据库用户密码

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041

OneProxy管理接口默认用户为admin,密码为OneProxy,端口为4041


启动OneProxy加载多个集群

/etc/init.d/rc.oneproxy start cisco

/etc/init.d/rc.oneproxy start juniper

/etc/init.d/rc.oneproxy start huawei

停止多个集群

/etc/init.d/rc.oneproxy stop cisco

/etc/init.d/rc.oneproxy stop juniper

/etc/init.d/rc.oneproxy stop huawei

 

5.2OneProxy常用参数说明

OneProxy的所有可用参数可通过oneproxy --help-all查看。所有参数均可以写入文件中,由OneProxy启动时加载

5.2.1、基本参数

--user=<user>

以指定的用户运行oneproxy

--pid-file=<file>

指定oneproxy的进程pid文件路径

--log-level=(error|warning|info|message|debug)

指定oneproxy的日志输出级别

--log-file=<file>

指定日志文件的路径

--keepalive

开启进程守护,当oneproxy进程挂掉后重启oneproxy

--max-open-files

显示指定oneproxy的最大文件句柄数,默认Soft Limit32768Hard Limit为系统指定的大小

--event-threads

指定oneproxy的线程数,默认为8,建议为CPUprocessor数量

--max-idle-time

在连接池中的连接最大空闲时间,指oneproxybackends之间的连接,数据库中interactive_timeout的值要大于(max-idle-time+10),max-idle-time最大值为1800

--proxy-address=<host:port>

设定oneproxy提供服务的监听端口,在单机环境下,可指定监听IP及端口;在高可用环境下可忽略IP,例如--proxy-address=:3306

--proxy-user-list=<user:passwd@dbname>

设定在当前group中访问dbname的用户名和密码,其中密码是经过管理接口中passwd进行加密的字符串。建议在管理接口中使用passwd ‘password’;密码需用引号引起来,否则在使用特殊字符时密码会被截断

--proxy-database=<dbname>

设置通过oneproxy访问的默认数据库,默认为test

--mysql-version=<version>

指定后端数据库的版本号,默认为5.5.18,此处主要是防止高版本的JDBC驱动连接oneproxy时,JAVA应用日志里出现“Caused by: java.sql.SQLException: Unknown system variable 'tx_read_only'”的错误导致应用无法启动。

--proxy-connect-timeout=<number>

设定oneproxy与后端建立连接的超时时间,默认为2

--proxy-read-timeout=<number>

设定oneproxy对后端进行读操作的超时时间,默认8小时

--proxy-write-timeout=<number>

设定oneproxy对后端进行写操作的超时时间,默认8小时

--admin-address=<host:port>

设定oneproxy管理接口的监听地址及端口

--admin-username=<string>

设定允许访问管理接口的用户名

--admin-password=<string>

设定允许访问管理接口的用户登陆密码

--proxy-license=<license>

针对企业版的注册码

--proxy-charset=<charset>

设定默认的字符集,默认为utf8_general_ci,可通过登陆管理接口并输入list charset查看oneproxy支持的所有字符集

5.2.2、读写分离

--proxy-master-addresses=<host:port@servergroup>

设定MySQL主服务器的地址、端口号及所属集群,例如

--proxy-master-addresses=172.16.4.1:3306@cisco

--proxy-slave-addresses=<host:port@servergroup>

设定MySQL从服务器的地址、端口号及所属集群,例如

--proxy-slave-addresses=172.16.4.2:3306@cisco

--proxy-group-policy=<groupname:policy>

设定在一个group中,数据库的读写分离策略,当前oneproxy支持12种读写分离策略

支持一主多从场景的策略

master_only:读写都在master

read_failover:读写都在master,当master挂掉的时候读切到slaves

read_slave:写在master,读在所有slaves

read_balance:写在master,读从master以及slaves

big_slave:写以及简单查询走master,复杂查询走slaves

big_balance:写及简单查询走master,复杂查询走masterslaves

数据分片场景的策略

write_shard:多组mastershard环境中,读写在任意master

read_shard:一组多从的shard环境中,写在master,读走其他节点

Percona XtraDB Cluster/MariaDB Galera Cluster环境

write_balance

write_other

write_failover

双主环境

read_other

5.2.3、主从延迟检测

--proxy-replication-check

开启oneproxy的主从延迟精确检测功能,默认会在test库中创建一张表。原理类似pt-heartbeat

--proxy-group-slavedelay=<servergroup:seconds>

设定在一个group中的slave,在检测到复制延迟到达设置的值之后,自动剔除该节点,在延迟小于设定值时动态加入服务

--repadmin-username=<string>

设置用于主从检测的用户名

--repadmin-password=<string>

设置用于主从检测的用户名密码

 

5.2.4、高可用

--vip-address=<ip/dev>

在多节点HA环境下,设置提供服务的VIP地址以及VIP绑定的dev

--remote-address=<host:port>

设定在HA环境下,设置其他节点的管理接口IP和管理端口

--proxy-server-id=<number>

设置oneproxyID

5.2.5、性能抓取

--proxy-trans-debug

开启是否事务调试功能,帮助架构师、DBA分析在业务运行时的各个表之间所关联的querytrx的关系

--proxy-log-sqlerror

开启记录sql error

--proxy-sql-debug

开启sql debug功能

 

5.3OneProxy实例管理

5.3.1OneProxy单机多实例

通过附录的脚本即可实现单机多个OneProxy实例

5.3.2OneProxy管理接口

OneProxy管理接口的连接

mysql -uadminuser-padminpasswd -hOneProxyIP -POneProxyadminport

其中

adminuser:由参数admin-username指定,默认用户为admin

adminpasswd:由参数admin-password指定,默认为OneProxy

OneProxyIP:为OneProxy监听的服务器IP

OneProxyadminport:为OneProxy监听的管理端口,默认为4041

 

通过OneProxy的管理端口,通过动态调整运行参数(登陆后通过list命令可查看所有支持的指令),可满足如下需求:

1、动态的调整Groupbackend的最大最小连接池数量

2、动态调整Group中读写分离策略

3、动态调整Group中的安全策略

4、动态调整GroupSQL防火墙的规则

5、动态开启或关闭OneProxy的性能统计数据

6、动态上线或下线Group中的MasterSlave机器

5.4OneProxy集群动态调整

1、扩容服务器

增加一台Master服务器

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “add master *.*.*.* ;set online ‘*.*.*.*’”

增加一台Slave服务器

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “add slave *.*.*.* ;set online*.*.*.*’”

 

2、下线服务器

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “set offline ‘*.*.*.*’”

 

5.5OneProxy性能数据

OneProxy的性能监控数据有很多,通过LIST指令可详细查看

开启、关闭或清空sql statistics

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET SQLSTATS {on|off|clear}”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST SQLSTATS

 

开启、关闭或清空table statistics

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET TABSTATS {on|off|clear}”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST TABSTATS

 

开启、关闭或清空user statistics

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET USERSTATS {on|off|clear}”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST USERSTATS

 

开启、关闭transaction debug mode

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET TRANS_DEBUG {on|off}”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST TRANS_DEBUG

 

开启、关闭sql error log

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET LOG_SQLERROR {on|off }”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST LOG_SQLERROR

 

开启、关闭sql debug mode

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “SET SQL_DEBUG {on|off }”

mysql -uadmin -pOneProxy -h172.16.4.98 -P4041 -e “LIST SQL_DEBUG

六、OneProxy杂谈

6.1OneProxy性能优化

6.1.1、升级内核

需要选择较新的内核版本,以避免撞上闻名的Big Kernel Lock 性能问题,CentOS 6下可以更新到2.6.32-573.7.1.el6.x86_64

 

6.1.2、网卡优化

1、在服务器千兆接入,交换机之前万兆接入的情况下,尽量为服务器选择Intel I350 DP/Inter I350 QP的网卡,并将驱动升级至最新版本。https://sourceforge.net/projects/e1000/ 这里选择合适的驱动下载。

kernel自带igb驱动与最新版驱动的差别

 

kernel自带驱动

最新驱动

版本号

5.0.5

5.3.4.4

多队列功能(cat /proc/interrupts |grep eth)

默认开启

需要生成配置文件后才开启

RSS

不支持

支持

Change Interrupt Mode

不支持

支持

InterruptThrottleRate

不支持

支持

升级驱动后通过modinfo igb可以看到网卡的很多可配置的参数,优化的条目可参考intel万兆网卡的部分说明

2、网卡SMP绑定

通过网卡多队列绑定到不同的CPU上,可降低CPU0的压力。建议关闭irqbalance服务

3MTU

默认的MTU1500,可调整到9000(相当于开启巨型帧),MTU增大后,需要在数据通过的链路上都开启巨型帧功能。

4、智能网卡

OCTEON XL NIC Network Interface Card

OCTEON XL NICPro Network Interface Card - Pro version

6.2OneProxy万兆网络环境

万兆环境下,网络架构比较关键,没有必要全网万兆环境。

6.3OneProxy监控

通过shell从管理端口获取各种监控数据,并做成Zabbix的自定义监控项输入监控系统

6.4、用HaproxyOneProxy进行负载均衡


6.5、另一种OneProxy多节点高可用方案

 

 

 

 

 

附录

rc.oneproxy脚本

#!/bin/sh

#

# chkconfig: - 98 02

# description: Utility for MySQL Proxy

#

# processname: Oneproxy

# config: /opt/config/oneproxy/proxy.conf

# pidfile: /opt/run/oneproxy/oneproxy.pid

# Short-Description: OneProxy is a MySQL Proxy

 

# Source function library.

. /etc/init.d/functions

 

### Default variables

ONEPROXY_HOME="/opt/websuite/oneproxy"

ONEPROXY_CONFIG="/opt/config/oneproxy/$2.conf"

ONEPROXY_PROJECT=$2

prog="OneProxy"

ONEPROXY_BIN="${ONEPROXY_HOME}/bin/oneproxy"

ONEPROXY_PID="/opt/run/oneproxy/oneproxy_$2.pid"

 

# Check if requirements are met

[ -x "$ONEPROXY_BIN" ] || exit 1

[ -r "$ONEPROXY_CONFIG" ] || exit 1

 

RETVAL=0

 

start() {

        echo -n $"Starting $prog: "

        daemon $ONEPROXY_BIN --defaults-file=$ONEPROXY_CONFIG

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

        return $RETVAL

}

 

stop() {

        echo -n $"Shutting down $prog: "

        if [ -e ${ONEPROXY_PID} ]; then

                daemon kill -INT $(cat ${ONEPROXY_PID})

                RETVAL=$?

        fi

        echo

}

 

restart() {

        stop

        start

}

 

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

  *)

        echo $"Usage: $0 {start|stop|restart|status}"

        RETVAL=1

esac

 

exit $RETVAL

 

 

 

 

cisco.conf

[oneproxy]

keepalive= 1

event-threads=24

log-file= /opt/logs/oneproxy/oneproxy_cisco.log

pid-file= /opt/run/oneproxy/oneproxy_cisco.pid

 

proxy-address            = :3306

proxy-master-addresses.1 = 172.16.4.1:3306@cisco

proxy-slave-addresses.1  = 172.16.4.2:3306@cisco

proxy-slave-addresses.2  = 172.16.4.3:3306@cisco

proxy-user-list.1        = item/FB14020BF4CB7C11173E9492C1D0C18DF18B6955@item1

proxy-secure-client      = 127.0.0.1

proxy-group-policy       = cisco:read-slave

proxy-read-timeout       = 3600

proxy-write-timeout      = 3600

proxy-charset            = utf8_general_ci

proxy-group-security     = cisco:0

vip-address              = 172.16.4.100/bond0:0

admin-address            = 172.16.4.98:4041

max-idle-time            = 1800

remote-address           = 172.16.4.99:4041

 

juniper.conf

[oneproxy]

keepalive = 1

event-threads=24

log-file  = /opt/logs/oneproxy/oneproxy_juniper.log

pid-file  = /opt/run/oneproxy/oneproxy_juniper.pid

 

proxy-address            = :3307

proxy-master-addresses.1 = 172.16.4.4:3306@juniper

proxy-slave-addresses.1  = 172.16.4.5:3306@juniper

proxy-slave-addresses.2  = 172.16.4.6:3306@juniper

proxy-user-list.1        = netemu/78D841BBCF0742621BCEE5B472E13E92824A2F24@netemu

proxy-user-list.2        = 51auto/78D841BBCF0742621BCEE5B472E13E92824A2F24@51auto

proxy-secure-client      = 127.0.0.1

proxy-group-policy       = juniper:0

proxy-read-timeout       = 3600

proxy-write-timeout      = 3600

proxy-charset            = utf8_general_ci

proxy-group-security     = juniper:0

vip-address              = 172.16.4.101/bond0:1

admin-address            = 172.16.4.98:4042

max-idle-time            = 1800

mysql-version            = 5.6.26

proxy-group-policy       = juniper:read-slave

remote-address           = 172.16.4.99:4042

 

huawei.conf

[oneproxy]

keepalive                = 1

event-threads            = 24

log-file                 = /opt/logs/oneproxy/oneproxy_huawei.log

pid-file                 = /opt/run/oneproxy/oneproxy_huawei.pid

 

proxy-address            = :3308

proxy-master-addresses.1 = 172.16.4.7:3306@huawei

#proxy-slave-addresses.1 = 172.16.4.8:3306@huawei

#proxy-slave-addresses.2 = 172.16.4.9:3306@huawei

proxy-user-list.1        = user1/2ED0B8B24B8B9D0D93112645C1502475E1009B80@data1

proxy-user-list.2        = user2/7EE08CF6626928BD3169D106C83B7957030FBB1E@data2

proxy-user-list.3        = user3/FE8EA7D6822FE01CD4F0282FD2BDD8888E46AFCD@data3

proxy-user-list.4        = user4/0A6B2A3A898D4F0A328B03C6075D91C00960530E@data4

proxy-secure-client      = 127.0.0.1

proxy-group-policy       = huawei:read_slave

proxy-read-timeout       = 3600

proxy-write-timeout      = 3600

proxy-charset            = utf8_general_ci

proxy-group-security     = huawei:0

vip-address              = 172.16.4.102/bond0:2

admin-address            = 172.16.4.98:4043

max-idle-time            = 1800

mysql-version            = 5.6.29

remote-address           = 172.16.4.99:4043

 


  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
OneProxy简明使用手册

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>


  用户登录