测试网:本地多节点

可以使用在目录~/eos/build/programs/launcher提供的启动(launcher)程序运行本地测试网。

用于测试目的,你可以运行2个本地生产节点相互交互。

cd ~/eos/build

cp ../genesis.json ./

./programs/launcher/launcher -p2 –skip-signature

这个命令会为每个实例节点生成2个数据目录:tn_data_0和tn_data_1。

你将会看到下面的响应:

spawning child, programs/eosd/eosd –skip-transaction-signatures –data-dir tn_data_0

spawning child, programs/eosd/eosd –skip-transaction-signatures –data-dir tn_data_1

为了确认节点正在运行,运行eosc命令:

~/eos/build/programs/eosc

./eosc -p 8888 get info

./eosc -p 8889 get info

对于每条命令,你将会得到一个包含区块链信息的json。

启动器(launcher)的详细内容

目前为止,我们完成了EOS区块链执行使用单一eosd实例托管全部21个区块链生产者的实验工作。虽然这是一个非常有效的验证区块链特点的解决方案,开发新的合约,或者其他等等,但它无法进行扩展。尽管但合约和区块链必须跨多实例共享,但它也不暴露相关问题。提供可扩展性能力涉及到跨多机器部署多eosd节点和依赖p2p网络。组建这种网络涉及裁剪和分发配置文件,协调启动和停止以及其他任务。

手工完成这些工作是非常冗长乏味,而且容易出错。幸运的是有一个解决方案,使用启动器应用程序(launcher application),描述如下。

 

  • 测试网节点,网络,和拓扑结构
  • 本地网络
    • 分布式网络
  • 网络拓扑
    • 星型网络
    • 网状网络
    • 自定义网络形状
  • 启动器应用程序
    • 运行启动器应用程序
    • 启动器命令行参数
    • 生成多主机测试网络配置文件
    • 运行时构件

测试网节点,网络,和拓扑结构

在开始讲EOS测试网之前,我们先澄清一些术语。在这份文档里面我使用术语主机(host)和机器(machine),是可以互相替换使用的。一个主机可以归结为一个IP地址,尽管实际情况可能有多个IP地址。

下一个术语是“节点”。一个节点是一个可执行的eosd实例,对它进行配置,可作为0个或者多个生产者。节点和主机不是一一映射关系,一个主机可以托管不止1个节点,但是一个节点不能跨越多个主机。

我使用“本地网络”指代任何一组节点,无论是在一个主机或者多个主机上,它们都能相互访问而不需要离开安全网络环境。

最后是涉及远程主机的分布式网络。这些主机你也许不能直接访问启动或者停止eosd实例,但你也许希望与之合作来建立一个去中心化的测试网络。

本地网络

在一台机器上面运行一个测试网络是最快的开始方式。正如你在下面看到的,这是发射器(launcher)应用的默认模式。你可以马上建立一个本地网络,只要简单的告诉发射器有多少个生产或者非生产节点是激活状态,和可能使用哪种类型的网络拓扑结果。

缺点是当你在一个主机上运行多个节点需要很多硬件。另外多节点会争用cpu周期,限制真正的并发性,同时还有本地网络的性能是和主机内(inter-host)性能非常不同,即使在非常高速的局域网内。

分布式网络

最能说明网络上线的就是跨多主机传播eosd节点了。启动器(launcher)应用可以通过ssh推送脚本启动远程节点。在这种情况下需要额外进行配置,替换配置引用中的“localhost”或者“127.0.0.1”为实际的主机名或者不同的对等机器ip地址。

启动一个分布式测试网络需要操作人员通过ssh访问所有远程配置好的机器,进行身份认证,而不需要用户输入密码。这个配置将在下面进行详细描述。

在一个测试网络需要跨越多个远程网络的情况中,一个通用的启动器定义配置文件可能需要共享给外部的分布式网络操作人员,每个操作人员负责启动各自的本地网络。

注意:启动器(launcher)不会推送eosd实例到远程主机,你必须分别准备各种测试网络主机。

网络拓扑

网络拓扑或者形状描述了节点如何连接,以便共享交易数据、区块链数据和请求。不同的网络拓扑是两种情形下的权衡,即每个节点必须发送多少次消息报告一个新的交易数据或者区块链;必须重复发送多少次消息,才能保证全部节点都知道这条消息。

启动器有定义两种基于其节点连接情况的不同的基本网络形状,可以通过命令行选项进行选择设置。如果你希望创建你自己定义的网络拓扑,你可以通过提供json格式的文件进行定义。这个文件通常是启动器在输出模式创建的编辑版本模板。

星型网络

一个星型网络是准备用于支持有很大数量节点的测试网络。在这个场景中,一个节点的对等连接节点数和这些节点的分布变化,是基于网络中节点的数量。

网状网络

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在网状网络中,每个节点连接尽可能多的对等节点。

自定义网络形状

这里有一个例子,演示自定义部署只能通过一个交叉链路的独立节点集群进行。

 

启动器应用程序(Launcher Application)

为了解决分布式多eosd节点跨局域网或者更大网络的复杂性,我们创建了启动器应用程序。

启动器使用少量的命令行参数能够组合对等节点配置文件,在对等主机之间安全地分发这些文件,然后启动多个eosd实例。

Eosd实例通过这种方式启动,输出日志到各自的文本文件。最后启动应用程序同样可以关闭其中一些或者全部测试网络。

运行启动器应用程序

启动器程序经常用于配置和部署生产和非生产eosd节点,这些节点使用配置路由交互。每个节点的配置文件分布存储在不同的目录,假如机器有足够的内存和磁盘空间提供给多个eosd实例,允许多节点运行在同一个主机上。为了发布测试网,启动器使用多个配置源。一些命令行参数可以用于简历简单本地网络。

为了支持部署分布式网络,启动器会从json文件读取更多详细配置信息。你可以使用启动器命令行参数生成默认json文件。编辑这个文件替换实际的主机名和其他需要的详细信息,然后使用修改后的文件,重新运行启动器。

目前启动器只能运行原生平台节点上,以后会支持docker化节点。Docker化节点以后将会直接使用生成的配置文件。

启动器命令行参数

下面是目前能被启动器认可的命令行参数。

 

注意如果一个testnet.json文件提供作为—shape的参数,则—nodes、–pnodes和—genesis参数都会被忽略。

生成的多主机测试网络配置文件

这是生成配置文件要运行的命令行:

launcher –output <filename> [other options]

着这个模式下,启动器不会启动任何eosd实例,它生成了给定文件名的文件,这个文件是提供了一个方便的途径得到的一个json格式的模板。

这个文件里面描述的对象包含了一个使用ssl助手(helper)和一系列测试网节点描述。节点描述被以名字、值对方式列出来。注意这些名字有双重含义,既是节点描述map里面的key,又是对等清单里面节点的别名。如下面例子:

Ssh助手(helper)字段是ssh和scp的路径,如果需要则包含身份字段,和其他可选的参数。

 

剩余的testnet.json文件是的节点描述符集合。上面的片段是通过命令行programs/launcher/launcher -p6 -s mesh -o testnet.json 创建的,然后进过编辑,指向名为“remoteserv”的远程主机。

Json文件元素

下面的表格描述所有在testnet.json文件中使用的键值对。

描述
ssh_helper 一组用于辅助使用ssh和scp的值
nodes 一组定义组成测试网的eosd实例的描述符。这些名字既作为这个集合的key,也作为对等节点的占位符。

 

ssh_helper元素 描述
ssh_cmd 本地ssh命令的路径
scp_cmd 本地scp命令的路径
ssh_args 任何成功连接远程对等服务器需要的命令行附加参数
ssh_identity 访问远程主机是需要的用户名

 

节点元素 描述
genesis genesis.json文件的路径。测试网中全部成员都必须使用同样的文件
remote 指定节点是本地网络还是远程网络。这个标志与启动模式命令行选项(-l)绑定以决定是否本地启动器实例尝试启动该节点
ssh_identity 一个per-node覆盖之前定义的ssh_identity
ssh_args 一个per-node覆盖常规的ssh_args
eos_root_dir 指定包含全部eosd组件的存放的目录。这个对任何不是本地主机的主机是必选的
data_dir 节点相关的设置的根目录
hostname 服务的域名或者ip地址
public_name 很可能与hostname不同,但创建per-node config.ini文件的对等节点列表时,这个名字会替换
p2p_port 与public_name组合用来标识接入点,在对等连接中列出。当多个节点共享一个主机时,每个节点的p2p_port号自动增长
http_port 定义客户端API服务监听的接入点
filesize 以MB为大小单位设置区块链支持的存储文件大小
keys 指定节点的认证tokens
peers 列出网络中其他节点,当前节点与之连接。因为这个文件会被编辑修改hostname、public name、p2p 端口的值, peers清单保留着实际接入点的别名,最终会写入到各自config.ini文件里。
producters 列出承载在节点中来自genesis.json文件的生产者标识。注意启动器使用round-robin算法传播生产者实例到生产节点。

 

准备分布式服务器

在testnet.json里面的ssh_helper部分包含了链接和发布命令给其他服务器的ssh元素。ssh_helper提供访问全局配置,而per-node配置的提供标识和连接参数覆盖全局配置。

同样必须提供给服务器至少是eosd执行文件的拷贝,和genesis.json文件到恰当的位置,位置与命名eos根目录相关。例如,我定义了一个eos根目录/home/phil/blockchain/eos。当启动时,启动器会通过各种shell命令使用ssh和使用scp,拷贝config.ini到恰当的远程服务器数据目录

运行时构件

启动器应用程序会创建一个独立的日期和配置目录给每个节点实例。这个目录命名为tn_data_<n>,n范围为0到被启动的节点个数。

Per-node文件 描述
config.ini Eosd配置文件
eosd.pid Eosd运行实例的进程ID
blockchain/* 区块链存储
blocks/* 区块链日志存储
stderr.txt Eosd错误输出
stdout.txt Eosd输出

 

文件last_run.json包含提示,最近一个启动器实例运行包含参数-k 15可以杀死本地或者远程节点。