介绍
#/bin/bash
#
export ONEPROXY_HOME=/usr/local/oneproxy/
# valgrind --leak-check=full \
${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-master-addresses.2 = 10.0.0.12:3306@B
proxy-slave-addresses.2 = 10.0.0.13:3306@B
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-part-template = conf/template.txt
proxy-part-tables.1 = conf/part.txt
proxy-part-tables.2 = conf/part2.txt
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:master-only
proxy-group-policy.2 = B:master-only
proxy-table-map.1=X:B
proxy-table-map.2=Y:A
proxy-table-map.3=Z:A
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-master-addresses.2 = 10.0.0.12:3306@B
proxy-slave-addresses.2 = 10.0.0.13:3306@B
proxy-master-addresses.3 = 10.0.0.14:3306@C
proxy-slave-addresses.4 = 10.0.0.15:3306@C
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-part-tables.1 = conf/part.txt
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:master-only
proxy-group-policy.2 = B:master-only
proxy-group-policy.3 = C:master-only
proxy-table-map.2=Y:A
proxy-table-map.3=Z:A
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[
{
"table" : "X",
"pkey" : "id",
"type" : "char",
"method" : "crc32",
"partitions" :
[
{ "suffix" : "_00", "group": "B" },
{ "suffix" : "_01", "group": "B" },
{ "suffix" : "_02", "group": "C" },
{ "suffix" : "_03", "group": "C"}
]
}
]
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:read_failover
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:read_slave
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-slave-addresses.1 = 10.0.0.11:3306@A
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:read_balance
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-master-addresses.2 = 10.0.0.11:3306@A
proxy-master-addresses.3 = 10.0.0.12:3306@A
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:write_other
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.6.27
proxy-address = :3307
proxy-master-addresses.1 = 10.0.0.10:3306@A
proxy-master-addresses.2 = 10.0.0.11:3306@A
proxy-master-addresses.3 = 10.0.0.12:3306@A
proxy-user-list = test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test
proxy-charset = gbk_chinese_ci
proxy-group-policy.1 = A:write_balance
proxy-secure-client = 127.0.0.1
proxy-sequence.1 = default
#remote-address = 192.168.1.119:4041
#vip-address = 192.168.1.120/eth0:0
FAQ
1、口令加密
此时可以启动oneproxy
cd /usr/local/oneproxy
sh ./demo.sh
进入管理端口,然后键入passwd <string>。
mysql -uadmin -pOneProxy -P4041 --protocol=TCP passwd test |
输出为:
1378F6CC3A8E8A43CA388193FBED5405982FBBD3
OneProxy提供了目前两种管理功能。
第一,提供了查看配置信息(例如后端 DB情况等)与系统的动态变化信息(例如OneProxy与后端数据库建立的连接变化等)。
命令 | 描述 | 例子 |
LIST HELP | 列出所有命令 | list help |
LIST BACKEND | 列出所有后端数据库 | list backend |
LIST GROUP | 列出所有的server group,具体含义请参考重要概念 | list group |
LIST POOL | 列出OneProxy与每个后端数据库建立的连接池大小与连接池配置 | list pool |
LIST QUEUE | 列出每个队列里到达的请求数量与已处理完成的请求 | list queue |
LIST THREADS | 列出每个线程处理过的请求数 | list threads |
LIST TABLEMAP | 列出table与server group的对应关系 | list tablemap |
LIST USERS | 列出用户 | list users |
LIST SQLSTATS | 列出执行过的SQL统计 | list sqlstats [hash] |
LIST SQLTEXT | 列出执行过的SQL与hashcode的对应关系 | list sqltext [hash] |
SET MASTER | 指定某后端DB为写库 | set master '192.168.1.119:3306' |
SET SLAVE | 指定某后端DB为读库 | set slave '192.168.1.119:3306' |
SET OFFLINE | 下线指定的后端数据库 | set offline '192.168.1.119:3306' |
SET ONLINE | 上线指定的后端数据库 | set online '192.168.1.119:3306' |
SET GPOLICY | 指定server group的策略。
预定义策略,0 代表由 Lua Script 来决定,默认为 Master Only; 1 代表 Read Failover; 2 代表Read/Write Split(Master 节点不参与读操作); 3 代表双 Master 结构,或者是 XtraDB Cluster结构,即多主对等的方式; 4 代表 Read/WriteSplit(Master 节点共同参与读操作); 5 代表读写随机。 |
set gpolicy default 1 |
SET GMASTER | 针对XtraDB Cluster,指定某个编号的数据库为写库 | set gmaster default 1 |
SET GACCESS |
指定server group允许的sql类型。0:无任何限制,缺省值; 1:禁止 DDL 操作; |
set gaccess default 1 |
SET POOLMIN | 设置OneProxy与后端数据库连接池的最少连接数 | set poolmin '192.168.1.119:3306' 5 |
SET POOLMAX |
设置OneProxy与后端数据库连接池的最大连接数, 实际的连接数可以超过这个数值, |
set poolmax '192.168.1.119:3306' 300 |
SET SQLSTATS | 打开、关闭或者清空SQL统计 | set sqlstats {on|off|clear} |
MAP | 把某个表归属给某个server group | map my_test1_0 default |
UNMAP | 删除表与server group的映射关系 | unmap my_test1_0 |
SUSPEND | 让event process停止指定秒数 | suspend 10 |
SHUTDOWN | 关闭proxy | shutdown force |
参数名 |
含义 |
proxy-address |
Proxy Server自身监听地址 |
proxy-master-addresses |
Master节点地址(可写入节点) |
proxy-slave-addresses |
Slave节点地址(可读取节点) |
proxy-user-list |
Proxy用户列表(用户名:口令) |
proxy-table-map |
为某张表指定“Server Group” |
proxy-sql-review |
为某张表指定Where条件中必须的列 |
proxy-database |
Proxy对应的后端数据库,默认: test |
proxy-charset |
Proxy字符集,默认:utf8_general_ci |
proxy-lua-script |
Proxy功能脚本(非常重要) |
proxy-group-policy |
预定义策略,0代表由Lua Script来决定,默认为Master Only;1代表Read Failover;2代表Read/Write Split(Master节点不参与读操作);3代表双Master结构,或者是XtraDB Cluster结构,即多主对等的方式;4代表Read/Write Split(Master节点共同参与读操作);5代表读写随机。 |
proxy-security-level |
安全级别,0默认值,1禁止DDL,2禁止不带条件的查询语句,3只允许SELECT。 |
proxy-group-security |
为特定Server Group设置安全级别。 安全级别,0默认值,1禁止DDL,2禁止不带条件的查询语句,3只允许SELECT。 |
event-threads |
并发线程数,最大允许48个线程。 |
解释
A) --proxy-master-addresses
重命名了MySQL Proxy里的参数(proxy-backend-addresses),觉得这个名字更容易记,所有允许写操作的Master节点。格式如下:
格式:ip:port@groupname
其中“groupname”指的是“Server Group”的名字,如果不指定,则默认为“default”。
B) --proxy-slave-addresses
重命名了MySQL Proxy里的参数(proxy-read-only-backend-addresses),觉得这个名字更容易记,所有允许只读操作的Slave节点。格式如下:
格式:ip:port@groupname
其中“groupname”指的是“Server Group”的名字,如果不指定,则默认为“default”。
C) --proxy-user-list
OneProxy止前接管了客户端的登录验证,即客户端在登录验证时不再需要和后端的MySQL数据库通信了,这就要求OneProxy必须有一个完整的用户列表,用来验证客户端登录,可以通过这个参数来指定允许访问的用户名和口令列表,所有后端的数据库都必须存在同样用户名和口令的登录账号。
可以用“bin/mysqlhash”来生成加密后的口令,例如:
[root@ANYSQLSRV1 oneproxy]# bin/mysqlhash test
A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
然后在命令行参数里指定这个用户名和口令:
--proxy-user-list=test:A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
如果有多个用户需要指定,多次指定此选项即可。也可以指定用户连接后端MySQL时的默认数据库,如果不指定,则连接到“proxy-database”指定的默认数据库。指定的格式如下:
--proxy-user-list=username:password@default_db
要求OneProxy后端所有的数据库都有同名用户、同名的数据库,及相应的访问权限,在OneProxy端并不支持改变一个会话的默认后端数据库,即传统的“USE”命令在OneProxy里有其他的含义。
D) --proxy-database
OneProxy基于现有连接池机制的考虑,并不支持切换数据库的功能,通过OneProxy连接的会话,只能对应到此参数指定的数据库里,“use”命令在OneProxy中也是被禁用的,原因是现有的代码里每一次获得连接池中的连接后,都会多发一个“use”命令,在高并发环境中会影响性能(后续版本将会对此作出改进),这是在使用OneProxy时需要注意的地方。
此选项默认值是“test”,这个库在默认安装时都会创建好的。
E) --proxy-charset
通过OneProxy来管理多个数据库时,要求所有的数据库字符集是一致的,同样是基于现有连接池机制的考虑,可以选的值在README文件里有,默认值是“utf8_general_ci”,为了防止连接池中不同的连接出现不同的设置,“set”命令在OneProxy里也是不生效的。
F) --proxy-group-policy
使用OneProxy时可以透时地对下层的数据架构做改造,可以通过Lua脚本来实现的,出于对性能及便捷性(许多人不是很懂Lua)的考虑,将简单的Failover及读写分离的方案固化到OneProxy里,使用C语言来实现,即不需要写任何Lua代码也可以透明地使用Failover和读写分离方案了。指定格式:
--proxy-group-policy=<servergroup>:<policy_value>
对于复杂的分库分表,则还需要编写Lua脚本来实现,在“lua”子目录下有一个示例脚本“oneproxy.lua”就是用来做分库分表的。其中“servergroup”表示针对哪个“Server Group”进行设置。
此选项可以设置的“policy_value”值有:
0
默认值,什么也不做,依赖于Lua脚本来实现。
1
Read Failover功能,对于读操作,首先从Master读取,如果Master不可用,则从Slave端读取。
2
Read/Write Split功能,对于读操作,首先从Slave读取,如果Slave端不可用,则从Master端读取。除非所有的Slave都不可用,否则Master不参与读操作。
3
针对XtraDB Cluster群集环境的Read/Write Split功能,从集群中固定地选择一台作为写入节点,其他的节点作为读节点;如果选中的写入节点不可用,则重新选一台作为写入节点,其他可用的节点继续提供读,这个策略提供了写入节点的自动漂移,在双Master节点上也可以设置成这种策略。
4
Read/Write Split功能,对于读操作,从Master和Slave中随机选一台进行查询操作,写入操作则从在Master上进行。
5
随机读写功能,对于读操作,从Master和Slave中随机选一台进行查询操作,写入操作则是随机选一台Master进行操作。
后续会继续内置更多的策略进去,以及不断优化已有的策略,为大家透明地做MySQL架构改造而努力。
G) --proxy-security-level
安全级别,提升安全性,默认值为0,即没有任何设置。设成1禁止通过OneProxy来做DDL操作;设置为2则必须要有Where条件;设置为3只允许只读的操作。
H) --proxy-group-security
可针对某一个“Server Group”来指定安全级别,指定格式:
--proxy-group-policy=<servergroup>:<policy_value>
安全级别,提升安全性,默认值为0,即没有任何设置。设成1禁止通过OneProxy来做DDL操作;设置为2则必须要有Where条件;设置为3只允许只读的操作。
I) --event-threads
这个参数本身的意义没有变化,但内部的实现经过大幅优化,使得单个OneProxy实例可以支持20万以上的QPS转发。在已知的数据库Proxy中,OneProxy的转发能力一直是第一,此选项允许设置的最大值是48。
数十万的转发能力表示由OneProxy本身引起的时延增加基本可以忽略,这一点是OneProxy相对于MySQL Proxy而言的一个重大进步,解决了MySQL Proxy的并发处理能力。
通常这个值可以设为CPU Core数量的两倍,用8C或16C配备万兆网卡的机器来跑OneProxy可以达到最好的效果。