栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

数据切分的设计方案

数据切分的设计方案

文章目录

1. 数据的切分实现方式

1.1. 垂直切分1.2. 水平拆分1.3. 整体方案总结 2. MyCat的整体分析

2.1. MyCat的内部逻辑2.2. MyCat实现数据分库分表 3. MyCat安装应用4. MyCat分库分表配置

4.1. server.xml4.2. schema.xml4.3. schema相关操作 5. MyCat的分片规则

5.1. 枚举分片5.2. 取模分片5.3. 创建一个时间分片规则5.4. MyCat全局表的概念5.5. MyCat子表管理 6. MyCat安全机制

6.1. 用户权限的配置6.2. 黑白名单 7. MyCat如何进行集群操作


1. 数据的切分实现方式

简单来讲,就是讲存放在一台数据库上的数据分布到多台数据库上,形成了一个分布式数据库,大致我们数据的拆分方式分为两种

1.1. 垂直切分

常用于我们的微服务设计中,不同的业务领域存放不同的表,比如用户模块存放我们用户相关表,外部调用通过服务访问用户模块,用户模块再去访问对应的数据库

跨库来实现我们数据的join连接,就会导致查询性能极大的下降

垂直切分的优缺点

优点

拆分后业务更清晰,规则明确系统之间耦合降低,便于扩展数据维护简单

缺点

部分业务表无法join,只能通过接口调用,提升了系统的复杂度跨库事务处理是个问题(2PC,程序端解决2PC-seata)垂直切分以后,某些业务数据依旧庞大,依然会存在单体性能瓶颈 1.2. 水平拆分

明确的id查询是通过表的存入规则来进行匹配,如果是范围查询,将数据在两个表都进行查询然后进行业务合并

优点

解决了单库大数据,高并发的问题,实现数据的分布式拆分规则只要封装好,开发人员不用考虑拆分细节提升了系统的稳定性和负载能力

缺点

拆分规则不太好抽象分布式事务一致性不好解决二次扩展的时候、数据迁移、维护难度都比较大 1.3. 整体方案总结

垂直和水平都要面临的问题(一定是先垂直后水平)

分布式事务问题跨库join问题多数据源的问题拆分合并的问题

针对多数据源的管理问题,主要有两种思路

1、客户端模式:只要需要配置好底层的数据源,然后在程序上直接访问即可

2、中间代理模式:由中间代理管理所有数据源,开发人员完全不用关心底层数据源是什么,在哪里,开发人员不用关系拆分规则

基于这两种模式对应的成熟的三方中间件

中间代理模式:MyCat(相当于一个分布式数据库,而我们的MySQL只是他的一个存储仓库)客户端模式:sharding-jdbc(统一的数据源,由他管理不同的数据链接) 2. MyCat的整体分析 2.1. MyCat的内部逻辑

逻辑库(Schema)

将分开的物理库合并的一个逻辑数据库

逻辑表(table)

逻辑表就是物理表的总和

只要进行了水平切分就是一个分片表,没有切分的就是非分片表

通过冗余方式复制到所有分片表所在库的表就叫全局表

分片节点(dataNode)

数据表被分片到不同的分片数据库上,每个分片表所在的库就叫数据节点

分片主机(dataHost)

所有分片数据实际存放的物理数据库

分片规则(rule)

MyCat有很多分片规则,基本够用,自己本身是用Java开发的

全局序列号

UUIDsnow id 2.2. MyCat实现数据分库分表 3. MyCat安装应用

http://www.mycat.org.cn/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49YRnM5c-1642657343109)(数据切分的设计方案.assets/image-20200624200530686.png)]

这是MyCat的物理结构,MyCat本身是不存储数据的

# 需要提前安装两个数据库:这两个数据库是独立,不能是主从关系
# 0.下载mycat
wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
# 1.解压
tar -xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
# 2.配置server.xml
cd /usr/local/mycat/mycat/conf
vi server.xml

进入server.xml我们去到底部先看用户权限


  123456
  user_module,cart_module,product_module

开始配置逻辑库:schema.xml

先配置两个物理主机

        
                select user()
                
                
        
        
                select user()
                
                
        

配置dataNode的数据节点,这里的database是我们的物理存放数据的数据库名

        
        

配置schema节点,schema节点的name是server.xml里配置逻辑库名,要对应

table节点里配置的name是物理数据库存放的实际表名


  
  

现在去两个物理数据库创建两个库user_213,user_214和两个表user_info

CREATE TABLE `user_info` (
  `id` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

启动MyCat

# 报错
jvm 1    | Caused by: io.mycat.config.util.ConfigException: Illegal table conf : table [ USER_INFO ] rule function [ rang-long ] partition size : 3 > table datanode size : 2, please make sure table datanode size = function partition size

# 根据分片规则去找具体的分片策略
vi rule.xml
# 找到这个规则 auto-sharding-long
        
                
                        id
                        rang-long
                
        
	
        
                autopartition-long.txt
        

vi autopartition-long.txt
0-2000000=0
2000001-4000000=1
4000001-8000000=2
# K=1000,M=10000
# 需要根据dataNode设置节点数
4. MyCat分库分表配置 4.1. server.xml

MyCat用户名,密码,权限,Schema关系

如果一个用户下右多个Schema就以csv格式来写入

多个schema就需要在schema.xml里配置多个组schema

mysql -umycat -p -h192.168.0.211 -P8066
4.2. schema.xml

配置dataHost,包括写host和读host配置dataNode,指定具体的数据库配置schema,表名,数据节点,分片规则

dataHost节点


# name:主机名,自己命名即可
# maxCon:最大连接
# minCon:最小链接
# balance:负载均衡策略,值有4个
# 1. balance="0",不开启读写分离,所有的操作都在writeHost上操作
# 2. balance="1",全部的readHost与stand by writeHost参与select数据的负载均衡
# 3. balance="2" 所有的读操作会随机writeHost和readHost
# 4. balance="3" 所有的读操作都会随机分发到readHost,writeHost不参与读操作
双主也需要我们自己进行replica,mycat平时只写入一个主机
# writeType 写数据类型
# 1. writeType="0",所有写操作都会发送到配置的第一个writeHost,如果第一个挂了就会自动切到第二个writeHost配置上
# writeType="1",所有的写操作会随机到writeHost上,1.5版本后不推荐
# switchType 切换类型配套我我们的writeType来进行操作的
# -1 表示写操作不自动进行切换
# 1 默认值,自动切换,从第一个到第二个writeHost
# 2 基于MySQL的主从同步的状态决定是否切换

dataNode节点


# name:节点名
# dataHost:对应dataHost的名字
# database:是物理数据库的保存名称

schema节点


		
# name:在server配置里定义的逻辑库名 # checkSQLschema:如果是true会自动去掉数据库前缀 # sqlMaxLimit:为了减轻数据库压力,做的输出限制,默认限制100行 # sqlMaxLimit仅对分片表有效 # table name:物流表名 # rule就是分片规则 4.3. schema相关操作

看下启动命令

Usage: ./mycat { console | start | stop | restart | status | dump }

修改完配置后不需要重启mycat就能使用?

# 更改一些基本配置可以使用脚本操作
# 比如更改了limit就可以使用
reload @@config;
# 比如更新了数据源就需要通过config_all来进行操作了,但这里是更新所有配置,比较慢
reload @@config_all;

模拟一个读写分离的操作

        
                select user()
                
                
                   
                
                
        

做一个双主的写操作配置

        
                select user()
                
                
                
                 
        

作业1:自己配置两个双主的writeHost,每个writeHost上挂载一个readHost

5. MyCat的分片规则 5.1. 枚举分片
# columns对应我们的分片列名
				
                
                        type
                        hash-int
                
        

# 加入了默认的配置项
        
                partition-hash-int.txt
                0
        
        
# 枚举规则
vi partition-hash-int.txt
10000=0
10010=0
10020=0
10001=1
10011=1
10021=1
DEFAULT_NODE=0
# 修改schema
        
                
                
5.2. 取模分片
# 拿id做取模分片
				
                
                        id
                        mod-long
                
        
# 根据节点数取模
        
                
                2
        
# 修改schema文件
        
                
                
5.3. 创建一个时间分片规则
# 创建表
CREATE TABLE `login_info` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `login_date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 在rule.xml中创建一个新的时间规则
        
                
                        login_date
                        my-sharding-by-date
                
        
# 增加一个function
        
                yyyy-MM-dd
                2020-06-20
                2020-06-23
                1
              
# cloumns:分区字段
# algorithm:指定分片算法
# dateFormat:日期格式
# sBeginDate:开始时间
# sEndDate:结束时间
# sPartionDay:分区的大小,1代表一天分一个,如果超过结束时间则循环写入
5.4. MyCat全局表的概念

对于数据量不大的基础配置表就没必要横向拆分

5.5. MyCat子表管理

比如我们的订单信息,一般分为订单info表,订单item表,这两个表即便是按照一样的分区规则,也有可能到导致数据去到不同库,这个时候就会导致跨库

# 创建两个关联表
CREATE TABLE `order_info` (
  `id` int(11) DEFAULT NULL,
  `order_total` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `order_item` (
  `id` int(11) DEFAULT NULL,
  `order_id` int(11) DEFAULT NULL,
  `product_name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 修改schema
6. MyCat安全机制 6.1. 用户权限的配置
vi server.xml

  123456
  user_module
  true
  1

# readOnly只读设置
# benchmark:当链接达到这里设置的值就拒绝访问,0或不设置就是不拒绝

schema中的表的操作权限


    123456
    user_module

    
    
    
        
# insert(0/1),update(0/1),select(0/1),delete(0/1) 基于schema下的表的具体权限
6.2. 黑白名单
# 先设置白名单

    
      	
      	
    

# 黑名单

    
      	
    
    
    		false
    

# 黑名单的权限配置项,是允许用户进行操作
selectAllow true/false
deleteAllow true/false
updateAllow true/false
insertAllow true/false
7. MyCat如何进行集群操作

MyCat对于每个数据节点都可以实现HA和负载均衡,所有数据节点形成了一个分布式的数据库

如果MyCat作为一个中间层挂了怎么办?

如果要对MyCat进行集群化:MyCat是不是无状态的节点?

Nginx/HAProxy/Lvs/SLB + MyCat

如果多个MyCat,你的配置如何同时更新:zookeeper帮助我们进行配置的统一管理

# 1.修改conf下的myid.properties
loadZk=true
zkURL=192.168.0.215:2181
clusterId=mycat-cluster-1
myid=mycat_fz_01
clusterSize=2
clusterNodes=mycat_fz_01,mycat_fz_02
#server  booster  ;   booster install on db same server,will reset all minCon to 2
type=server
boosterDataHosts=dataHost1

# 2.将之前单机的配置 server.xml,schema.xml,rule.xml,autopartition-long.txt
# 将这些修改后的配置文件传输到mycat/conf/zkconf目录下来做上传使用

# 3.执行zookeeper配置的同步脚本,在mycat/bin目录下
./init_zk_data.sh
# 报错
-bash: ./init_zk_data.sh: /bin/bash^M: bad interpreter: No such file or directory
# 修改一下命令
sed -i 's/r$//' init_zk_data.sh
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号