最新资讯

  • [Redis#19] 集群 | 数据分片 | docker模拟 | 故障转移 | 集群扩容

[Redis#19] 集群 | 数据分片 | docker模拟 | 故障转移 | 集群扩容

2025-04-27 22:01:12 0 阅读

目录

集群

数据分片算法

1. 哈希求余

2 一致性哈希算法

3. 哈希槽分区算法 (Redis 使用)

Docker搭建集群

i:创建目录和配置文件

编写 generate.sh 脚本

执行生成命令

ii:编写 docker-compose.yml

网络配置

iii: 构建集群

连接并验证集群

重定向

主节点宕机自动处理流程

故障判定

故障迁移

Fail 状态的影响

实验

集群扩容

一、加入集群

二、分配哈希槽

三、添加从节点


  • 本章节相关操作不需要记忆,后续工作中如果用到了能查到即可。
  • 重点在于理解流程和原理。
基本概念
  • 上篇文章讲述的哨兵模式, 提高了系统的可用性. 但是真正用来存储数据的还是 master 和 slave 节点. 所有的数据都需要存储在单个 master 和 slave 节点中.
  • 如果数据量很大, 接近超出了 master/slave 所在机器的物理内存, 就可能出现严重问题了.
  • 虽然硬件价格在不断降低, 一些中大厂的服务器内存已经可以达到 TB 级别了, 但是 1TB 在当前这个 "大数据" 时代, 俨然不算什么, 有的时候我们确实需要更大的内存空间来保存更多的数据.

如何获取更大的空间?

加机器即可! 所谓 "大数据" 的核心, 其实就是一台机器搞不定了, 用多台机器来搞.

Redis 的集群就是在上述的思路之下, 引入多组 Master/Slave, 每一组 Master/Slave 存储数据全集的一部分, 从而构成一个更大的整体, 称为 Redis 集群 (Cluster)

集群

集群这个词,可以从广义上来理解,也可以从狭义上来理解。

  • 其中广义的集群,只要是多个机器,构成了分布式系统。我们前面学过的哨兵模式,也可以算作是一种广义上的集群。
  • 狭义的集群,是 Redis 提供的一种集群模式,在这个集群模式之下,主要解决存储空间不足的问题,即 拓展存储空间。

我们前面的哨兵模式提高了系统的可用性,哨兵模式中,本质上还是 Redis 主从节点存储数据,其中要是请求一个主节点/从节点,就得存储整个数据的“全集”。

  • 但是集群中主要要解决的问题就是要 引入多台机器, 每台机器存储一部分数据。
  • 只要机器规模足够大, 就可以存储任意数据的大小了。比如:

  • Redis 的集群通过引入多组 Master/Slave 来分散数据存储压力。
  • 每一组 Master/Slave 存储数据全集的一部分,构成一个更大的整体。
  • 假定整个数据 全集为 1TB,三组 Master/Slave 可以每组存储 1/3 的数据。
  • 每个 Slave 是对应 Master 的备份(Master 故障时,Slave 会补位成 Master)。
  • 每个 红框部分称为一个分片 (Sharding),用于进一步扩展存储容量。

关于使用硬盘代替内存

  • 硬盘虽然可以存储更多数据,但访问速度远慢于内存。
  • 在某些应用场景(如搜索引擎),既需要存储较多数据,又希望有非常高的读写速度。这时我们就可以引入 redis 集群啦

这其中每个服务器集群上都需要存储一定规模的数据,也就是把数据分为了多份,但是数据在分成多份的时候,应该怎么分?这就是我们接下来需要主要研究的问题。


数据分片算法

分片的核心思路是用多组机器来存数据的每个部分,那么接下来的核心问题就是,给定一个数据(一个具体的 key),那么这个数据应该存储在哪个分片上?读取的时候又应该去哪个分片读取?围绕这个问题,业界有三种比较主流的实现方式:

  1. 哈希求余
  2. 一致性哈希算法
  3. 哈希槽分区算法

1. 哈希求余

哈希求余,就是借鉴了哈希表的基本思想

借助哈希函数,把一个 key 映射到整数,再针对数据的长度,求余就可以得到一个数组的下标。

哈希求余的分片算法具体是什么样子的呢?

  • 比如有三个分片,编号 0 1 2,此时就可以针对要插入的数据的 key 计算出一个哈希值
  • (计算 哈希值的算法,一般是针对一个字符串里面的内容进行一系列的变换,比如 md5 算法就是一种哈希算法,它是把一个字符串变换成为一个 16 进制的数字)。
  • 在把这个 哈希值余上一个分片个数,就会得到一个下标。此时就可以把这个数据放到该下标对应的分片中了。

  • 比如,hash(key) % N => 0,由于求出的余数是 0,此时这个 key 对应的数据就要 存储在 0 号分片中。
  • 后续查询 key 的时候也是同样的算法。只要 key 是一样的,hash 函数式一样的,得到的分片的值就是一样的。
  • 随着业务逐渐增长,数据变多的时候,仅有的几个分片就不足以保存数据了,这就需要对集群进行扩容,引入新的分片。

这时候,哈希求余算法的缺点就体现出来了,就是在增加集群容量,需要对数据进行 搬运的时候,开销非常大,很多数据都需要搬运原因就是,扩容后 N的值会变大,那么原先的求余就不再适用了,此时要把 所有数重新计算。计算完毕后,还要面临复杂的搬运数据的过程。,大部分的数据都是需要搬运的,这就是扩容的开销非常大。

从上图中可以看到,其中的 21 个数据,只有 3 个 key 没有被搬运,其他的 key 都是搬运过的。

当然,哈希求余的分片算法也是有一定优点的,那就是 简单高效,数据分配比较均匀。


2 一致性哈希算法

哈希求余这种操作中,当前的 key 属于哪个分片是交替的。例如某些数据的 hash 值分别是 102, 103, 104,这些数据在对 3 求余后,得到的值分别是 0, 1, 2,它们哈希求余求出的值是交替的,交替分布在不同的集群中。

而在一致性哈希算法中,我们改进了这种交替存储的方式为连续存储。一致性哈希算法的过程如下:

  • 数据空间映射首先把数据空间全部映射到一个圆环上,数据按照顺时针方向增长。
  • 分片定位:假设当前存在三个分片,将这些 分片放到圆环的某个位置。
  • Key 映射与分配:对于每一个 key,通过哈希函数 计算得到 哈希值 H,并将 H 映射到圆环上的对应位置。从 H 所在的位置开始,顺时针向下找,找到的第一个分片即为该 key 所从属的分片。

这相当于 N 个分片的位置将整个圆环分成了 N 个管辖区间,key 的哈希值落在某个区间内,就归该区间管理。

在这种一致性哈希算法情况下,如果需要对数据进行扩容,原有分片在环上的位置不动,只需要在环上 安排一个新的分片(如下图粉色区域)。

此时只需把 3 号分片上的部分数据搬运给新增的分片(如 4 号分片),而其他分片管理的区间保持不变。

这种方式 相比哈希求余减少了数据搬运成本,但可能导致各分片的数据量不均匀,出现 数据倾斜 现象。


3. 哈希槽分区算法 (Redis 使用)

  • 求余%:扩容不便
  • 一致性分片:数据倾斜

为了解决上述问题,Redis 集群引入了哈希槽算法,其公式为:

hash_slot = crc16(key) % 16384
  • 这里 CRC 是一种哈希算法,16384 等于 16*1024 或者说是 2^14。
  • 此算法 结合了 一致性哈希 和 哈希求余 的特点
  • 将哈希值映射到 16384 个槽位上,然后把这些 槽位均匀地分配给每个分片。每个分片会使用“位图” 这样的数据结构来记录自己持有的槽位号,用 0/1 表示是否持有该槽位。

假设当前有三个分片,一种可能的分配方式如下:

  • 0 号分片: [0,5461],共 5462 个槽位
  • 1 号分片: [5462,10923],共 5462 个槽位
  • 2 号分片: [10924,16383],共 5460 个槽位

实际上,分片方式非常灵活,每个分片持有的 槽位号可以是连续或不连续的。尽管不是严格意义上的均匀,但差异很小,使得数据分布较为均衡。

当需要进行扩容时,比如新增一个 3 号分片,可以通过重新分配原有的槽位来实现:

  • 0 号分片: [0,4095],共 4096 个槽位
  • 1 号分片: [5462,9557],共 4096 个槽位
  • 2 号分片: [10924,15019],共 4096 个槽位
  • 3 号分片: [4096,5461]+[9558,10923]+[15019,16383],共 4096 个槽位

此时,每个分片分出一部分槽位给新来的分片,并且保证最终所有分片持有的槽位个数接近,此处因为 16384 / 4可以除尽,所以最终四个分片的槽位数目完全相同。

最后进行数据拷贝时,只需要0 1 2三个分片,分别单向拷贝一部分数据给3号分片即可。

此外,还有一些关于 Redis 集群的问题需要注意:

Redis 集群最多有 16384 个分片吗?

在 Redis 集群中,key 是要先映射到槽位上,再映射到分片上的。这种设计的目的是为了确保数据分布的均匀性:

  • 如果每个分片包含的槽位较多,并且槽位个数相当,那么可以认为每个分片包含的 key 数量也是相等的,从而保证了数据分布的均匀性。
  • 然而,如果每个分片包含的槽位非常少,槽位的数量可能无法直观地反映出 key 的数量,这种情况之下,数据的均匀性就难以保证。
  • 此外,如果每个分片中包含的槽数非常少,则会导致集群中的服务器规模变得非常庞大,随着服务器数量的增加,出现故障的概率也会相应增大。

为什么是16384个槽位?

  • 节点之间通过心跳包通信,心跳包中包含了该节点持有哪些槽位,这个是使用位图这样的数据结构表示的。
  • 表示 16384 个槽位需要的位图大小是 2KB,如果给定的槽位数更多了,此时就需要消耗更多的空间。
  • 这对于内存来说不算什么,但是 在频繁的网络心跳包中,还是一个不小的开销,因为网络带宽是比内存更稀缺的资源
  • 另一方面,Redis 集群一般不建议超过 1000 个分片。16384个槽位,对于最大 1000 个分片来说是足够用的,同时也会使对应的槽位配置位图体积不至于很大

参考:


Docker搭建集群

接下来使用docker搭建一个如下集群,拓扑结构如下:

注意

  • 本示例中我们将创建11个Redis节点
  • 其中前9个用于演示集群的搭建,后两个用于演示集群扩容。

i:创建目录和配置文件

首先,创建一个名为 redis-cluster 的目录,并在该目录下创建两个文件:

编写 generate.sh 脚本

generate.sh 内容如下,此脚本将为每个 Redis 实例创建配置文件并设置不同的 IP 地址:

#!/bin/bash

# 创建并配置前9个节点
for port in $(seq 1 9); do
    mkdir -p redis${port}
    touch redis${port}/redis.conf
    cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.10${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done

# 创建并配置第10和11个节点(用于后续扩容)
for port in $(seq 10 11); do
    mkdir -p redis${port}
    touch redis${port}/redis.conf
    cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done

C++ 和 Java 中的循环

  • C++: range based for(C++ 也有 std::for_each,STL 中的一个函数)
  • Java: for each

Shell 脚本中的循环如上

解释

  • seq: 一个 Linux 命令,生成 [1, 9]
  • : 续行符,把下一行的内容和当前行合并成一行。
    • 默认情况下,shell 要求把所有的代码都写到一行里,使用续行符来换行。
  • { }: 在 shell 中表示变量,不是表示代码块。
    • 对于 for使用 dodone 来表示代码块的开始和结束
    • 循环体内的代码。
  • 字符串拼接:在 shell 中拼接字符串是直接写到一起,而不需要使用 +

预期效果

  • 得到 11 个目录,每个目录里都有一个配置文件。
  • 配置文件中,IP 地址各不相同。

注意cluster-announce-ip 172.30.0.10${port} 的值对于每个实例是不同的,以确保它们在网络中的唯一性。


执行生成命令

运行以下命令以执行 generate.sh 脚本,这将在 redis-cluster/ 目录下生成相应的子目录及配置文件:

bash generate.sh

生成后的目录结构应类似于:

每个 redis.conf 文件的内容除了 cluster-announce-ip 不同外,其他部分都相同。例如,redis1/redis.conf 包含如下内容:

配置说明

  • cluster-enabled yes: 开启集群模式。
  • cluster-config-file nodes.conf: 集群节点自动生成的配置文件。
  • cluster-node-timeout 5000: 节点失联的超时时间(毫秒)。
  • 🎢cluster-announce-ip 172.30.0.101: 节点自身的 IP 地址。
  • cluster-announce-port 6379: 节点自身的业务端口。
  • cluster-announce-bus-port 16379: 节点自身的总线端口,用于集群管理信息交互。

注意:

  • cluster-announce-ip: Docker 容器的 IP 地址。
  • port: 容器内的  Redis 端口。
  • 业务端口: 用于业务数据通信。(eg. 客户端访问的
  • 管理端口: 用于管理任务通信。

故障处理

  • 如果某个分片中的 Redis 主节点挂了,就需要让从节点成为主节点,就需要通过刚才 管理端口 来完成相应的操作。
  • 服务器端口绑定: 一个服务器可以绑定多个端口号。

ii:编写 docker-compose.yml

接下来,我们需要编写 docker-compose.yml 文件来定义 Docker 容器网络和服务。以下是配置示例:

networks:
  mynet:
    ipam:
      config:
        - subnet: 172.30.0.0/24

services:
  redis1:
    image: 'redis:5.0.9'
    container_name: redis1
    restart: always
    volumes:
      - ./redis1/:/etc/redis/
    ports:
      - 6371:6379
      - 16371:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.101
  redis2:
    image: 'redis:5.0.9'
    container_name: redis2
    restart: always
    volumes:
      - ./redis2/:/etc/redis/
    ports:
      - 6372:6379
      - 16372:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.102
  redis3:
    image: 'redis:5.0.9'
    container_name: redis3
    restart: always
    volumes:
      - ./redis3/:/etc/redis/
    ports:
      - 6373:6379
      - 16373:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.103
  redis4:
    image: 'redis:5.0.9'
    container_name: redis4
    restart: always
    volumes:
      - ./redis4/:/etc/redis/
    ports:
      - 6374:6379
      - 16374:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.104
  redis5:
    image: 'redis:5.0.9'
    container_name: redis5
    restart: always
    volumes:
      - ./redis5/:/etc/redis/
    ports:
      - 6375:6379
      - 16375:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.105
  redis6:
    image: 'redis:5.0.9'
    container_name: redis6
    restart: always
    volumes:
      - ./redis6/:/etc/redis/
    ports:
      - 6376:6379
      - 16376:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.106
  redis7:
    image: 'redis:5.0.9'
    container_name: redis7
    restart: always
    volumes:
      - ./redis7/:/etc/redis/
    ports:
      - 6377:6379
      - 16377:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.107
  redis8:
    image: 'redis:5.0.9'
    container_name: redis8
    restart: always
    volumes:
      - ./redis8/:/etc/redis/
    ports:
      - 6378:6379
      - 16378:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.108
  redis9:
    image: 'redis:5.0.9'
    container_name: redis9
    restart: always
    volumes:
      - ./redis9/:/etc/redis/
    ports:
      - 6379:6379
      - 16379:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.109
  redis10:
    image: 'redis:5.0.9'
    container_name: redis10
    restart: always
    volumes:
      - ./redis10/:/etc/redis/
    ports:
      - 6380:6379
      - 16380:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.110
  redis11:
    image: 'redis:5.0.9'
    container_name: redis11
    restart: always
    volumes:
      - ./redis11/:/etc/redis/
    ports:
      - 6381:6379
      - 16381:16379
    command:
      redis-server /etc/redis/redis.conf
    networks:
      mynet:
        ipv4_address: 172.30.0.111
网络配置
  • subnet: 此处为了后续创建静态的 IP,就需要先手动创建出网络,同时给这个网段分配 IP。这里分配的 网络号是 172.30.0,其中这个网络号是私网格式的一种,需要注意的是,不能和当前主机上现有的其他网段冲突0/24 是主机号。
  • volumes: 配置文件映射,确保容器内的配置文件与宿主机上的配置文件同步更新。
  • ports: 端口映射,需要注意的是,映射右边的端口必须和配置文件中的保持一致。
  • ipv4_address: 静态配置的网络 IP,这里的 IP 也必须和之前的配置文件中的一致。

启动容器之前,要把之前测试的容器关掉,避免冲突

博主在测试机上没什么有用的,就粗暴的直接全都删掉了

由于要启动是一个容器,所以上面的文件会比较长。

启动容器:

docker compose up -d

此时十一个容器就启动了。

但是这些容器目前还是单独的节点,尚未构成集群。


iii: 构建集群

接下来需要把这些服务容器全部构建为集群,使用如下命令:

redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2
  • --cluster create 表示建立集群,后面填写每个节点的 IP 和端口。
  • --cluster-replicas 2 表示每个主节点需要两个从节点备份。设置了这个配置之后,Redis 就会知道,每 3 个节点是一组(一个分片)。但是分配的时候,谁是主节点,谁是从节点,都是随机的。

这样redis就会依据规则自动构建集群,每三个节点构成一个分片(因为指定了一个主有两个从),并且会自动构建主从关系。

输入命令后,出现以下界面:

  • 1 部分,是信号槽的分配部分,可以看到redis内部采用了连续分配的方式,将信号槽均匀的分配给三个分片。
  • 2 部分,是主从关系的建立部分,第一行表示:172.30.0.105:6379成为172.30.0.101:6379的从节点。那么这六行日志,就表示xxx.101xxx.102xxx.103成为了三个主节点,其余的节点成为这三个的从节点。
  • 3 部分,是一段日志,就是具体把那一部分槽位具体分配给哪一个分片,比如xxx.101拿到了[0-5460]的槽位号。

输入 yes 之后才会真正创建。

见到 [OK] 之后说明集群建立完成。

连接并验证集群

使用客户端连接集群中的任何一个节点,都相当于连上了整个集群。:

redis-cli -h 172.30.0.101 -p 6379

在客户端中,我们使用 cluster nodes 来查看当前集群的信息。

重定向

尝试插入数据:

报错了,因为当前集群发生了分片,每个分片都只能存储一部分数据,key1经过哈希运算,发现并不是这个节点可以存储的值,于是就报错了。

想要解决这个问题,可以在启动时加上-c选项,此时插入数据,会自动重定向到对应的节点。

如图,每次操作数据是,如果该数据不属于当前分片,就会触发一次重定向,自动跳转到对应的客户端。命令行前面的 ip 一直在改变,这就说明我们的客户端一直在切换。

但是redis中,有一些命令同时操作多个key,比如最后一个命令mget,此时又报错了。因为这几个key属于不同分片,那么就无法同时处理,因此在集群的情况下,最好不要一次性操作多个key


主节点宕机自动处理流程

如果在集群中,某一个分片的主节点宕机了,会发生什么?在部署集群时,并没有引入哨兵节点,但是集群也会完成哨兵的工作,如果主节点宕机了,集群会自动完成重新选主的过程。

接下来就讲解集群中是如何完成故障转移的。

故障判定

Redis 集群中的所有节点会周期性地使用心跳包进行通信,确保各节点之间的连接状态和集群配置信息的同步。以下是心跳包交互的具体过程:

  • 跳包通信:节点A给节点B发送ping包,B接收到后返回一个pong。这些消息除了类型属性外,其余部分相同,并包含以下集群配置信息:
    • 节点ID
    • 所属分片
    • 主/从角色
    • 附属主节点(如果为从节点)
    • 持有的哈希槽位图
  • 随机化心跳检测每个节点每秒钟随机选择一部分节点发送ping包,而非向所有节点发送,以减少大量节点存在时的心跳包数量。
  • PFAIL 状态:当节点A尝试与节点B通信未果时,A首先尝试重置TCP连接;若仍然失败,则将B标记为PFAIL(主观下线)状态。
  • Gossip协议确认:一旦A判定B为PFAIL,它会通过内置的Gossip协议与其他节点沟通,确认B的状态。每个节点维护自己的“下线列表”,反映其视角下的故障节点。
  • FAIL 状态:如果多数节点(超过半数)也认为B处于PFAIL状态,那么A将正式把B标记为FAIL(客观下线),并通知其他节点更新状态。
故障迁移

当一个节点被标记为FAIL时,根据该节点的角色,可能触发不同的响应:

  • 从节点故障:如果是从节点,通常不需要特别处理,因为它们不直接服务客户端请求。
  • 主节点故障:如果故障节点是主节点,则需要进行故障迁移,流程如下:
    1. 资格审查:从节点检查自身是否符合晋升条件,即与原主节点的最后通信时间不超过设定阈值。
    2. 休眠等待:符合条件的从节点进入一段随机的休眠期,休眠时间=500ms基础时间+[0,500ms]随机时间+排名*1000msoffset 的值越大,则排名越靠前(越小)。这一策略有助于防止多个从节点同时竞选。
    3. 拉票选举:休眠结束后的 从节点开始向其他集群的主节点拉票。只有主节点有投票权,且每个主节点只能投一票。
    4. 晋升为主:获得超过半数主节点支持的从节点晋升为主节点,并执行SLAVEOF NO ONE命令脱离原主节点控制。并且让同一分片中的其它节点执行 slaveof
    5. 最后,新的主节点会把自己成为主节点的消息,同步给其他集群的节点,大家也都会更新自己保存的集群结构信息

此过程类似于 Raft算法,旨在选出网络状况较好的节点作为新的主节点,保证集群的服务连续性和数据一致性。

Fail 状态的影响

在某些情况下,单个节点的故障可能导致整个集群进入fail状态,具体情形包括但不限于:

  • 某一分片内的所有主节点和从节点都不可用。
  • 某一分片内主节点故障且 无可用从节点可晋升。
  • 超过半数的主节点失效。

实验

如图:

首先通过docker stop redis1,关掉了redis1节点,也就是xxx.101下线了,而这是一个主节点。登录6372端口的客户端,查看当前集群,可以发现xxx.106成为了新的主节点,而xxx.105原先是xxx.101的从节点。

重启redis1,其变为了reids5的从节点。

此处 集群的故障转移,和哨兵的故障转移是有一些差别的

  • 哨兵:sdown/odown
  • 集群:PFAIL/FAIL

集群扩容

一、加入集群
  • 命令格式
    • 使用 --cluster add-node 选项将新节点添加到集群。
  • 具体操作
    • 新增节点:要增加到集群的节点。
    • 集群任意节点:用于标识要加入哪一个集群。
redis-cli --cluster add-node 172.30.0.110:6379 172.30.0.101:6379

这样就可以把xxx.110节点加入到集群中,登入任意客户端查看:

通过上述命令,可以将 xxx.110 节点加入到集群中。登录任意客户端查看,可以看到集群内部已有 xxx.110,且是一个主节点。但需要注意的是,新增节点没有分配哈希槽。

二、分配哈希槽
  • 命令格式
    • 使用 --cluster reshard 选项给新节点分配哈希槽(注意是 reshard 不是 shared)。
redis-cli --cluster reshard 172.30.0.101:6379

执行步骤

  • 系统会询问要移动多少个 slots(哈希槽)。假设需要移动4096个哈希槽给新节点,则输入 4096
  • 接着询问将这些哈希槽移动给哪个节点。此时应选择 哈希槽为 0的主节点,并复制其ID。

  • 最后询问从哪些节点中空出这些哈希槽。可以 选择 all 表示从所有现有节点平均提取,或自己指定节点ID,以 done 结束。
  • 最终向用户确认是否要执行该操作。

执行完毕后,进入任意客户端查看集群现状,可以看到新节点获得了三个范围的哈希槽。

问题:搬运哈希槽的过程可能比较久,在此期间用户的访问合法性如何?

  • 大部分哈希槽在搬运过程中仍可正常访问。
  • 如果 用户访问正在移动的哈希槽,则可能会导致访问失败。
三、添加从节点
  • 命令格式
    • 使用 add-node 命令配合 --cluster-slave--cluster-master-id 选项来添加从节点。
redis-cli --cluster add-node 新节点 --cluster-slave --cluster-master-id 主节点的ID
  • 参数说明
    • --cluster-slave:指定新添加的节点作为从节点。
    • --cluster-master-id:后面跟着的是主节点的ID,表示该节点从属于哪一个节点。
redis-cli --cluster add-node 172.30.0.111:6379 172.30.0.101:6379 --clusterslave --cluster-master-id  [172.30.1.110 节点的 nodeId-->] 7ec6d4a0e616916afab017f30d9a1434e375e80a

此时扩容目标初步达成,但是为了保证整个集群的可用性,还需要给主节点添加一些从结点,保证主节点宕机之后,有接班人~

sum:

主从复制:分担了读取压力

哨兵:监控,稳健性提高

集群:存储数据量 提升

本文地址:https://www.vps345.com/3926.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge python MCP llama 算法 opencv 自然语言处理 神经网络 语言模型 ssh deepseek Ollama 模型联网 API CherryStudio 进程 操作系统 进程控制 Ubuntu harmonyos 华为 开发语言 typescript 计算机网络 ubuntu 数据库 centos oracle 关系型 安全 分布式 tcp/ip 网络 网络协议 udp unity rust http java fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse pycharm ide pytorch 人工智能 numpy adb nginx 监控 自动化运维 阿里云 网络安全 笔记 C 环境变量 进程地址空间 django flask web3.py github 创意 社区 RTSP xop RTP RTSPServer 推流 视频 macos flutter react.js 前端面试题 node.js 持续部署 Dell R750XS 科技 ai 个人开发 vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 java-ee YOLO 深度学习 bash android c++ c语言 sql KingBase conda 机器学习 Qwen2.5-coder 离线部署 spring 银河麒麟 kylin v10 麒麟 v10 目标检测 计算机视觉 spring boot websocket 后端 tomcat postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 ESP32 LDAP 腾讯云 nuxt3 vue3 docker 实时音视频 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 自动化 maven intellij idea .netcore dubbo 运维开发 容器 ssl 统信 国产操作系统 虚拟机安装 .net 蓝耘科技 元生代平台工作流 ComfyUI openEuler 低代码 golang gitlab elasticsearch jenkins 多线程服务器 Linux网络编程 android studio AI 爬虫 数据集 pillow live555 rtsp rtp json html5 firefox web安全 Kali Linux 黑客 渗透测试 信息收集 kubernetes 学习方法 经验分享 程序人生 vim vscode 代码调试 ipdb DeepSeek-R1 API接口 c# springsecurity6 oauth2 授权服务器 token sas Flask FastAPI Waitress Gunicorn uWSGI Uvicorn prometheus kvm 无桌面 命令行 串口服务器 Hyper-V WinRM TrustedHosts apache matlab YOLOv8 NPU Atlas800 A300I pro asi_bench Docker Compose docker compose docker-compose windows 搜索引擎 Deepseek mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 智能路由器 dell服务器 IIS .net core Hosting Bundle .NET Framework vs2022 rabbitmq es jvm php html 面试 性能优化 jdk intellij-idea 架构 oceanbase rc.local 开机自启 systemd 麒麟 ecm bpm 深度优先 图论 并集查找 换根法 树上倍增 ddos ollama llm chatgpt 大模型 llama3 Chatglm 开源大模型 zotero WebDAV 同步失败 代理模式 ansible playbook 云原生 AIGC AI agent 硬件架构 系统架构 思科模拟器 思科 Cisco mysql redis 云服务 权限 kind 华为云 物联网 react next.js 部署 部署next.js QQ 聊天室 spring cloud AI编程 嵌入式硬件 单片机 温湿度数据上传到服务器 Arduino HTTP eureka ocr 命令 其他 银河麒麟服务器操作系统 系统激活 远程工作 googlecloud https muduo X11 Xming 小程序 jupyter Windsurf 电脑 博客 游戏程序 stm32 qt windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 ESXi 社交电子 学习 git 弹性计算 虚拟化 KVM 计算虚拟化 弹性裸金属 远程登录 telnet 1024程序员节 uni-app 漏洞 安全威胁分析 fpga开发 机器人 vscode 1.86 智能手机 NAS Termux Samba Linux unix SSH 远程连接 计算机外设 mac 软件需求 express p2p 报错 信息与通信 ip k8s 媒体 kylin Docker Hub docker pull 镜像源 daemon.json Dify SWAT 配置文件 服务管理 网络共享 监控k8s集群 集群内prometheus HTTP 服务器控制 ESP32 DeepSeek ruoyi wsl2 wsl 服务器繁忙 备选 网站 api 调用 示例 银河麒麟桌面操作系统 Kylin OS 国产化 DeepSeek行业应用 DeepSeek Heroku 网站部署 测试工具 hugo WSL2 Netty 即时通信 NIO microsoft rpc vasp安装 边缘计算 智能硬件 远程桌面 AutoDL gitee IIS服务器 IIS性能 日志监控 selete 高级IO ollama下载加速 系统安全 编辑器 MQTT mosquitto 消息队列 minicom 串口调试工具 r语言 数据挖掘 数据可视化 数据分析 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 计算机 程序员 华为od sqlite TCP服务器 qt项目 qt项目实战 qt教程 openssl 密码学 微信 微信分享 鸿蒙 Image wxopensdk 模拟退火算法 开源 田俊楠 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP 根服务器 clickhouse 数据库系统 EMQX 通信协议 kafka hibernate kamailio sip VoIP sqlserver junit ukui 麒麟kylinos openeuler W5500 OLED u8g2 微服务 chfs ubuntu 16.04 框架搭建 jar 宝塔面板 同步 备份 建站 excel laravel AI大模型 大模型入门 大模型教程 webrtc remote-ssh Xterminal 需求分析 规格说明书 豆瓣 追剧助手 迅雷 nas 内存 微信小程序 前端框架 unity3d mongodb springboot 火绒安全 云服务器 VPS 数据结构 Nuxt.js 飞书 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 孤岛惊魂4 uniapp vue aws 恒源云 tcp HarmonyOS Next minio AD域 大数据 ios vSphere vCenter 软件定义数据中心 sddc RTMP 应用层 反向代理 致远OA OA服务器 服务器磁盘扩容 okhttp CORS 跨域 雨云 NPS 音视频 7z JAVA Java 输入法 echarts av1 电视盒子 机顶盒ROM 魔百盒刷机 传统数据库升级 银行 大语言模型 LLMs 单一职责原则 3d 数学建模 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 jmeter 软件测试 网络结构图 HCIE 数通 oneapi 大模型微调 open webui 外网访问 内网穿透 端口映射 Headless Linux 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 XCC Lenovo asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 策略模式 单例模式 华为认证 网络工程师 交换机 远程 执行 sshpass 操作 移动云 MS Materials gateway Clion Nova ResharperC++引擎 Centos7 远程开发 visualstudio zookeeper debian SSL 域名 skynet 安全架构 AISphereButler tcpdump shell embedding Trae IDE AI 原生集成开发环境 Trae AI npm Cursor 驱动开发 硬件工程 嵌入式实习 WSL win11 无法解析服务器的名称或地址 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 armbian u-boot LORA NLP 交叉编译 嵌入式 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 EasyConnect Cline RustDesk自建服务器 rustdesk服务器 docker rustdesk 黑客技术 URL ftp web pyqt ssrf 失效的访问控制 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 MI300x 交互 openwrt ux 多线程 vscode1.86 1.86版本 ssh远程连接 SSE zabbix open Euler dde deepin 统信UOS LLM Web APP Streamlit pygame 小游戏 五子棋 hadoop big data opensearch helm virtualenv arm 服务器主板 AI芯片 xrdp 软件工程 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 游戏服务器 TrinityCore 魔兽世界 开发环境 SSL证书 sysctl.conf vm.nr_hugepages adobe Python 网络编程 聊天服务器 套接字 TCP 客户端 Socket asm svn 崖山数据库 YashanDB 源码剖析 rtsp实现步骤 流媒体开发 Ubuntu 24.04.1 轻量级服务器 NFS redhat VMware安装Ubuntu Ubuntu安装k8s mysql离线安装 ubuntu22.04 mysql8.0 pdf 群晖 文件分享 中间件 iis CPU 主板 电源 网卡 VSCode 负载均衡 odoo 服务器动作 Server action 雨云服务器 僵尸进程 FTP 服务器 银河麒麟操作系统 远程过程调用 Windows环境 ffmpeg 直播推流 服务器部署ai模型 hive Hive环境搭建 hive3环境 Hive远程模式 rsyslog 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 毕设 raid5数据恢复 磁盘阵列数据恢复 重启 排查 系统重启 日志 原因 微信公众平台 risc-v flash-attention C语言 ipython 缓存 三级等保 服务器审计日志备份 FTP服务器 v10 软件 c 联想开天P90Z装win10 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 bootstrap ci/cd ecmascript nextjs reactjs 软考 流式接口 架构与原理 camera Arduino 电子信息 Ubuntu Server Ubuntu 22.04.5 IDEA 多进程 bonding 链路聚合 TRAE 压力测试 tailscale derp derper 中转 飞牛NAS 飞牛OS MacBook Pro 网工 Unity Dedicated Server Host Client 无头主机 stm32项目 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 Linux PID Reactor 设计模式 C++ idm 课程设计 MCP server C/S LLM windows日志 ceph agi Agent gpu算力 iDRAC R720xd 命名管道 客户端与服务端通信 5G 3GPP 卫星通信 企业微信 Linux24.04 能力提升 面试宝典 技术 IT信息化 go 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 XFS xfs文件系统损坏 I_O error 磁盘监控 iot midjourney AI写作 前后端分离 netty mcu gitea FunASR ASR 佛山戴尔服务器维修 佛山三水服务器维修 file server http server web server 集成学习 集成测试 服务器配置 生物信息学 Invalid Host allowedHosts rdp 实验 Wi-Fi WebUI DeepSeek V3 Spring Security list ISO镜像作为本地源 mybatis 云电竞 云电脑 todesk MacOS录屏软件 职场和发展 硬件 设备 GPU PCI-Express 矩阵 线性代数 电商平台 UOS 统信操作系统 yum SysBench 基准测试 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 Minecraft YOLOv12 MNN Qwen 向日葵 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 firewalld cursor 音乐服务器 Navidrome 音流 transformer gaussdb xss 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 pip H3C Dell HPE 联想 浪潮 医疗APP开发 app开发 pppoe radius arm开发 浏览器开发 AI浏览器 ssh漏洞 ssh9.9p2 CVE-2025-23419 iventoy VmWare OpenEuler safari Mac 系统 无人机 历史版本 下载 安装 测试用例 功能测试 vmware 卡死 .net mvc断点续传 自动化任务管理 AI作画 Unity插件 etl 代理 nvidia visual studio code EMUI 回退 降级 升级 yaml Ultralytics 可视化 db 剧本 devops yum源切换 更换国内yum源 个人博客 linux安装配置 AI代码编辑器 kali 共享文件夹 虚拟机 Linux find grep ArkUI 多端开发 智慧分发 应用生态 鸿蒙OS edge浏览器 rocketmq ue5 vr 安卓 apt 工业4.0 ip命令 新增网卡 新增IP 启动网卡 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 中兴光猫 换光猫 网络桥接 自己换光猫 dify rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK IMX317 MIPI H265 VCU 微信开放平台 微信公众号配置 IPMI 游戏引擎 rime 视觉检测 游戏开发 frp 文件系统 用户缓冲区 SEO Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 hexo wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 模拟实现 perf 流水线 脚本式流水线 显示管理器 lightdm gdm 单元测试 selenium DevEco Studio ui springcloud 阻塞队列 生产者消费者模型 服务器崩坏原因 鸿蒙系统 网站搭建 serv00 jetty undertow 灵办AI fd 文件描述符 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 jina grafana 链表 产测工具框架 IMX6ULL 管理框架 图形化界面 换源 国内源 Debian gradle 裸金属服务器 弹性裸金属服务器 Linux的基础指令 cocoapods xcode threejs 3D SenseVoice composer 元服务 应用上架 KylinV10 麒麟操作系统 Vmware milvus yolov8 tensorflow trae 毕昇JDK elk Logstash 日志采集 gpt GCC crosstool-ng 游戏机 开发 micropython esp32 mqtt deekseek ragflow 知识库 iBMC UltraISO 查询数据库服务IP地址 SQL Server 路径解析 语音识别 半虚拟化 硬件虚拟化 Hypervisor 多层架构 解耦 软链接 硬链接 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 trea idea efficientVIT YOLOv8替换主干网络 TOLOv8 mamba code-server SVN Server tortoise svn 音乐库 飞牛 实用教程 具身智能 强化学习 cnn DenseNet ubuntu24.04.1 算力 图像处理 Radius CrewAI 分析解读 proxy模式 prompt postgresql pgpool 业界资讯 Windows 实时互动 eNSP 企业网络规划 华为eNSP 网络规划 银河麒麟高级服务器 外接硬盘 Kylin 信号 物联网开发 outlook 可信计算技术 网络攻击模型 HAProxy n8n 工作流 workflow ABAP 直流充电桩 充电桩 主从复制 IPv4 子网掩码 公网IP 私有IP rust腐蚀 SSH 密钥生成 SSH 公钥 私钥 生成 信号处理 ubuntu24 vivado24 MacMini 迷你主机 mini Apple 键盘 宠物 毕业设计 免费学习 宠物领养 宠物平台 小艺 Pura X 做raid 装系统 BMC 实战案例 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 双系统 代理服务器 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 ruby bug rustdesk k8s集群资源管理 云原生开发 mariadb RAGFLOW ShenTong 网络穿透 GRUB引导 Linux技巧 dns Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 烟花代码 烟花 元旦 线程 autodl lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 VR手套 数据手套 动捕手套 动捕数据手套 OD机试真题 华为OD机试真题 服务器能耗统计 ros2 moveit 机器人运动 技能大赛 编程 大模型面经 大模型学习 dity make opcua opcda KEPServer安装 王者荣耀 AI-native Docker Desktop 自动驾驶 win服务器架设 windows server 迁移指南 Typore keepalived sonoma 自动更新 繁忙 解决办法 替代网站 汇总推荐 AI推理 CDN 影刀 #影刀RPA# 鲲鹏 大数据平台 chrome devtools chromedriver 抗锯齿 wsgiref Web 服务器网关接口 flink nfs 信息可视化 网页设计 华为机试 办公自动化 自动化生成 pdf教程 ArcTS 登录 ArcUI GridItem arkUI firewall 自定义客户端 SAS ardunio BLE etcd 数据安全 RBAC arcgis webstorm GIS 遥感 WebGIS Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 金融 大大通 第三代半导体 碳化硅 回显服务器 UDP的API使用 状态模式 gcc g++ g++13 合成模型 扩散模型 图像生成 ai工具 java-rocketmq 序列化反序列化 服务器管理 配置教程 服务器安装 网站管理 GoogLeNet Kylin-Server 语法 h.264 HarmonyOS OpenHarmony 真机调试 SSH 服务 SSH Server OpenSSH Server 项目部署到linux服务器 项目部署过程 本地部署 pyautogui CVE-2024-7347 Linux环境 捆绑 链接 谷歌浏览器 youtube google gmail WebRTC web3 AD 域管理 bot Docker 图形渲染 虚拟局域网 黑苹果 VMware 网卡的名称修改 eth0 ens33 sdkman cpp-httplib sequoiaDB 小智AI服务端 xiaozhi TTS onlyoffice 政务 分布式系统 监控运维 Prometheus Grafana IMM cd 目录切换 alias unalias 别名 gpt-3 文心一言 cuda cudnn prometheus数据采集 prometheus数据模型 prometheus特点 lio-sam SLAM IPMITOOL 硬件管理 相机 显卡驱动 环境迁移 Node-Red 编程工具 流编程 网络用户购物行为分析可视化平台 大数据毕业设计 VMware创建虚拟机 视频编解码 Ark-TS语言 python3.11 dash 正则表达式 tidb GLIBC 源码 混合开发 环境安装 JDK regedit 开机启动 程序 xml CLion 在线office 僵尸世界大战 游戏服务器搭建 远程控制 远程看看 远程协助 京东云 知识图谱 基础入门 sqlite3 Open WebUI Anolis nginx安装 linux插件下载 cpu 实时 使用 webgl cmos 端口 查看 ss linux环境变量 xpath定位元素 centos-root /dev/mapper yum clean all df -h / du -sh 虚幻 考研 P2P HDLC 端口测试 VMware安装mocOS macOS系统安装 QT 5.12.12 QT开发环境 Ubuntu18.04 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 私有化 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos ldap springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 ros RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 开机自启动 性能分析 easyui langchain 多个客户端访问 IO多路复用 TCP相关API RAID RAID技术 磁盘 存储 uv MySql RAGFlow 实习 css epoll nac 802.1 portal 宕机切换 服务器宕机 Jellyfin 移动魔百盒 wps USB转串口 CH340 harmonyOS面试题 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 压测 ECS 邮件APP 免费软件 DOIT 四博智联 OpenSSH 防火墙 NAT转发 NAT Server 超融合 aarch64 编译安装 HPC 金仓数据库 2025 征文 数据库平替用金仓 linux驱动开发 lua LInux vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 rnn seatunnel 常用命令 文本命令 目录命令 树莓派 VNC deepseek r1 thingsboard 域名服务 DHCP 符号链接 配置 mq wireshark 自动化测试 性能测试 昇腾 npu PVE 深度求索 私域 css3 智能音箱 智能家居 ue4 着色器 sentinel iphone docker run 数据卷挂载 交互模式 iftop 网络流量监控 rag ragflow 源码启动 make命令 makefile文件 iperf3 带宽测试 相差8小时 UTC 时间 dba Python基础 Python教程 Python技巧 anaconda 蓝桥杯 Vmamba 本地知识库部署 DeepSeek R1 模型 腾讯云大模型知识引擎 状态管理的 UDP 服务器 Arduino RTOS 镜像 navicat IM即时通讯 剪切板对通 HTML FORMAT 我的世界服务器搭建 Claude 加解密 Yakit yaklang VLAN 企业网络 ROS AnythingLLM AnythingLLM安装 干货分享 黑客工具 密码爆破 Kali glibc 技术共享 我的世界 我的世界联机 数码 环境配置 阿里云ECS eclipse HiCar CarLife+ CarPlay QT RK3588 带外管理 执法记录仪 智能安全帽 smarteye k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm less 流量运营 log4j 串口驱动 CH341 uart 485 rclone AList webdav fnOS bat Erlang OTP gen_server 热代码交换 事务语义 RAG 检索增强生成 文档解析 大模型垂直应用 Xinference can 线程池 matplotlib linux 命令 sed 命令 bcompare Beyond Compare 模拟器 教程 llama.cpp dns是什么 如何设置电脑dns dns应该如何设置 USB网络共享 Google pay Apple pay Playwright 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 ssh远程登录 freebsd linux上传下载 健康医疗 互联网医院 论文阅读 rpa uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 嵌入式Linux IPC gnu VS Code 网络建设与运维 网络搭建 神州数码 神州数码云平台 云平台 信创 信创终端 中科方德 PX4 DBeaver 数据仓库 kerberos grub 版本升级 扩容 Linux的权限 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 C# MQTTS 双向认证 emqx 李心怡 大模型推理 TCP协议 docker部署Python 渗透 程序员创富 nlp minecraft 聚类 分布式训练 MVS 海康威视相机 离线部署dify ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR IO fast 大模型应用 风扇控制软件 虚幻引擎 DocFlow 存储维护 NetApp存储 EMC存储 自动化编程 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 内网服务器 内网代理 内网通信 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 Qwen2.5-VL vllm 嵌入式系统开发 conda配置 conda镜像源 项目部署 远程服务 热榜 spark HistoryServer Spark YARN jobhistory searxng 网络药理学 生信 PPI String Cytoscape CytoHubba wpf 大模型部署 xshell termius iterm2 neo4j 数据库开发 database CentOS 服务网格 istio js MDK 嵌入式开发工具 论文笔记 sublime text figma 产品经理 运维监控 seleium UOS1070e 目标跟踪 OpenVINO 推理应用 鸿蒙开发 移动开发 leetcode 推荐算法 dock 加速 visual studio SRS 流媒体 直播 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 hosts 人工智能生成内容 软负载 AI Agent 字节智能运维 拓扑图 搭建个人相关服务器 curl wget 本地化部署 openstack Xen 玩机技巧 软件分享 软件图标 deep learning swoole Ubuntu共享文件夹 共享目录 Linux共享文件夹 内网环境 TrueLicense 飞牛nas fnos triton 模型分析 车载系统 Deepseek-R1 私有化部署 推理模型 欧标 OCPP 本地部署AI大模型 Cookie docker命令大全 x64 SIGSEGV xmm0 CentOS Stream 西门子PLC 通讯 粘包问题 匿名管道 DNS UDP 系统开发 binder framework 源码环境 qemu libvirt 网络爬虫 基础环境 ubuntu20.04 开机黑屏 Attention Redis Desktop 服务器时间 沙盒 word 多路转接 ping++ IO模型 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用