使用Amazon ELB Application Load Balancer并使用Sticky Sessions时,负载均衡器会插入AWSALB
第一个请求中指定的cookie .要让下一个请求粘贴到同一目标节点(EC2实例),cookie应该包含在该请求中.这样做时,负载均衡器似乎在对第二个请求的响应中插入了不同的cookie值.在第3个请求中包含此新cookie值时,我们会在响应中获得新的cookie值.等等...
(这与Sticky Sessions如何与Classic Load Balancer一起使用,其中cookie被命名AWSELB
并保留其值,直到被客户端或负载均衡器丢弃.)
AWSALB
cookie一直在改变值的原因似乎是(正如文档所述):
cookie的名称是AWSALB.这些cookie的内容使用旋转密钥加密.您无法解密或修改负载均衡器生成的cookie.
因此,即使cookie的内容可能相同,我们也无法分辨.
问题是对负载均衡器的请求是否必须始终包含最近收到的AWSALB
cookie 值,或者是否可以发送一些先前收到的值(当然,来自同一个粘性会话).
如果这是一项要求,AWS ELB应用程序负载均衡器将无法为执行多个并行请求的客户端(在收到第一个AWSALB
cookie之后)提供服务,而只能为以连续方式(一次一个)执行所有请求的客户端提供服务.
任何人都可以对此有所了解吗?
目前,我正在尝试在 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
我有在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) 我在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
最初,我们有两个AWS EC2实例,它们的node.js在带有粘性会话的负载均衡器后面运行。随着负载增加,将添加更多实例。
但是我们正面临这种方法的问题。由于外出应用主要用于车间,因此负载通常会在较短的时间内(车间开始)增加,并且每个车间参与者都对前两个实例有粘性会议,而新实例几乎没有。因此,性能仍然很差。
首先想到的是:让我们禁用粘性会话。但这破坏了我们的网络套接字,因为它们需要粘性会话(至少这是我读过的内容)。另一个问题是负载减少。实例关闭,套接字连接也丢失。
有没有一种方法可以在实例之间转移用户会话或使Websocket在没有粘性会话的情况下工作(也许使用Redis)?
load-balancing amazon-web-services node.js sticky-session elastic-load-balancer
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) 我在 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)
这也失败了。请求仍然使用默认算法进行平衡。
如何实现会话持久性?
我们使用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
我试图弄清楚如何基于 JSESSIONID cookie 为具有长期交互式用户会话的 web 应用程序提供零停机滚动更新,这些会话应该是粘性的。
出于这个(和其他)原因,我正在研究容器技术,比如 Docker Swarm 或 Kubernetes。
我很难找到关于如何的好答案:
更多信息:
所以,我对所需流程的想法是这样的:
正如我提到的,我正在研究 Kubernetes 和 Docker Swarm,但对其他建议持开放态度,但最终解决方案应该能够在云平台上运行(目前使用 Azure,但未来可能会使用谷歌或亚马逊云)
任何指示/提示/建议或想法表示赞赏
保罗
编辑:回答@Tarun 问题和一般说明:是的,我不想停机。我设想的方式是托管旧版本的容器将继续运行以服务所有现有会话。一旦旧服务器上的所有会话结束,旧服务器就会被移除。
新容器只会为在新版本开始推出后启动应用程序的用户提供新会话。
因此,举个例子: - 我在上午 9 点启动旧版本应用程序的新会话 A - 上午 10 点推出新版本。- 我继续使用会话 A,并保留托管在运行旧版本的容器上。- 中午我去吃午饭并注销 - 因为我是连接到运行旧版本的容器的最后一个会话,容器现在将被销毁 - 下午 1 点我回来,重新登录并获得新版本的应用程序
说得通?
尽管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!
我的问题待解决,因为我仍然想看看是否还有其他输入。
sticky-session ×10
node.js ×3
cookies ×2
jsessionid ×2
kubernetes ×2
amazon-elb ×1
azure-aks ×1
django ×1
docker-swarm ×1
ibm-cloud ×1
node-cluster ×1
pm2 ×1
socket.io ×1
updating ×1
websocket ×1