Skip to main content
版本:1.5.0

网关服务支持多活

1.背景

因为原有的登陆 session 未支持分布式存储,对于同一个用户的所有请求,需要 nginx 转发请求到同一个 gateway 实例上,才能正常处理请求。 常用的解决方式是通过在入口 nginx 上通过配置 ip hash 负载均衡的方式来支持。 但是ip hash 方式 如果存在服务器的扩容与缩容时,所有客户端ip的 hash 值都需要重新计算,会导致会话丢失, 其次容易因为节点分部不均匀⽽造成数据倾斜问题。为了优化 ip hash 方式存在的问题,对登陆态的 session 实现共享存储

2.实现方案

因为会话信息主要是通过 ticketId 来标识,所有对外入口为 gateway,所以只需要对 gateway 模块进行改造。 对于底层的共享存储,选择主流的内存数据库 redis。对于是否启动 redis 会话存储,支持通过配置文件控制。
关键代码改动为 org.apache.linkis.server.security.SSOUtilsuserTicketIdToLastAccessTime

请求流程:

用户请求 -> nginx -> linkis-gateway -> linkis 后端服务

3.使用方式

需要可用的 reids 环境,支持单机版redis和redis 哨兵模式。

安装部署Linkis 后,修改配置文件 ${LINKIS_HOME}/conf/linkis.properties

#开启redis cache配置
linkis.session.redis.cache.enabled=true


#单机版
linkis.session.redis.host=127.0.0.1
linkis.session.redis.port=6379
linkis.session.redis.password=test123

# 哨兵模式
linkis.session.redis.sentinel.master=sentinel-master-name
linkis.session.redis.sentinel.nodes=127.0.1.1:6381,127.0.2.1:6381,127.0.3.1:6381
linkis.session.redis.password=test123

正常启用 gateway 即可,启动 redis 后,对于多个 gateway 示例,在 nginx 侧配置时,可以使用 nginx 默认负载均衡模式。