当前位置:首页 » 数据仓库 » 数据库不停扩容会怎么样
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库不停扩容会怎么样

发布时间: 2022-10-03 13:33:01

1. 数据库id自动增长,数据不停的删除和插入,这样的话id字段会不断的变大,直到溢出这个问题是怎么解决的

这个看情况了,首先看看是不是有使用自增列的必要,如果有必要前期要有预见性,对于可能会出现溢出的情况,则尽量使用bigint类型,当然这个要多占用存储空间。如果删除操作比较规则,比如会定期删除较早的数据,那么可以在id即将溢出的时候重置种子,从头开始自增,如果不能循环使用id值得话只能在即将溢出的时候修改表,用更大的数据类型来作为自增列的类型,这个过程因为涉及大量的数据更新插入操作,速度会很慢,通常尽量避免。如果id快溢出了,最好新建一个表来存储新增的数据。

2. 企业数据运维场景复杂会带来什么风险呢

在安华金和公众号文章里看到说在数据运维场景中,分两个方向考虑,一个是数据运维场景复杂,一个是运维人员权限宽泛。随着企业发展,机房建设、人员波动、业务系统扩容会变得愈加频繁,带来了复杂的运维场景,例如公用数据库账号、公用运维主机、公用的操作系统账号等;与此同时,数据的运维管理工作仍是传统的“企业运维人员+一大堆第三方厂商人员”模式。面对如此复杂、混乱的运维场景,如果不具备有效的、细粒度的管控能力,那么诸如数据被误操作、恶意批量删除、高权限用户的滥用、敏感数据的泄露等数据安全事件的发生,将难以避免,并对企业造成不可估量的经济损失与声誉损害。我知道安华金和有专门针对数据库运维场景的管控产品,你去问问他们~

3. 超详细Mysql数据库优化

数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷.

1. 优化一览图

2. 优化

笔者将优化分为了两大类,软优化和硬优化,软优化一般是操作数据库即可,而硬优化则是操作服务器硬件及参数设置.

2.1 软优化

2.1.1 查询语句优化

1.首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息.

2.例:

显示:

其中会显示索引和查询数据读取数据条数等信息.

2.1.2 优化子查询

在MySQL中,尽量使用JOIN来代替子查询.因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高.

2.1.3 使用索引

索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:

2.1.4 分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,

2.1.5 中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时.

2.1.6 增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询.

2.1.7 分析表,,检查表,优化表

分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费.

1. 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;

2. 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]

option 只对MyISAM有效,共五个参数值:

3. 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志.,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁.

2.2 硬优化

2.2.1 硬件三件套

1.配置多核心和频率高的cpu,多核心可以执行多个线程.

2.配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度.

3.配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力.

2.2.2 优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能.MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数.

2.2.3 分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

2.2.4 缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计.因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了.

4. 如何进行mysql的动态扩容和缩容

mysql在线扩容和缩容一般涉及到的内容,主要包括三个方面,1.在线也就意味着需要把增量的数据重新分布到新的拓扑结构中,我们一般称做增量复制,2.原有的数据需要一条不漏的扫出来重新分布到新的拓扑结构中,这个一般叫做全量复制,3.全量做完,增量正在同步,把应用的数据路由拓扑切到新的路由拓扑上来,并且做到无数据丢失,这个我们叫做停写切换。做好这三个方面的工作,能够达到的效果就是应用在最后切换数据分布拓扑的时刻,只要停写非常短的时间(秒级别)就能够做到无数据丢失的扩容和缩容。

增量同步一般有2种方式,一种是应用端或者数据库前端做trigger,记录变更数据的特征值log(比如pk,sharding key),然后异步复制到新的拓扑结构中。另外一种方式是通过分析mysql的binlog再进行不同数据拓扑的复制。两者本质上来说应该是一样的,后者可能更加简便,并且对应用无侵入,前者虽然也能够做到,实际实现或者推广和操作上都有不少阻力,最起码解析binlog方式是mysql一上去,更新的log已经天然存在与binlog中了。

增量同步的两种方式如果要考虑到同步的可伸缩性(也就是多台机器可以同时消费相同的变更日志),需要在原数据中添加数据的版本信息防止更新乱序,或者通过唯一键进行复制机器的sharding,也就是不同进程(线程)同时消费相同的更新日志,必须让同一条记录的更新落在同一个线程里面,如果还需要保证复制的事务,那么实现会非常复杂,一般不会去支持多线程下复制的事务。

全量复制,也就是扫描需要复制的表的数据进行重新分布,主要存在的问题是复制速度和对数据库的写入压力的矛盾,其实能够做到整个拓扑连数据库都全部换掉,来达到对正在使用数据库的0影响,这个是一种可行的方案,另外是分时段调整复制线程数,一般单线程复制对于数据库的影响不会很大,在凌晨再转换成多线程方式达到提速的目标。

扩容或者缩容在最后阶段如何切换,这个涉及到的问题主要是如何避免新更新进来以至于增量没完没了,方式有很多,最简单的方法就是停掉应用,一般时间只有几分钟是可以接受的。另外一种是逻辑停写,因为我们迁移的时候是有一个规则去重新散列数据,也就是如果新的规则和旧的规则两者算出来的结果不一致,那么这个数据就是需要被迁移的,如果在停写的时刻,向前端抛错即可。逻辑停写最大的好处就是避免PE的介入,并且配合动态的数据路由数据推送,可以完全避免重新发布达到扩容或者缩容,这个就是真正的在线扩容,停写不可避免(等待延迟的增量同步完成),但是不影响读。

数据扩容或者缩容,我们觉得不应该排入业务的开发日程中,而是由数据管理团队对应用透明地进行这种操作,最后介入的人员只是DBA而已。但是不像一些nosql一样按容量或者完全透明的split,数据库的sharding还是按照应用的数据特性(pk,user_id,gmt_create等等不同字段,自选策略)进行sharding,应用知道他们的某条数据具体存在哪个机器哪张表上,这个无论对于开发还是测试或者DBA都是一件不错的事情。