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

分布式文件系统是否可以解决 docker 集群服务数据持久化的问题?

  •  
  •   craftx · 2023-03-02 10:08:40 +08:00 · 3261 次点击
    这是一个创建于 657 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,mysql ,需要把数据持久化到本地文件。
    但如果用 docker 集群跑 mysql ,默认情况下,实例是会被调度到别的节点的,而持久化的文件固定在节点本地。
    docker swarm 的解决方案是给某个节点加 label ,指定 mysql 的部署节点 label 要求,mysql 就不会到处跑了。
    不知道 k8s 的解决方案是什么。

    但如果,使用 MinIO 或者 SeaweedFS 之类的解决方案,把每个节点的磁盘空间,组成一个分布式文件系统,让 docker 集群上的服务,通过 POSIX API 或者 s3 兼容接口去访问这个分布式文件系统,就像访问当前节点的文件系统。
    这么还能充分利用各个节点的闲置磁盘空间。
    当然,还要能接受分布式文件系统带来的性能损耗。

    mysql 只是随便举个例子。
    28 条回复    2023-06-26 18:28:16 +08:00
    piku
        1
    piku  
       2023-03-02 10:12:49 +08:00 via Android
    有没有一种可能,他们可以共用同一个 iSCSI 之类的存储
    huigeer
        2
    huigeer  
       2023-03-02 10:12:55 +08:00 via Android
    mysql 这种不能随便举例子,它属于有状态实例,不合适。
    容器化的存储方案有多种,本地,分布式,按自己的实际需求来
    star7th
        3
    star7th  
       2023-03-02 10:24:03 +08:00
    如果只是短期的日志,我会保存到节点所在硬盘。
    对于长期储存,我会用服务器直接起一个 NFS 服务给各大容器公用。
    对于数据库存储,我用服务器搭建,不用容器
    SKYNE
        4
    SKYNE  
       2023-03-02 10:30:57 +08:00
    可以看一下 rancher ,rancher 本身是一个 k8s 管理平台
    realrojeralone
        5
    realrojeralone  
       2023-03-02 10:34:37 +08:00
    1 楼正解,解决方案是块存储,比如 Ceph
    SKYNE
        6
    SKYNE  
       2023-03-02 10:37:32 +08:00
    不好意思,误操作回复了,
    rancher 可以配合使用分布式储存 longhorn ,
    你可以划定某些节点作为存储节点,
    将 longhorn 作为储存类,动态分配给你的应用使用,
    目前使用下来挺稳定的,kafka 、MQ 、MySQL 有状态应用也跑在上面
    遇到的问题,节点间磁盘使用率有点不均衡,这取决于分配到磁盘上的 pvc 的大小
    mengpp
        7
    mengpp  
       2023-03-02 10:40:08 +08:00
    分布式存储带来的性能损失会比想象中影响更大,尝试过团队开发环境使用 k8s+gluster 部署 mysql 使用,后面因为使用一段时间后,随着数据的增长,性能比较差,又回归到本地存储了
    craftx
        8
    craftx  
    OP
       2023-03-02 10:44:49 +08:00
    @huigeer
    @mengpp
    en
    mysql 这个例子的确不太合适,只是立马想到了 mysql ,大家也肯定都知道 mysql
    craftx
        9
    craftx  
    OP
       2023-03-02 10:46:05 +08:00
    @star7th 眼下要解决的问题,就是存储日志。
    如果日志保存到节点所在的磁盘
    怎么做到聚合查询呢?
    暂时准备 loki 日志方案
    craftx
        10
    craftx  
    OP
       2023-03-02 10:47:48 +08:00
    @mengpp 目前首先要解决的问题是存储日志
    如果分布式文件性能损失太大,分布式数据库是不是同样不可接受?
    youngce
        11
    youngce  
       2023-03-02 10:49:46 +08:00   ❤️ 1
    @craftx 日志、分布式、性能、数据库——>elasticsearch ?
    firemiles
        12
    firemiles  
       2023-03-02 10:50:29 +08:00
    @craftx 搞个 agent 采集日志不挺好的
    julyclyde
        13
    julyclyde  
       2023-03-02 11:06:36 +08:00
    mysql 也可以吧。挂 volume 进去就行了
    mengpp
        14
    mengpp  
       2023-03-02 11:08:42 +08:00
    @craftx 还是看场景吧,分布式文档数据库对于明显的冷热数据场景挺擅长的,比如 ES;
    然后分布式关系型数据库发力的应该是数据分类算法和数据存储算法吧(猜测,没详细了解过),所以能降低性能损耗带来的影响,尝试过 TIDB 和 OB,小表性能体验一般,大表还蛮好的;
    另外我尝试的场景中,性能损失大部分也是因为分布式存储多副本的原因,不止网络和 IO
    ysjiang4869
        15
    ysjiang4869  
       2023-03-02 11:11:40 +08:00
    日志的方案,应该日志转发到统一的存储中,这个统一的存储可以是数据库、另外的一台日志机器、消息队列等

    MySQL 这种数据库,通常会选择绑定节点,docker 和 k8s 都有 label 这样的绑定,通过主从保证高可用吧。

    分布式文件系统 100%影响性能,ceph 不是一般小公司能搞定的,里面的坑坑重度用起来问题挺多的,读写速度也不快。
    billlee
        16
    billlee  
       2023-03-02 12:15:12 +08:00 via Android
    存日志的场景,应该是直接把日志通过网络打到日志服务上。
    onehao28
        17
    onehao28  
       2023-03-02 14:58:43 +08:00
    这不就是计算+存储分离的方案吗? 现在很多数据库都在做类似的,华为的 redis 还有腾讯的 CynosDB 也就是 tdsql-c 就是基于这个架构,用了底层块存储共享能力。
    salmon5
        18
    salmon5  
       2023-03-02 15:52:13 +08:00
    就是计算和存储分离,云厂商搞了 2-3 年了
    salmon5
        19
    salmon5  
       2023-03-02 15:54:46 +08:00
    好几年了
    craftx
        20
    craftx  
    OP
       2023-03-02 16:52:28 +08:00
    @billlee 这个直接,是指不通过 agent ,服务直接把日志发送到日志服务?
    ElmerZhang
        21
    ElmerZhang  
       2023-03-02 17:01:10 +08:00
    @SKYNE 去年用了一段时间 longhorn ,遇到最麻烦的问题:万一服务异常服务器 CPU 跑满,该节点上所有 longhorn 盘都会 io error ,虽然 redeploy 可恢复,但是要一个个手动操作,很麻烦。
    现在已经把 longhorn 都下掉了
    Mirana
        22
    Mirana  
       2023-03-02 20:16:15 +08:00
    存算分离是存储和计算是独立的两个集群 这样部署应该叫超融合
    SKYNE
        23
    SKYNE  
       2023-03-02 21:09:16 +08:00
    @ElmerZhang 我们的应用通过 helm 部署,默认都有 limit 限制,存储节点也尽量只作为存储,目前还没遇到过问题
    dcoder
        24
    dcoder  
       2023-03-03 06:26:22 +08:00
    @craftx

    要把一个网盘当本地(persistent)硬盘用, 需要:
    1. 找到 cloud vendor 提供的相应水平的网盘.
    2. mount 上之后, 自己做 performance 测试, 保证你 db 跑在上面真的行.

    另外, docker/k8s 其实一直是个残废, 比如搞 stateful 的东西就巨难...
    真的要用 docker/k8s, 得接受这个事实, 劲量只当做 stateless computing cluster 来用.
    litguy
        25
    litguy  
       2023-03-03 08:34:59 +08:00
    mysql 只需要一个分布式块存储就行了,不需要分布式文件系统
    也可以用 ZFS 作一个 HA 方案,block 通过 iscsi 给 mysql 用
    性能还是 OK 的
    你可以想象每个 ZFS 节点一对 NVME 作 RAID1 ,两个 ZFS 通过 ZIL 层作强一致
    julyclyde
        26
    julyclyde  
       2023-03-03 11:01:13 +08:00
    @litguy mysql 明说了需要“块”存储吗?
    还是随便一个存储就可以?


    @dcoder 说的对,尽量只用 stateless 。但是近几年有个趋势就是新入行的人根本不懂除了 docker 之外的世界
    litguy
        27
    litguy  
       2023-03-03 14:34:43 +08:00
    @julyclyde 之所以说块存储,是因为分布式块的性能比分布式文件系统高,你的场景中,只需要一个卷挂载点,mysql 迁移到新的 docker 后,只要这个 docker 挂载这个卷,mysql 起来就可以继续读写,你并不是几个 docker 中的应用要同时读写一个文件
    trzzzz
        28
    trzzzz  
       2023-06-26 18:28:16 +08:00 via iPhone
    @ysjiang4869 可以试一下 JuiceFS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1027 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.