使用Groovy快速分析Terracotta HealthCheck属性

article/2025/11/8 7:24:54

使用tc-config.xml 配置Terracotta服务器时,要考虑的因素之一是在Terracotta服务器(L2-L2)之间,从客户端到服务器(L1-L2)以及从服务器到客户端(L2-L1)之间的运行状况检查属性的规范。 。 在高可用性方案中,Terracotta会检查这些属性的配置组合,以确保这些组合落在特定范围内。 这篇博客文章演示了如何使用Groovy解析和分析给定的tc-config.xml文件,以确定Terracotta是否将提供有关这些属性配置的WARN级消息。

Terracotta 4.3.2 BigMemory Max高可用性指南 ( PDF )的“ About HealthChecker ”部分描述了HealthChecker的目的:“ HealthChecker是一个类似于TCP keep-alive的连接监视器。 HealthChecker在Terracotta服务器实例之间(在高可用性环境中)以及Terracotta服务器实例与客户端之间运行。 通过使用HealthChecker,Terracotta节点可以确定对等节点是否可达,处于运行状态或处于GC操作中。 如果对等节点不可访问或发生故障,则使用HealthChecker的Terracotta节点可以采取纠正措施。”

《 Terracotta 4.3.2 BigMemory Max高可用性指南》在“ HealthChecker属性 ”部分下包含一个表格,该表格明确说明了用于计算以确定是否应记录有关配置错误的高可用性的警告的Terracotta属性。 为每个组合指定了类似命名的属性(服务器对客户端[L2L1]的l2.healthcheck.l1.*属性,服务器对服务器[L2L2]的l2.healthcheck.l2.*l1.healthcheck.l2.*客户端到服务器[L1L2]的l1.healthcheck.l2.* )和对高可用性配置检查重要的属性(刚刚引用的属性名称的*部分)为ping.enabledping.idletimeping.intervalping.probessocketConnectsocketConnectCountsocketConnectTimeout 。 这篇文章的相关Groovy脚本假定一个L2-L2,L1-L2和L2-L1的ping.enabledsocketConnect属性都配置为true (这是所有L2L2,L1L2,L2L1组合的默认属性) 。

Terracotta类com.tc.l2.ha.HASettingsChecker检测到这些属性的两种组合,这些组合导致以短语“未正确配置高可用性:…”开头的WARN级别的日志消息。 这两个警告消息分别指出:“未正确配置高可用性:L1L2HealthCheck小于L2-L2HealthCheck + ElectionTime + ClientReconnectWindow”和“未正确配置高可用性:L1L2HealthCheck大于L2-L2HealthCheck + ElectionTime”。

Terracotta类HASettingsChecker的方法interNodeHealthCheckTime(int,int,int,int,int)实施了《 高可用性指南 》“ 计算HealthChecker最大值 ”部分中概述的公式:

pingIdleTime + ((socketConnectCount) * (pingInterval * pingProbes + socketConnectTimeout * pingInterval))

以下Groovy脚本分析指示的tc-config.xml文件,并将相同的运行状况检查属性检查应用于该文件的<tc-properties>部分中定义的相关属性。 此处显示的Groovy脚本除了要解析和分析的有效tc-config.xml文件之外,没有任何外部依赖项。 如果脚本访问com.tc.properties.TCPropertiesConsts中定义的String常量,而不是定义它们自己的硬编码版本,则脚本将更短并且需要的维护更少。

checkTCServerProperties.groovy

#!/usr/bin/env groovydef cli = new CliBuilder(usage: 'checkTCServerProperties -f <pathToTcConfigXmlFile> [-v] [-h]',header: '\nAvailable options (use -h for help):\n',footer: '\nParses referenced tc-config.xml file and analyzes its health check parameters..\n')
import org.apache.commons.cli.Option
cli.with
{h(longOpt: 'help', 'Usage Information', required: false)f(longOpt: 'file', 'Path to tc-config.xml File', args: 1, required: true)v(longOpt: 'verbose', 'Specifies verbose output', args: 0, required: false)
}
def opt = cli.parse(args)if (!opt) return
if (opt.h) cli.usage()String tcConfigFileName = opt.f
boolean verbose = opt.vprintln "Checking ${tcConfigFileName}'s properties..."
def tcConfigXml = new XmlSlurper().parse(tcConfigFileName)
TreeMap<String, String> properties = new TreeSet<>()
tcConfigXml."tc-properties".property.each
{ tcProperty ->String tcPropertyName = tcProperty.@nameString tcPropertyValue = tcProperty.@valueproperties.put(tcPropertyName, tcPropertyValue)
}
if (verbose)
{properties.each{ propertyName, propertyValue ->println "${propertyName}: ${propertyValue}"}
}boolean isL2L1PingEnabled = extractBoolean(properties, "l2.healthcheck.l1.ping.enabled")
boolean isL2L2PingEnabled = extractBoolean(properties, "l2.healthcheck.l2.ping.enabled")
boolean isL1L2PingEnabled = extractBoolean(properties, "l1.healthcheck.l2.ping.enabled")
boolean isPingEnabled = isL2L1PingEnabled && isL2L2PingEnabled && isL1L2PingEnabled
println "Health Check Ping ${isPingEnabled ? 'IS' : 'is NOT'} enabled."
if (!isPingEnabled)
{System.exit(-1)
}Long pingIdleTimeL2L1 = extractLong(properties, "l2.healthcheck.l1.ping.idletime")
Long pingIdleTimeL2L2 = extractLong(properties, "l2.healthcheck.l2.ping.idletime")
Long pingIdleTimeL1L2 = extractLong(properties, "l1.healthcheck.l2.ping.idletime")Long pingIntervalL2L1 = extractLong(properties, "l2.healthcheck.l1.ping.interval")
Long pingIntervalL2L2 = extractLong(properties, "l2.healthcheck.l2.ping.interval")
Long pingIntervalL1L2 = extractLong(properties, "l1.healthcheck.l2.ping.interval")Long pingProbesL2L1 = extractLong(properties, "l2.healthcheck.l1.ping.probes")
Long pingProbesL2L2 = extractLong(properties, "l2.healthcheck.l2.ping.probes")
Long pingProbesL1L2 = extractLong(properties, "l1.healthcheck.l2.ping.probes")boolean socketConnectL2L1 = extractBoolean(properties, "l2.healthcheck.l1.socketConnect")
boolean socketConnectL2L2 = extractBoolean(properties, "l2.healthcheck.l2.socketConnect")
boolean socketConnectL1L2 = extractBoolean(properties, "l1.healthcheck.l2.socketConnect")if (!socketConnectL2L1 || !socketConnectL2L2 || !socketConnectL1L2)
{println "Socket connect is disabled."System.exit(-2)
}Long socketConnectTimeoutL2L1 = extractLong(properties, "l2.healthcheck.l1.socketConnectTimeout")
Long socketConnectTimeoutL2L2 = extractLong(properties, "l2.healthcheck.l2.socketConnectTimeout")
Long socketConnectTimeoutL1L2 = extractLong(properties, "l1.healthcheck.l2.socketConnectTimeout")Long socketConnectCountL2L1 = extractLong(properties, "l2.healthcheck.l1.socketConnectCount")
Long socketConnectCountL2L2 = extractLong(properties, "l2.healthcheck.l2.socketConnectCount")
Long socketConnectCountL1L2 = extractLong(properties, "l1.healthcheck.l2.socketConnectCount")Long maximumL2L1 = calculateMaximumTime(pingIdleTimeL2L1, pingIntervalL2L1, pingProbesL2L1, socketConnectCountL2L1, socketConnectTimeoutL2L1)
Long maximumL2L2 = calculateMaximumTime(pingIdleTimeL2L2, pingIntervalL2L2, pingProbesL2L2, socketConnectCountL2L2, socketConnectTimeoutL2L2)
Long maximumL1L2 = calculateMaximumTime(pingIdleTimeL1L2, pingIntervalL1L2, pingProbesL1L2, socketConnectCountL1L2, socketConnectTimeoutL1L2)if (verbose)
{println "L2-L1 Maximum Time: ${maximumL2L1}"println "L2-L2 Maximum Time: ${maximumL2L2}"println "L1-L2 Maximum Time: ${maximumL1L2}"
}long electionTime = 5000
long clientReconnectWindow = 120000long maximumL2L2Election = maximumL2L2 + electionTime
long maximumL2L2ElectionReconnect = maximumL2L2Election + clientReconnectWindowif (verbose)
{println "L2-L2 Maximum Time + ElectionTime: ${maximumL2L2Election}"println "L2-L2 Maximum Time + ElectionTime + Client Reconnect Window: ${maximumL2L2ElectionReconnect}"   
}if (maximumL1L2 < maximumL2L2Election)
{print "WARNING: Will lead to 'High Availability Not Configured Properly: L1L2HealthCheck should be more than L2-L2HealthCheck + ElectionTime' "println "because ${maximumL1L2} < ${maximumL2L2Election}."
}
else if (maximumL1L2 > maximumL2L2ElectionReconnect)
{print "WARNING: Will lead to 'High Availability Not Configured Properly: L1L2HealthCheck should be less than L2-L2HealthCheck + ElectionTime + ClientReconnectWindow' "println "because ${maximumL1L2} > ${maximumL2L2ElectionReconnect}."
}/*** Extract a Boolean value for the provided property name from the provided* properties.** @return Boolean value associated with the provided property name.*/
boolean extractBoolean(TreeMap<String, String> properties, String propertyName)
{return  properties != null && properties.containsKey(propertyName)? Boolean.valueOf(properties.get(propertyName)): false
}/*** Extract a Long value for the provided property name from the provided* properties.** @return Long value associated with the provided property name.*/
Long extractLong(TreeMap<String, String> properties, String propertyName)
{return  properties != null && properties.containsKey(propertyName)? Long.valueOf(properties.get(propertyName)): 0
}/*** Provides the maximum time as calculated using the following formula:** Maximum Time =*      (ping.idletime) + socketConnectCount **      [(ping.interval * ping.probes) + (socketConnectTimeout * ping.interval)]*/
Long calculateMaximumTime(Long pingIdleTime, Long pingInterval, Long pingProbes,Long socketConnectCount, Long socketConnectTimeout)
{return pingIdleTime + socketConnectCount * pingInterval * (pingProbes + socketConnectTimeout)
}

该脚本也将在GitHub上可用 。 在某个时候,我可能会在该GitHub版本中解决其某些弱点和局限性。 具体来说,如上所示,该脚本当前采用“选举时间”和“客户端重新连接窗口”的默认值,但是可以从tc-config.xml文件中进行解析。

以下屏幕快照展示了该脚本针对各种tc-config.xml文件的操作。 第一个图像描述了未启用ping时脚本的行为。 第二张图描述了未启用套接字检查时脚本的行为。 第三幅和第四幅图像描述了高可用性配置的属性未正确配置时可能遇到的两个警告。 第五张图片描绘了脚本的完全成功执行,该脚本指示运行状况检查属性的配置在预期范围内。

Ping未启用 (非默认)

套接字未启用 (非默认)

HealthCheck属性警告#1

HealthCheck属性警告#2

已正确启用和配置HealthCheck属性

我使用了一个简单的电子表格来执行这些计算,并且效果很好。 但是,本文讨论的Groovy脚本允许自动分析候选tc-config.xml文件,而不需要将值复制并粘贴到电子表格中。 可以修改Groovy脚本以使用Terracotta提供的Java文件,如前所述。 还有其他一些增强功能可以使脚本更有用,例如从tc-config.xml文件解析客户端重新连接窗口和选举时间,而不是采用默认值。

翻译自: https://www.javacodegeeks.com/2017/03/using-groovy-quickly-analyze-terracotta-healthcheck-properties.html


http://chatgpt.dhexx.cn/article/86Aop45R.shtml

相关文章

EhCache 分布式缓存/缓存集群之Terracotta

介绍 分布式缓存使您可以利用水平扩展的其他好处&#xff0c;而不会损失本地堆上层提供的低延迟。 热点数据在本地缓存&#xff0c;热点数据在更快的层中 由一个应用程序实例缓存的数据可用于所有群集成员。 群集中有完整数据。 可以部署一台或多台镜像服务器来提供HA 要使…

Terracotta 集群

2019独角兽企业重金招聘Python工程师标准>>> 如何实现集群的。 测试代码编写 我们首先写一个demo&#xff0c;该demo在没有terracotta的环境下执行一次&#xff0c;看看结果 我们首先先写一个简单的多线程代码&#xff08;我们这个例子制定共享TerracottaDemo类的de…

Ehcache与terracotta集群配置

首先下载Ehcache&#xff0c;我下载的是ehcache-2.5.2&#xff0c;下载后解压文件&#xff0c;目录结构如下&#xff1a; 主要说明下terracotta这个目录&#xff0c;这个是terracotta服务器&#xff0c;里面有个bin目录&#xff0c;包含启动服务器和关闭服务的脚本&#xff0c;…

Terracotta 分布式缓存机制深入

Terracotta已收购Ehcache 数据缓存&#xff1a;&#xff08;无缝集成&#xff0c;代码注入方式&#xff0c;不需修改原代码&#xff09; Terracotta 功能&#xff08;JVM级POJO集群&#xff09;&#xff1a;DSO&#xff08;jvm本地线程加锁外&#xff0c;JVM集群上加排它锁&am…

分布式缓存之Ehcache与terracotta - Terracotta服务器概念篇

1、介绍 Terracotta服务器为Terracotta产品提供分布式数据平台。Terracotta服务器集群被称为Terracotta服务器阵列(TSA)。Terracotta服务器阵列可以从单个服务器&#xff0c;到一个用于高可用性(HA)的基本的双服务器串联&#xff0c;再到一个提供可配置的规模、高性能和深度故障…

IOCP与ASIO关系

笔记 IOCP&#xff1a;Input/Output Completion Port&#xff0c;Windows独有的内核对象&#xff0c;内核级完成IO的传输 &#xff0c;数据到来的时候自动把数据搬运到用户态的内存区&#xff0c;不需要拷贝文件描述符FileDescription&#xff08;fd&#xff09;到内核态查询状…

IOCP工作原理

文章来源&#xff1a;http://blog.csdn.net/zhongguoren666/article/details/7386592 本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念&#xff0c;这些概念都是与基于IOCP的开发密切相关的&#xff0c;对开发人员来讲&#xff0c;又不得不给予足…

Windows IOCP

Windows IOCP IOCP全称I/O Completion Port&#xff0c;中文译为I/O完成端口。IOCP是一个异步I/O的Windows API&#xff0c;它可以高效地将I/O事件通知给应用程序&#xff0c;类似于Linux中的Epoll。 简介 IOCP模型属于一种通讯模型&#xff0c;适用于Windows平台下高负载服务器…

IOCP小结

文章目录 一 什么是完成端口&#xff08;completion port&#xff09;对象二 使用IOCP的方法创建完成端口对象I/O服务线程和完成端口完成端口和重叠I/O 三 恰当地关闭IOCP四 IOCP大概的处理流程五 一个简单示例具体编程流程 当应用程序必须一次管理多个套接字时&#xff0c;完成…

IOCP高性能服务器的实现

应用场景说明&#xff1a;完成端口在面向现实应用的许多网络通信中应用很广泛&#xff0c;例如大型多人在线游戏&#xff0c;大型即时通信系统&#xff0c;网吧管理系统以及企业管理系统等具有大量并发用户请求的场合。 实现目标说明&#xff1a;通过完成端口模型构建一款服务…

IOCP 详解

IOCP 详解 网络上关于epoll的介绍资料多如牛毛&#xff0c;大多数已经讲解的非常细致。相比而言epoll只有三个接口调用&#xff0c;IOCP却有一堆的接口调用&#xff0c;更关键的是Windows的闭源性质&#xff0c;我们不知道调用之后Windows究竟做了哪些操作。众所周知IOCP是基于…

IOCP简介

1.1 环境要求本文读者需要熟悉C、TCP/IP、Socket编程、MFC&#xff0c;和多线程。源码使用Winsock 2.0和IOCP技术&#xff0c;要求&#xff1a;Windows NT/2000或以上&#xff1a;要求Windows NT3.5或以后版本Windows 95/98/ME&#xff1a;不支持Visual C.NET&#xff0c;或完整…

什么是IOCP

百度词条 输入输出完成端口&#xff08;Input/Output Completion Port&#xff0c;IOCP&#xff09;, 是支持多个同时发生的异步I/O操作的应用程序编程接口 一个IOCP对象&#xff0c;在操作系统中可关联着多个Socket和&#xff08;或&#xff09;文件控制端。 IOCP对象内部有一…

IOCP

载自&#xff1a;http://blog.csdn.net/markman101/article/details/6235516 本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念&#xff0c;这些概念都是与基于IOCP的开发密切相关的&#xff0c;对开发人员来讲&#xff0c;又不得不给予足够重视的…

IOCP模型与网络编程

IOCP模型与网络编程 一。前言&#xff1a; 在老师分配任务&#xff08;“尝试利用IOCP模型写出服务端和客户端的代码”&#xff09;给我时&#xff0c;脑子一片空白&#xff0c;并不知道什么是IOCP模型&#xff0c;会不会是像软件设计模式里面的工厂模式&#xff0c;装…

Windows下的IOCP模型(一):介绍与简单使用

一、IOCP简介 IOCP&#xff08;I/O Completion Port&#xff0c;I/O完成端口&#xff09;是Windows操作系统中伸缩性最好的一种I/O模型。I/O 完成端口是应用程序使用线程池处理异步 I/O 请求的一种机制。处理多个并发异步I/O请求时&#xff0c;使用 I/O 完成端口比在 I/O 请求时…

完成端口(IOCP)编程探讨

FW: http://www.zhuaxia.com/item/473350387 完成端口(IOCP)编程探讨 2007-08-26 16:06:00 来自&#xff1a;C博客-首页原创精华区 新建目录...根目录新手试用频道 本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念&#xff0c;这些概念都是与…

异步通信之IOCP详解

一、 概述 学习完网络基础&#xff0c;在写C/S应用程序时&#xff0c;大多童靴写服务器基本都没有用到io模型&#xff0c;基本都是采用“accept同步拥塞通讯和多线程方式”与客户端通讯。但当有成千上万客户端请求连接并与服务器通讯时&#xff0c;多线程的创建与CPU上下文的切…

IOCP详解

IOCP详解 IOCP&#xff08;I/O Completion Port&#xff0c;I/O完成端口&#xff09;是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时&#xff0c;以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多…

IOCP技术详解

这几周我接触了Windows网络通讯中的IOCP模型,自己在网上找了相关的知识进行学习&#xff0c;自己又下了好多服务器端的代码&#xff0c;但都运行不了&#xff0c;也是自己菜&#xff0c;能力还需加强。幸好我师父资助了我一个能运行的服务端IOCP代码&#xff0c;自己参照网上的…