
【摘要】如何对线上的Infinispan进行调优?
大家好,我是小盒子。上次推文:Infinispan篇(二):如何对Infinispan进行压力测试?从压测的结果来看,调整Infinispan的JVM启动参数之后,垃圾回收有明显减少。
今天的主题:如何对线上的Infinispan进行调优?
一、前言
在上篇中我们说到生产环境中Keycloak用的Infinispan的三节点分布式缓存,由于发现了大量的java.lang.OutOfMemoryError: Java heap space,JVM堆内存溢出了。导致Infinispan的其中一个节点竟然莫名的挂了,后面我们进行了压力测试,默认的Infinispan的JVM内存配置不足以支持我们Keycloak的会话存储。所以我们决定对生产中的Infinispan调整JVM内存配置。
二、集群架构
2.1 分布式内存
Infinispan 使用一致的哈希技术将每个条目的固定数量的副本存储在整个集群的缓存中。分布式缓存允许您线性扩展数据层,从而随着节点的加入而增加容量。分布式缓存为 Infinispan 集群增加了冗余,以提供容错和持久性保证。Infinispan部署通常配置与持久存储的集成,以保留群集状态,以便正常关闭和从备份还原。如下分布式缓存架构图:
2.1 会话外部化
Infinispan可以为基于Quarkus,WildFly,Apache Tomcat和Spring构建的应用程序提供外部缓存。这些外部缓存独立于应用程序层存储 HTTP 会话和其他数据。我们目前Keycloak采取的就是会话外部化。会话外部化有以下几个好处:
弹性:无需在扩展应用程序时重新平衡操作。
更小的内存占用:将会话数据存储在外部缓存中可降低应用程序的总体内存需求。
跨站点复制
Infinispan可以在地理位置分散的数据中心和不同云提供商之间运行的集群之间备份数据。跨站点复制为 Infinispan 提供了全局群集视图,并且:
在发生中断或灾难时保证服务连续性。
为客户端应用程序提供对全局分布式缓存中数据的单一访问点。
三、备份和恢复集群
我们Infinispan常驻会话大概8w多个,为了让用户无感知,我们需要先进行集群备份。Infinispan的备份包含缓存条目、缓存的 Infinispan资源的存档配置、Protobuf架构和服务器脚本。备份存档*.zip包结尾。备份存档可以在重新启动或重新启动后还原,或者进行Infinispan 服务器集群迁移。备份和恢复集群只操作一个节点即可。
3.1 备份和还原Infinispan集群命令集合
3.1.1、备份命令集合
先决条件:
启动Infinispan CLI。
连接到正在运行的 Infinispan 集群。
1. 创建与Infinispan的 CLI 连接
[root@201 infinispan-server-13.0.2.Final]# cd bin/
[root@201 bin]# ls
cli.bat cli.sh common.sh report-osx.sh server.bat server.sh user-tool.bat
cli.log4j2.xml common.bat nohup.out report.sh server.conf service.bat user-tool.sh
[root@201 bin]# ./cli.sh
[disconnected]> connect 192.168.0.201:11222
[201-24046@cluster//containers/default]>
“在infinispan启动是-b 0.0.0.0的connect 127.0.0.1:11222即可
”
2.使用自动生成的名称备份所有资源
backup create
3.备份名为example-backup的备份存档中的所有资源
backup create -n example-backup
4.所有资源备份到服务器上的路径。如:/some/server/dir
backup create -d /some/server/dir
“这个路径指的是服务器上的绝对路径。
”
5.仅备份缓存和缓存模板
backup create --caches=* --templates=*
6.仅备份命名的 Protobuf 架构
backup create --proto-schemas=schema1,schema2
7.列出服务器上可用的备份存档
backup ls
8.从服务器下载名为example-backup存档
backup create -n example-backup
“如果备份操作仍在进行中,该命令将等待它完成
”
9.从服务器中删除名为example-backup的存档(可选)。
backup delete example-backup
3.1.2、还原命令集合
先决条件:
创建 Infinispan CLI 本地或存储在 Infinispan Server 上的备份归档。
确保目标容器与备份存档中的容器名称匹配。如果容器名称不匹配,则无法还原备份。
1. 创建与Infinispan的 CLI 连接
[root@201 bin]# ./cli.sh
[disconnected]> connect 192.168.0.201:11222
[201-24046@cluster//containers/default]>
“在infinispan启动是-b 0.0.0.0的connect 127.0.0.1:11222即可
”
2.从服务器上可访问的备份存档中恢复所有内容
backup restore /some/path/on/the/server
3.从本地备份存档还原所有内容
backup restore -u /some/local/path
4.仅从服务器上的备份存档还原缓存内容
backup restore /some/path/on/the/server --caches=*
3.2 备份Infinispan集群实践
先通过Infinispan Console看看在线的会话情况,如下:
1. 创建与Infinispan的 CLI 连接
[root@201 bin]# ls
cli.bat cli.sh common.sh report-osx.sh server.bat server.sh user-tool.bat
cli.log4j2.xml common.bat nohup.out report.sh server.conf service.bat user-tool.sh
[root@201 bin]# ./cli.sh
[disconnected]> connect 192.168.0.201:11222
[201-24046@cluster//containers/default]>
2.使用自动生成的名称备份所有资源
[201-24046@cluster//containers/default]> backup create
Creating backup 'Infinispan-20230118132557'
[201-24046@cluster//containers/default]>
3.列出服务器上可用的备份存档
[201-24046@cluster//containers/default]> backup ls
["Infinispan-20230118132557"]
[201-24046@cluster//containers/default]>
3.服务器上备份路径查看
在/server/data/backups下就可以看到备份的文件
3.3 还原Infinispan集群实践
1. 先停止整个Infinispan集群
[root@201 bin]# ./cli.sh
[disconnected]> connect 192.168.0.201:11222
["Infinispan-20230118132557"]
[201-24046@cluster//containers/default]> shutdown cluster
[201-24046@cluster//containers/default]>
“shutdown cluster停止整个集群,三个节点都会停止。
”
2. 启动整个Infinispan集群
nohup /mnt/data/infinispan-server-13.0.2.Final/bin/server.sh -b 192.168.0.201 -k 192.168.0.201 &
nohup /mnt/data/infinispan-server-13.0.2.Final/bin/server.sh -b 192.168.0.202 -k 192.168.0.202 &
nohup /mnt/data/infinispan-server-13.0.2.Final/bin/server.sh -b 192.168.0.203 -k 192.168.0.203 &
3. 先通过Infinispan Console看看在线的会话情况
“2个session已经不见了。
”
4. 还原Infinispan集群
[root@201 bin]# ./cli.sh
[disconnected]> connect 192.168.0.201:11222
[201-1981@cluster//containers/default]> backup restore ../server/data/backups/Infinispan-20230118132557/Infinispan-20230118132557.zip
Restoring from backup '/mnt/data/infinispan-server-13.0.2.Final/bin/../server/data/backups/Infinispan-20230118132557/Infinispan-20230118132557.zip'
[201-1981@cluster//containers/default]>
5. 再通过Infinispan Console看看在线的会话情况
“2个session回来了。
”
3.4 小结
Infinispan的集群的成功备份是由集群的健康状态来决定的,若是集群状态是Healthy,则可以备份成功。若是集群状态Degraded(降级状态),是备份不成功的。我们线上的Infinispan集群由于一个节点挂了一段时间,再重启后导致集群状态Degraded(降级状态),各节点数据不一致,导致备份不成功,只有来一次彻底重启才能恢复到Healthy状态。
由于线上集群状态Degraded(降级状态),且通过api接口调用自动均衡的接口不起作用,我们无法完成整个集群的备份。经过验证在Infinispan三个节点的情况下,挂一个节点,其余两个节点是可以保持数据的完整性,不会影响Keycloak服务的正常使用。虽然采用轮换节点修改JVM内存的方法可行,但是我们为了保险起见,又增加了2个Infinispan节点。在5节点的情况下,对原来3个节点进行了jvm内存调整。
“可以看到集群状态还是Degraded(降级状态),为了数据的一致性,还是需要找个合适的时间点来重启整个Infinispan集群。
”
· END ·
如果这篇文章对您有帮助或者有所启发的话,请帮忙三连暴击点赞、转发和在看。您的支持是我坚持更新的最大动力。













