【Redis】服务端高并发分布式结构演进之路

文章目录

现在说起服务端,经常听到的就是分布式、集群、微服务这类词汇,这些到底是什么呢?又是如何而来的呢?本篇博客记录相关学习

前景概念

在认识上述架构之前,需要有些前景知识

应用(Application) / 系统(System)

应用是为了完整一整套服务的一个程序,而系统是一组互相配合的程序群。

类比生活中的篮球队,中锋、后卫、自由人都是一个个应用,有各自的功能,而他们相互配合组成的队伍就是一个系统,有强大的功能

模块(Module) / 组件(Conponent)

当应用功能复杂时,可以从中分离职责,将其中具有清晰职责、内聚性强的部分抽离出来,单独为一部分

类比军队将人员分为突击小组、爆破小组、掩护小组、通信等

分布式(Distributed)

系统中的多个模块可以被部署在不同的服务器上,模块之前通过网络进行通信,这样的系统就被称为分布式系统

常见的有Web服务器和数据库分别工作在不同的服务器上,或者多个Web服务器部署在不同的服务器之上

集群(Cluster)

部署在多台服务器上的,为了实现特定目标的一个或多个组件,被称为集群

如多个MySQL工作在不同的服务器上,共同提供数据库服务

主(Master) / 从(Slave)

集群中,一般有一个程序需要承担更多的职责,称为主;其他承担附属职责的被称为从

比如MySQL集群中,外界只对一台主服务器上的MySQL进行操作(增/删/改),其他从服务器的MySQL只对主服务器作数据同步。当主服务器挂掉了,再找个从服务器顶上,变成主服务器

中间件(Middleware)

常常说"没有什么是加一层中间层解决不了的,如果有就再加一层 "

中间件就是互通不同技术、工具和数据库之间的桥梁,用于相互通信

架构演进

单机架构

单机架构即业务处理,数据存储都在一台服务器上,甚至单线程。此时用户访问量不大,没有对性能、安全提出很高的要求,而且系统架构简单,运维起来成本不大


相关软件

Web服务器:Tomcat、Netty、Nginx、Apache等

数据库:MySQL、Oracle、PostgreSQL、SQL Server等

应用数据分离架构

数据持久化往往是比较耗时的,因为磁盘IO速度较慢,当系统的访问量逐步上升后,在业务处理的时候,不希望因为数据持久而拖慢了系统的性能,此时就可以把数据库服务独立出去,成为存储服务器,将业务和存储分离

应用服务器通过网络访问存储服务器,虽然网络通信也比较慢,但比磁盘IO还是要快一些的,而且分离后,数据存储并不会影响应用服务器的业务处理

应用服务集群架构

当系统访问量再次上升后,可能单台应用服务器已经无法满足需求,此时有两种方案:

  • 垂直扩展 / 纵向扩展 Scale Up:购买性能更优、价格更高的服务器
  • 水平扩展 / 横向扩展 Scale Out:调整软件架构,增加应用服务器,将用户流量分摊到不同的应用服务器

集群就是水平扩展的产物,有了多台服务器,还需要对用户流量进行分流,常见的方法有:

  1. Round-Robin 轮询算法:公平地将请求依次分给不同的应用服务器。优点是不会出现有服务器没有分摊到流量的情况;缺点就是性能好的服务器没有完全发挥性能,因为是公平分配给差的和好的
  2. Weight-Round-Robin 轮询算法:为不同的服务器(比如性能不同) 赋予不同的权重(weight),解决方法1的缺点。但新的缺点是同一用户的多个请求可能分配到不同的服务器
  3. 一致哈希散列算法 :通过计算用户的特征值(如IP地址)得到哈希值,根据哈希值做分发,这样同个用户的请求就可以被分配给同一个服务器。这就是专项客户经理服务


相关软件

负载均衡软件:Nginx、HAProxy、LVS、F5等

读写分离 / 主从分离架构

应用服务器扩展后,用户流量已经可以抗住了,但是数据库读写数据性能还不足以支撑,到一定程度后,数据的压力称为系统承载能力的瓶颈点。

如果像应用服务器一样进行纵向扩展,那么数据就会被分散,一致性无法保证。这就用到上述的主从思想

保留一个主数据库作为写入数据库,其他从数据库同步主数据库数据。因为二八定律 :用户的操作20%是写,80%是读,写操作并不会那么频繁,所以可以将写数据请求全部交给主库处理 ,主库也一般是性能更强的服务器,读请求则分散到各个从库中,因为从库同步主库数据,所以也保证了一致性

应用服务器需要对读写请求做分离处理,可以利用一些数据库中间件,将请求分离的职责托管出去

相关软件

MyCat、TDDL、Amoeba、Cobar等类似数据库中间件等

冷热分离架构

引入缓存

随着访问量继续增大,发现业务中一些数据的读取频率远大于其他数据的读取频率。这部分数据被称为热点数据,与之相对的是冷数据。

为了提取读取的响应时间,可以将这些数据缓存,如此还减少了磁盘的读取开销


相关软件

Memcached、Redis等缓存软件

垂直分库

业务数据量再增大后,大量数据存储在同一个库中已经有些力不从心了,所以可以根据业务,对数据分别存储


相关软件

Greenplum、TiDB、Postgresql XC、HAWQ等,商用的如南大通用的GBase、华为的LibrA

微服务

随着业务发展,可以将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离


以上就是本篇博客的所有内容,感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关推荐
007php0075 分钟前
Go 语言常用命令使用与总结
java·linux·服务器·前端·数据库·docker·容器
共享家952720 分钟前
MySQL-索引(下)
数据库·mysql
小乖兽技术1 小时前
C#与C++交互开发系列(三十):C#非托管内存分配大比拼,哪种方式才是真正的性能王者?
c++·c#·交互
浊尘1 小时前
SQL Server 查看备份计划
数据库·sqlserver
拾忆,想起1 小时前
Redis红锁(RedLock)解密:分布式锁的高可用终极方案
java·数据库·redis·分布式·缓存·性能优化·wpf
望获linux1 小时前
【实时Linux实战系列】实时数据可视化技术实现
linux·运维·服务器·网络·数据库·信息可视化
明天见~~1 小时前
Linux下的网络编程SQLITE3详解
数据结构·数据库
it_czz2 小时前
Flink Redis广播方案
大数据·redis·flink
郝学胜-神的一滴2 小时前
C++组合模式:构建灵活的层次结构
开发语言·c++·程序人生·设计模式·组合模式
数巨小码人2 小时前
国产数据库转型指南:DBA技能重构与职业发展
数据库·重构·dba