文档章节

Erlang节点互联笔记

rongtou
 rongtou
发布于 2016/11/17 00:37
字数 897
阅读 89
收藏 2

最近工作上需要,游戏服需要部署到腾讯云上。打算只是登陆充值相关的部署在腾讯云上,其他游戏节点则在另外云上。实际操作下来,发现Erlang节点并不能很好的互联起来,节点只能从腾讯云上主动往外连接,反过来则不行。以前觉得理所当然的事情,现在却变得莫名其妙,所以也趁机稍微深入了解下这机制。

Q:请求连接远程节点时,节点互联是建立一条tcp链接?谁是S,谁是C?

A:腾讯云上的测试得出是谁主动连接,谁就是C。 节点互联是建立一条tcp连接,主动连接者是client,被连接的监听端口就是节点端口 同时节点启动时本身也会建立一个连接到EPMD上,用于获取、更新节点信息

根据实验结果去看代码 net_sup进程树

  • <0.21.0>:inet_tcp_dist, 启动时调用erl_epmd向EPMD注册本节点信息
  • <0.22.0>:ticker

主动连接方:

net_kernel进程查询sys_dist表连接的节点信息,如果没有,就进入建立连接步骤 inet_tcp_dist:setup,根据对方的节点名获取host,得到对应的IP,然后通过erl_epmd:port_please向对方的EPMD请求该节点的端口信息。并向sys_dist插入该节点信息,标记为pending。Driver:connect(IP, TcpPort, connect_options([{active, false}, {packet, 2}])) 成功后,就进入handshake阶段,详细可以参考Erlang dist protocol部分,代码就略过了。握手成功后,向net_kernel进程发送Kernel ! {self(), {nodeup,Node,Address,publish_type(Flags), true}}。net_kernel即改变节点状态为UP。

被动连接方:

inet_tcp_dist 启动监听端口,来接收其他节点的连接。经过握手协议时,会想sys_dist标记节点为pending,当握手成功后,则改为UP状态。 (注:中间忽略了其他各种连接情况下的状态转换以及处理)

回到一开始的问题,为什么只能从腾讯云上主动外网建立连接?因为开放平台 tgw 的某种奇葩设计,从外部连入的 tcp 连接都会多出一个莫名其妙的包头。如果连接后不首先发送此包头,则无法正确路由到对应的服务器,同时还需服务器去处理这多出来的包头。除非去修改Erlang底层的连接代码,否则外网是不可能直接连接上来的。

Q:在查询资料,阅读代码过程中,都会觉得Erlang这套机制安全性不太可靠的。节点互联靠cookie来验证,除此之外还有没有其他手段来进一步限制呢?

A:

关于定制EPMD默认端口

  • erl -epmd "epmd -port 7000 -daemon" -epmd_port 7000 -name nodename@IP -setcookie 123456
  • ERL_EPMD_PORT=7000 erl -name nodename@IP -setcookie 123456

实验得出这两种方式都可以附带启动以指定端口的EPMD,而不需要再另外再执行命令来启动。 第二种只支持shell环境,windows上则需另外安装下shell环境来执行即可。(注:不能完全相信别人写的东西,还是自己去实际操作才能检验出来,同时结合源码也能知道写文档上所没讲述的内容)

参考资料

© 著作权归作者所有

rongtou

rongtou

粉丝 5
博文 9
码字总数 4533
作品 0
广州
程序员
私信 提问
EMQ百万级MQTT消息服务(分布式集群)

在强大的单机也比不上集群,EMQ的集群模式很粗暴,只需要把EMQ服务关联在一起然后负载均衡就可以达到集群的效果,这样就算面对1000CK问题也迎刃而解 附上: 喵了个咪的博客:w-blog.cnEMQ官方地址...

喵了_个咪
2018/04/15
0
0
erlang节点互相ping,一个能ping通,另外一个不行。

今天发现一个问题,2个erlang节点,1个主动ping另外一个不通,然后等待另外一个ping过来,2个节点才连通。记录一下。 首先,erlang节点的cookie是一致的。查了文档,cookie一致就可以连通的。...

格通
2016/02/22
18
0
集群引入inet_dist_{listen,connect}_options更精细参数微调

集群引入inetdist{listen,connect}_options更精细参数微调 系统技术非业余研究2015-04-0164 阅读 erlang 原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: 集群引入inetdist{...

系统技术非业余研究
2015/04/01
0
0
Erlang节点互联失败原因分析以及解决方案

转载自Erlang非业余研究 今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似 1> net_adm:ping('xx@ip1'). pang 由于这个问题比较普遍,我就记录下一步步的排除步骤. 首先从原理上...

景德真人
2012/03/29
0
0
新文章 联系 订阅 管理 [Erlang 0123] Erlang EPMD

epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢? epmd 是Erlang Port Mapper Daemon的缩写,全称足够明确表达...

唐玄奘
2018/01/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

windows下cmd常用的命令

windows下常用的命令指示行: windows下 CMD比较常见的命令1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器...

WinkJie
22分钟前
1
0
折叠手机适配布局

CSS Grid 设备相关参数 媒体查询 Chrome进行调试,创建相应的模拟机

lilugirl
22分钟前
0
0
Knative Eventing 中如何实现 Registry 事件注册机制

摘要: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的。针对这些问题,希望通过本篇文章给出答案。 背景 作为事件消费者,之前是...

阿里云云栖社区
26分钟前
0
0
安装 jemalloc for mysql

前言: Jemalloc 是BSD的提供的内存分配管理 安装依赖 $ yum install -y gcc$ yum install autoconf -y 安装 jemalloc $ git clone https://github.com/jemalloc/jemalloc$ cd jema......

Linux_Anna
37分钟前
2
0
linux下ctrl+c中止不了

有一台centos7的服务器,ctrl+c无效,并且tail -f也无效,只能关掉终端或者crtl+z放入后台再删掉,但是ping的时候使用ctrl+c是有效果的。 出现这种情况的原因可能是因为有人要使用ruby安装r...

gaolongquan
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部