OneProxy构建
OneProxy的主要功能有:
1. 垂直分库
2. 水平分表
3. Proxy集群
4. 读高可用
5. 读写分离(master不参与读)
6. 读写分离(master参与读)
7. 写高可用
8. 读写随机
一、重要概念
Server Group
在OneProxy中,一组主从复制的MySQL集群被称为Server Group。如图. 所示,有Server Group A和Server Group B。

在OneProxy中,垂直分库和水平分表的实现思路都是建立在Server Group的概念上。为了更好地说明,我们假设以下场景。
A)Server Group A中有三张表table X, table Y, table Z,其中应用对table X操作非常频繁,占用大量I/O带宽,严重影响了应用对tableY, tableZ的操作效率。

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

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所示

二、安装步骤
1)下载
wget http://www.onexsoft.com/software/oneproxy-rhel6-linux64-v6.2.0-ga.tar.gz
2)上传到目标主机的目录:/usr/local
3)cd /usr/local/
tar zxvf oneproxy-rhel6-linux64-v6.2.0-ga.tar.gz
4)cd oneproxy/
5)修改demo.sh
###############################
#/bin/bash
export ONEPROXY_HOME=/usr/local/oneproxy/ #根据自己环境配置,修改为oneproxy解压后的目录路径
#valgrind --leak-check=full \
${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf
#####################################
6)创建相关数据库,用户名和密码
已经安装配置好MySQL
mysql -uroot
mysql> create database if not exists test character set utf8 ;
mysql> grant insert, update, delete, select on test.* to test@'10.0.0.%' identified by 'test';
7)chmod +x ./demo.sh
./demo.sh
8)检查是否成功启动。
ps aux | grep mysql-proxy | grep -v grep
如有输出,则启动成功。
若无输出,请检查运行日志/usr/local/oneproxy/log/oneproxy.log
注:目前OneProxy有个限制,如果/etc/hosts文件有IPv6地址,则无法启动,因此需要注释掉
[root@oneproxy oneproxy]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
9)通过mysql client连接OneProxy
mysql -u test -h 10.0.0.9 -P3307 -p
注:-h 后加上IP(最好不要是 localhost或者127.0.0.1,这种写法可能导致其使用unix socket连接而无法连接上)
三、应用场景与配置范例
下面给出在以下几种场景下,如何正确的配置OneProxy
1. 垂直分库

OneProxy的配置文件conf/proxy.conf:
###############################
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log #指定日志文件路径
pid-file = log/oneproxy.pid #指定PID文件路径
lck-file = log/oneproxy.lck #指定LCK文件路径
mysql-version = 5.6.27 #版本
proxy-address = 0.0.0.0:3307 #指定自身监听端口
proxy-master-addresses.1 = 10.0.0.10:3306@A #指定主服务器的IP地址 格式:IP地址:端口@oneproxy组
proxy-slave-addresses.1 = 10.0.0.11:3306@A #指定从服务器的IP地址 格式:IP地址:端口@oneproxy组
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 = utf8_general_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
#####################################
注:具体参数含义参考附录
2. 水平分表

OneProxy的配置文件conf/proxy.conf:
###############################
[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
#####################################
OneProxy分库分表配置文件conf/part.txt
####################################
[
{
"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"}
]
}
]
####################################
3. Proxy集群
4. 读高可用
该方案是为了解决重要配置库的单点问题。在master不可用时,OneProxy会自动读取slave。
OneProxy的配置文件conf/proxy.conf:
###############################
[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
#####################################
注:10.0.0.10为只读主库,10.0.0.11为只读从库
5. 读写分离(master不参与读)
读写分离能有效的解决应用读负载较重且能忍受一定延迟的场景。此种模式下,读负载只能由slave承担,写与事务负载只能由master承担。
OneProxy的配置文件conf/proxy.conf:
###############################
[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
#####################################
注:10.0.0.10为主库,10.0.0.11为从库
6. 读写分离(master参与读)
这是另一种读写分离模式,所有类型的负载(读、写、事务)都有可能由master承担。
OneProxy的配置文件conf/proxy.conf:
###############################
[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
#####################################
注:10.0.0.10为主库,10.0.0.11为从库
7. 写高可用
这是专门针对XtraDB Cluster集群设计的一种模式。这种模式,只允许将一个节点作为写,而所有节点平均的承担所有的读负载。如图所示。

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

OneProxy在切换时,没有考虑数据的一致性,需要XtraDB Cluster本身来保证。其它类型的集群慎用。
OneProxy的配置文件conf/proxy.conf:
###############################
[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自动选择的,无法手动指定。
8. 读写随机
这是专门针对XtraDB Cluster集群设计的一种模式。这种模式,所有的节点都平均的承担读写负载。
OneProxy的配置文件conf/proxy.conf:
###############################
[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
#####################################
1、口令加密
此时可以启动oneproxy
cd /usr/local/oneproxy
sh ./demo.sh
进入管理端口,然后键入passwd <string>。
mysql -uadmin -pOneProxy -P4041 --protocol=TCP
passwd test
输出为:
1378F6CC3A8E8A43CA388193FBED5405982FBBD3
OneProxy构建的更多相关文章
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 快速构建H5单页面切换骨架
在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理
.NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- 使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert
使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...
随机推荐
- 值类型和引用类型的区别,struct和class的区别
C#值类型和引用类型 1.简单比较 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long,floa ...
- JSON.NET VS BinaryFormatter 性能
近期有个性能调优工作.通过dottrace 分析,发现几处问题,其中json.net 在序列化和反序列化的时候也比较耗性能,所以考虑能不能通过其它序列化方式来提高性能. 1 object 序列化代码 ...
- centos下部署redis服务环境及其配置说明
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...
- 牛客网-小白月赛6-J-洋灰三角
题目链接https://www.nowcoder.com/acm/contest/136/J 这题我还是不找规律了,老老实实推吧,传说找规律也可以,我还是算了 递推式:f(n)=k*f(n-1)+p ...
- PHP使用echo输出标签设置CSS样式问题
使用php是可以输出HTML标签的,这为页面设计带来很大方便. 在此记录php输出标签设置CSS样式的问题: echo可使用''.""或你不用引号,如果想要输出带CSS样式的HTM ...
- 面向对象课程 - T-shirt
拿到了一件谜一样的T-shirt 吓得我赶紧捏了下hbb
- [福大软工] Z班 第11次成绩排行榜
注:本次成绩排行榜是针对团队Alpha阶段冲刺博客的得分统计 作业要求 http://www.cnblogs.com/easteast/p/7749181.html 评分细则 在团队Alpha阶段刚开 ...
- shell脚本--shift参数左移
参数左移什么意思呢?这个参数指的是在运行脚本时,跟在脚本名后面的参数,前面已经讲过,可以使用$#来获取参数的个数,使用$*来获取所有的参数,而参数左移的含义是这样的:有个指针指向参数列表第一个参数,左 ...
- Consul vs. Zookeeper
https://www.consul.io/intro/vs/zookeeper.html 阿里不用zookeeper而是用consul,京东也在用consul.
- WebLogic Server Components:XA Transactions
https://docs.oracle.com/cd/E19509-01/820-5892/ref_xatrans/index.html Weblogic支持基于JPA规范的强一致性的XA事务,应对传 ...