为了在容器环境中运行,首先需要弄清楚的是在传统环境下如何运行,所以我们从传统环境开始。

先去http://access.redhat.com下载相应介质,主要是 jboss-datagrid-7.2.0-server.zip和jboss-datagrid-7.2.0-tomcat8-session-client.zip

前者用于jboss data grid的启动,后者用于客户端tomcat通过Client-Server方式去连接和操作

1. 安装

直接解压就是安装,但要注意如果是需要多个server构成一个集群,需要建立两个目录分别解压,我试过只修改配置不成,因为还有

其他文件在进程启动以后需要进行同时写入。所以最佳办法是每个实例分别建立一个目录。

修改配置文件cluster.xml,如果需要加入定义的Cache,可以添加下面这一段

<subsystem xmlns="urn:infinispan:server:endpoint:6.0">
<hotrod-connector socket-binding="hotrod" cache-container="clusteredcache">
<topology-state-transfer lazy-retrieval="false" lock-timeout="" replication-timeout=""/>
</hotrod-connector>
.........
<subsystem xmlns="urn:infinispan:server:core:6.0" default-cache-container="clusteredcache">
<cache-container name="clusteredcache" default-cache="default" statistics="true">
<transport executor="infinispan-transport" lock-timeout=""/>
......
<distributed-cache name="directory-dist-cache" mode="SYNC" owners="" remote- timeout="" start="EAGER">
<locking isolation="READ_COMMITTED" acquire-timeout="" striping="false"/>
<eviction strategy="LRU" max-entries="" />
<transaction mode="NONE"/>
</distributed-cache>
..............
</cache-container>

如果不需要定义,可以用缺省的配置,也就是default,配置为分布式

<distributed-cache name="default"/>

修改server2的端口,主要是标黑的port-offset,标黑的那段

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:100}">
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
<socket-binding name="hotrod" port=""/>
<socket-binding name="hotrod-internal" port=""/>
<socket-binding name="jgroups-mping" port="" multicast-address="${jboss.default.multicast.address:234.99.54.14}" multicast-port=""/>
<socket-binding name="jgroups-tcp" port=""/>
<socket-binding name="jgroups-tcp-fd" port=""/>
<socket-binding name="jgroups-udp" port="" multicast-address="${jboss.default.multicast.address:234.99.54.14}" multicast-port=""/>
<socket-binding name="jgroups-udp-fd" port=""/>
<socket-binding name="memcached" port=""/>
<socket-binding name="rest" port=""/>
<socket-binding name="rest-multi-tenancy" port=""/>
<socket-binding name="rest-ssl" port=""/>
<socket-binding name="txn-recovery-environment" port=""/>
<socket-binding name="txn-status-manager" port=""/>
<outbound-socket-binding name="remote-store-hotrod-server">
<remote-destination host="remote-host" port=""/>
</outbound-socket-binding>
<outbound-socket-binding name="remote-store-rest-server">
<remote-destination host="remote-host" port=""/>
</outbound-socket-binding>
</socket-binding-group>

2.启动

standalone.bat -c=clustered1.xml -Djboss.node.name=server1

standalone.bat -c=clustered2.xml -Djboss.node.name=server2

从日志中可以看到server2的加入,并进行数据的rebalance.

3.监控和操作

  • CLI操作

可以通过bin/cli.sh或者cli.bat进行直接对缓存的读取。windows环境中基本命令如下

[disconnected /] connect 127.0.0.1:
[standalone@127.0.0.1: /] container clustered
[standalone@127.0.0.1: cache-container=clustered] cache
ISPN019029: No cache selected yet
[standalone@127.0.0.1: cache-container=clustered] cache default
[standalone@127.0.0.1: distributed-cache=default] cache
default
[standalone@127.0.0.1: distributed-cache=default] put ericnie
[standalone@127.0.0.1: distributed-cache=default] get
ericnie

container的值,可以从cluster.xml的配置中找到,截取一段,cache值也是一样,缺省为default.

<subsystem xmlns="urn:infinispan:server:core:8.5" default-cache-container="clustered">
<cache-container name="clustered" default-cache="default" statistics="true">
<transport lock-timeout=""/>
<global-state/>
<distributed-cache-configuration name="transactional">
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</distributed-cache-configuration>
<distributed-cache-configuration name="async" mode="ASYNC"/>
<replicated-cache-configuration name="replicated"/>
<distributed-cache-configuration name="persistent-file-store">
<file-store shared="false" fetch-state="true" passivation="false"/>
</distributed-cache-configuration>
<distributed-cache-configuration name="indexed">
<indexing index="LOCAL" auto-config="true"/>
</distributed-cache-configuration>
  • 监控层面

惊闻Jboss ON要end of life,以后更多需要走prometheus或者openshift容器化的监控手段了,所以果断来个最基本的jmx监控。

启动jconsole, 基于jmx连接本地或者远程端口(9990),在MBean中找到jboss.datagrid-infinispan

  • 查看集群属性,CacheManager->clustered

  • 查看Cache Entry

4.客户端访问

在tomcat的webapp下建立一个项目jdg,然后建立WEB-INF,在lib下面把之前的jar包拷入。

写一段客户端访问代码.

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="org.infinispan.client.hotrod.RemoteCache,org.infinispan.client.hotrod.RemoteCacheManager,org.infinispan.client.hotrod.configuration.ConfigurationBuilder,com.redhat.lab.jdg.*,java.utils.*" %>
<html>
<head>
<title>My JSP starting page</title>
</head> <body>
<h1> <%
try {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host("127.0.0.1")
.port(Integer.parseInt(""));
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());
RemoteCache<String, User> cache = cacheManager.getCache(); User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
cache.put("jdoe", user);
System.out.println("John Doe has been put into the cache");
out.println("John Doe has been put into the cache"); if (cache.containsKey("jdoe")) {
System.out.println("jdoe key is indeed in the cache");
out.println("jdoe key is indeed in the cache");
} if (cache.containsKey("jane")) {
System.out.println("jane key is indeed in the cache");
out.println("jane key is indeed in the cache");
} user = cache.get("jdoe");
System.out.println("jdoe's firstname is " +
user.getFirstName()); out.println("jdoe's firstname is " +
user.getFirstName()); } catch (Exception e) {
e.printStackTrace();
} %>
</h1>
</body>
</html>

然后是各种验证

5.OpenShift部署

首先找到官方镜像地址

https://github.com/openshift/library/tree/master/official/datagrid

打开imagestreams/jboss-datagrid72-openshift-rhel7.json,然后pull到本地

docker pull registry.redhat.io/jboss-datagrid-/datagrid72-openshift:1.2

pull前先用docker login登录网站redhat.io(3.11的新特征 :()

然后查看Service catalog

咱们就来搞这个7.2的Ephemeral, no https了

oc get templates -n openshift

.....
datagrid72-basic An example Red Hat JBoss Data Grid application. For more information about us... ( blank) ........

然后修改镜像地址

oc edit template datagrid72-basic -n openshift

切换到openshift命名空间,导入ImageStream

oc project openshift

oc import-image datagrid72-openshift:1.2   --from=registry.example.com/jboss-datagrid-/datagrid72-openshift:1.2  --insecure --confirm

一切就绪,开始建立

输入一个Cache名,然后创建.

创建完成

Scale Pod,然后检查Pod日志,可见新的pod已经加入集群。

6.OpenShift环境中的验证

Openshift环境中JDG提供了访问的三种模式

  • memcached, 基于memcache协议
  • hotrod,基于TCP,适合Client Server
  • Rest(对应datagrid-app),适合基于http协议,因此暴露对外路由。

原本想法是,修改hotrod,加入nodePort,然后通过OpenShift外面的tomcat或Java Client进行访问,但尝试了一下,发现不行,

Client端会直接找JDG Pod的实际地址建立连接,然后发现无法访问。因此需要将tomcat部署到OpenShift内部进行尝试。

  • 在同一项目中访问,修改jsp代码为
                ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host(System.getenv("DATAGRID_APP_HOTROD_SERVICE_HOST"))
.port(Integer.parseInt(System.getenv("DATAGRID_APP_HOTROD_SERVICE_PORT"));
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());

这里hotrod的地址是通过存放在tomcat pod中的环境变量DATAGRID_APP_HOTROD_SERVICE_HOST已及ATAGRID_APP_HOTROD_SERVICE_PORT获取

访问成功。

  • 不同项目中访问,需要在java代码中根据服务名获取服务地址。

不同的项目访问,在pod的环境变量中不会有其他项目的环境变量,因此需要根据服务名获取服务地址,核心代码为

                        InetAddress address = InetAddress.getByName("datagrid-app-hotrod.jdg");
System.out.println(address.getHostAddress()); ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host(address.getHostAddress())
.port(Integer.parseInt(""));

访问hotrod的地址,通过InetAddress.getByName("datagrid-app-hotrod.jdg"),带上服务名以及项目名获取。验证无误。

贴一个jdg-write.jsp的完整代码:

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="org.infinispan.client.hotrod.RemoteCache,org.infinispan.client.hotrod.RemoteCacheManager,org.infinispan.client.hotrod.configuration.ConfigurationBuilder,com.redhat.lab.jdg.*,java.net.*,java.utils.*" %>
<html>
<head>
<title>My JSP starting page</title>
</head> <body>
<h1> <%
try { InetAddress address = InetAddress.getByName("datagrid-app-hotrod.jdg");
System.out.println(address.getHostAddress()); ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host(address.getHostAddress())
.port(Integer.parseInt(""));
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build()); RemoteCache<String, User> cache = cacheManager.getCache("samples"); User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
cache.put("jdoe", user);
System.out.println("John Doe has been put into the cache");
out.println("John Doe has been put into the cache"); if (cache.containsKey("jdoe")) {
System.out.println("jdoe key is indeed in the cache");
out.println("jdoe key is indeed in the cache");
} if (cache.containsKey("jane")) {
System.out.println("jane key is indeed in the cache");
out.println("jane key is indeed in the cache");
} user = cache.get("jdoe");
System.out.println("jdoe's firstname is " +
user.getFirstName()); out.println("jdoe's firstname is " +
user.getFirstName()); } catch (Exception e) {
e.printStackTrace();
} %>
</h1>
</body>
</html>

调试到了第11个版本终于解决了各种低级错误,成功运行,反复调试修改后主要执行的三个命令记录如下

docker build -t registry.example.com/jdg/tomcatsample:v1 .

docker push registry.example.com/jdg/tomcatsample:v1

oc import-image tomcatsample:v1   --from=registry.example.com/jdg/tomcatsample:v1  --insecure --confirm

然后就依赖于Deployconfig的根据镜像变化从而触发Pod更新的trigger了。

形成客户端镜像的Tomcat 的Dockerfile

[root@master client]# cat Dockerfile
FROM registry.example.com/tomcat:-slim RUN mkdir -p /usr/local/tomcat/webapps/jdg
COPY samples/jdg/* /usr/local/tomcat/webapps/jdg/ USER root RUN unzip -d /usr/local/tomcat/webapps/jdg/ /usr/local/tomcat/webapps/jdg/WEB-INF.zip CMD [ "/usr/local/tomcat/bin/catalina.sh","run" ]

JBoss Data Grid 7.2 在OpenShift环境中的Quick Start的更多相关文章

  1. OpenShift环境中手工模式添加etcd server

    模拟备份和恢复,在现有的集群环境,单master(etcd), infra和node上面添加另外一台机器作为etcd Server. 基于OpenShift 3.11版本,详情可以参考 https:/ ...

  2. DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  3. DevExpress WinForms使用教程:Data Grid - Find Panel模式

    [DevExpress WinForms v18.2下载] DevExpress WinForms用户都熟知,Data Grid是整个产品线的主要产品.在v18.2中添加了一些新的功能,例如之前教程中 ...

  4. JBOSS安装与配置搭建本地项目环境(方便前端开发调式)

    JBOSS安装与配置搭建本地项目环境  什么是JBOSS? JBOSS是EJB的服务器,就像Tomcat是JSP服务器一样,就是服务器的一种. 环境搭建如下: 一:首先安装JDK,配置环境变量(PAT ...

  5. 如何计算Data Guard环境中Redo所需的网络带宽传输 (Doc ID 736755.1)

    How To Calculate The Required Network Bandwidth Transfer Of Redo In Data Guard Environments (Doc ID ...

  6. DevExpress Blazor组件全新来袭!增强Data Grid、TreeView API

    点击获取DevExpress v19.1.7最新完整版试用下载 DevExpress UI for Blazor即将在最新的v19.1.8中可用,此次更新发布包括DevExpress Blazor组件 ...

  7. Docker系列(十六):搭建Openshift环境

    目的: 搭建Linux下的Openshift环境. 参考资料: 开源容器云OpenShift 构建基于Kubernetes的企业应用云平台 ,陈耿 ,P253 ,2017.06 .pdf 下载地址:h ...

  8. 基于 Angular Material 的 Data Grid 设计实现

    自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...

  9. Sensor Fusion-based Exploration in Home Environments using Information, Driving and Localization Gains(基于传感器融合的使用信息、驾驶和定位增益在家庭环境中的探索)

    Authors: Joong-Tae Park, Jae-Bok Song Department:Department  of  Mechanical  Engineering,  Korea  Un ...

随机推荐

  1. shell实现增加删除Linux系统用户脚本(密码为随机)

    README shell环境下运行脚本,根据需求选择相应的功能. List \t\t create the userlist 这一步是必须执行的,脚本会识别本地当前目录下的文件 Useradd \t\ ...

  2. 【LOJ】#2031. 「SDOI2016」数字配对

    题解 这个图是个二分图,因为如果有一个奇环的话,我们会发现一个数变成另一个数要乘上个数不同的质数,显然不可能 然后我们发现这个不是求最大流,而是问一定价值的情况下最大流是多少,二分一个流量,加上一条边 ...

  3. 【LOJ】#2292. 「THUSC 2016」成绩单

    题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...

  4. Django实战(4):scaffold生成物分析

    在上一节用一个插件生成了类似rails的scaffold,其实无非就是URLconf+MTV.让我们看看具体都生成了哪些东西. 首先是“入口”的定义即URLconf,打开urls.py: from d ...

  5. hdoj1233 还是畅通工程(Prime || Kruskal)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...

  6. poj1251 Jungle Roads(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...

  7. Java工具类之浮点精确计算

    public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 构造器私有,让这个类不能实例化 pri ...

  8. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  9. CLR基础

    一.各个语言的长处 ①非托管C/C++可对系统进行低级控制.可完全按照自己的想法管理内存,必要时方便地创建线程②使用Microsoft Visual Basic 6.0可以快速生成UI应用程序,并可以 ...

  10. [LeetCode] Max Points on a Line 题解

    题意 Given n points on a 2D plane, find the maximum number of points that lie on the same straight lin ...