JBoss Data Grid 7.2 在OpenShift环境中的Quick Start
为了在容器环境中运行,首先需要弄清楚的是在传统环境下如何运行,所以我们从传统环境开始。
先去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的更多相关文章
- OpenShift环境中手工模式添加etcd server
模拟备份和恢复,在现有的集群环境,单master(etcd), infra和node上面添加另外一台机器作为etcd Server. 基于OpenShift 3.11版本,详情可以参考 https:/ ...
- DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...
- DevExpress WinForms使用教程:Data Grid - Find Panel模式
[DevExpress WinForms v18.2下载] DevExpress WinForms用户都熟知,Data Grid是整个产品线的主要产品.在v18.2中添加了一些新的功能,例如之前教程中 ...
- JBOSS安装与配置搭建本地项目环境(方便前端开发调式)
JBOSS安装与配置搭建本地项目环境 什么是JBOSS? JBOSS是EJB的服务器,就像Tomcat是JSP服务器一样,就是服务器的一种. 环境搭建如下: 一:首先安装JDK,配置环境变量(PAT ...
- 如何计算Data Guard环境中Redo所需的网络带宽传输 (Doc ID 736755.1)
How To Calculate The Required Network Bandwidth Transfer Of Redo In Data Guard Environments (Doc ID ...
- DevExpress Blazor组件全新来袭!增强Data Grid、TreeView API
点击获取DevExpress v19.1.7最新完整版试用下载 DevExpress UI for Blazor即将在最新的v19.1.8中可用,此次更新发布包括DevExpress Blazor组件 ...
- Docker系列(十六):搭建Openshift环境
目的: 搭建Linux下的Openshift环境. 参考资料: 开源容器云OpenShift 构建基于Kubernetes的企业应用云平台 ,陈耿 ,P253 ,2017.06 .pdf 下载地址:h ...
- 基于 Angular Material 的 Data Grid 设计实现
自 Extensions 组件库发布以来,Data Grid 成为了使用及咨询最多的组件.最开始 Data Grid 的设计非常简陋,经过一番重构,组件质量有了质的提升. Extensions 组件库 ...
- 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 ...
随机推荐
- shell实现增加删除Linux系统用户脚本(密码为随机)
README shell环境下运行脚本,根据需求选择相应的功能. List \t\t create the userlist 这一步是必须执行的,脚本会识别本地当前目录下的文件 Useradd \t\ ...
- 【LOJ】#2031. 「SDOI2016」数字配对
题解 这个图是个二分图,因为如果有一个奇环的话,我们会发现一个数变成另一个数要乘上个数不同的质数,显然不可能 然后我们发现这个不是求最大流,而是问一定价值的情况下最大流是多少,二分一个流量,加上一条边 ...
- 【LOJ】#2292. 「THUSC 2016」成绩单
题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...
- Django实战(4):scaffold生成物分析
在上一节用一个插件生成了类似rails的scaffold,其实无非就是URLconf+MTV.让我们看看具体都生成了哪些东西. 首先是“入口”的定义即URLconf,打开urls.py: from d ...
- hdoj1233 还是畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...
- poj1251 Jungle Roads(Prime || Kruskal)
题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...
- Java工具类之浮点精确计算
public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 构造器私有,让这个类不能实例化 pri ...
- @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法
JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...
- CLR基础
一.各个语言的长处 ①非托管C/C++可对系统进行低级控制.可完全按照自己的想法管理内存,必要时方便地创建线程②使用Microsoft Visual Basic 6.0可以快速生成UI应用程序,并可以 ...
- [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 ...