使用分布式数据库集群做大数据分析之OneProxy

一、十亿数据,轻松秒出

实时监控领域有两个显著的特点,一是数据来源很多而且数据量大,有来自监控摄像头、GPS、智能设备等;二是需要实时处理。我们的客户在做实时处理时,就遇到这样的问题。客户的某个数据表中有10亿条记录,希望统计类查询的响应时间在30s以内,而使用单台MySQL的响应时间在300s以上。OneProxy特有的并行查询功能,让响应时间降到10s以内。

二、并行查询前提之分库分表

在互联网+的时代,分库分表已经成为行业的标准解决方案之一。在众多应用中,数据每天都以GB级别递增,其中若干个热点表会达到几十G或者几百G。众所周知,大的数据表在使用和维护时,存在诸多问题。

1)某些DDL操作,响应时间难以接受。添加、修改、删除数据表字段时,耗时太长(甚至达到几天),占用大量IO,导致影响线上业务;

2)性能难以提高。一张大表只能放在一台服务器上,而单台服务器的服务能力有限,导致系统的性能受制于单台服务器的能力;

3)统计分析,耗时太长。由于MySQL本身不支持单条SQL语句内的并发,因此一个统计分析型SQL语句,受制于全表扫描的速度,而这是难以接受的,尤其是表无法全部放在内存时。

对于上述问题,一个目前被广泛采用的解决方案,就是把一个大表拆成多个小表放到多个不同的数据库中,即分库分表,如图1。

    图 1 分库分表

三、并行查询原理

OneProxy并行查询的实现依赖于其自身的分库分表功能。它通过内置的SQL解析器,将来自客户端的SQL查询改写成带有分片信息的多个查询并分发到不同的主机上并行执行,从而极大提高了响应速度,如图2。

        图2 并行查询

四、部署

1) 多台linux主机,推荐Centos6 64bit

2)从公司官网下载安装文件(http://www.onexsoft.com/download) 3) 安装

A)解压到指定目录


mv oneproxy-rhel5-linux64*
 /usr/local/

tar zxvf oneproxy-rhel5-linux64*

B)更改启动文件


cd
oneproxy

cat
demo.sh


#!/bin/bash

export
ONEPROXY_HOME=/data/oneproxy

if [
-f ${ONEPROXY_HOME}/oneproxy.pid ]; then

kill -9 `cat
${ONEPROXY_HOME}/oneproxy.pid`

fi

sleep
2

#
valgrind --leak-check=full --show-reachable=yes \

${ONEPROXY_HOME}/oneproxy
--proxy-address=:3307 --proxy-extra-address=:3308 \

--proxy-master-addresses=192.168.1.119:[email protected] \

--proxy-user-list=test/[email protected] \

--proxy-part-tables=${ONEPROXY_HOME}/part.txt \

--proxy-charset=gbk_chinese_ci
--proxy-found-rows \

--proxy-group-policy=default:master-only \

--event-threads=6 --proxy-group-security=default:0 \

--log-file=${ONEPROXY_HOME}/oneproxy.log \

--pid-file=${ONEPROXY_HOME}/oneproxy.pid

更改后


#/bin/bash

#

export
ONEPROXY_HOME=/usr/local/oneproxy

if [
-f ${ONEPROXY_HOME}/oneproxy.pid ]; then

kill -9 `cat
${ONEPROXY_HOME}/oneproxy.pid`

fi

sleep
2

#
valgrind --leak-check=full --show-reachable=yes \

${ONEPROXY_HOME}/oneproxy
--proxy-address=:3307 --proxy-extra-address=:3308 \

--proxy-master-addresses=<IP1>:[email protected] \

--proxy-master-addresses=<IP2>:[email protected] \

--proxy-master-addresses=<IP3>:[email protected] \

--proxy-master-addresses=<IP4>:[email protected] \

--proxy-master-addresses=<IP5>:[email protected] \

--proxy-master-addresses=<IP6>:[email protected] \

--proxy-master-addresses=<IP7>:[email protected] \

--proxy-master-addresses=<IP8>:[email protected] \

--proxy-user-list=test/[email protected] \

--proxy-part-tables=${ONEPROXY_HOME}/hashpart.txt
\

--proxy-charset=utf8_bin --proxy-found-rows
\

--proxy-group-policy=data1:master-only \

--proxy-group-policy=data2:master-only \

--proxy-group-policy=data3:master-only \

--proxy-group-policy=data4:master-only \

--proxy-group-policy=data5:master-only \

--proxy-group-policy=data6:master-only \

--proxy-group-policy=data7:master-only \

--proxy-group-policy=data8:master-only \

--event-threads=6  \

--keepalive \

--log-file=${ONEPROXY_HOME}/oneproxy.log \

--pid-file=${ONEPROXY_HOME}/oneproxy.pid

注释:

A) 
--proxy-user-list=test/[email protected] 其中第一个test为连接proxy的用户名,该用户名也是用来连接后端数据库的用户名;1378F6CC3A8E8A43CA388193FBED5405982FBBD3为test用户的加密口令;最后一个test为各个数据库节点中的test数据库。

B) 
口令加密。启动OneProxy之后,进入管理端口,然后键入passwd <string>。


mysql
-uadmin -pOneProxy -P4041 --protocol=TCP

passwd
test

输出为:

C) 
分表文件hashpart.txt


[

{

"table"   : "bigtable",

"pkey"    : "id",

"type"    : "int",

"method"  : "hash",

"partitions": 256,

"groups": ["data1","data2","data3",
"data4","data5","data6", "data7","data8"]

}

]

其中table:拆分的表;pkey:分表列;type:分表列类型,目前支持的类型为int和char;method:分区方法,目前支持hash,range,list,global

4). 安装数据节点,并赋予用户相应权限。

A) MySQL安装方法 请参考官方安装文档https://dev.mysql.com/doc/refman/5.6/en/linux-installation.html

如果你对线程池、SQL级别限流,秒杀解决方案等感兴趣,可以使用OneSQL。

下载地址:www.onexsoft.com/download ,解压替换系统中已有mysqld文件即可。具体使用方法见文档:http://www.onexsoft.com/OneSQL_Best_Practise.pdf

B)权限分配

登录到各个底层数据库所在的linux主机上,运行如下命令:


mysql
-e "grant all privileges on *.* to [email protected]‘%‘ identified by ‘test‘ "

5). 启动


sh
./demo.sh

检查启动输出


cat
oneproxy.log

2015-05-04 19:38:15: (critical) plugin oneproxy
5.4.1-20150425 started
2015-05-04 19:38:15: (critical) valid config checksum = 88429892

6). 检查后端数据库节点状态

进入管理端口(默认端口为4041)


mysql
-uadmin -pOneProxy -P4041 --protocol=TCP

然后键入


list
backend;

可以看到输出为:

status这一栏为UP,表示集群正常。

7). 创建表

登录OneProxy的转发端口


mysql -h<OneProxyIP> -P3307 -utest -ptest

DDL语句:


CREATE TABLE `bigtable` (

`id` bigint(20) NOT NULL,

`start` datetime DEFAULT NULL,

`icol3` int(11) DEFAULT NULL COMMENT ‘ 1-10 ‘,

`icol4` int(11) DEFAULT NULL COMMENT ‘ 1-100 ‘,

`icol5` int(11) DEFAULT NULL COMMENT ‘ 1-1000 ‘,

`icol6` int(11) DEFAULT NULL,

`vcol7` varchar(20) DEFAULT NULL,

`vcol8` varchar(20) DEFAULT NULL,

`vcol9` varchar(30) DEFAULT NULL,

`vcol10` varchar(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

执行这个语句,会看到报错: ERROR 1044 (42000): Access denied due to security policy, DDL disabled or DML restricted!

解释:由于OneProxy为了安全起见,默认是禁止DDL语句的。

解决办法:从OneProxy管理端口,运行如下命令


mysql  -h<OneProxyIP> -uadmin -pOneProxy -P4041 -e "set gaccess data1 0;set gaccess data2 0;set gaccess data3 0;set gaccess data4 0;set gaccess data5 0;set gaccess data6 0;set gaccess data7 0;set gaccess data8 0"

再次登录到OneProxy的转发端口,运行DDL命令即可成功。

经过上面的步骤之后,256个表就在8个底层数据库中创建好了,分别为bigtable_0 , bigtable_1 .....bigtable_255。

五、测试数据生成

客户可以使用自己编写的程序来生成测试数据,也可以使用平民软件创始人(楼方鑫)编写的mydbtest软件。mydbtest不仅可以生成测试数据,也可以根据用户自定义的SQL语句去执行测试。程序下载地址:

http://www.onexsoft.com/software/mydbtest_linux64.zip

文档可以从百度云中找到:

http://pan.baidu.com/s/1mgJpukg#path=%252FOneSQL%252FDocument

然后找到 ”MySQL数据库测试工具“ 即可下载。具体的使用和详细的参数,请参考文档。

本文使用mydbtest来做数据装载工具,使用方法和配置文件如下


nohup ./mydbtest_linux64.bin query=insert.cnf degree=500 > /dev/null 2>&1 &

配置文件 insert.cnf


Option

user test/[email protected]<OneProxyIP>:3307:data1

loop 100000000

log insert_%p.log

time 24h

declare

vid bigseq 1  10000000000

vstart TIMESTAMP -10 10

vicol3 int 1 10

vicol4 int 1 100

vicol5 int 1 1000

vicol6 int 1 100000

vvcol7 char 10 19

vvcol8 char 10 19

vvcol9 char 10 29

vvcol10 char 10 19

begin

insert into bigtable( id , start ,icol3, icol4 , icol5 , icol6 , vcol7, vcol8, vcol9, vcol10 )

values ( :vid , :vstart ,:vicol3, :vicol4 , :vicol5 , :vicol6 , :vvcol7, :vvcol8, :vvcol9, :vvcol10);

end

六、并行查询测试

测试环境:


OS


Centos 6.3 x64


CPU


8Core

2.4GHZ


Memory


32G


Disk


RAID1 300G 7200r/min

MySQL 配置:


innodb_buffer_pool_size


24G


max_connections


4096


tcc_control_min_connections [OneSQL]


16

测试数据:


表名


bigtable


分表数


256


数据节点数


8


记录数


1,401,817,594


数据文件大小


25G * 8

测试结果


测试方法


响应时间


Select count(*) from bigtable   非并行


286.38s


Select /* parrallel */count(*) from bigtable  并行


8.23s


Select  icol3,count(*) from bigtable group by icol3; 非并行


652.64s


select /*parallel*/ icol3,count(*) from bigtable group by icol3  并行


22.24s

可以看出并行之后,count(*)性能提升约35倍。

时间: 2024-10-12 23:19:41

使用分布式数据库集群做大数据分析之OneProxy的相关文章

分布式数据库集群中间件

我是一个分布式数据库集群中间件的开发人员,已经一年多一点的开发时间了,今天总结点我所知道的一些事情,给有新近来到这个领域的研发人员一点借鉴. 生活不易,赚钱不易,离开仅仅是为多赚点钱. ----学渣 我仅仅是说我所开发过的系统: 后面文章会有具体的分析.这里仅仅做简单的梳理.也就是你要研发分布式数据库集群中间件.须要向着哪些方面去思考. 首先我们从名字去分析我们正在从事的工作内容: 1. 分布式 须要考虑它的方向(后面具体说明) a)  分布式中的概念 b)  分布式的模型 c)  分布式系统特

分布式数据库集群节点数据一致性校验

某500强客户要上线一个功能,其后台所有数据库是我司设计开发的NoSQL数据库. 为了避免数据库集群中,数据节点不一致而导致问题,需要对数据库节点间的数据进行校验. 理论上说,数据库节点之间的数据,应当保持最终一致性.而我司的数据库,是在对主节点对数据进行操作时,coord节点会(立即)通知备节点拉取数据,从而保持数据的一致性.所以,对于正常运行的数据库来说,一个集群内每个节点上的数据,是完全一致的. 客户是上帝,我们所作的就是要让客户放心.虽然我们强调我们的数据库集群内的节点中数据是一致的,让

大型分布式数据库集群的研究

1.为什么要设计成分布式数据库,数据为什么要分区? 当数据量很大的时候,即使服务器在没有任何压力的情况下,某些复杂的查询操作都会非常缓慢,影响了最终用户的体验. 在大数据量下对数据库的装载与导出,备份与恢复,结构的调整,索引的调整等都会让数据库停止服务或者高负荷运转很长时间,影响了数据库的可用性和可管理性. 这个时候靠提升服务器的硬件配置是起不到作用的,只有靠分区把数据分成更小的部分才能提高数据库的可用性和可管理性. 通过分区把各部分数据放到不同的机器中,每次查询可以由多个机器上的CPU,I/O

数据库–Cobar分布式数据库集群MySQL中间件

运行环境: 主机1:Ubuntu14.04 Desktop + MySQL5.5 + JDK 1.7(HP Z400)  内网IP地址:192.168.137.8 NODE1:Ubuntu 13.04 server + MySQL5.5  内网IP地址:192.168.137.31 NODE2:Ubuntu 13.04 server + MySQL5.5  内网IP地址:192.168.137.32 注:(NODE1和NODE2运行于XEN虚拟化平台,硬件环境HP Z800) Cobar简介:

数据库集群的概念

1 读写分离 在数据库分布式集群中,从节点从逻辑上是不能写数据的,但是也不读的话会造成资源的浪费; 分析: 集群中从节点具有数据同步的效果,可以完成对外的读服务,从节点的整体数量一般来讲大于主节点;读的服务比例大于写的服务;一旦读写分离实现,集群的性能就可以得到极大的提升; 2 高可用替换 分布式数据库集群中的某个数据分片完成可靠性的提高必须基于主从复制的高可用替换; 2.1 单机热备 主从复制是单向的的2个数据库服务器形成的热备模式单机热备       一旦单机热备中主节点宕机,从节点顶替,主

java架构师课程、性能调优、高并发、tomcat负载均衡、大型电商项目实战、高可用、高可扩展、数据库架构设计、Solr集群与应用、分布式实战、主从复制、高可用集群、大数据

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

mssql数据库,数据库同步,分布式数据库,数据库集群,如何实现

由于项目需要,产品的部署必须考虑到安全和灾难的解决办法.由于之前一直做的的小项目,基本都是单服务器,单数据库结构,但是由于一次灾难,把这个问题提上了日程. 本人资历浅薄,很多东西还不是很熟悉,最近在网上百度了一大堆相关的东西,基本有了大概的思路, 思路就是,      1..用多个服务器做集群,做压力负载均衡,这样第一可以分流,减轻每个服务器的压力,提高稳定性,再者就是,一个服务器崩溃了,其他服务器可以继续运行.提供服务. 2..做文件同步式,自动把多台服务器上的一些特殊文件夹做文件同步,比如一

36套精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程

新年伊始,学习要趁早,点滴记录,学习就是进步! QQ:1225462853 视频课程包含: 36套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr集群与应用,主从复制,中间件,全文检索,Spring boot,Spring cloud,Dubbo,Elasticsearch,Redis,ActiveMQ

?Postgres-XL:基于PostgreSQL的开源可扩展数据库集群

?Postgres-XL:基于PostgreSQL的开源可扩展数据库集群 最近这一年业界去"IOE"越叫越响,很多传统企业也把去"IOE"计划摆上了桌面.我老是想不明白这些非互联网企业(比如:银行)做这种事的动力何在? 高大上的"自主可控"."振兴民族科技"等空洞口号先不去管,真正的动力在哪里? "安全"."成本"."互联网架构".......等等.等等, 唯一看起来