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

先去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. ASP.NET:MVC模板化机制

    模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...

  2. 【51nod】1565 模糊搜索

    题解 这个字符集很小,我们可以把每个字符拿出来做一次匹配,把第一个字符串处理每个出现过的该字符处理成一个区间加,即最后变成第一个字符串的该位置能够匹配某字符 例如对于样例 10 4 1 AGCAATT ...

  3. USACO 6.5 All Latin Squares

    All Latin Squares A square arrangement of numbers 1 2 3 4 5 2 1 4 5 3 3 4 5 1 2 4 5 2 3 1 5 3 1 2 4 ...

  4. ifdown eth0或service network restart

    错误提示信息如下: Shutting down interface eth0:  Error: Device 'eth0' (/org/freedesktop/NetworkManager/Devic ...

  5. Ionic Js十五:对话框

    $ionicPopup ionic 对话框服务允许程序创建.显示弹出窗口. $ionicPopup 提供了3个方法:alert(), prompt(),以及 confirm() . 实例 HTML 代 ...

  6. 在windows下的CLI模式下如何运行php文件

    https://blog.csdn.net/evkj2013/article/details/52313728 https://jingyan.baidu.com/article/da1091fb09 ...

  7. zoj 3983 Crusaders Quest 思维+枚举

    题目链接 这道题意思是: 给你一个长度为9的字符串,且只有3个a.3个g.3个o 问,你可以选择删除一段连续的串或者单个的字符也可以不删,最多会出现几个三子相连的子串 比如:agoagoago只有将两 ...

  8. parcelable 和 serializable 区别

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha serializable 是 java 中的 序列化 接口. parcelable 是 ...

  9. [JOISC2014]水筒

    OJ题号: BZOJ4242.AtCoder-JOISC2014E 题目大意: 给你一个h*w的网格图,每个格子可能是空地.障碍物和建筑物. 你只可以从空地上走过或者从建筑物中穿过. 建筑物总共有p个 ...

  10. PIXIV 爬取国际前100名代码

    PYTHON爬虫 爬取PIXIV国际前100名的代码 代码是别人的,那天学习爬虫的时候看到了,写的很厉害~ 学习学习 #coding:UTF-8 __author__ = 'monburan' __v ...