首页 > 数据库 >关系数据库扩展知识总结

关系数据库扩展知识总结

时间:2023-09-14 14:37:37浏览次数:48  
标签:总结 分区 扩展 代理服务器 关系数据库 服务器 日志 数据库


最近在学习分布式数据库架构相关的知识(主要是Mysql),并对数据库扩展这部分知识整理总结了一下,希望对看到的人有所帮助,也希望读者能多提建议。


-----------------------------------------------------------


关系型数据库扩展的几个步骤:


一、第一步:主从复制+读写分离


1.Mysql数据库主从复制是依据主服务器的二进制日志进行的.


2.主服务器中日志记录的操作会在从服务器中进行重放,从而实现复制.所以主服务器必须开启二进制日志.


这种复制是异步进行的,从服务器定时向主服务器请求最新日志,主服务器通过I/O线程来读取本地二进制日志,并传输给从服务器。


3.多级复制:


当存在多个从服务器同时从一个主服务器进行复制的时候,主服务器的磁盘压力会有不同程度的增长。可以采用多级复制策略解决。即Master <- Slave <- Slave模式。


4.在主服务器上对更新操作记录二进制日志,这部分性能消耗很少,差不多1%的性能影响.


5.读写分离:


将所有写操作作用于主服务器,将所有读操作作用于从服务器(前提是主从复制)。


但是把读操作平均分配到多台服务器上,应用程序不容易实现,如果某台服务器宕掉了,应用程序也不容易发现。


6.数据库反向代理服务器(Mysql Proxy、Amoeba等...)。


应用程序只需要跟反向代理服务器通信即可。


使用代理服务器可以对多个从服务器实现负载均衡和可用性检测。


关于反向代理服务器(个人理解,欢迎大家指正):


从外网访问内网的机器时,并不直接访问内网的机器,而是访问代理服务器,由代理决定访问内网的哪台机器。所谓反向就是由外网至内网。


二、第二步:垂直扩展(垂直分区)


1.当存在大量的从服务器时,代理服务器也会出现性能瓶颈,主服务器也无法承受写操作的压力了。对于频繁写操作的站点,仅仅使用主从复制+读写分离可能效果并不明显。


2.对数据库进行垂直扩展:


将没有关系或不需要join查询的表放在独立的数据库服务器上,这种方式称为垂直分区。


在数据库模型设计和程序编写时尽量减少使用联合查询。


3.垂直分区扩展:对垂直分区中的每台数据库做主从复制+读写分离。


三、第三步:水平分区(sharding)


1.当垂直扩展也达到写操作的极限时,进行水平扩展。


2.将同一数据库表中数据跟据特定的算法进行分离,保存在不同的数据库表中,以实现部署在不同的数据库服务器上。


分表:只是单台数据库服务器优化策略。但分表后的数据更易于分区,因为数据已经是分离的。


分区:比如将10张表分布在2个服务器上,要在应用程序中维护一张映射关系表。


3.分区算法


(1)哈希算法:例如userId % 10后的值写入不同服务器。优点易于实现,缺点不易于扩展,如果将10个分区修改为20个,原来的数据需要重新计算并分区。


(2)范围算法:例如userId 为1-10000的放在1张表,10001-20000的放在一张表...程序需要维护一个简单的范围映射表。


优点易于扩展,缺点老用户或者一部分Id接近的热点用户会使分区压力过大。


(3)映射关系算法(推荐):


使用一套比较复杂的算法创建一个分区的映射,应用程序已经无法通过简单的计算或配置来维护它。需要将分区映射关系写入数据库,获取分区时也先查询数据库(可使用缓存提高性能)。


这种方式保存了每条记录的分区对映关系,所以各个分区有较强的可伸缩性,可轻松的将数据从一个分区迁移到另一个分区,也可以使各个分区通过灵活的动态调节而保持平衡。

标签:总结,分区,扩展,代理服务器,关系数据库,服务器,日志,数据库
From: https://blog.51cto.com/u_6978506/7470090

相关文章

  • Memcached深入学习总结
    在上一家公司时,产品主要使用memcached做缓存。虽然目前这家公司memcached使用的比较少(刚进公司做云存储相关服务时小规模使用了一下,后来做另一个系统时换redis做了缓存),但前几天整理资料时看到了原先写的memcached相关笔记,在此整理一下发上来。----------------------------------......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • SQL基础总结(一):关系模型
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。--------------------------------------------------------------- 规范化父子表图示:由父表画出主键画出箭头指向子表外键。满足第一范式的表:列包含原子值,没有重复的组。 当满足下列条件时第一范式的表自动满足第二范式的表:1.......
  • SQL基础总结(二):SQL基础
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。--------------------------------------------------------------- 标识符是可以在数据库对象(任何create语句所创建的内容)层次中明确的引用一个对象的名称。 标准的SQL区分保留关键字和非保留关键字。不可以用保留关键字作......
  • SQL基础总结(三):从表中检索数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。---------------------------------------------------------------使用DISTINCT消除重复的行。虽然空值是未知的,但彼此绝不相等,但DISTINCT认为空值是彼此相等的。对于DISTINCT操作,DBMS执行内部排序去识别并消除重复的行。排序......
  • SQL基础总结(四):操作符和函数
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------派生列是一个计算结果。派生列不会成为表中的永久列,他们用于显示或者报表目的。 包含空值的任何算数运算的......
  • SQL基础总结(六):联结
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------限定名称是一个表名后跟一个点号和表中的列名。限定名称可以在整个数据库中唯一的标识出某个列。如:table.colu......
  • SQL基础总结(七):子查询
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------不要在子查询中使用ORDERBY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。子查询是单个SELECT......
  • SQL基础总结(五):汇总和分组数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)-------------------------只对单个值进行操作的是标量函数。对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。可以对行的集合进行......
  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......