V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aricch
V2EX  ›  程序员

负载均衡后的 Session 同步问题有什么成熟的好用的方案?

  •  
  •   aricch · 2018-03-15 10:37:28 +08:00 · 5857 次点击
    这是一个创建于 2456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位老铁,nginx 做负载均衡 反代到 tomcat 后的用户 Session 同步 有什么成熟的好用的方案?

    42 条回复    2018-03-16 12:10:08 +08:00
    uqf0663
        1
    uqf0663  
       2018-03-15 10:41:38 +08:00   ❤️ 2
    存 redis 里
    autumnshine
        2
    autumnshine  
       2018-03-15 10:42:38 +08:00
    spring session
    liwl
        3
    liwl  
       2018-03-15 10:44:20 +08:00
    存 redis 里
    linyinma
        4
    linyinma  
       2018-03-15 10:53:40 +08:00
    fzleee
        5
    fzleee  
       2018-03-15 10:54:56 +08:00
    使用一致性哈希算法负载均衡,这样就可以避免 session 同步
    aricch
        6
    aricch  
    OP
       2018-03-15 10:55:58 +08:00
    @uqf0663
    @autumnshine
    @liwl
    @linyinma 都看过相应 方案,也自己试过 Memcached,结果发现大量不同同步的情况,各位 有没有实际用过,以及遇到过有哪些坑儿?
    aricch
        7
    aricch  
    OP
       2018-03-15 10:56:16 +08:00
    @fzleee 求详解
    realityone
        8
    realityone  
       2018-03-15 11:00:52 +08:00 via iPhone
    最简单加密存到 cookie 里
    af463419014
        9
    af463419014  
       2018-03-15 11:03:18 +08:00
    存 redis +1
    Moker
        10
    Moker  
       2018-03-15 11:09:08 +08:00
    Reids 或者 JWT ?
    z1154505909
        11
    z1154505909  
       2018-03-15 11:14:26 +08:00
    存 redis+2
    pathbox
        12
    pathbox  
       2018-03-15 11:14:59 +08:00 via iPhone
    用 ip hash 负载算法 或者就是用 redis 存
    wentx
        13
    wentx  
       2018-03-15 11:23:00 +08:00
    存 redis +10086
    gouchaoer
        14
    gouchaoer  
       2018-03-15 11:24:11 +08:00   ❤️ 1
    不可以用 ip hash,因为 ip 会变
    yy120345
        15
    yy120345  
       2018-03-15 11:24:44 +08:00
    redis
    novacn
        16
    novacn  
       2018-03-15 11:27:59 +08:00
    spring session
    baiy
        17
    baiy  
       2018-03-15 11:32:28 +08:00
    session 一致性架构设计实践
    http://mp.weixin.qq.com/s/NnnqVrC9-Jekwy3Opmvy_w
    aricch
        18
    aricch  
    OP
       2018-03-15 11:34:03 +08:00
    @realityone 有些信息不想存本地

    @gouchaoer 对,不能用 ip,尤其是移动应用,分分钟 wifi 到 4G,互相切换 。
    @all 推荐 redis 的,有坑儿吗?稳定吗?
    q397064399
        19
    q397064399  
       2018-03-15 11:36:27 +08:00
    首推 Redis Spring 有相应的接口 一行代码都不用写,Redis 可以考虑购买 阿里云的 Redis 集群,避免宕机
    nicevar
        20
    nicevar  
       2018-03-15 11:37:07 +08:00   ❤️ 1
    关注一下,这个问题不是上面一堆人的一句存 redis 那么简单,实际情况很复杂,与业务上有很大的关系,比如请求是否是无标识单向的,一台 session 服务器宕机之后这部分用户处理问题,同步成本开销等等,楼主搞定了记得分享一下
    kenshin912
        21
    kenshin912  
       2018-03-15 11:38:09 +08:00 via iPhone
    ip_hash
    或者 Redis
    aricch
        22
    aricch  
    OP
       2018-03-15 11:39:08 +08:00
    @novacn
    @q397064399 你俩说的是同一个东西吗?

    @baiy
    @nicevar 感谢
    TZ
        23
    TZ  
       2018-03-15 12:26:29 +08:00
    看来都是用 redis 的
    binux
        24
    binux  
       2018-03-15 12:27:44 +08:00
    加密,存用户那
    hambut
        25
    hambut  
       2018-03-15 12:32:23 +08:00
    JWT
    likuku
        26
    likuku  
       2018-03-15 12:38:10 +08:00
    @nicevar memcached 差不多 10 年前就有日本人搞出来双向自动同步的简单集群分支。
    fzleee
        27
    fzleee  
       2018-03-15 13:01:35 +08:00
    @aricch 参见 @baiy 回复文章链接的第三节,反向代理 hash 一致性
    q397064399
        28
    q397064399  
       2018-03-15 15:20:29 +08:00
    @nicevar #20
    https://mp.weixin.qq.com/s/NnnqVrC9-Jekwy3Opmvy_w


    无标识单向,不明白是什么 请指教。

    Session 服务器宕机? Redis 有集群,master 节点挂了 还有 slave,Redis 还有一致性 hash
    可用性是完全可以保证的,后端存 Session 存 Token 基本上都是采取集中式的处理,,
    这样 web 服务 可以水平扩展,但实际上 web 服务扩展 看不到什么卵用,,
    之前的一个项目,压力全在 DB 上,即使水平扩展 web 服务 也是看不到什么卵用的,
    搞 web 还是 把数据库搞明白,该填的 都得填了
    vance
        29
    vance  
       2018-03-15 16:35:01 +08:00
    1.Nginx 一致性 Hash 2.Redis 管理 3.不用 Session
    night98
        30
    night98  
       2018-03-15 18:01:20 +08:00 via Android
    最近新开项目搭框架的时候也遇到了这个问题,目前比较主流的方案就是 redis 共享 session,使用 springboot+springsession 的话一行代码就解决了,其他的就是 jwt,相当于用户信息加密保存到 c 端,每次请求带上这个数据即可,优点是服务器无 session 化,经过对比后我选的是 redis 共享的方案,比较方便
    janxin
        31
    janxin  
       2018-03-15 18:08:43 +08:00
    我来说一个不一样的,cookies 植入后端服务器信息(没必要写 ip 域名),前端负载均衡根据 cookie 选择。不保证请求均衡,可支持水平伸缩。
    RubyJack
        32
    RubyJack  
       2018-03-15 18:11:59 +08:00
    客户端方案是用 JWT 这类,服务端方案就是 Session 集中存储
    wucao219101
        33
    wucao219101  
       2018-03-15 18:20:27 +08:00
    Spring Seession + Redis 用的很舒服

    http://xxgblog.com/2016/09/29/spring-session-redis/
    vibbow
        34
    vibbow  
       2018-03-15 18:21:41 +08:00
    同时存本机和共享数据库里。
    LB 做 sticky session。

    这样绝大多数情况都不会牵扯到 session 共享
    一旦一个机子掉了,请求被打到另一台服务器上,也可以通过共享数据库取出 session
    jasonchn
        35
    jasonchn  
       2018-03-15 18:35:34 +08:00 via Android
    @janxin 这样的话,负载均衡本身还要实现高可用,要考虑负载均衡之间同步 server id 表的问题。
    gandofyan
        36
    gandofyan  
       2018-03-15 19:18:03 +08:00
    spring session + apache Geode 集群

    低延迟, 高并发和一致性都可以保证
    jorneyr
        37
    jorneyr  
       2018-03-15 20:00:02 +08:00
    JWT 挺好的
    janxin
        38
    janxin  
       2018-03-15 22:09:14 +08:00
    @jasonchn #35 无论什么样的方案,入口总是要可用的,server_id 表同步方式也有很多
    1762628386
        39
    1762628386  
       2018-03-15 23:24:44 +08:00
    都别一句话完事啊 有没有大佬结合自己使用中的场景讲讲的
    aricch
        40
    aricch  
    OP
       2018-03-16 08:42:13 +08:00
    @fzleee ip_hash 不行的,换 ip 了就不一定在登录那台服务器上了。
    aricch
        41
    aricch  
    OP
       2018-03-16 08:47:39 +08:00
    @vance
    @night98
    @wucao219101
    @RubyJack
    @wucao219101
    @vibbow
    @gandofyan
    @jorneyr
    @1762628386
    @q397064399
    @likuku
    @TZ
    @binux
    @hambut 各位感谢,准备用 Redis 再实践一下。
    @janxin 感谢新思路
    JRay
        42
    JRay  
       2018-03-16 12:10:08 +08:00
    存 redis +1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:41 · PVG 18:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.