MrChat(我取名字一向很可以
项目源码GitHub地址:https://github.com/Ye2273/MrChat
开发环境:ubuntu20.04 linux环境
编程语言:C++
编译工具:CMake
序列化工具:Protocol Buffers
RPC框架:自研的MyRpc框架
数据库:MySQL、Redis
网络库:muduo库
负载均衡器:nginx
简介
该项目是通过应用之前写的Rpc框架完成的,可能还有很多内容需要完善,现在自己开了几个节点测试了一下,功能都正常。
现在打算先整理一下项目过程中的思路,和一些关键的技术栈知识,还有项目过程中遇到的问题。
还是捋一下好,不然写的东一块西一块~~
后续可能还会加入一些模块,例如:加入redis的缓存机制,MySQL表结构的优化等
1、项目介绍
1.1、整个聊天系统的框架图
1.2、”分布式”,“集群”
整个项目想要体现的核心思想和功能主要是这两个方面
分布式:
一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节点模块集群部署。
业务服务器群
不同的业务逻辑(如注册登录、好友管理、群组管理、聊天)被分布在不同的服务器上。
这种设计实现了业务的分离,使得每个服务器只专注于处理特定类型的任务,降低了单一服务器的负载压力,并提高了系统的可扩展性。
ZooKeeper
每个事务服务器在启动时都会将自身信息注册到ZooKeeper中。网关服务器通过ZooKeeper获取每个事务服务器的服务地址,从而实现服务的动态发现和调用。这一机制确保了系统能够在服务变动(如扩展或故障)时自动调整,从而保持系统的稳定性和可用性。
网关服务器
RPC远程调用的核心所在,在业务服务器这边扮演“client”的角色。而在客户端角度则扮演网关接口服务器的角色。
1. 客户端请求的入口
- 统一接入点:网关服务器作为客户端与后端服务之间的桥梁,接收来自客户端的所有请求。客户端不需要直接与多个事务服务器交互,而是通过网关服务器来进行统一访问。这简化了客户端的逻辑,也增强了系统的安全性和可维护性。
2. 请求的分发和路由
- 动态路由:当网关服务器接收到客户端的请求后,会根据请求的类型,动态选择合适的事务服务器来处理请求。这个选择过程依赖于从ZooKeeper获取的最新服务地址信息,从而实现请求的准确路由。这种动态路由机制可以应对事务服务器的增加或减少,保证了系统的灵活性。
集群
集群的设计通过使用负载均衡、消息队列和集群数据库,使得系统在处理大量并发请求时能够保持高效和稳定的运行。
Nginx负载均衡:
Nginx在项目中扮演了负载均衡器的角色,它可以将来自客户端的请求均匀地分发到后端的网关接口类服务器上。这种设计不仅提高了系统的并发处理能力,还增强了系统的可用性,因为单个接口类服务器的故障不会导致系统不可用。
Redis消息队列:
Redis被用于处理跨服务器的消息传递问题。通过Redis的发布/订阅机制,不同服务器上的用户可以实现实时通信,这在聊天服务中尤为关键。这种设计使得系统即使在多服务器分布的情况下,仍然能够保证消息的即时传递和处理。
MySQL集群:
数据的存储被集中在MySQL数据库中,并且通过合理的设计确保了数据的一致性和可靠性。事务服务器通过与数据库的交互,完成对用户数据和群组数据的持久化存储,这保证了数据的安全性和系统的可恢复性。
仅供学习之用~~
PS:这只是个人项目
知识点
集群
**集群(Cluster)**的概念在计算机科学中指的是一组独立的计算机(通常称为节点或服务器)通过网络连接在一起,共同工作以完成特定任务。集群系统旨在通过协调这些计算机的工作,提供更高的性能、可用性、可扩展性和容错能力。
主要特点:
- 性能提升(Performance Enhancement):
- 集群系统可以将任务分配给多个节点并行处理,从而显著提升计算速度和处理能力,尤其在大规模数据处理和高性能计算中表现突出。
- 高可用性(High Availability):
- 集群系统通过冗余设计,确保即使某些节点出现故障,系统仍然能够继续运行。其他节点可以接管失效节点的任务,从而提高系统的可靠性和持续运行能力。
- 可扩展性(Scalability):
- 集群的架构设计通常具有良好的可扩展性。通过增加更多的节点,可以线性或接近线性地提升系统的整体性能,以应对不断增长的工作负载。
- 容错性(Fault Tolerance):
- 集群系统中的节点之间通常具有某种程度的冗余。这样,在一个或多个节点发生故障时,系统可以自动调整并重新分配任务,以确保服务的连续性。
集群的分类:
- 负载均衡集群(Load Balancing Cluster):
- 这种集群的主要目的是通过负载均衡技术将任务或请求均匀地分配到多个节点上,防止单个节点超载,提升整体系统的处理能力和响应速度。
- 高可用性集群(High Availability Cluster):
- 这种集群的设计重点在于保证系统的持续可用性。通常采用主从(active-passive)或双活(active-active)的方式,当主节点出现故障时,备用节点可以立即接管其工作。
- 高性能计算集群(High Performance Computing Cluster, HPC):
- HPC 集群旨在通过多个节点的并行计算能力来处理大规模复杂计算任务,常用于科学计算、模拟、数据分析等领域。
- 存储集群(Storage Cluster):
- 这种集群专注于数据的存储和管理,通过多个节点提供统一的存储服务,通常用于云存储、大数据处理等场景。
集群的应用场景:
- Web服务器集群:通过负载均衡和冗余设计,提升网站的并发处理能力和可靠性。
- 数据库集群:通过数据复制和分片,提供高可用性和高性能的数据库服务。
- 大数据处理集群:使用分布式计算技术,如Hadoop集群,处理和分析海量数据。
总结:
集群是通过多台计算机协同工作来增强系统的性能、可用性和可靠性的一种重要技术。它在现代计算机系统中被广泛应用,特别是在需要处理大量并发请求、高性能计算或保障服务稳定性和持续性的场景中。
分布式
**分布式(Distributed)**的概念在计算机科学中指的是将计算任务、数据存储或服务功能分散到多个独立的计算节点(通常是服务器或计算机)上,通过网络进行协调和合作来完成整体任务。分布式系统旨在通过资源的分散和任务的并行处理,提升系统的可扩展性、容错性和性能。
分布式系统的主要特点:
- 资源分布性:
- 在分布式系统中,计算资源、数据存储和应用服务分布在多个物理或逻辑上分散的节点上。这些节点可以位于不同的地理位置,通过网络连接在一起。
- 并行处理:
- 分布式系统将任务分解为多个子任务,并行地在不同节点上处理。这种并行处理可以显著提高任务处理的速度和效率。
- 容错性和可靠性:
- 由于系统资源是分散的,分布式系统具有较强的容错性。如果某个节点发生故障,其他节点可以继续工作,确保系统的整体稳定性和连续性。
- 可扩展性:
- 分布式系统可以通过增加新的节点来提升处理能力和存储容量,从而适应业务规模的增长。系统的扩展往往可以实现线性或接近线性的性能提升。
- 异构性:
- 分布式系统中的节点可以是不同的硬件设备或运行不同操作系统的服务器。系统设计通常允许这种异构性,确保不同类型的资源能够协同工作。
分布式系统的类型:
- 分布式计算系统:
- 这种系统将一个复杂的计算任务分解为多个子任务,分配到不同的节点上并行计算。常见的例子包括MapReduce、Hadoop等大数据处理框架。
- 分布式存储系统:
- 这种系统将数据分布存储在多个节点上,通过冗余和分片技术来确保数据的安全性和可用性。常见的例子包括分布式文件系统(如HDFS)、分布式数据库(如Cassandra)。
- 分布式应用系统:
- 这种系统将应用服务分布在不同的服务器上,通过服务之间的协作完成整体业务功能。微服务架构是典型的分布式应用系统,其中每个微服务负责特定的业务功能。
- 分布式消息队列:
- 这种系统用于在不同节点之间传递消息,确保消息的可靠传输和处理。常见的例子包括Apache Kafka、RabbitMQ等。
分布式系统的应用场景:
- Web应用:通过分布式架构,将应用的不同模块(如用户管理、订单处理、支付系统)分布在不同的服务器上,提升系统的灵活性和扩展性。
- 大数据处理:通过分布式计算框架处理海量数据,快速完成数据分析、机器学习模型训练等任务。
- 云计算:通过分布式架构提供弹性的计算资源和存储能力,用户可以根据需求动态扩展资源。
分布式系统面临的挑战:
- 一致性问题:如何在多个节点之间保持数据的一致性,是分布式系统的核心挑战之一。CAP理论(Consistency, Availability, Partition tolerance)描述了在分布式系统中,如何在一致性、可用性和分区容忍性之间权衡。
- 网络延迟和故障:分布式系统依赖网络进行通信,因此网络延迟、数据包丢失或节点间的网络分区都会对系统的性能和稳定性产生影响。
- 数据复制和同步:在多个节点上分布存储数据时,需要考虑如何同步和复制数据,以确保所有节点上数据的一致性和完整性。
- 负载均衡:如何将任务和数据均匀分配到各个节点,避免某些节点过载也是一个重要的设计问题。
总结:
分布式系统通过将计算和数据分布在多个节点上,利用并行处理、资源共享和容错机制,来实现更高的性能、可用性和扩展性。它被广泛应用于现代计算场景,尤其是在处理大规模数据、构建复杂应用系统以及提供云服务的领域。