基于Linux和C++环境,实现RPC分布式集群聊天服务器(项目介绍)

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)**的概念在计算机科学中指的是一组独立的计算机(通常称为节点或服务器)通过网络连接在一起,共同工作以完成特定任务。集群系统旨在通过协调这些计算机的工作,提供更高的性能、可用性、可扩展性和容错能力。

主要特点:
  1. 性能提升(Performance Enhancement)
    • 集群系统可以将任务分配给多个节点并行处理,从而显著提升计算速度和处理能力,尤其在大规模数据处理和高性能计算中表现突出。
  2. 高可用性(High Availability)
    • 集群系统通过冗余设计,确保即使某些节点出现故障,系统仍然能够继续运行。其他节点可以接管失效节点的任务,从而提高系统的可靠性和持续运行能力。
  3. 可扩展性(Scalability)
    • 集群的架构设计通常具有良好的可扩展性。通过增加更多的节点,可以线性或接近线性地提升系统的整体性能,以应对不断增长的工作负载。
  4. 容错性(Fault Tolerance)
    • 集群系统中的节点之间通常具有某种程度的冗余。这样,在一个或多个节点发生故障时,系统可以自动调整并重新分配任务,以确保服务的连续性。
集群的分类:
  1. 负载均衡集群(Load Balancing Cluster)
    • 这种集群的主要目的是通过负载均衡技术将任务或请求均匀地分配到多个节点上,防止单个节点超载,提升整体系统的处理能力和响应速度。
  2. 高可用性集群(High Availability Cluster)
    • 这种集群的设计重点在于保证系统的持续可用性。通常采用主从(active-passive)或双活(active-active)的方式,当主节点出现故障时,备用节点可以立即接管其工作。
  3. 高性能计算集群(High Performance Computing Cluster, HPC)
    • HPC 集群旨在通过多个节点的并行计算能力来处理大规模复杂计算任务,常用于科学计算、模拟、数据分析等领域。
  4. 存储集群(Storage Cluster)
    • 这种集群专注于数据的存储和管理,通过多个节点提供统一的存储服务,通常用于云存储、大数据处理等场景。
集群的应用场景:
  • Web服务器集群:通过负载均衡和冗余设计,提升网站的并发处理能力和可靠性。
  • 数据库集群:通过数据复制和分片,提供高可用性和高性能的数据库服务。
  • 大数据处理集群:使用分布式计算技术,如Hadoop集群,处理和分析海量数据。
总结:

集群是通过多台计算机协同工作来增强系统的性能、可用性和可靠性的一种重要技术。它在现代计算机系统中被广泛应用,特别是在需要处理大量并发请求、高性能计算或保障服务稳定性和持续性的场景中。

分布式

**分布式(Distributed)**的概念在计算机科学中指的是将计算任务、数据存储或服务功能分散到多个独立的计算节点(通常是服务器或计算机)上,通过网络进行协调和合作来完成整体任务。分布式系统旨在通过资源的分散和任务的并行处理,提升系统的可扩展性、容错性和性能。

分布式系统的主要特点:
  1. 资源分布性
    • 在分布式系统中,计算资源、数据存储和应用服务分布在多个物理或逻辑上分散的节点上。这些节点可以位于不同的地理位置,通过网络连接在一起。
  2. 并行处理
    • 分布式系统将任务分解为多个子任务,并行地在不同节点上处理。这种并行处理可以显著提高任务处理的速度和效率。
  3. 容错性和可靠性
    • 由于系统资源是分散的,分布式系统具有较强的容错性。如果某个节点发生故障,其他节点可以继续工作,确保系统的整体稳定性和连续性。
  4. 可扩展性
    • 分布式系统可以通过增加新的节点来提升处理能力和存储容量,从而适应业务规模的增长。系统的扩展往往可以实现线性或接近线性的性能提升。
  5. 异构性
    • 分布式系统中的节点可以是不同的硬件设备或运行不同操作系统的服务器。系统设计通常允许这种异构性,确保不同类型的资源能够协同工作。
分布式系统的类型:
  1. 分布式计算系统
    • 这种系统将一个复杂的计算任务分解为多个子任务,分配到不同的节点上并行计算。常见的例子包括MapReduce、Hadoop等大数据处理框架。
  2. 分布式存储系统
    • 这种系统将数据分布存储在多个节点上,通过冗余和分片技术来确保数据的安全性和可用性。常见的例子包括分布式文件系统(如HDFS)、分布式数据库(如Cassandra)。
  3. 分布式应用系统
    • 这种系统将应用服务分布在不同的服务器上,通过服务之间的协作完成整体业务功能。微服务架构是典型的分布式应用系统,其中每个微服务负责特定的业务功能。
  4. 分布式消息队列
    • 这种系统用于在不同节点之间传递消息,确保消息的可靠传输和处理。常见的例子包括Apache Kafka、RabbitMQ等。
分布式系统的应用场景:
  • Web应用:通过分布式架构,将应用的不同模块(如用户管理、订单处理、支付系统)分布在不同的服务器上,提升系统的灵活性和扩展性。
  • 大数据处理:通过分布式计算框架处理海量数据,快速完成数据分析、机器学习模型训练等任务。
  • 云计算:通过分布式架构提供弹性的计算资源和存储能力,用户可以根据需求动态扩展资源。
分布式系统面临的挑战:
  1. 一致性问题:如何在多个节点之间保持数据的一致性,是分布式系统的核心挑战之一。CAP理论(Consistency, Availability, Partition tolerance)描述了在分布式系统中,如何在一致性、可用性和分区容忍性之间权衡。
  2. 网络延迟和故障:分布式系统依赖网络进行通信,因此网络延迟、数据包丢失或节点间的网络分区都会对系统的性能和稳定性产生影响。
  3. 数据复制和同步:在多个节点上分布存储数据时,需要考虑如何同步和复制数据,以确保所有节点上数据的一致性和完整性。
  4. 负载均衡:如何将任务和数据均匀分配到各个节点,避免某些节点过载也是一个重要的设计问题。
总结:

分布式系统通过将计算和数据分布在多个节点上,利用并行处理、资源共享和容错机制,来实现更高的性能、可用性和扩展性。它被广泛应用于现代计算场景,尤其是在处理大规模数据、构建复杂应用系统以及提供云服务的领域。

zkfire = zookeeper openfire(3.8.1)     Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议,您可以使用它轻易的构建高效率的即时通信服务器.    根据对xmpp与openfire的理解,我在openfire中相应的地方植入少量的代码,并把zookeeper包也一并打包到zkfire中。使用zookeeper(http://zookeeper.apache.org/)管理集群中的节点。   客户登陆集群中的不同服务器进行通信就如登陆同一台服务器一样。   openfire自身也有一套集群实现,使用了oracle 的coherence的中间件,使用时要自己加入相应的jar包与集群插件。   之所以又自己开发了一套集群实现,一个是给集群提供多一些选择,一个是兴趣^_^,让openfire天然就支持集群      zkfire使用的场景:   zkfire中有zookeeper的服务器监听与客户端连接程序,但可以不依赖自身的zookeeper服务,可以在openfire之外另外开启其他zookeeper服务,此时只需指定   cluster.xml配置文件中zClient节点的连接地址即可。   如果只是zookeeper单机服务,那么所有openfire服务器只需要连到同一个zookeeper服务器就可以完成openfire的集群   如果是zookeeper集群,根据zookeeper的集群特点,集群中节点不应该少于3台。如果超过一半的zk节点宕机,那么整个集群境将不能正常的工作。      使用方法:   将zkfire.jar包替换lib下的openfire.jar,之所以命名zkfire.jar只是为了易于区分,名字可以随意取。并将cluster.xml放到bin目录下。   zkfire基于单openfire的实现,所以如果使用的话建议不要开启openfire自身的集群功能。   在安装的openfire目前bin下,放入cluster.xml文件。   示例内容如下:    <?xml version="1.0" encoding="UTF-8"?>    <jive>         <!-- 该节点用于openfire服务器之间通讯。IP为本机IP地址,需其他服务器能访问到 --> <notice>10.10.152.180:3004</notice>          <!-- zoo节点用于配置zkfire的zookeeper服务。如果用其他zk服务器,那么这个节点可以去掉。-->    <zoo>               <tickTime>2000</tickTime>              <initLimit>10</initLimit>              <syncLimit>5</syncLimit>              <dataDir>E:/zoo/data</dataDir>              <clientPort>3181</clientPort>               <server name="server.1">10.10.152.180:2888:3888</server>               <server name="server.2">10.10.152.185:2888:3888</server>               <server name="server.3">10.10.152.189:2888:3888</server>               <myid>1</myid>    </zoo>                <!-- 该节点用于连接zk服务器,如果连接zkfire自身的zk服务器,那么该节点可以去掉 -->      <zClient>127.0.0.1:3181</zClient>    </jive>  zoo中的节点server用于配置zookeeper的集群,myid指定本身zookeeper服务器的myid值,server.X 这个数字就是对应myid中的数字,集群中不同zk服务器的myid值不同。    zoo中其他节点的内容皆对应zk配制文件的键值内容。这里不再详述,可以参考 http://rdc.taobao.com/team/jm/archives/665,但dataDir与clientPort是必须配置,用于指定zookeeper数据文件地址与监听端口。    有任何问题请随时email给我donnie4w@gmail.com 标签:zkfire
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值