简介

wildfly是一个非常强大的工具,我们可以轻松的使用wildfly部署应用程序,更为强大的是,wildfly可以很方便的部署cluster应用。

今天我们通过一个例子来讲解下wildfly如何构建cluster应用。

下载软件和相关组件

假如我们有两个host,一个称为master,一个称为slave,我们需要在两个机子上面安装wildfly,构建成domain模式。然后需要在Domain controller主机上面安装mod_cluster和httpd以组成集群。

首先我们需要下载wildfly-21.0.0.Final.zip,解压之后,运行domain.sh以开启domain模式。

配置domain

我们需要将master配置为domain controller,根据我们之前的文章,首先配置interfaces,我们需要修改domain/configuration/host.xml:

  1. <interfaces>
  2. <interface name="management"
  3. <inet-address value="${jboss.bind.address.management:10.211.55.7}"/>
  4. </interface>
  5. <interface name="public">
  6. <inet-address value="${jboss.bind.address:10.211.55.7}"/>
  7. </interface>
  8. <interface name="unsecured">
  9. <inet-address value="10.211.55.7" />
  10. </interface>
  11. </interfaces>

因为我们master的ip地址是10.211.55.7,所以需要修改相应的值。这里使用的是master对外的ip地址,从而可以供slave连接到master。

同样的,我们需要修改slave的interface值:

  1. <interfaces>
  2. <interface name="management">
  3. <inet-address value="${jboss.bind.address.management:10.211.55.2}"/>
  4. </interface>
  5. <interface name="public">
  6. <inet-address value="${jboss.bind.address:10.211.55.2}"/>
  7. </interface>
  8. <interface name="unsecured">
  9. <inet-address value="10.211.55.2" />
  10. </interface>
  11. </interfaces>

也需要修改相应的ip地址。

接下来是修改host name :

  1. //master
  2. <host name="master" xmlns="urn:jboss:domain:3.0">
  3. //slave
  4. <host name="slave" xmlns="urn:jboss:domain:3.0">

在slave中,我们还需要配置domain-controller,从而让slave可以连接到master:

  1. <domain-controller>
  2. <remote security-realm="ManagementRealm" >
  3. <discovery-options>
  4. <static-discovery name="master-native" protocol="remote" host="10.211.55.7" port="9999" />
  5. <static-discovery name="master-https" protocol="https-remoting" host="10.211.55.7" port="9993" security-realm="ManagementRealm"/>
  6. <static-discovery name="master-http" protocol="http-remoting" host="10.211.55.7" port="9990" />
  7. </discovery-options>
  8. </remote>
  9. </domain-controller>

接下来,我们需要创建用于连接的security-realm,通过add-user.sh命令,我们可以创建添加用户。

这里我们创建两个用户,第一个用户叫做admin,使用来进行domain管理的用户。

第二个用户叫做slave,这个用户用来slave连接到master。

还记得add-user.sh命令是怎么用的吗?下面是创建admin用户的输出:

  1. ./add-user.sh
  2. Enter the details of the new user to add.
  3. Realm (ManagementRealm) :
  4. Username : admin
  5. Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
  6. - The password should not be one of the following restricted values {root, admin, administrator}
  7. - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
  8. - The password should be different from the username
  9. Password : passw0rd!
  10. Re-enter Password : passw0rd!
  11. The username 'admin' is easy to guess
  12. Are you sure you want to add user 'admin' yes/no? yes
  13. About to add user 'admin' for realm 'ManagementRealm'
  14. Is this correct yes/no? yes

如果是slave用户,则需要在下面的问题提示的时候,回答yes

  1. Is this new user going to be used for one AS process to connect to another AS process?
  2. e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
  3. yes/no? yes
  4. To represent the user add the following to the server-identities definition <secret value="cGFzc3cwcmQh" />

有了slave用户,我们就可以使用这个用户来配置slave的ManagementRealm了:

  1. <security-realms>
  2. <security-realm name="ManagementRealm">
  3. <server-identities>
  4. <secret value="cGFzc3cwcmQh" />
  5. <!-- This is required for SSL remoting -->
  6. <ssl>
  7. <keystore path="server.keystore" relative-to="jboss.domain.config.dir" keystore-password="jbossas" alias="jboss" key-password="jbossas"/>
  8. </ssl>
  9. </server-identities>
  10. <authentication>
  11. <properties path="mgmt-users.properties" relative-to="jboss.domain.config.dir"/>
  12. </authentication>
  13. </security-realm>
  14. </security-realms>

这样配置过后,slave和master就可以进行连接了。

创建应用程序

这里我引用的是官网的demo程序。实际上就是一个非常简单的web应用。代码地址 https://github.com/liweinan/cluster-demo/

我们简单进行一下讲解,基本的代码逻辑就是在session中存放一个时间数据,然后尝试从不同的server中取出,看是否一致,如果一致的话说明cluster集群是有效的。

  1. //设置session的值
  2. session.setAttribute("current.time", new java.util.Date());
  3. //获取session的值
  4. session.getAttribute("current.time")

cluster中最重要的就是session共享,或者说session复制。我们可以简单的在web.xml中使用distributable标签即可。

  1. <web-app>
  2. <display-name>Archetype Created Web Application</display-name>
  3. <distributable/>
  4. </web-app>

这就是我们应用程序的全部了。

部署应用程序

这次我们从web console中进行应用程序的部署。

打开 http://10.211.55.7:9990 ,输入我们创建的admin用户名和密码,即可进入管理界面。

默认情况下,会创建3个服务,分别是server-one,server-two和server-three。

server-one,server-two是默认启动的,他们属于main-server-group。而server-three是不启动的,它属于other-server-group。

我们看下other-server-group的配置:

  1. <server-group name="other-server-group" profile="full-ha">
  2. <jvm name="default">
  3. <heap size="64m" max-size="512m"/>
  4. </jvm>
  5. <socket-binding-group ref="full-ha-sockets"/>
  6. </server-group>

other-server-group使用的profile是full-ha,看名字就知道整个profile是为高可用设计的。那么这个profile有什么特别之处呢?

  1. <profile name="full-ha">
  2. ...
  3. <subsystem xmlns="urn:jboss:domain:modcluster:5.0">
  4. <proxy name="default" advertise-socket="modcluster" listener="ajp">
  5. <dynamic-load-provider>
  6. <load-metric type="cpu"/>
  7. </dynamic-load-provider>
  8. </proxy>
  9. </subsystem>
  10. <subsystem xmlns="urn:jboss:domain:infinispan:11.0">
  11. ...
  12. </subsystem>
  13. <subsystem xmlns="urn:jboss:domain:jgroups:8.0">
  14. <channels default="ee">
  15. <channel name="ee" stack="udp" cluster="ejb"/>
  16. </channels>
  17. <stacks>
  18. <stack name="udp">
  19. ...
  20. </stack>
  21. <stack name="tcp">
  22. ...
  23. </stack>
  24. </stacks>
  25. </subsystem>
  26. ...
  27. </profile>

这个profile中和ha有关的就是infinispan,jgroup和modcluster。通过这些组件,wildfly就可以来进行cluster的组建。

因为server-three默认是停止状态的,我们需要在master和slave中分别启动他们。

在Manage Deployments页面,点击Add Content,然后选择我们之前的demo应用程序cluster-demo.war,上传即可。

好了,程序已经部署好了,我们可以分别访问:

http://10.211.55.7:8330/cluster-demo/http://10.211.55.2:8330/cluster-demo/ 来查看应用程序的页面。

现在为止,两个应用程序还是独立的,并没有组合成cluster,接下来我们将会进行cluster的配置。

还有一点要注意的是,我们需要将master和slave中的server-three修改成不同的名字,如果是相同的名字,那么我们在后面使用的mod_cluster将会报错,因为在同一个server group中不允许出现两个相同的名字。

  1. <server name="server-three" group="other-server-group" auto-start="true">
  2. <socket-bindings port-offset="250"/>
  3. </server>
  4. <server name="server-three-slave" group="other-server-group" auto-start="true">
  5. <socket-bindings port-offset="250"/>
  6. </server>

集群配置

软件部署好之后,我们需要在master机子上面使用mod_cluster + apache httpd 来启用集群功能。

首先安装httpd:

  1. sudo yum install httpd

然后下载mod_cluster:

  1. http://www.jboss.org/mod_cluster/downloads

将其解压缩到 /etc/httpd/modules ,然后修改 /etc/httpd/conf/httpd.conf

添加下面的modules:

  1. LoadModule slotmem_module modules/mod_slotmem.so
  2. LoadModule manager_module modules/mod_manager.so
  3. LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
  4. LoadModule advertise_module modules/mod_advertise.so

并且注释掉下面的modules:

  1. #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

因为proxy_balancer_module是和proxy_cluster_module相冲突的。

然后修改httpd监听 10.211.55.7:80。

最后还要在httpd.conf中配上mod_cluster-manager的监听端口:

  1. <VirtualHost 10.211.55.7:10001>
  2. <Directory />
  3. Order deny,allow
  4. Deny from all
  5. Allow from 10.211.55.
  6. </Directory>
  7. # This directive allows you to view mod_cluster status at URL http://10.211.55.4:10001/mod_cluster-manager
  8. <Location /mod_cluster-manager>
  9. SetHandler mod_cluster-manager
  10. Order deny,allow
  11. Deny from all
  12. Allow from 10.211.55.
  13. </Location>
  14. KeepAliveTimeout 60
  15. MaxKeepAliveRequests 0
  16. ManagerBalancerName other-server-group
  17. AdvertiseFrequency 5
  18. </VirtualHost>

我们可以使用service httpd start启动httpd服务即可。

我们可以通过访问 http://10.211.55.7/cluster-demo/ 来访问集群服务了。

注意,虽然是集群模式,但是我们所有的请求都要先到master机子上面做转发。

总结

wildfly内置了很多强大的组件支持,不愧为工业标准的典范。值的学习。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/wildfly-cluster-domain/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

在wildfly 21中搭建cluster集群的更多相关文章

  1. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  2. Redis 超详细的手动搭建Cluster集群步骤

    功能概述 ​ Redis Cluster是Redis的自带的官方分布式解决方案,提供数据分片.高可用功能,在3.0版本正式推出. ​ 使用Redis Cluster能达到负载均衡的问题,内部采用哈希分 ...

  3. 实验室中搭建Spark集群和PyCUDA开发环境

    1.安装CUDA 1.1安装前工作 1.1.1选取实验器材 实验中的每台计算机均装有双系统.选择其中一台计算机作为master节点,配置有GeForce GTX 650显卡,拥有384个CUDA核心. ...

  4. docker容器中搭建kafka集群环境

    Kafka集群管理.状态保存是通过zookeeper实现,所以先要搭建zookeeper集群 zookeeper集群搭建 一.软件环境: zookeeper集群需要超过半数的的node存活才能对外服务 ...

  5. Docker中搭建zookeeper集群

    1.获取官方镜像 从dockerhub获取官方的zookeeper镜像: docker pull zookeeper 2.了解镜像内容 拉取完镜像后,通过 docker inspect zookeep ...

  6. 在CentOS7中搭建Zookeeper集群

    前几天装了CentOS7.并安装了一些基本的工具,现在我手上有三台机器:分别是master,slave1,slave2. 今天我将搭建zookeeper,使用的版本是zookeeper-3.4.11. ...

  7. Windows中搭建Redis集群

    从 http://rubyinstaller.org/downloads/ 下载Ruby2.2.5(x64)并安装,安装时勾选添加至路径变量中 命令行中执行gem source -a http://g ...

  8. Ubuntu中搭建Hadoop集群(简记)

    stp1:在Vmware虚拟机上创建Ubantu.2环境 步骤:文件—>新建虚拟机—>典型(下一步)—>下一步——>位置(不建议放c盘,文件地址一定要全英文)—>下一步— ...

  9. linux中搭建solr集群出现org.apache.catalina.LifecycleException: Failed to initialize component ,解决办法

    07-Jan-2018 20:19:21.489 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to i ...

随机推荐

  1. jquery动态生成的select下拉框,怎么设置默认的选中项?

    这两天都被这问题困扰,可能是我不太懂前端.我做layui表格行编辑,点击编辑按钮弹出layer,里边有一个民族的下拉框不能直接显示后台传过来的值.我把民族数组用jquery添加到了select里边,可 ...

  2. 第7.10节 Python类中的实例变量定义与使用

    一.    引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...

  3. 第7章 Python类型、类、协议目录

    第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议.多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭 ...

  4. PyQt Designer中连接信号和槽时为什么只能连接控件自己的信号和槽函数?

    老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeType属性

    在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有sizeType属性,如图: 这个sizeType实际上与Q ...

  6. LeetCode初级算法之字符串:387 字符串中的第一个唯一字符

    字符串中的第一个唯一字符 题目地址:https://leetcode-cn.com/problems/first-unique-character-in-a-string/ 给定一个字符串,找到它的第 ...

  7. 漫话docker的衰落与kubernetes的兴起

    本文首发在OPPO互联网公众号,欢迎点击转载 https://mp.weixin.qq.com/s/wBC4CgAzXeTNURa1YdYmIQ. 伴随着kubernetes 1.20中对于docke ...

  8. Springboot mini - Solon详解(一)- 快速入门

    一.Springboot min -Solon 最近号称 Springboot mini 的 Solon框架,得空搞了一把,发觉Solon确实好用,小巧而快速.那Solon到底是什么,又是怎么好用呢? ...

  9. 笔记-[ZJOI2014]力

    [ZJOI2014]力 \[\begin{split} E_j=&\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\frac{q_i}{ ...

  10. 九、git学习之——git基本命令全总结

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit,完成. ...