redis分片集群的部署和使用

redis分片集群的部署和使用

使用docker在虚拟机部署

脚本是个好东西。使用脚本部署那是相当的快速。下面介绍一下我使用脚本+docker部署的步骤吧。

  1. 首先拉取镜像,至少是可以分片的版本。
shell 复制代码
pull images redis:5.0.9-alpine3.11  
  1. 选取一个工作目录创建一个redis配置文件的模板文件(redis-cluster.tmpl )
shell 复制代码
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 你的虚拟机IP
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
  1. 使用脚本批量创建目录和配置文件 init.sh
shell 复制代码
#!/bin/bash

for port in $(seq 8001 8006); 
do 
  mkdir -p ./${port}/conf  
  PORT=${port} envsubst < ./redis/redis-cluster.tmpl > ./${port}/conf/redis.conf 
  mkdir -p ./${port}/data; 
done
  1. 给脚本权限并运行脚本
shell 复制代码
chmod +x init.sh
./init.sh
  1. 创建docker-compose.yml文件
    这里redis对应的版本按照自己拉取的改一下。
yaml 复制代码
version: '3.8'
services:
  redis-8001:
    image: redis:latest
    container_name: redis-8001
    ports:
      - "8001:8001"
      - "18001:18001"
    volumes:
      - ./8001/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8001/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-8002:
    image: redis:latest
    container_name: redis-8002
    ports:
      - "8002:8002"
      - "18002:18002"
    volumes:
      - ./8002/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8002/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-8003:
    image: redis:latest
    container_name: redis-8003
    ports:
      - "8003:8003"
      - "18003:18003"
    volumes:
      - ./8003/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8003/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-8004:
    image: redis:latest
    container_name: redis-8004
    ports:
      - "8004:8004"
      - "18004:18004"
    volumes:
      - ./8004/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8004/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-8005:
    image: redis:latest
    container_name: redis-8005
    ports:
      - "8005:8005"
      - "18005:18005"
    volumes:
      - ./8005/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8005/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

  redis-8006:
    image: redis:latest
    container_name: redis-8006
    ports:
      - "8006:8006"
      - "18006:18006"
    volumes:
      - ./8006/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./8006/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-net

networks:
  redis-cluster-net:
    driver: bridge
  1. 在创建dcoker-compose.yml对应的目录下执行该文件
shell 复制代码
docker compose up -d
  1. 随便进入一个容器内部搭建分片集群
shell 复制代码
docker exec -it reids-8001 redis-cli --cluster create \
    192.168.59.128:8001 \
    192.168.59.128:8002 \
    192.168.59.128:8003\
    192.168.59.128:8004 \
   192.168.59.128:8005 \
    192.168.59.128:8006 \
    --cluster-replicas 1  // 副本数量·1  前三个节点成为主节点,后面三个节点成为从节点

至此大功告成。

SpringBoot 整合redis集群

  1. 导入依赖
xml 复制代码
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
      <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
       </dependency>
  1. 配置yml
yaml 复制代码
spring:
  data:
    redis:
      # 集群节点配置:填写你的虚拟机IP和端口
      cluster:
        nodes:
          - 192.168.59.128:8001
          - 192.168.59.128:8002
          - 192.168.59.128:8003
          - 192.168.59.128:8004
          - 192.168.59.128:8005

        # 最大重定向次数
        max-redirects: 3
      # 连接超时时间
      timeout: 3000ms
      # Lettuce连接池配置 (可选但推荐)
      lettuce:
        pool:
          max-active: 8
          max-idle: 8
          min-idle: 0
          max-wait: -1ms
  1. 配置读写分离
java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer() {
        return clientConfigurationBuilder -> clientConfigurationBuilder
                .readFrom(ReadFrom.REPLICA_PREFERRED);  // 优先从从节点读取
    }

}

可选取的读写分离政策:

  1. ReadFrom.MASTER // 只从主节点读取(强一致性)
  2. ReadFrom.MASTER_PREFERRED // 优先从主节点读取
  3. ReadFrom.REPLICA // 只从从节点读取
  4. ReadFrom.REPLICA_PREFERRED // 优先从从节点读取(推荐)
  5. ReadFrom.NEAREST // 从最近的节点读取
  6. ReadFrom.ANY // 从任意节点读取

redis分片集群一些须知

哈希槽

  1. 分片集群一共有为0-16383 slot,存储数据和读取数据时,在哪一个节点进行操作,是根据key的有效值,根据CRC16 算法算取哈希值,然后对 16384 进行取模,得到的值就是slot值。
  2. key的有效值分为两种情况
    a.key中没有{},整个key都是有效值
    b. key中有{},只有{}中的字符才是有效值。
    3.根据key的有效值的特性,我们可以把同一类型的数据存储在相同的slot下,减少切换节点带来的不必要的性能消耗。比如存储用户的数据 ,在设计key时,我们可以统一在和用户相关的key前加上:{user}。

redis的拓展和压缩

  1. 添加一个新的节点
shell 复制代码
redis-cli --cluster add-node <新节点IP:端口> <集群中任意已知节点IP:端口>

默认时主节点,此时新节点还没有分配任何的slot,需要重新分配slot。

shell 复制代码
redis-cli --cluster reshard <集群中任意已知节点IP:端口>

如果要设置成从节点

shell 复制代码
# 连接新节点
redis-cli -h <新从节点IP> -p <新从节点端口>
# 设置主节点
CLUSTER REPLICATE <目标主节点ID>
  1. 删除节点
    如果删除的从节点,因为从节点没有任何的slot,所以可以直接删除
shell 复制代码
redis-cli --cluster del-node <集群中任意已知节点IP:端口> <要删除的从节点ID>

删除主节点,把主节点的slot迁移到其他主节点在进行删除

yaml 复制代码
redis-cli --cluster reshard <集群中任意已知节点IP:端口>
相关推荐
旖旎夜光4 小时前
C++(17)
c++·学习
专注于大数据技术栈5 小时前
java学习--StringBuilder
java·学习
川贝枇杷膏cbppg5 小时前
Redis 的 RDB 持久化
前端·redis·bootstrap
源代码•宸6 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang
川贝枇杷膏cbppg6 小时前
Redis 的 AOF
java·数据库·redis
qcwl666 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
车载测试工程师6 小时前
CAPL学习-CAN相关函数-概述
网络协议·学习·capl·canoe
roman_日积跬步-终至千里6 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习
m0_689618286 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
charlie1145141917 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++