OneProxy的主要功能有:
1. 垂直分库

2. 水平分表

3. Proxy集群

4. 读高可用

5. 读写分离(master不参与读)

6. 读写分离(master参与读)

7. 写高可用

8. 读写随机

一、重要概念

Server Group

在OneProxy中,一组主从复制的MySQL集群被称为Server Group。如图. 所示,有Server Group A和Server Group B。

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片1.png)

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

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

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片2.png)

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

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片3.png)
 
    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所示

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片4.png)
 
                                                                               
 二、安装步骤

   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. 垂直分库

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片5.png)

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. 水平分表

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片6.png)
                                                                      
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集群设计的一种模式。这种模式,只允许将一个节点作为写,而所有节点平均的承担所有的读负载。如图所示。

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片7.png)
                                                                     
以图.为例,若Node 1节点不可用,则任意选择另一台机器作为新的节点。如下图所示。

![image](https://github.com/luoyan321/Mysql/blob/master/OneProxy/图/图片8.png)
                                                                     
 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构建的更多相关文章

  1. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  2. 快速构建H5单页面切换骨架

    在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...

  3. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  4. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  5. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  6. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  7. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  8. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  9. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

随机推荐

  1. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  2. 使用sklearn进行K_Means聚类算法

    首先附上官网说明 [http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-usin ...

  3. 《Head First 设计模式》例子的C++实现(2 观察者模式)

    最近在学习设计模式,用的是 <Head First 设计模式>这本书.感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式.唯一有点不方便的地方是这本书的例子全都是用的 Java ...

  4. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

  5. 记一次MongoDB裸奔

    导言 大意失荆州,裸奔的 MongoDB 被黑了.虽然并不是什么非常重要的数据,但也给自己敲响的一个警钟.虽然我们平时不容易接触到数据安全,但我们在开发,部署项目的时候,一定要养成良好的安全意识. 根 ...

  6. VitualBox安装linux记录

    下载镜像 CentOS 7镜像下载 阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/ VirtualBox安装linux https://ww ...

  7. 基于HTML5 Canvas的工控SCADA模拟飞机飞行

    昨天看到一篇文章说是学习如何开飞机的,然后我就想,如果我也可以开飞机那就好玩了,每个人小时候都想做飞行员!中国飞行员太难当了,再说也不轻易让你开飞机!后来我就想如果能用 HT 开飞机那就是真的有趣了, ...

  8. poj1426 Find The Multiple(c语言巧解)

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36335   Accepted: 151 ...

  9. 个人作业Week1

    一.<构建之法>提问 1.需求是什么?需求的规范需要明确吗? 2.一个人开发效率非常高,多人开发,个人效率随团队人数上升而直线下降,我们一般需要将大项目拆为小项目,使协作耦合产生的效率负影 ...

  10. oracle alter

    ALTER TABLE (表名) ADD CONSTRAINT (索引名);ALTER TABLE (表名) DROP CONSTRAINT (索引名); ALTER TABLE (表名) ADD ( ...