mysql可扩展第二部分

Wesley13
• 阅读 605

  数据分片主要是将数据按照一定的规则分为几个完全不同的数据集合的方式成为数据分片。数据的切分可以是数据库内的,将数据库中的一张表切分为几个不同的数据库表。也可以是数据库级别的,将数据库中的表划分为多个表,这些表存储在不同的数据库服务器上。该部分主要用来介绍数据库级的数据分片。切分规则将具有相关的数据保存在同一个分片上可以提高数据查询效率。数据库分片的路由规则可以是应用程序或者数据库层和应用层之间的管理层进行分片。

  分片的结构图:

  mysql可扩展第二部分

  数据进行分片时需要考虑对以后的数据维护,一般在分片时满足以下集中情况:

  1、要很容易的移动分片。

  2、由于一个服务器上有多个分片,所以要比较容易的识别分片,并且分片命名要有规则。

  3、可以单独复制分片到其他服务器。

数据分区

选择分区键

    选择分区键需要考虑一下几个因素:

    1、在哪里存储数据

    2、从哪里取到希望得到的数据

  一个好的分区键时一个数据库中一个分厂重要的实体主键,这些键值决定了分片单元。

    在选择分区键的时候需要避免以下几种情况发生:

    1、选择那些能够避免跨分片查询,能够使分片足够下,避免足够过大的分片导致问题。

    2、尽量使分片分布均匀。

多个分区键

  在有多个查询类型时,可以设置多个分区键对数据进行分片。

在节点上部署分片

数据在分区时需要将相关的数据保存在一个分片上,保证数据操作的高效性。数据分片需要一个合适的分片键,在选择分区键以后,可以通过两种模式实现数据分区:

静态分区模式

    静态分区是通过哈希函数对分区键中的值进行哈希值计算,通过哈希值来判断数据存储的分片。或者通过id字段进行分区,id值在09999在分片1上,1000019999在分片2上。但是静态分片不是很灵活,在对数据重新分片后,需要修改应用层的路由规则。

动态分区模式

    通过一个数据中心存储分片与数据的关联关系,可以通过数据中心实现动态分配。但是在进行数据操作时,需要首先访问数据中心中的分片与数据的关系。动态分片比较灵活,在进行重新分片时,将数据重新重新分片后,对共享数据中心的分片信息重新配置即可。

  混合分区模式

分片之间的均衡

移动分片

分片间移动数据

  分片实例

静态分片

    现在有一个需求,用户可以发表博文也可以对博文进行评论。相关的数据库表如下:

    create table user(userid,password,name)

    create table articles(article_id,author_id,published,body)

    create table comments(comment_id,for_article,author_name,added,body)

    人员信息如果在1亿条范围内,无需分片,但是随着发表的博文越来越多,需要对博文和回复进行分片处理,分片的命名可以以shard为基础,并加上分片号,如shard_123。为了能够高效的对数据操作,可以将同一个人员的所有博文保存在同一个分片上,将同一篇博文的相关回复保存在同一个分片上。分片键可以为用户id(userId)也可以为博文id(articleid)。

    通过用户id获取分片号,获取到分片号后对该用户的博文进行操作。

    通过博文id获取分片号。对分片上的博文和回复进行操作。

动态分片

如果某一天的一个人发表了一些比较有趣的博文,引起了很多人的关注,导致该人所在的分片变得较“热”,从而使该分片上的数据查询和操作变得较慢,数据库性能下降。如果在静态分片的模式下要想实现数据分片在节点间移动,比较困难。此时需要借助动态分片实现数据的移动。

    现在需要新加几个数据库表实现动态分片:

    create table user(user_id,name,shard,primary key(user_id))

    create table shard_to_node(shard,host,port,sock,Key(shard))

    create table article_author(user_id,author_id,primary key(article_id))

    在user数据库表中查询出该人员的博文和回复所在的分片,通过分片与节点的映射表shard_to_node查询出该分片所在的节点,通过返回的结果中的分片和节点信息对博文和回复进行查询。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
京东面试官:呦,你对中间件 Mycat了解的还挺深~
1.数据切分概念数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)(https://jq.qq.com/?wv1027&k0IsBuUb0)之上,这种切可以称之为数据的垂直(纵向)切分;另外一则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Easter79 Easter79
3年前
Springboot2.x + ShardingSphere 实现分库分表
之前一篇文章中我们讲了基于Mysql8的读写分离(文末有链接),这次来说说分库分表的实现过程。概念解析垂直分片按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的
Stella981 Stella981
3年前
Mycat适配oracle,各种坑
注:文中使用版本为Mycat1.6.5。1、Mycat正如官方所说,Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。由于前面讲的对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。当然,Mycat没有自己的存储引擎,并
Wesley13 Wesley13
3年前
MongoDB 分片管理(一)检查集群状态
一、检查集群状态1.1使用sh.status()查看集群摘要信息1、使用sh.status()可以查看分片信息、数据库信息、集合信息sh.status()如果数据块较多时,使用sh.status(true)又是输出会很多,就不会截断,要使用如下查看2、tooman
Wesley13 Wesley13
3年前
thinkphp 基本配置
12returnarray(34//定义数据库连接信息5'DB\_TYPE''mysql',//指定数据库是mysql67'DB\_HOST''localhost',89'DB\_NAME''uchome',//数据库名1011'DB\_USER''root