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安装完成. 请参考这 ...
随机推荐
- 校内模拟赛 SovietPower Play With Amstar
SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...
- libgdx学习记录27——线段与线段相交检测
给定p1, p2, p3, p4四个点,p1,p2为一条线段,p3,p4为一条线段,检测其是否有交点. 可分为三种情况: 1. L2与x轴平行 2. L2与y轴平行 3. L2与坐标轴不平行. (L1 ...
- C#获取当前堆栈的各调用方法列表
在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...
- 干货分享:vue2.0做移动端开发用到的相关插件和经验总结(2)
最近一直在做移动端微信公众号项目的开发,也是我首次用vue来开发移动端项目,前期积累的移动端开发经验较少.经过这个项目的锻炼,加深了对vue相关知识点的理解和运用,同时,在项目中所涉及到的微信api( ...
- 新人入坑Redis必会的吐血总结
新人入坑Redis必会的吐血总结 一.什么是Redis Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map.简单来讲,Redis是一种NO ...
- #个人博客作业Week2——关于代码规范的讨论
<1> 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 反驳:官僚制度在一定程度下维持了社会的和谐稳定,一个没有法律.没有拥有完善的管理体制.完全崇尚 ...
- 《Linux内核分析》第13章
<Linux内核设计与实现>第十三章--虚拟文件系统概述 20135211 一.通用文件系统接口 之所以可以使用这种通用接口(VF)对所有类型的文件系统进行操作,是因为内核在它的底层文件系 ...
- 《蹭课神器》Beta版使用说明
相比 Alpha 版,我对主界面进行了优化,使主界面更加简洁 同时数据库增加了一个表,里面存放的是课程的详细信息
- myeclipse快捷方式汇总
选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可. 如果你想使用的快捷键的注释是的话,那么你的快捷键是ctrl+shift+/我以前都是手动注释的,直接打// ...
- 使用git命令创建分支到团队项目
背景 在我们的团队中,我作为管理者,创建了一个叫HelloWorld的项目,大家各自在本地进行开发,将自己的工作贡献到我们的团队项目中.为了便于审核,我希望大家先将自己的贡献先放在属于自己的一个分支上 ...