Socket通讯探索(二)-socket集群

  前面我们在章节“Socket通讯探索(一)”中如何实现一个tcp连接,但是这仅仅是一个最初级的BIO实现,且没有添加线程池,实际应用中很少采用这种方式,因为不得不考虑当大量的Tcp连接建立的时候,服务端如何安全稳定的运行?为什么呢?

  1、BIO实现方式,是阻塞式的(上一节最后面的实现方式虽然无数据的时候,不会阻塞);

  2、服务端为每条连接都开辟了一个线程进行处理,而且在连接不断开的情况下,线程不会得到释放;

  基于以上情况,当有大量的连接建立的时候,服务端会开辟大量的线程处理并得不到释放,而线程会占用系统资源,这样就会导致系统资源耗尽,没有系统资源的连接请求将会等待处理,更甚至程序直接崩溃,所以最直接的方式是添加线程池防止程序崩溃,大量的连接的处理则还还需要另想他法。

  大家都知道当web应用面临大量的请求时,我们会对其进行集群或分布式等方式部署,同理,我们也可以对socket服务端进行多处部署。

  通常,由于Tcp连接中客户端需要知道服务端的IP跟端口,那么这就意味着客户端需要知道所有的目标服务器的地址和端口,如果有那么一台主机专门用于对我们的服务器进行负载均衡,然后将负载均衡完成后选择的地址跟端口返回给客户端,然后客户端再发起真实的连接请求。具体的请求过程如下图(详细请参考:https://wenku.baidu.com/view/d5769f85d4d8d15abe234e7c):

  

  以上图中的virtual server实际上就是一个负载均衡用的服务器,所有客户端都会优先连接此服务器得到真实服务器连接(real server);该模型具体的通信流程如下:

    ①client向处于侦听的vs发SYN包;

    ②VS按照调度策略选择一个RS,并向RS发SYN包;

    ④RS响应VS的SYN请求,将SYN ACK包返回给VS;

    ④VS将收到的SYN ACK包发给client;

    ④client将5次握手的最后一个ACK包直接发给RS,此时client进入已建立连接状态,RS在收到ACK包后也进入已建立连接状态

    ⑥client和RS直接通信,此过程与VS无关。

  通过以上模型即可完成TCP服务端集群部署,至于具体的实现过程,不在本篇的范畴之内,就目前来说,我只了解这一种实现方式,如果还有其他的方案,大家可以相互交流……

  

原文地址:https://www.cnblogs.com/onedayinMay/p/12203618.html

时间: 2024-11-29 07:15:57

Socket通讯探索(二)-socket集群的相关文章

hbase 学习(十二)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪.一个master集群可以向多个slave集群推送,收到推送的集群会覆盖它本地的edits日志. 这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中.备份个格式在设计上是和mysql的statement-based

Hadoop(二)——分布式集群搭建

前两天和一个朋友在聊天的时候说,很多自学Hadoop的朋友80%都会夭折在集群环境的搭建上,原因吗无在乎:1,没有很好的电脑配置,不能像机房一样用多台电脑搭建起集群:2,对linux的不熟悉,各种小黑窗,linux命令--:3,环境搭建的反锁步骤,需要耐心+细心+认真等等吧.不过吗,我觉的,只要敢于坚持,敢于付出都是会成功的.下边讲述一下我的Hadoop集群搭建过程,由于条件有限,也是在虚拟机中进行的. 一,准备资料: 1,一台笔记本:I5的CPU,4G内存,500硬盘(内存有些小,运行的时候比

Hadoop 系列(二)—— 集群资源管理器 YARN

一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配. <div align="center"> <img width="600px" src="https://raw.githubusercontent.com/heibaiying/

consul系列二之集群

集群中的每个节点必须有位置名称,默认情况下consul使用主机名作为名称,我们也可以使用-node命令指定 构建集群 启动首个节点 [[email protected] ~]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -bind=192.168.0.149 -config-dir /etc/consul.d/ ==> WARNING: BootstrapExpect Mode i

kafka学习(二)-zookeeper集群搭建

zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制 不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此. 1.角色 Zookeeper中的角色主要有以下三

Elasticsearch(二)集群设置

Elasticsearch支持多播和单播自动发现节点,但多播已经不被大多数操作系统支持,并且安全性不高,这里主要用单播发现节点,配置如下 discovery.zen.ping.multicast.enabled: false  #关闭多播 discovery.zen.ping.unicast.hosts: ["192.168.31.163:9300","192.168.31.160:9300","192.168.31.161:9300",&quo

Etcd学习(二)集群搭建Clustering

1.单个etcd节点(测试开发用) 之前我一直开发测试一直是用的一个Etcd节点,然后启动命令一直都是直接打一个etcd(我已经将etcd安装目录的bin目录加入到PATH环境变量中),然后启动信息显示etcd server监听在默认的4001端口,peer server监听在默认的7001端口. 2.三个Etcd节点组成Clustering 然后今天想测试一下集群功能,就按照gutHub上面的教程: 参考:https://github.com/coreos/etcd/blob/master/D

《HBase权威指南》读书笔记12:第十二章 集群管理

运维任务 减少节点 先停止一个region服务器 $ ./bin/hbase-daemon.sh stop regionserver region服务器会先关闭所有region,然后把自己停止. 等待zk超时后就会过期. master会将这台机器上的region移动到别的机器上 注意:节点关闭之前要先禁用负载均衡 hbase(main):0.01:0>balance_switch false graceful_stop 但是region下线会带来一定的服务不可用时间,时间取决于zk的超时.这种方

RocketMQ(二)集群配置

Broker集群部署方式主要有以下几种:(Slave 不可写,但可读) 单个Master 这种方式风险较大,一旦Broker 重启或者宕机时,会导致整个服务不可用,不建议线上环境使用. 多Master模式 一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master. 优点:配置简单,单个Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复情况下,由于RAID10 磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同