一. 介绍
keycloak专为高可用和多节点集群设置而设计。当前的分布式缓存实现是建立在Infinispan之上的,Infinispan是一种高性能,可分布式的内存数据存储。
Infinispan是开源的Key--value数据存储,可以容纳所有类型的数据,从java对象到纯文本。可以做缓存或持久数据存储。
1.1 思考:在第8章已经部署了一个生产环境的Keycloak服务,如果再部署一台生产环境的keycloak服务,共用mysql数据库,为什么还要设置分布式缓存呢?下面来了解:
当在开发模式下启动keycloak时,通过使用start-dev命令,keycloak仅使用本地缓存,并且通过隐式设置--cache=local选项完全禁用分布式缓存。
本地缓存持久数据以避免不必要的数据库往返,默认情况下,领域、用户、授权都是本地缓存,最多缓存10000个条目,默认情况下本地密钥最多缓存1000个条目,并且默认为每小时过期一次。
缓存的条目越多,服务器从数据库中获取数据的频率就越低,应该评估内存利用率和性能之间的权衡。
本地缓存提高了性能,但在多节点设置中增加了挑战。当一个keycloak节点共享数据库中的数据时,其他节点都需要同步,否则全使其它节点缓存的数据无效。
部署多节点集群后,身份验证会话、用户会话打在某台节点上,首先会缓存,如果是分布式缓存。其它节点都能同步。
1.启用分布式缓存
当在生产模式下启动keycloak时,通过使用该start 命令,将启用缓存并发现您网络中的所有keycloak节点。
要显示启用分布式infinispan缓存,使用
bin/kc.[sh|bat] start --cache=ispn
2.配置缓存可用性
分布式缓存在集群中的节点子集上复制缓存条目,并将条目分配给固定所有者节点。每个分布式缓存默认有两个所有者,这意味着两个节点都有特定缓存条目的副本。当两个所有者节点都离线时,所有数据都将丢失。这种情况通常会导致用户在下一次请求时被注销并不得不重新登录。
如果集群节点超过二个,可以手动配置所有者数量,更好的满足可用性要求,请打开分布式缓存conf/cache-ispn.xml
的值并将其更改owners=<value>
为您想要的值
keycloak提供了一个缓存配置文件,位置是conf/cache-ispn.xml,如下所示
二.具体实现
2.1 准备条件:1) 二台节点(这里是centos8),分别装好docker, 二个节点内网ip为172.18.148.51, 172.18.148.50
2)申请域名这里是keycloak.mogul-tech.com
3)申请SSL证书并且关联到该域名,完整访问域名:https://keycloak.mogul-tech.com/
4)提供mysql数据库地址
2.2 部署keycloak
在二台节点,分别执行以下命令(由于8080已被占用,对外使用8081端口):
docker run -d -p 8081:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=Adm@kfk quay.io/keycloak/keycloak:20.0.1 start --cache=ispn --proxy edge --https-client-auth=none --hostname-admin-url=https://keycloak.xxx.com --hostname-strict-backchannel=false --hostname-strict=false --db mysql --db-url-host rm-xxxxf7ut8lvxa3771zo.mysql.rds.aliyuncs.com --db-url-port 3306 --db-username kcuser --db-password kcuser@keycloak#xxx --db-url-database keycloak --log=console,file
分别在二个节点,查看容器是否启动成功,以及查看容器日志
可以在内网访问:http://172.18.148.51:8081, http://172.18.148.50:8081
2.3 配置反向代理(阿里云负载)
在负载服务器上关联域名,分发到内网二台(使用https 443端口分发),调度算法由默认的轮询 改为 源IP一致性哈希(目前由于Infinispan没有配置成功,所有调度算法不能用轮询)。
2.4 访问web管理控制台
二台浏览器先后访问: https://xxxx.com/ 再登录, 二个浏览器下都能看到二个会话信息,如下所示:
官方文档:配置分配式缓存