前段时间看了一下Mysql数据库切分方面的知识,感觉某些点还挺有技巧的,决定小小的对自己所看的知识点进行一下总结。
随着企业的不断发展,需要存储的数据不断加大,以往把数据放在单一的数据库中的做法越来越成为存取数的瓶颈,因此就对数据库提出了以下的一些要求:
1、为了降低单台数据库
负载,引入数据库切分。
2、考虑到大多数数据库操作大都“多读少写”,因此,在数据库中引入“读写分离”机制。
3、为了数据库容灾,在数据库中引入备库的思想。
基于以上需要mysql数据库可以从以下几方面入手进行改造:
一、数据库水平切分
考虑一个情况,
一个表中现在有5000w条数据,在这个表中增加(insert)一条新的数据,insert完毕后,数据库会针对这张表重新建立索引,5000w行数据建立索引的系统开销是不容忽视的。因此为了解决以上问题,我们引入了第一个数据切分的方式:
数据库内的水平切分。这种切分方式是
对数据通过一系列的切分规则,将数据分布到一个数据库的不同表中,比如将article分为article_001,article_002等子表,若干个子表水平拼合有组成了逻辑上一个完整的article表。但是这种方式仍然将读取限定在了一台数据库,因此由此产生了另外一种切分:
物理上的水平切分,即将数据分布到不同的DB服务器上,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。
那通过哪些方法能够将数据库拆分呢,总结了下,主要有几下几点:
1、按号段分:即按照某一个字段的区间来分库、分表,如用户表,可按照Id为1——100的用户存放在 DB1,Id为101——200的用户存放在 DB2。这样做的优点是具有方便的迁移性,可以方便的将数据库进行拆分;但缺点是数据分布不均。
2、hash取模分:
将数据按照某种规则进行hash运算,结果作为存到哪个库、哪个表的依据。这种分库、分表的
优点是数据可以分布的很均匀;但这种方式的缺点同样突出,首先是数据迁移时会很麻烦,同时由于数据分配很均衡也就导致了数据并不能按照机器性能分摊。
3、在认证库中保存数据库配置:即创建一个中心库,存放了数据路由的规则,每条数据到底存放在什么位置,中心库中都能够有记录。这种方式优点是灵活性强,具有一对一的关系;但缺点是每次查询之前都要多一次查询,性能大打折扣。
二、数据库的读写分离策略
由于数据库大多是“多读少写”的,同时由于写数据存在锁表的机制,因此在数据库集群内可以采用“读写分离”的机制来提高性能。具体做法是:在数据库集群内部制定一台数据库为master,另外几台为slave,并都与master通信,对数据库所有的写操作都在master端发生,而其他slave与master共同来负责读的任务,当master端写完数据后将数据传递给slave(其实是slave向master请求),这样就能做到数据的一致性。利用这种机制分散了对数据库读的负载,同时也能够控制写数据时锁表对数据库的影响。其中把数据从master端复制到slave端的操作由mysql的replication机制保证。
mysql的replication机制:
replication机制的步骤如下图所示:
1、首先master在其配置中打开bin log,然后slave通过i/o线程链接到master,请求master传递bin log日志,同时请求中包括了此次需要的日志的起始标志位。
2、master收到请求后从接收到的标志位开始给slave返回内容,同时返回此次日志发送到达的记录位置,作为一下次slave请求的起始标志位。
3、slave将得到的内容记录在relay log中,同时受到的起始位置信心记录在mysql的master-info文件中。
4、另外开启一个线程,解析日志,并执行,这样master端的数据都都同步到了slave端。
其中3、4步骤是同时执行。
因此记录到relay log的信息是不断的执行,然后擦除的,
所以中继日志的开销很小,并
通常将其存入OS的缓存中,。
但是复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
那从master端到底是复制什么内容到slave端了,一般有两种类型:
1、基于语句的复制:指日志中记录的是master端执行过的写数据库的sql语言,然后slave获取到这些sql语言后再次在自己的数据库中执行一次。这样做的好处整个复制去slave端的内容数据量小,而且清晰易懂。但由于sql中存在着now()等函数,带有这种函数的sql传递到slave端执行时now()值早已变化了,因此对着这种情况此种复制方法需要特殊处理。
2、基于记录的复制:指日志中记录的是实际数据的改变,然后复制到slave端后只需执行相应的改变即可,这样的好处是对于某些语句高效,缺点是日志不直观。
e.g 1 :
mysql> INSERT INTO summary_table(col1, col2, sum_col3) values
SELECT col1, col2, sum(col3) FROM enormous_table GROUP BY col1, col2;
对于这种sql语句,显然第二种复制方式对于slave数据库来说更为高效。
e.g 2 :
mysql> UPDATE enormous_table SET col1 = 0;
而对着这种sql语言,第一种复制方式就只用执行一次sql语句即可,而第二种方式需要依次改变
enormous_table表的每条记录,因此第一种更为高效。
其实,仔细想想,以上的replication机制会存在问题,假设,当master端已经更新了数据A,但是还没有来得及传递到slave端,而此时两个读请求同时请求到master和slave的数据A,这样两个请求获取到得数据A将是不同的,这样就会产生“脏数据”的问题。这个问题是读写分离中遇到的最常见的问题之一,为了解决这个问题,可以采用mysql提供的proxy机制。
mysql提供的proxy机制:
proxy是
一个位于client端和mysql的server端的小程序,是一个连接池,用lua脚本实现。
proxy的处理过程对于client端透明,client只需要把链接数据库的ip和端口改成proxy服务器的就行。
1、解决读写分离:client端请求时,
proxy
截取出当前的请求是insert、update还是select,然后把 insert和update请求发送到Master中,把select请求发送到Slave中,这样就解决了读写分离的问题。
2、同步延迟:在master端增加只含有一个字段的自增表,当master端有数据更新时便向自增表更新记录。同时slave端也存在一个自增表,当Client通过Proxy进行数据读取时,Proxy可以先向Master和Slave的 Count_table表发送查询请求,当二者的数据相同时,Proxy可以认定 Master和Slave的数据状态是一致的,然后把select请求发送到Slave服务器上,否则就发送到Master上。如下图所示:
通过以上方式就能避免同步延迟产生的脏数据。
- 大小: 21.2 KB
- 大小: 33 KB
分享到:
相关推荐
MySQL 规则持久化则是 Sentinel 功能的一个重要组成部分,它确保了在系统重启或者故障恢复后, Sentinel 的规则能够被正确地加载,从而维持服务的稳定运行。 在本项目中,"sentinel-mysql规则持久化" 是一个将 ...
关于mysql中的innodb存储引擎的索引机制简介,详细介绍了锁机制
Prometheus通过其服务发现机制来找到MySQL实例,然后通过导出器(如`mysqld_exporter`)将MySQL的指标暴露出来。mysqld_exporter是一个能够收集MySQL服务器状态信息的代理,它将这些信息转换为Prometheus可以理解的...
MySQL切分查询是一种优化大数据处理策略,特别是在执行大型数据操作如删除、更新或者插入大量记录时,为了提高系统性能和避免一次性对数据库造成过大压力,通常会采用分批处理的方式。这种技术尤其适用于那些可能...
prometheus监控规则大全 node规则,redis监控,es监控,vmware监控,ipmi监控,ceph监控,etcd监控,k8s监控,mysql监控,openstack监控,os监控,交换机监控,windows监控,cdh监控,calico监控规则监控
非常实用的mysql优化规则,问题:,若是能够恰当的使用sql规则,便能极大提高系统的效率。那么如何实现sql语句和表的优化呢?
MySQL 的备份和恢复机制 MySQL 的备份和恢复机制是数据库管理的重要组成部分。好的备份和恢复机制可以帮助数据库管理员快速恢复数据库,以减少数据丢失和业务中断的风险。本文将讲解 MySQL 的备份和恢复机制,以及...
### MySQL 数据库水平切分的实现原理解析 #### 第1章 引言 随着互联网技术的迅猛发展,海量数据的存储与访问已成为系统设计的关键挑战之一。在高流量应用场景中,例如大型电商平台或社交网络平台,每日数十亿次页面...
MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 MySQL如何实现的索引机制.mp4 ...
本资源是对sentinel-1.8.1中的代码进行修改,可以将规则文件持久化到数据库。下载本包后修改sentinel-dashboard模块中的application.properties中的数据连接地址就可以连上数据库,代码中的sql数据在该模块的sql文件...
MySQL 面试问题及其简要答案
MySQL 事件调度器是 MySQL 中的一种机制,可以根据指定的时间间隔执行特定的 SQL 语句。事件调度器有两个优点:一是可以用于定期统计、清理、检查等操作;二是可以提高数据库的自动性和可靠性。但是,事件调度器也...
sentinel规则持久化到msql,限流、降级、热点,授权什么的都基本实现了, 这是一个项目压缩包,解压后,修改数据库地址, 需要监控的项目中还需要配置一下 yml spring: cloud: sentinel: transport: dashboard:...
7.1 MySQL锁定机制简介 7.2 各种锁定机制分析 7.3 合理利用锁机制优化MySQL 7.4 小结 第8章 MySQL数据库Query的优化 8.0 引言 8.1 理解MySQL的Query Optimizer …… 第9章 MySQL数据库...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
首先,安装数据库,然后将mysql-connector-java-5.1.21-bin.jar文件拷贝到一个目录下,任意即可,放在MySQL下更好,然后到classpath配置环境,将 此文件追加到后面。最后,在工程的webContent的web-Inf下找到lib...
Oracle和MySQL作为两个主流的关系数据库管理系统,在空间回收机制上有着显著的差异。本文将深入探讨Oracle和MySQL在数据库空间回收机制上的差异,并提供实际的代码示例。 Oracle和MySQL在数据库空间回收机制上各有...
MySQL的水平和垂直切分是数据库优化的重要策略,主要用于应对数据量大、访问压力高的情况。这两种切分方法都是为了提高数据库的性能和可扩展性。 **垂直切分**是根据表中的字段来划分,目的是减小单个表的大小和...