最近在学习分布式数据库架构相关的知识(主要是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