已文大神可以略过。
当一台服务器已不能满足日益膨胀的站点时,就应该对数据库进行扩展。
一、主从复制
几乎所有的主流数据都支持复制,在mysql中,配置如下
1、开户服务器上的二进制日志(log-bin)
2、在主服务器和从服务器上分别进行简单的配置和授权。
具体可参看官方手册。
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
注意:
1、从服务器本身也可以充当主服务器,从而可以构成链式复制服务器,采用多级复制策略,避免多个从服务器同时复制一个主服务器带来的磁盘压力。
2、当你进行复制时,所有对复制中的表的更新都必须在主服务器上进行,否则可能会造成主从数据的冲突。
二、读写分离
当主服务器的压力不断增大时,由于更新操作必须在主服务器上进行,因此我们应当尽量让主服务器不做读操作,以减轻它的压力,读操作就交给从服务器。
那么问题来了,程序如何决定使用哪台从服务器进行read呢?这可以看作是一个从服务器的负载均衡的操作,程序必须合理地发送不同的SQL到从服务器,让它们的工作量相对均衡,更重要的是,如果某台服务器发生了故障,程序得知道并做出相应的操作。这样程序代码看来需要修改很多,且实现不简单,幸运的是,我们可以将这工作交给数据库反向代理。
针对mysql可以尝试使用mysql proxy,它就像WEB反向代理服务器一样,可以在SQL语句转发到后端的mysql服务器之前对它进行修改,比如将对数据库a的操作修改为数据库b,更厉害的是,mysql proxy还对可以多个从服务器实现负载均衡以及可用性检测。
三、垂直分区
对于数据库写操作频繁的站点来说,仅仅采用主从和读写分离并不能对主服务器负载有多少影响。这个时候最简单的方法就是将数据根据业务不相关性进行垂直分区。比如一个商城可以将商品数据库和用户数据库分别存储到独立的数据库服务器上。
四、水平分区
现在我们的商城越来越大,用户越来越多,发现用户服务器虽然独立一台服务器也有点吃不消了,用户太多了。这时,我们不得不对其进行水平分区。当然在此之前,经常会先尝试进行分表,将用户表按照取余法分为10个或者100个用户表,如果这样仍然不能满足站点的需要,分区便派上用场。注意这里的分区,并不是partition,而是分布式分区。
那么应该如何分区呢?
首先我们得先确定分区索引字段,比如userId,它必须和所有的记录都存在关系。如果使用主键,你得保证它不能使用auto_increment自增类型,接下来要考虑就是采用什么分区算法了,这个算法必须拥有良好的扩展性,并且让各个分区的工作量相对均衡。
1、哈希算法
前面提到的userid%10取余,是最简单的哈希,它可以对分区均衡地分配工作量。但是它对于扩展并不友好。一旦我们需要从10个分区扩展到20个,这便需要将所有数据重新分区,你不得不暂停站点,waiting。
2、范围
这种算法是指按照分区索引字段的范围进行分区,比如将userId0-100000的记录存储在一个分区中,将100000-200000存储在另一个分区中,以此类推。显然这样扩展性很好,但是各个分区的工作量会存在较大的差异,比如老用户所在的分区压力相对较大,或者一部分ID比较靠近的热点用户导致所在的分区压力过大。
3、映射关系
这种算法将对分区索引字段的每个可能的结果创建一个分区映射关系,可以想像,userId有多少,那么映射关系就有多少,因此需要将它写入到数据库,通过查询数据库得到用户的分区,当然,我们会使用缓存来提高性能。
这样映射关系,使得各个分区具有较强的可伸缩性,我们可以灵活地控制它们的规模,并且轻松地将数据从一个分区迁移到另一个分区,这也使得各个分区通过灵活的动态调节来保持平衡。
幸运的是分区也可以反向代理,在读写分离时提到了mysql proxy,另一个开源产品spock proxy可以帮助应用程序实现水平分区的访问调度,这意味着我们不需要在应用程序中维护那些分区的对应关系了。
相关推荐
这使MySQL深 刻地了解到扩展Web数据库的挑战,从而推动了对MySQL集群的开发,用一些关键技术实现有大量写操作Web数据库的升级,包括: 自动分区技术,有很强的写操作可扩展性。 实时性能。 active/active式跨地域...
《Node.js项目实践:构建可扩展的Web应用》涉及许多组件的使用,比如安全、部署上线、组织代码、数据库驱动和模板引擎等,从中可使读者接触到很多经过历年实践所得出的广受欢迎的模块库,它们可以大大提高开发人员的...
第16章 数据库扩展 16.1 复制和分离 16.2 垂直分区 16.3 水平分区 第17章 分布式计算 17.1 异步计算 17.2 并行计算 第18章 性能监控 18.1 实时监控 18.2 监控代理 18.3 系统监控 18.4 服务监控 参考文献...
第16章 数据库扩展 16.1 复制和分离 16.2 垂直分区 16.3 水平分区 第17章 分布式计算 17.1 异步计算 17.2 并行计算 第18章 性能监控 18.1 实时监控 18.2 监控代理 18.3 系统监控 18.4 服务监控 18.5 ...
第16章 数据库扩展 16.1 复制和分离 16.2 垂直分区 16.3 水平分区 第17章 分布式计算 17.1 异步计算 17.2 并行计算 第18章 性能监控 18.1 实时监控 18.2 监控代理 18.3 系统监控 18.4 服务监控 参考文献...
构建可扩展的方案:通过AKF扩展立方识别扩展需求,选择最佳的解决方法,并借助缓存、应用和数据库划分以及异步设计等优化系统性能。 利用新兴的技术,如云和网格,实现扩展。 构建有效的监控策略,及时回答最重要的...
“Access工作台”部分在第1章中介绍了如何创建数据库和单个表,逐渐转移到不同主题,到最后第7章介绍相对于Microsoft Access数据库的Web数据库处理,和第8章介绍使用Microsoft Access和Microsoft Excel生成Pivot...
使用PostgreSQL和空间数据库扩展程序PostGIS的Spring Boot Data JPA项目。 该项目是如何创建的 该项目最初是使用以及以下依赖项创建的: 。 Java注释库可帮助减少样板代码。 。 使用Spring MVC构建Web(包括...
Spring是一种基于Java的开源框架,可以用于构建Web应用程序。利用Spring实现Java Web技术可以带来许多好处,包括: 1. 简化开发:Spring提供了一系列的模块和工具,可以帮助开发人员更快速、更高效地开发Web应用...
web 负载均衡 分布式缓存 内容分发和同步 数据库扩展 性能监控
构建高性能Web站点: 涵盖主题: 数据的网络传输 服务器并发处理能力 动态内容缓存 动态脚本加速 浏览器缓存 Web服务器缓存 反向代理缓存 Web组建分离 分布式缓存 ...数据库扩展 分布式计算 性能监控
构建可扩展的方案:通过AKF扩展立方识别扩展需求,选择最佳的解决方法,并借助缓存、应用和数据库划分以及异步设计等优化系统性能。 利用新兴的技术,如云和网格,实现扩展。 构建有效的监控策略,及时回答最重要的...
构建可扩展的方案:通过AKF扩展立方识别扩展需求,选择最佳的解决方法,并借助缓存、应用和数据库划分以及异步设计等优化系统性能。 利用新兴的技术,如云和网格,实现扩展。 构建有效的监控策略,及时回答最重要的...
构建可扩展的方案:通过AKF扩展立方识别扩展需求,选择最佳的解决方法,并借助缓存、应用和数据库划分以及异步设计等优化系统性能。 利用新兴的技术,如云和网格,实现扩展。 构建有效的监控策略,及时回答最重要的...
扩展QGIS Web客户端(EQWC) 这是官方QGIS Web Client I的修改和扩展版本。它将QGIS项目转换为带有查看,导航,搜索和打印数据的工具的Web和Mobile GIS应用程序。 最重要的是,还有一个PostgreSQL管理数据库,用于...
通过深入研究系统的设计思路、架构和实现细节,您将能够全面了解使用Python构建Web应用程序的方法。源代码不仅是学习的资源, 还可作为技术分享和交流的平台,促进技术互动和知识共享。 在学习过程中,您将通过分析...
通过深入研究系统的设计思路、架构和实现细节,您将能够全面了解使用Python构建Web应用程序的方法。源代码不仅是学习的资源, 还可作为技术分享和交流的平台,促进技术互动和知识共享。 在学习过程中,您将通过分析...