mysql分布式数据库适合做数据仓库么

mysql分布式数据库适合做数据仓库么,第1张

数据仓库就是数据库,只不过是按照业界不同的提法说法不同而已; 一般的数据仓库的说法是要建立一个高性能的可查询数据库,一般说来是提供高效的查询而不是交互。

从软件出发考虑:

MySQL现有的几种数据库从5.5后缺省的数据引擎是Innodb, 性能在查询上和MyISAM差不多,不过对事物的支持更加好。 如果需要建立一个有规模的数据仓库首先必须考虑查询和聚合运算的效率问题, 从MySQL内部的函数的使用效率出发选用innodb可以支持复杂的存储过程让运算集中在服务器上运行,可以高效的发挥服务器的运算性能和SQL集合运算的效率。

从平台考虑:

数据仓库的数据源可能来自不同的 *** 作系统和数据库, 怎么把数据同步到本地可以参考通用的方法,作为数据仓库需要考虑的是数据的一致性,比如一个流程的不同环节的数据来自不同的数据库,这时就需要考虑怎么来定制来保证数据的时效和一致,比如不允许第一步的数据还未进行同步,第二步的数据就已经同步到本地,这样的话后台的应用在读取数据的时候就会非常的混乱

从硬件出发考虑:

数据仓库一般是从业务数据库导出到另外一个独立数据库作为计算分析, 这样的好处在于把计算分开,避免非业务的大规模运算对正常业务的影响。即使软硬件崩溃也不会对正常业务造成影响,而数据重建只需要按照原来的方法恢复即可。在往数据仓库上同步数据的过程要灵活考虑数据同步的方法,缺省可直接使用Mysql的主从备份。 如果不想对业务服务器造成太多影响,也可以采用自己定制的方法来进行增量备份和差异备份。

从SQL的使用出发考虑:

能够交由SQL完成的工作最好全部使用SQL来完成聚合,表和表进行联合的时候先进行添加约束,和外部的程序,比如统计分析的计算,尽量让SQL输出一个计算后的数据集给后台应用。

不是很理解,比如说你3台搭建分布式,你通过什么方式区分库表?假设每台服务器上部署一个mysql实例,那你怎么把数据分布到3个mysql里面?是每个mysql里面存不同的表么?如果这样,就还可以接受。这块问题不是很大。

第二个问题,你的HA主备,意思是说两个分布式互为主备?那怎么备份,怎么切换?

其实按照你想要达到的目标。应该是每两台互做主备,形成3对主备库,然后这3对再组建一个分布式集群。

其实和你要做的可能差不多,不过逻辑上还是有差异的。HA你准备怎么做?keepalived?

另外,咨询一下,你的分布式是通过什么来实现,不同业务访问不同的数据库,每个库存不同的表?还是相同的表分布在不同数据库?

看你服务器的配置如何,其实我觉得一般来说拿3台来做备机有点浪费,如果配置允许,可以考虑做成6套mysql主备的分布式集群。

通过交叉互备实现硬件的最大利用。下图是我们之前用4台服务器做的一套集群方案。

如果还有其他问题可以和我联系。

参考: https://www.jianshu.com/p/5e0062f6cf62

图中是两组分片,红色我们称为shard1,蓝色我们称为shard2

51 52是服务器

两个3307互为主从(双主),3309是本地3307的从库

说明:没有明确说明是只在某一个节点上做的,就是两个节点都做

两台虚拟机 db01 db02

每台创建四个mysql实例:3307 3308 3309 3310

mysql软件我们之前已完成二进制安装,直接初始化即可

我们server-id规划为:db01上是7/8/9/10,db02上是17/18/19/20

"箭头指向谁是主库"

10.0.0.51:3307<-----> 10.0.0.52:3307

10.0.0.51:3309------> 10.0.0.51:3307

10.0.0.52:3309------> 10.0.0.52:3307

两个分片,每个分片四个mysql节点

shard1:

Master:10.0.0.51:3307

slave1:10.0.0.51:3309

Standby Master:10.0.0.52:3307

slave2:10.0.0.52:3309

shard2:

Master:10.0.0.52:3308

slave1:10.0.0.52:3310

Standby Master:10.0.0.51:3308

slave2:10.0.0.51:3310

shard1

10.0.0.51:3307 <----->10.0.0.52:3307

db02

db01

db02

10.0.0.51:3309 ------>10.0.0.51:3307

db01

10.0.0.52:3309 ------>10.0.0.52:3307

db02

shard2

10.0.0.52:3308 <----->10.0.0.51:3308

db01

db02

db01

10.0.0.52:3310 ----->10.0.0.52:3308

db02

10.0.0.51:3310 ----->10.0.0.51:3308

db01

这个复制用户在谁上建都行

注:如果中间出现错误,在每个节点进行执行以下命令

常见方案:

360 Atlas-Sharding 360

Alibaba cobar 阿里

Mycat 开源

TDDL 淘宝

Heisenberg 百度

Oceanus 58同城

Vitess 谷歌

OneProxy

DRDS 阿里云

我们装的是openjdk,不是官方的那个

Mycat-server-xxxxx.linux.tar.gz

http://dl.mycat.io/

配置环境变量

我们mycat的命令也是在bin目录下

启动

8066就是对外提供服务的端口,9066是管理端口

连接mycat:

默认123456

db01:

我们一般先把原schema.xml备份,然后自己新写一个:

xml和html看起来差不多,xml是从下往上调用的

前三行我们不用看,直接从第四行schema开始看起:

定义了schema,然后以/schema结尾

为什么要用逻辑库?

业务透明化

此配置文件就是实现读写分离的配置

重启mycat

读写分离测试

总结:

以上案例实现了1主1从的读写分离功能,写 *** 作落到主库,读 *** 作落到从库.如果主库宕机,从库不能在继续提供服务了。

我们推荐这种架构

一写三读,

不设置双写的原因是:性能没提升多少,反而引起主键冲突的情况

配置文件:

之后重启:mycat restart

真正的 writehost:负责写 *** 作的writehost

standby writeHost :和readhost一样,只提供读服务

我们此处写了两个writehost,默认使用第一个

当写节点宕机后,后面跟的readhost也不提供服务,这时候standby的writehost就提供写服务,

后面跟的readhost提供读服务

测试:

读写分离测试

对db01 3307节点进行关闭和启动,测试读写 *** 作

结果应为另一台(52)的3307(17)是写,3309(19)是读

一旦7号节点恢复,此时因为7落后了,写节点仍是17

balance属性

负载均衡类型,目前的取值有3种:

writeType属性

负载均衡类型,目前的取值有2种:

switchType属性

-1 表示不自动切换

1 默认值,自动切换

2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status

datahost其他配置

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">

maxCon="1000":最大的并发连接数

minCon="10" :mycat在启动之后,会在后端节点上自动开启的连接线程,长连接,好处是连接速度快,弊端是占内存

tempReadHostAvailable="1"

这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时

<heartbeat>select user()</heartbeat> 监测心跳

其他参数sqlMaxLimit自动分页,必须在启用分表的情况下才生效

创建测试库和表:

我们重启mycat后连接到8066

发现跟一个库一样,实际上已经分到不同的物理硬件上了

分片:对一个"bigtable",比如说t3表

热点数据表 核心表

(1)行数非常多,800w下坡

(2)访问非常频繁

分片的目的:

(1)将大数据量进行分布存储

(2)提供均衡的访问路由

分片策略:

范围 range 800w 1-400w 400w01-800w 不适用于业务访问不均匀的情况

取模 mod(取余数) 和节点的数量进行取模

枚举 按枚举的种类分,如移动项目按省份分

哈希 hash

时间 流水

优化关联查询(否则join的表在不同分片上,效率会比单库还要低)

全局表

ER分片

案例:移动统一:先拆出边缘业务,再按地域分片,但对应用来说是统一的

vim rule.xml

<tableRule name="auto-sharding-long">

<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>

</rule>

<function name="rang-long"

class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long.txt</property>

</function>

===================================

vim autopartition-long.txt

0-10=0

11-20=1

创建测试表:

mysql -S /data/3307/mysql.sock -e "use taobaocreate table t3 (id int not null primary key auto_increment,name varchar(20) not null)"

mysql -S /data/3308/mysql.sock -e "use taobaocreate table t3 (id int not null primary key auto_increment,name varchar(20) not null)"

测试:

重启mycat

mycat restart

mysql -uroot -p123456 -h 127.0.0.1 -P 8066

insert into t3(id,name) values(1,'a')

insert into t3(id,name) values(2,'b')

insert into t3(id,name) values(3,'c')

insert into t3(id,name) values(4,'d')

insert into t3(id,name) values(11,'aa')

insert into t3(id,name) values(12,'bb')

insert into t3(id,name) values(13,'cc')

insert into t3(id,name) values(14,'dd')

取余分片方式:分片键(一个列)与节点数量进行取余,得到余数,将数据写入对应节点

vim schema.xml

<table name="t4" dataNode="sh1,sh2" rule="mod-long" />

vim rule.xml

<property name="count">2</property>

准备测试环境

创建测试表:

mysql -S /data/3307/mysql.sock -e "use taobaocreate table t4 (id int not null primary key auto_increment,name varchar(20) not null)"

mysql -S /data/3308/mysql.sock -e "use taobaocreate table t4 (id int not null primary key auto_increment,name varchar(20) not null)"

重启mycat

mycat restart

测试:

mysql -uroot -p123456 -h10.0.0.52 -P8066

use TESTDB

insert into t4(id,name) values(1,'a')

insert into t4(id,name) values(2,'b')

insert into t4(id,name) values(3,'c')

insert into t4(id,name) values(4,'d')

分别登录后端节点查询数据

mysql -S /data/3307/mysql.sock

use taobao

select * from t4

mysql -S /data/3308/mysql.sock

use taobao

select * from t4

t5 表

id name telnum

1 bj 1212

2 sh 22222

3 bj 3333

4 sh 44444

5 bj 5555

sharding-by-intfile

vim schema.xml

<table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" />

vim rule.xml

<tableRule name="sharding-by-intfile">

<rule><columns>name</columns>

<algorithm>hash-int</algorithm>

</rule>

</tableRule>

<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">

<property name="mapFile">partition-hash-int.txt</property>

<property name="type">1</property>

<property name="defaultNode">0</property>

</function>

partition-hash-int.txt 配置:

bj=0

sh=1

DEFAULT_NODE=1

columns 标识将要分片的表字段,algorithm 分片函数, 其中分片函数配置中,mapFile标识配置文件名称

准备测试环境

mysql -S /data/3307/mysql.sock -e "use taobaocreate table t5 (id int not null primary key auto_increment,name varchar(20) not null)"

mysql -S /data/3308/mysql.sock -e "use taobaocreate table t5 (id int not null primary key auto_increment,name varchar(20) not null)"

重启mycat

mycat restart

mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB

insert into t5(id,name) values(1,'bj')

insert into t5(id,name) values(2,'sh')

insert into t5(id,name) values(3,'bj')

insert into t5(id,name) values(4,'sh')

insert into t5(id,name) values(5,'tj')

a b c d

join

t

select t1.name ,t.x from t1

join t

select t2.name ,t.x from t2

join t

select t3.name ,t.x from t3

join t

使用场景:

如果你的业务中有些数据类似于数据字典,比如配置文件的配置,

常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,

而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,

要在所有的分片上保存一份数据即可,Mycat 在Join *** 作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,

避免跨库Join,在进行数据插入 *** 作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。

vim schema.xml

<table name="t_area" primaryKey="id" type="global" dataNode="sh1,sh2" />

后端数据准备

mysql -S /data/3307/mysql.sock

use taobao

create table t_area (id int not null primary key auto_increment,name varchar(20) not null)

mysql -S /data/3308/mysql.sock

use taobao

create table t_area (id int not null primary key auto_increment,name varchar(20) not null)

重启mycat

mycat restart

测试:

mysql -uroot -p123456 -h10.0.0.52 -P8066

use TESTDB

insert into t_area(id,name) values(1,'a')

insert into t_area(id,name) values(2,'b')

insert into t_area(id,name) values(3,'c')

insert into t_area(id,name) values(4,'d')

A

join

B

为了防止跨分片join,可以使用E-R模式

A join B

on a.xx=b.yy

join C

on A.id=C.id

<table name="A" dataNode="sh1,sh2" rule="mod-long">

<childTable name="B" joinKey="yy" parentKey="xx" />

</table>


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7403522.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存