Vertx ignite 网络配置

需求: vertx cluster 依靠ignite 网络来搭建集群,不使用hazelcast 或者redis。

分析需求: 这个需求很简单,就是使用ignite搭建一个集群网络,但是由于再搭建的过程中,遇到过一些坑,记忆中好久也没有解决(在不同的ECS 上,并不是再本地),后来无意中配置下网络就可以了。

前提:

1. 首先得了解 vertx cluster 集群模式,特别集群下的eventbus

2. 需要理解 ingite 在vertx中的作用, 是如何搭建成p2p网络的

3. 另外顺便了解下,不使用hazelcast 是因为 hazelcast 社区版本耗JVM的内存,会被JVM GC统一管理,而ignite是耗堆外内存,不会收到 JVM GC的影响,另外hazelcast 专业版本也是耗堆外内存,但是是收费的。

那下面看看我们怎么连接集群网络:

第一步: 添加依赖    <dependency><groupId>io.vertx</groupId><artifactId>vertx-ignite</artifactId><version>3.5.4</dependency>

第二步:配置相关的Beans,我们特别要注意使用ignite的TcpDiscoveryVmIpFinder 网络,不要使用TcpDiscoveryMulticastIpFinder,因为会出现奇怪的问题,又不会报错,比如,在集群中,一个vertx instance 挂掉会影响其他vertx instance的通信。(eventbus 信息丢失等)。我是使用springboot configuration来配置相关的beans,请看下面的代码

@Bean

public IgniteConfigurationgetIgniteSelfConfiguration()throws Exception{

IgniteConfiguration igniteConfiguration =new IgniteConfiguration();

    igniteConfiguration.setDiscoverySpi(getTcpDiscoverySpi());

    igniteConfiguration.setCacheConfiguration(getCacheConfiguration());

    return igniteConfiguration;

}

@Bean

public TcpDiscoverySpigetTcpDiscoverySpi()throws Exception{

TcpDiscoverySpi tcpDiscoverySpi =new TcpDiscoverySpi();

    tcpDiscoverySpi.setIpFinder(getTcpDiscoveryVmIpFinder());

    return tcpDiscoverySpi;

}

@Bean

public TcpDiscoveryVmIpFindergetTcpDiscoveryVmIpFinder(){

TcpDiscoveryVmIpFinder tcpDiscoveryVmIpFinder =new TcpDiscoveryVmIpFinder();  tcpDiscoveryVmIpFinder.setAddresses(Arrays.asList("10.168.128.229:47500..47509,10.168.128.208:47500..47509".split(CommonConstants.CHARACTER_SEPARATOR_COMMA)));

    return tcpDiscoveryVmIpFinder;

}

@Bean

public CacheConfigurationgetCacheConfiguration(){

CacheConfiguration cacheConfiguration =new CacheConfiguration();

    cacheConfiguration.setName("*");

    cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);

    cacheConfiguration.setReadFromBackup(false);    cacheConfiguration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);

    cacheConfiguration.setBackups(1);

    return cacheConfiguration;

}

请大家特别关注这个配置tcpDiscoveryVmIpFinder.setAddresses(), 我设置的是两个IP,和端口号,由于我们使用的是ignite (p2p gossip 协议), 那我们在使用的时候,最好能够至少指定三个iP地址和端口号。不需要把所有的节点的IP都加入进来,在集群中的节点,节点加入集群先找配置好的节点,如果存活,会将这个节点加入到集群网络中来。(大家事前请好好看看gossip 协议)。

第三步:我们来配置vertx集群模式

ClusterManager clusterManager =new IgniteClusterManager(igniteSelfConfiguration);

VertxOptions vertxOptions =new VertxOptions().setClustered(true).setClusterHost().setClusterPort().setClusterManager(clusterManager);

Vertx.clusteredVertx(vertxOptions, ar->{

});

然后就可以启动了,首先呢,我们需要注意两点:

第一点:这里没有配置EventBusOptions,我们不要在evenbusoption里面配置 clusterhost和port这类的东西,vertx instance 启动成功之后,VertxUtil.getVertxInstance().eventBus()就可以拿到集群的模式下event bus instance,如果配置了,可能eventbus 之间的通信会一直存在问题,连接refused

第二点:我们需要在vertxOption里面显示的去设置setClusterHost 和 setClusterPort,这个Ip地址和port就是event bus 通信的 ip和端口号,显示的指明之后,eventbus 通信就不会报错。这里再贴一下 setClusterHost(“IP”), 这里的Ip 是如何获取的。

public static StringgetLocalIp()throws Exception {

String localIp=null;

    InetAddress inetAddress=getLocalHostLANAddress();

    if(null!=inetAddress) {

//localIp = inetAddress.getHostAddress();

        localIp=InetAddress.getLocalHost().getHostAddress();

    }

log.info("localIP={}", localIp);

    return localIp;

}

private static InetAddressgetLocalHostLANAddress()throws Exception {

InetAddress candidateAddress =null;

        for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) {

NetworkInterface iface = (NetworkInterface) ifaces.nextElement();

            for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {

InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();

                if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址

                    if (inetAddr.isSiteLocalAddress()) {

                        return inetAddr;

                    }else if (candidateAddress ==null) {

                        candidateAddress = inetAddr;

                    }

}

}

}

if (candidateAddress !=null) {

            return candidateAddress;

        }

InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();

        return jdkSuppliedAddress;

}

获取到正确的iP 之后,就可以尝试 evenbus通信了,这个时候就不会有问题了。

但是当我们想让vertx  ecs cluster 集群 和 docker 节点之间通信,那么我们应该如何配置呢?我是按照下面的方式配置,结果是正确的(折腾好长时间,一直是网络通信的问题)

第一: docker-compose中填写下面的信息

vertx-instal3:

  build: ./docker

  hostname: ech-10-168-128-77

  privileged: true

  ports:

    - "12001:12001"

    - "12002:12002"

    - "41000-47000:41000-47000" (这个端口号映射最好映射全点,vertx里面会有很多端口号,我没有仔细搞搞这个端口号,缺少和主机端口号映射的话,会导致网络通信问题)

第二步:配置Dockerfile 文件,dockerfile文件的内容如下:

FROM java:8

ENV VERTICLE_FILE vertx-network-communication-1.0-SNAPSHOT.jar

# Set the location of the verticles

ENV VERTICLE_HOME  /usr/verticles

#EXPOSE 12002 12002

#EXPOSE 12001 12001

#EXPOSE 47500

#Copy your fat jar to the container

COPY $VERTICLE_FILE $VERTICLE_HOME/

#Launch the verticle

WORKDIR $VERTICLE_HOME

ENTRYPOINT ["sh", "-c"]

CMD ["java -jar $VERTICLE_FILE -cluster -cluster-host 10.168.128.77"]

最后执行docker-compose build / up 的命令就可以了。 请记住,根据gossip 协议,p2p 的网络,docker 这个节点,连接cluster 时候,配置的IP 也是 上面提到的IP,不需要改变。只要有一个可以连接通,docker这个节点就会加入到这个集群。

好了,我把ecs 和docker 集群网络配置好了, vertx 就显得简单很多,按照异步框架写代码就可以了。

关于vertx evenbus local 和cluster 模式的分析,请看很下面的博客,分析的很详细:

https://blog.csdn.net/sdmjhca/article/details/78612792

https://www.sczyh30.com/posts/Vert-x/vertx-advanced-clustered-event-bus-internal/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,827评论 0 5
  • 为了更好地理解Apache Ignite和用例的功能,理解它的体系结构和拓扑结构非常重要。通过更好地理解Ignit...
    席梦思阅读 7,559评论 1 8
  • redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户...
    hadoop_null阅读 1,586评论 0 6
  • 关于支付宝支付宝的返回值问题, 再一次踩到深坑里, 无论是从返回值的格式上, 还是使用在线的格式化工具验证, 都像...
    流火绯瞳阅读 6,062评论 1 6
  • 人的宗教中介绍的佛教禅宗中,涉及到一些我以前不懂的思想。 它介绍了禅宗的一些对于文字的看法,文字是有局限性,它虽然...
    神话之光阅读 460评论 0 0