【Hazelcast学习】Management Center、R
如果想要查看Hazelcast里储存的数据,有几种方式呢?本文介绍Hazelcast监控相关的工具:
-
Management Center
: UI 管理界面 -
Hazelcast Rest API
:端点暴露 - 通过
JMX
查看数据 - 通过
hz-cli
查看数据
注:文章示例基于Hazelcast v5.1.1,关于Hazelcast与Spring的集成,看【Hazelcast学习】入门篇,以及和Spring Boot集成
1. Management Center
在线文档:https://docs.hazelcast.com/management-center/5.1/getting-started/overview
1.1 下载
可以通过Docker安装,或是MacOS homebrew安装,当然也可以下载Binary版本。我使用的是Binary版本。
Binary下载地址:https://hazelcast.com/open-source-projects/downloads/archives/#hazelcast-management_center
1.2 启动Management Center
下载好了之后,在bin目录下启动start.sh,控制台打印:
2022-05-15 20:23:21,165 [ INFO] [AsyncExecutor-1] [c.h.w.s.ClusterManager]: Connecting to 0 enabled cluster(s) on startup.
2022-05-15 20:23:22,192 [ INFO] [main] [c.h.w.Launcher]: Hazelcast Management Center successfully started at http://localhost:8080/
进入http://localhost:8080,首页长这样:
点击Dev Mode,Cluster Connections -> Add:
1.3 示例
首先在代码中加入三个value:
@RestController
public class TestController {
@Autowired
private HazelcastInstance hazelcastInstance;
@PostConstruct
public void init() {
IMap iMap = hazelcastInstance.getMap("testMap");
iMap.put("user1", "user name-1");
iMap.put("user2", "user name-2");
iMap.put("user3", "user name-3");
}
}
在Strorage -> Maps查看确实存了3个对象:
在Console里也提供了通过key来查看value的功能:
但如果你的value是一个Java对象,比如new User(1, "user name")
这样的对象,那么在Management User按key取值的时候会报错。原因是Hazelcast在存的时候都会序列化(如果使用Json格式的String倒是可以的)。报错如下:
解决办法:可以把包含Value对象的jar,放到hazelcast-management-center-5.1.1\bin\user-lib下。
有关更多IMap在Management Center中的使用,查看:https://docs.hazelcast.com/management-center/5.1/data-structures/map
2. Hazelcast Rest API
详情:https://docs.hazelcast.com/hazelcast/5.1/maintain-cluster/rest-api
Rest service默认是关闭的,需要手动开启:
REST service is disabled in the configuration by default.
2.1 开启Rest API
如何手动开启:<hz:rest-api enabled="true"></hz:rest-api>
<hz:hazelcast id="instance">
<hz:config>
<hz:cluster-name>dev</hz:cluster-name>
<hz:network port="5701" port-auto-increment="true">
...
<hz:rest-api enabled="true"></hz:rest-api>
</hz:network>
</hz:config>
</hz:hazelcast>
开始后Rest API默认端口5701,访问:http://localhost:5701/hazelcast/health
返回:
{"nodeState":"ACTIVE","clusterState":"ACTIVE","clusterSafe":true,"migrationQueueSize":0,"clusterSize":2}
2.2 支持多种endpoint group
- CLUSTER_READ,开启Rest API后就默认开启了这个组
- CLUSTER_WRITE
- HEALTH_CHECK,开启Rest API后就默认开启了这个组
- PERSISTENCE
- WAN
- DATA
- CP
具体的说明看官网:https://docs.hazelcast.com/hazelcast/5.1/maintain-cluster/rest-api#using-rest-endpoint-groups
2.3 DATA Group的示例
在#2.2中说了,只有CLUSTER_READ和HEALTH_CHECK Group默认开启的,想要使用DATA Group,需要额外配置:
<hz:rest-api enabled="true">
<hz:endpoint-group name="DATA" enabled="true"></hz:endpoint-group>
</hz:rest-api>
测试:
打开:http://localhost:5701/hazelcast/rest/maps/testMap/user1
返回数据:user name-1
3. 通过JMX查看
3.1 默认情况下,JMX Metrics相关的指标是默认开启的:
Controls whether the metrics collected are exposed to through JMX. It is enabled by default.
想要关闭,可以配置system property:hazelcast.metrics.jmx.enabled
。
3.2 通过JConsole查看
如果是MacOS系统,在Finder不好找路径,可以在终端用open foldername打开。
点击MBean,就能看到hazelcast相关的metrix了。 MBean
Metrix相关的指标,可以参考:https://docs.hazelcast.com/hazelcast/5.1/list-of-metrics
3.3 除了Metrix,我们还可以看别的指标
除了Metrics,我们还可以看IMap, ISet这些具体的数据,这块相关的就需要手动开启了,Hazelcast官网把这块内容叫JMX监控,它并不从属于Metrics的内容。
参考:https://docs.hazelcast.com/hazelcast/5.1/maintain-cluster/monitoring#monitoring-with-jmx
手动开启:<hz:property name="hazelcast.jmx">true</hz:property>
<hz:hazelcast id="instance">
<hz:config>
<hz:network port="5701" port-auto-increment="true">
...
</hz:network>
<hz:properties>
<hz:property name="hazelcast.jmx">true</hz:property>
</hz:properties>
</hz:config>
</hz:hazelcast>
在开启后,可以在jconsole中看到除了之前的Metrics,还多了一项IMap了:
JMX monitor
一般像IMap的size, 或者是values, entrySet, 甚至做clear操作,都不能在Metrics指标下做,Metrics更像是纯监控的指标,而IMap这个,可以通过JMX查看数据以及操作数据。
IMap
3.4 通过Java代码查看JMX
前提是先运行另一个Hazelcast客户端,开启hazelcast.jmx,然后set下JMX Port: -Dcom.sun.management.jmxremote.port=9988,在启动的时候先put一条数据:
@PostConstruct
public void init() {
IMap iMap = hazelcastInstance.getMap("testMap");
iMap.put("user1", "value1");
}
然后是JMX代码:
public class ConnectToJMXBeans {
private static final int PORT = 9988;
public static void main(String[] args) throws Exception {
// parameters for connecting to the JMX Service
String hostname = InetAddress.getLocalHost().getHostName();
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://" + hostname + ":" + PORT
+ "/jndi/rmi://" + hostname + ":" + PORT + "/jmxrmi");
// connect to the JMX Service
JMXConnector jmxConnector = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
// See all Beans available
Set<ObjectName> names = new TreeSet<>(mbsc.queryNames(null, null));
names.stream().forEach(System.out::println);
// Metrix
ObjectName metrics = names.stream().filter(name -> name.toString().contains("testMap") && name.toString().contains("type=Metrics")).findAny().get();
System.out.println("putCount: " + mbsc.getAttribute(metrics, "putCount"));
// IMap
ObjectName imap = names.stream().filter(name -> name.toString().contains("testMap") && name.toString().contains("type=IMap")).findAny().get();
System.out.println("size " + mbsc.getAttribute(imap, "size"));
}
}
4. 通过hz-cli查看数据
下载页面:https://hazelcast.com/open-source-projects/downloads/archives/#hazelcast-platform
下载hazelcast-5.1.1.tar.gz,解压,bin目录下面,有个hz-cli,可以通过这个客户端加入到Hazelcast网络中。
在bin目录下输入:
通过help命令可以查看帮助: hz-cli console./hz-cli console
示例:
首先默认进入的是default namespace。
而我们的代码中写的是:IMap iMap = hazelcastInstance.getMap("testMap");
所以可以通过ns + namespace的方式,切到testMap目录下。
然后就可以通过IMap的命令拿到数据啦: