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

先去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. cetos6配置用msmtp和mutt发邮件(阿里云)

    Linux下可以直接用mail命令发送邮件,但是发件人是user@servername,如果机器没有外网的dns,其他人就无法回复.此时,有一个可以使用网络免费邮箱服务的邮件发送程序就比较重要了.ms ...

  2. 【LOJ】#2672. 「NOI2012」魔幻棋盘

    题解 代码7.1KB,人傻代码长 恶心死我了这代码真的把我写恶心了= = 想一想就知道这个东西--维护到中心的差分,然后用二维线段树维护一下矩形的gcd 嗯,我说完了,你写吧. 首先这个二维线段树的单 ...

  3. jenkins备份与恢复

    jenkins这里我通过thinbackup插件进行对jenkins的配置备份与恢复 1丶安装thinbackup插件 2丶系统管理选择thinbackup插件 3丶创建备份目录 mkdir /bac ...

  4. 使用ASP.NET MVC+Entity Framework快速搭建系统

    详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...

  5. php中explode和implode函数

    explode array explode ( string $delimiter, string $string, [ , $limit ] ) 函数返回由字符串组成的数组,每个元素都是string ...

  6. c++ 栈(顺序表)

    栈可以用顺序表(数组)也可以用链表来储存内容,本文采用顺序表(数组)来保存内部元素.代码如下:  1 #include <iostream> 2 using namespace std; ...

  7. shell cut

    使用说明cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要参数 ...

  8. Web服务评估工具Nikto

    Web服务评估工具Nikto   Nikto是一款Perl语言编写的Web服务评估工具.该工具主要侧重于发现网站的默认配置和错误配置.它通过扫描的方式,检测服务器.服务和网站的配置文件,从中找出默认配 ...

  9. bzoj5102 [POI2018]Prawnicy 线段树

    $bzoj$跑的太慢了...... 我们考虑用线段树来解决这个问题 考虑扫描线 当扫到左端点$i$时,我们把线段$i$加入线段树 同时,对于每个左端点$i$,我们在线段树上二分出最远的$r$满足$r$ ...

  10. Problem A&B: 开宝箱 1/2 (最沙雕的做法)(未用指针做) 改:附上一种指针做法

    Description 急先锋是一个商人,有一天找到了一个宝箱,宝箱需要正确的密码才能打开.同时他发现宝箱上有一个数字,和一份密码表.密码表上有n个密码,只有一个密码是正确的. 急先锋所在的岛上有m个 ...