标签: sticky-session

是否需要最新的AWSALB cookie?(AWS ELB应用程序负载均衡器)

意见

使用Amazon ELB Application Load Balancer并使用Sticky Sessions时,负载均衡器会插入AWSALB第一个请求中指定的cookie .要让下一个请求粘贴到同一目标节点(EC2实例),cookie应该包含在该请求中.这样做时,负载均衡器似乎在对第二个请求的响应中插入了不同的cookie值.在第3个请求中包含此新cookie值时,我们会在响应中获得新的cookie值.等等...

(这与Sticky Sessions如何与Classic Load Balancer一起使用,其中cookie被命名AWSELB并保留其值,直到被客户端或负载均衡器丢弃.)

AWSALBcookie一直在改变值的原因似乎是(正如文档所述):

cookie的名称是AWSALB.这些cookie的内容使用旋转密钥加密.您无法解密或修改负载均衡器生成的cookie.

因此,即使cookie的内容可能相同,我们也无法分辨.

问题是对负载均衡器的请求是否必须始终包含最近收到的AWSALBcookie 值,或者是否可以发送一些先前收到的值(当然,来自同一个粘性会话).

如果这是一项要求,AWS ELB应用程序负载均衡器将无法为执行多个并行请求的客户端(在收到第一个AWSALBcookie之后)提供服务,而只能为以连续方式(一次一个)执行所有请求的客户端提供服务.

任何人都可以对此有所了解吗?

amazon-web-services sticky-session elastic-load-balancer

17
推荐指数
1
解决办法
1万
查看次数

Kubernetes 集群上的粘性会话

目前,我正在尝试在 Google Cloud 上创建一个带有两个负载均衡器的 Kubernetes 集群:一个用于后端(在 Spring Boot 中),另一个用于前端(在 Angular 中),其中每个服务(负载均衡器)与 2 个副本(pod)通信. 为了实现这一点,我创建了以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-ingress
spec:
  rules:
    - http:
        paths:
          - path: /rest/v1/*
            backend:
              serviceName: sample-backend
              servicePort: 8082
          - path: /*
            backend:
              serviceName: sample-frontend
              servicePort: 80
Run Code Online (Sandbox Code Playgroud)

上面提到的入口可以使前端应用程序与后端应用程序提供的 REST API 进行通信。但是,由于后端提供的身份验证机制,我必须创建粘性会话,以便每个用户都与同一个 POD 通信。澄清一下,如果一个用户在 POD #1 中进行身份验证,POD #2 将无法识别 cookie。

为了解决这个问题,我读到Nginx-ingress设法处理这种情况,我通过此处提供的步骤进行安装:https : //kubernetes.github.io/ingress-nginx/deploy/ using Helm。

您可以在我尝试构建的架构图下方找到:

在此处输入图片说明

使用以下服务(我将只粘贴其中一项服务,另一项类似):

apiVersion: v1
kind: Service
metadata:
  name: sample-backend
spec:
  selector:
    app: sample
    tier: …
Run Code Online (Sandbox Code Playgroud)

cookies load-balancing kubernetes sticky-session nginx-ingress

16
推荐指数
1
解决办法
2万
查看次数

无法在AWS中使用粘性会话?

我有在EC2 Tomcat实例中运行的Web应用程序,我不能为我的生命得到粘会话负载均衡工作.我已经按照http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html中的所有步骤进行了操作,尝试使用基于应用程序(使用JSESSIONID cookie)和时间 -基于(使用86400秒)方法,但无论如何,它根本不起作用.同一个用户不断在所有不同的节点上反弹.每次他们点击网页上的新链接时,它都会将它们弹回主屏幕再次登录.

我不知道它为什么不起作用.我也不太了解这些东西(哎呀,直到2个小时前我甚至不知道'粘性会话'是什么意思 - 不,我不能让其他人去做)所以我'我也不确定从哪里开始调试它.

编辑:看看我的cookie ..似乎AWSELB cookie每次加载网站时都会被删除并重写,而不是像它应该的那样持久化.

编辑2:我的负载均衡器的XML配置:

{
    "LoadBalancerDescriptions": [
        {
            "Subnets": [
                "subnet-5c83aa39",
                "subnet-6a778830",
                "subnet-c41cdde8"
            ],
            "CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
            "CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
            "ListenerDescriptions": [
                {
                    "Listener": {
                        "InstancePort": 5432,
                        "LoadBalancerPort": 5432,
                        "Protocol": "TCP",
                        "InstanceProtocol": "TCP"
                    },
                    "PolicyNames": []
                },
                {
                    "Listener": {
                        "InstancePort": 8888,
                        "LoadBalancerPort": 8888,
                        "Protocol": "HTTP",
                        "InstanceProtocol": "HTTP"
                    },
                    "PolicyNames": [
                        "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
                    ]
                }
            ],
            "HealthCheck": {
                "HealthyThreshold": 2,
                "Interval": 10,
                "Target": "HTTP:44554/",
                "Timeout": 8,
                "UnhealthyThreshold": 4
            },
            "VPCId": "vpc-721bec0b",
            "BackendServerDescriptions": [],
            "Instances": …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-elb sticky-session

8
推荐指数
1
解决办法
2303
查看次数

关闭了AWS Load Balancer粘性的Django用户会话

我在Elastic Load Balancer(ELB)后面使用AWS Elastic Beanstalk和EC2服务器.

我在ELB上启用了"粘性会话",因为这是我可以让django用户会话正常工作的唯一方法.但是,在高峰流量时,这会导致问题,因为ELB不再均匀地分配每个传入请求.这通常会像迷你DDOS一样超载1台服务器.

我想要做的是使用服务器端用户会话,其中用户身份验证信息存储在我的Redis缓存中.我试过设置SESSION_ENGINE很多东西,比如:

SESSION_ENGINE = 'redis_sessions.session' 
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
Run Code Online (Sandbox Code Playgroud)

然后,当我关闭粘性会话时,我无法登录,因为请求最终会转到不同的服务器,其中某些请求已经过身份验证而其他请求未经过身份验证.那些不是,将我重定向回登录页面.

以下是我的一些其他相关设置:

INSTALLED_APPS = (
    ...,
    'django.contrib.sessions',
    ...,
)
MIDDLEWARE_CLASSES = (  
    ...,
    'djangosecure.middleware.SecurityMiddleware',
    ...,
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...,
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    ...,
)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?非常感谢.

django load-balancing django-sessions amazon-elastic-beanstalk sticky-session

6
推荐指数
1
解决办法
833
查看次数

通过粘性会话和WebSocket进行扩展

最初,我们有两个AWS EC2实例,它们的node.js在带有粘性会话的负载均衡器后面运行。随着负载增加,将添加更多实例。

但是我们正面临这种方法的问题。由于外出应用主要用于车间,因此负载通常会在较短的时间内(车间开始)增加,并且每个车间参与者都对前两个实例有粘性会议,而新实例几乎没有。因此,性能仍然很差。

首先想到的是:让我们禁用粘性会话。但这破坏了我们的网络套接字,因为它们需要粘性会话(至少这是我读过的内容)。另一个问题是负载减少。实例关闭,套接字连接也丢失。

有没有一种方法可以在实例之间转移用户会话或使Websocket在没有粘性会话的情况下工作(也许使用Redis)?

load-balancing amazon-web-services node.js sticky-session elastic-load-balancer

6
推荐指数
1
解决办法
957
查看次数

Nodejs使用Sticky-Session进行聚类

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server



  var sticky = require('sticky-session');
  var express = require('express');
  var app = express();

  app.get('/', function (req, res) { …
Run Code Online (Sandbox Code Playgroud)

node.js sticky-session node-cluster

6
推荐指数
1
解决办法
1190
查看次数

用于 websocket 应用程序的 nginx-ingress 粘性会话

我在 K8s 集群中有一个 websocket .net 应用程序。我需要使用 nginx 开源为 websocket 实现粘性会话。

我已经阅读了 nginx 和 kubernetes 的文档。 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#session-affinity

它说我们可以使用以下配置进行粘性会话:

nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "ingresscoookie"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。我在这里尝试了 kubernetes 提供的示例代码https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/affinity/cookie/ingress.yaml

这对我有用,所以我相信基于 cookie 的会话亲和力似乎不适用于 websocket。

在进一步挖掘文档时,它说我可以使用 IP 哈希算法。所以我尝试使用下面的注释。

nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"

Run Code Online (Sandbox Code Playgroud)

这也失败了。请求仍然使用默认算法进行平衡。

如何实现会话持久性?

websocket sticky-session azure-aks nginx-ingress

6
推荐指数
1
解决办法
1463
查看次数

Spring Boot JSESSIONID安全标志未通过HTTPS设置

我们使用Liberty for Java构建了一个Cloud Foundry应用程序.在测试应用程序时,我们发现SSL cookie没有设置安全标志.

问题:当_VCAP_ID设置了安全标志时,JSESSIONID没有设置安全标志

我们使用Spring Boot来开发应用程序,根据文档我们只需要在属性文件中保护cookie标志:http://docs.spring.io/spring-boot/docs/current/reference/html/common -应用- properties.html

解决方案:我们最终通过以下文章自动修复了问题,在弹簧中将安全标志添加到JSESSIONID cookie

有没有人知道Cloud Foundry或Liberty是否存在与无法通过HTTPS同时在JSESSIONID和_VCAP_ID上设置SSL cookie安全标志相关的问题?

cookies jsessionid websphere-liberty sticky-session ibm-cloud

5
推荐指数
0
解决办法
1832
查看次数

如何使用容器为具有(长期)粘性会话的应用程序进行零停机滚动更新

我试图弄清楚如何基于 JSESSIONID cookie 为具有长期交互式用户会话的 web 应用程序提供零停机滚动更新,这些会话应该是粘性的。

出于这个(和其他)原因,我正在研究容器技术,比如 Docker Swarm 或 Kubernetes。

我很难找到关于如何的好答案:

  1. 确保新会话转到最新版本的应用程序
  2. 虽然现有会话仍由它们启动的任何版本的应用程序提供服务
  3. 关闭所有会话后,正确清理旧版本

更多信息:

  • 请求链接到基于 JSESSIONID cookie 的会话
  • 会话可能会持续数天,但可以在 24 小时内从应用程序内终止它们(向用户发送通知“注销/再次登录,因为有新版本,否则会在下午 12 点自动注销” “ 例如)
  • 当然,对于应用程序的每个版本,已经有多个容器以负载平衡的方式运行
  • 我不介意容器总数的增长,例如,如果每个旧版本的容器都仍在运行,因为它们仍然会托管 1 个会话,而大多数用户已经在使用新版本的应用程序

所以,我对所需流程的想法是这样的:

  1. 安装新版本的应用程序
  2. 让所有新连接(没有 JSESSIONID cookie 集的连接)转到应用程序的新版本一次
  3. 旧版本应用程序的容器不再提供会话服务,请删除容器/....

正如我提到的,我正在研究 Kubernetes 和 Docker Swarm,但对其他建议持开放态度,但最终解决方案应该能够在云平台上运行(目前使用 Azure,但未来可能会使用谷歌或亚马逊云)

任何指示/提示/建议或想法表示赞赏

保罗

编辑:回答@Tarun 问题和一般说明:是的,我不想停机。我设想的方式是托管旧版本的容器将继续运行以服务所有现有会话。一旦旧服务器上的所有会话结束,旧服务器就会被移除。

新容器只会为在新版本开始推出后启动应用程序的用户提供新会话。

因此,举个例子: - 我在上午 9 点启动旧版本应用程序的新会话 A - 上午 10 点推出新版本。- 我继续使用会话 A,并保留托管在运行旧版本的容器上。- 中午我去吃午饭并注销 - 因为我是连接到运行旧版本的容器的最后一个会话,容器现在将被销毁 - 下午 1 点我回来,重新登录并获得新版本的应用程序

说得通?

updating jsessionid kubernetes docker-swarm sticky-session

5
推荐指数
1
解决办法
1098
查看次数

如何使粘性会话与socket.io(不带pm2或不带pm2)一起工作?

尽管socket.io文档说“ 粘性会话 ”可以使socket.io与节点群集一起工作。我只是无法使其工作。

我找到了PM2几个问题开了反对的话,最接近的解决方案,我能找到的是这个,“力只使用websock选项”,在所有不使用粘性会话。

有没有人有过使节点群集与socket.io兼容的经验?

-------更新--------

我检查了这里提到的其他两个粘性会话实现,sticky-session与socket.io-sticky-session节点js库!哪个更好?,找到“粘性群集”即可完成工作。

我学到的另一个教训是,粘性会话不适用于pm2集群,例如,从https://github.com/uqee/sticky-cluster/issues/26进行确认。因此,在使用socket.io时,请勿使用pm2集群模式(或仅使用“ websocket”传输)。

socket.io文档中提到的“粘性会话”实现实际上也可以工作。如果有人需要有关代码示例的更多说明,请在此处检查https://github.com/elad/node-cluster-socket.io

我的问题待解决,因为我仍然想看看是否还有其他输入。

node.js socket.io pm2 sticky-session

5
推荐指数
1
解决办法
969
查看次数