목차
머리말
이 예에서는 8G 서버입니다. 데모 효과를 위해 마스터와 슬레이브를 포트로 나누어 준비합니다
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
로그인 후 복사
" >
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
로그인 후 복사
Redis散列插槽说明
集群伸缩(添加节点)
故障转移
使用redistemplate访问分片集群
데이터 베이스 Redis Redis 샤딩 클러스터 구축 및 활용에 대한 자세한 설명

Redis 샤딩 클러스터 구축 및 활용에 대한 자세한 설명

Jul 21, 2022 pm 05:46 PM
redis

추천 학습: Redis 동영상 튜토리얼

머리말

Redis는 실제 프로젝트 개발에서 매우 자주 사용된다고 할 수 있습니다. Redis의 공통 클러스터에서는 Redis에서 일반적으로 사용하는 여러 클러스터 솔루션에 대해 이야기했습니다. 서로 다른 클러스터는 서로 다른 시나리오에 대응하며, 다양한 클러스터의 장단점을 자세히 설명합니다. 이 기사에서는 Redis 샤딩 클러스터 구축부터 시작하여 Redis 샤딩 클러스터를 시작점으로 삼아 기술적 포인트를 자세히 설명합니다. Redis 샤딩 클러스터 관련 ;

  • 단일 머신 쓰기(높은 동시 쓰기) 병목 현상
  • 자동 클러스터 확장;
  • 클러스터 아키텍처 다이어그램 구축
준비

1 가상 머신 또는 서버 1개(또는 조건이 허용되는 경우 6개)를 준비합니다.

이 예에서는 8G 서버입니다. 데모 효과를 위해 마스터와 슬레이브를 포트로 나누어 준비합니다

2. Redis 설치 패키지를 미리 다운로드하세요.

빌드 단계

1. 각 redis 예제

mkdir 7001 7002 7003 8001 8002 8003
로그인 후 복사

2. 다음 내용으로 redis.conf 파일을 생성합니다

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /usr/local/soft/redis/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /usr/local/soft/redis/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 本机公网IP
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /usr/local/soft/redis/6379/run.log
로그인 후 복사

3. 구성 파일을 배치

echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
로그인 후 복사

4. 각 디렉터리에서 6379를 해당 디렉터리와 일치하도록 수정하세요

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
로그인 후 복사

redis.conf를 무작위로 열어 수정이 성공했는지 확인하세요

4. command to start

/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7001/redis.conf
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7003/redis.conf

/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8001/redis.conf
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8002/redis.conf
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8003/redis.conf
로그인 후 복사

실행이 완료되면 6개의 Redis 인스턴스가 오픈된 것을 확인할 수 있습니다

클러스터 생성

위의 과정을 통해 6개의 Redis 인스턴스가 오픈되었으나 이러한 인스턴스는 형성되지 않았습니다. 그런 다음 관련 명령을 수행하여 클러스터를 형성해야 합니다

1. 다음 명령을 사용하여 클러스터를 구축합니다(버전 5.0 이후 명령)

redis-cli --cluster create --cluster-replicas 1 IP地址:7001 IP地址:7002 IP地址:7003 IP地址:8001 IP地址:8002 IP地址:8003
로그인 후 복사

위 명령에 대한 지침

redis-cli --cluster 또는 ./redis-trib .rb: 클러스터 작업 명령을 나타냅니다.

create: 클러스터 생성을 나타냅니다.

–replicas 1 또는 –cluster-replicas 1: 각 복제본 수를 지정합니다. 클러스터의 마스터를 1로 하고, 총 노드 수 ¼(복제본 + 1)을 얻는 것은 마스터 수입니다. 따라서 노드 목록의 처음 n개 노드는 마스터이고 다른 노드는 슬레이브 노드이며 다른 마스터에 무작위로 할당됩니다.

    또한 redis-cli --cluster help 명령을 통해 클러스터 명령을 볼 수도 있습니다. 명령을 실행하면 어떤 예제가 마스터로 사용될지, 어떤 예제가 슬레이브로 사용될지 묻는 메시지가 콘솔에 표시됩니다.
  • 계속해서 yes를 입력하면 위의 전략에 따라 클러스터가 생성됩니다.

; 아마도 출력 로그에서 이를 얻을 수 있습니다.

마스터 노드의 포트 번호는 7001, 7002 및 7003입니다.

슬레이브 노드의 포트 번호는 8001, 8002 및 8003입니다. 마스터 노드에는 순서대로 7001, 7002 및 7003의 포트 번호가 있습니다. 각 노드에는 [0-5460], [5461-10922], [10923-16383]의 특정 수의 슬롯이 할당됩니다. 총 16384개의 슬롯이 할당됩니다.

2. 클러스터 상태를 확인하세요.

redis-cli -p 7001 cluster nodes
로그인 후 복사
로그인 후 복사
  • 通过这个命令,可以清楚的看到集群中各个实例节点的主从状态,实例ID(唯一身份标识),槽位区间等信息

    Redis散列插槽说明

    其实对redis分片集群稍有了解的同学应该知道,redis分片集群在逻辑上将集群中的所有节点构成了一块完整的内存空间,数据写入进来后,具体存放到哪个节点呢?所以集群引入了一个逻辑尚的插槽概念,即将集群划分为16384个槽位,集群中的每个节点占据一部分槽位数(这个日志中可以看出来);

    那么当某个具体的key写入的时候,集群将会通过一定的算法,将要写入的数据路由到指定的插槽上去;

    这里有个点需要注意,数据key不是与节点绑定,而是与插槽绑定。

    redis集群会根据key的有效部分计算插槽值,分两种情况:

    • key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分;
    • key中不包含“{}”,整个key都是有效部分;

    举例来说:key是num,那么就根据num计算,如果是{应用名称}num,则根据“应用名称”计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值

    下面不妨看下效果

    通过上面的演示可以发现,经过集群计算的key将会分配到不同的插槽上,也就是说,key是与插槽绑定,而不是与某个节点绑定,想想为什么会这样呢?

    思考下面这个需求

    如何将同一类数据固定的保存在同一个Redis实例?

    简单来说,如果key的分配完全没有规则的话,当涉及到某个业务类的数据对应的key随机分配到不同的节点上面时,取值的时候就会出现像上面的重定向跨节点的问题,一定程度上提升性能;

    解决办法

    这一类数据使用相同的有效部分,例如key都以{业务ID}为前缀

    集群伸缩(添加节点)

    reids的cluster模式下,有一个比较强的功能就是集群的伸缩能力,即在现有的集群基础上,可以根据实际的业务需求,进行集群的伸缩,下面来演示下给上面的集群添加一个新节点的步骤;

    1、在当前目录下拷贝一个目录

    2、修改配置文件的端口

    sed -i s/6379/7004/g 7004/redis.conf
    로그인 후 복사

    3、启动这个实例

    /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7004/redis.conf
    로그인 후 복사

    4、使用下面的命令将7004实例假如集群

    redis-cli --cluster add-node IP:7004 IP:7001
    로그인 후 복사

    5、再次查看集群状态

    redis-cli -p 7001 cluster nodes
    로그인 후 복사
    로그인 후 복사

    通过上面的状态信息发现,7004这个节点虽然加入了集群,并成了master,但是集群并没有给它分配任何的插槽

    6、分配插槽

    分配插槽的基本思路是,从现有的某个节点上迁移部分插槽到新的节点即可,执行下面的命令进行插槽分配

    redis-cli --cluster reshard 101.34.23.80:7001
    로그인 후 복사

    执行命令后将出现下面的提示,这里输入你要转移的插槽数量

    将7004对应的实例ID输入即可

    输入yes后开始移动插槽

    移动完成后,再次查看集群状态,这时候7004对应的节点就分配到了从0 ~ 500的数量的插槽

    故障转移

    redis的cluster模式的集群,还具备一定的故障转移能力,比如在上面的架构模式下,当集群中的某个master节点宕机之后,会出现什么情况呢?下面我们来模拟下这个过程,看看效果如何

    1、使用watch命令监控下集群的状态

    通过这个命令可以实时查看集群的动态日志变化

    watch redis-cli -p 7001 cluster nodes
    로그인 후 복사

    2、手动将7002实例的master宕机

    redis-cli -p 7002 shutdown
    로그인 후 복사

    从上面的监控日志不难发现,当7002挂掉后,过了一会儿与集群以及它的从节点8003失去了联系,然后8003这个节点升级为master节点;

    3、手动将7002实例启动起来

    /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf
    로그인 후 복사

    再次分析日志,可以看到这时候7002只能以slave的身份加入了集群,事实上在某些情况下,我们仍然希望这个宕机的节点恢复后依然是主节点,这该怎么办呢?这就涉及到了手动故障转移,主要操作步骤如下:

    • 使用redis-cli连接7002节点;
    • 执行cluster failover命令;

    在上面执行之后的情况下,7002是一个slave节点

    执行 CLUSTER FAILOVER 命令,观察日志动态变化,通过日志变化,可以看到,命令执行完毕后,7002很快就变成了master,而8003成了slave;

    通过以上步骤就完成了redis的cluster模式下的故障转移的过程

    使用redistemplate访问分片集群

    1、引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    로그인 후 복사

    2、将配置文件中的集群地址修改成下面这样即可

    spring:
      redis:
        cluster:
          nodes:
           - 集群IP:7001
           - 集群IP:7002
           - 集群IP:7003
           - 集群IP:7004
           - 集群IP:8001
           - 集群IP:8002
           - 集群IP:8003
    로그인 후 복사

    至于具体的代码部分,可以参考下面的这个测试案例

    	@Autowired
        private RedisTemplate<String,String> redisTemplate;
    
        //localhost:8083/set?key=b&value=123
        @GetMapping("/set")
        public void set(@RequestParam String key,@RequestParam String value){
            redisTemplate.opsForValue().set(key,value);
        }
    
        //localhost:8083/get?key=b
        @GetMapping("/get")
        public String get(@RequestParam String key){
            return redisTemplate.opsForValue().get(key);
        }
    로그인 후 복사

    推荐学习:Redis视频教程

    위 내용은 Redis 샤딩 클러스터 구축 및 활용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Redis 클러스터 모드를 구축하는 방법 Redis 클러스터 모드를 구축하는 방법 Apr 10, 2025 pm 10:15 PM

Redis Cluster Mode는 Sharding을 통해 Redis 인스턴스를 여러 서버에 배포하여 확장 성 및 가용성을 향상시킵니다. 시공 단계는 다음과 같습니다. 포트가 다른 홀수 redis 인스턴스를 만듭니다. 3 개의 센티넬 인스턴스를 만들고, Redis 인스턴스 및 장애 조치를 모니터링합니다. Sentinel 구성 파일 구성, Redis 인스턴스 정보 및 장애 조치 설정 모니터링 추가; Redis 인스턴스 구성 파일 구성, 클러스터 모드 활성화 및 클러스터 정보 파일 경로를 지정합니다. 각 redis 인스턴스의 정보를 포함하는 Nodes.conf 파일을 작성합니다. 클러스터를 시작하고 Create 명령을 실행하여 클러스터를 작성하고 복제본 수를 지정하십시오. 클러스터에 로그인하여 클러스터 정보 명령을 실행하여 클러스터 상태를 확인하십시오. 만들다

Redis 명령을 사용하는 방법 Redis 명령을 사용하는 방법 Apr 10, 2025 pm 08:45 PM

Redis 지시 사항을 사용하려면 다음 단계가 필요합니다. Redis 클라이언트를 엽니 다. 명령 (동사 키 값)을 입력하십시오. 필요한 매개 변수를 제공합니다 (명령어마다 다름). 명령을 실행하려면 Enter를 누르십시오. Redis는 작업 결과를 나타내는 응답을 반환합니다 (일반적으로 OK 또는 -err).

단일 스레드 레 디스를 사용하는 방법 단일 스레드 레 디스를 사용하는 방법 Apr 10, 2025 pm 07:12 PM

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

Redis의 소스 코드를 읽는 방법 Redis의 소스 코드를 읽는 방법 Apr 10, 2025 pm 08:27 PM

Redis 소스 코드를 이해하는 가장 좋은 방법은 단계별로 이동하는 것입니다. Redis의 기본 사항에 익숙해집니다. 특정 모듈을 선택하거나 시작점으로 기능합니다. 모듈 또는 함수의 진입 점으로 시작하여 코드를 한 줄씩 봅니다. 함수 호출 체인을 통해 코드를 봅니다. Redis가 사용하는 기본 데이터 구조에 익숙해 지십시오. Redis가 사용하는 알고리즘을 식별하십시오.

Redis 데이터를 지우는 방법 Redis 데이터를 지우는 방법 Apr 10, 2025 pm 10:06 PM

Redis 데이터를 지우는 방법 : Flushall 명령을 사용하여 모든 키 값을 지우십시오. FlushDB 명령을 사용하여 현재 선택한 데이터베이스의 키 값을 지우십시오. 선택을 사용하여 데이터베이스를 전환 한 다음 FlushDB를 사용하여 여러 데이터베이스를 지우십시오. del 명령을 사용하여 특정 키를 삭제하십시오. Redis-Cli 도구를 사용하여 데이터를 지우십시오.

Redis에서 모든 키를 보는 방법 Redis에서 모든 키를 보는 방법 Apr 10, 2025 pm 07:15 PM

Redis에서 모든 키를 보려면 세 가지 방법이 있습니다. 키 명령을 사용하여 지정된 패턴과 일치하는 모든 키를 반환하십시오. 스캔 명령을 사용하여 키를 반복하고 키 세트를 반환하십시오. 정보 명령을 사용하여 총 키 수를 얻으십시오.

Redis 대기열을 읽는 방법 Redis 대기열을 읽는 방법 Apr 10, 2025 pm 10:12 PM

Redis의 대기열을 읽으려면 대기열 이름을 얻고 LPOP 명령을 사용하여 요소를 읽고 빈 큐를 처리해야합니다. 특정 단계는 다음과 같습니다. 대기열 이름 가져 오기 : "큐 :"와 같은 "대기열 : my-queue"의 접두사로 이름을 지정하십시오. LPOP 명령을 사용하십시오. 빈 대기열 처리 : 대기열이 비어 있으면 LPOP이 NIL을 반환하고 요소를 읽기 전에 대기열이 존재하는지 확인할 수 있습니다.

Redis로 서버를 시작하는 방법 Redis로 서버를 시작하는 방법 Apr 10, 2025 pm 08:12 PM

Redis 서버를 시작하는 단계에는 다음이 포함됩니다. 운영 체제에 따라 Redis 설치. Redis-Server (Linux/MacOS) 또는 Redis-Server.exe (Windows)를 통해 Redis 서비스를 시작하십시오. Redis-Cli Ping (Linux/MacOS) 또는 Redis-Cli.exe Ping (Windows) 명령을 사용하여 서비스 상태를 확인하십시오. Redis-Cli, Python 또는 Node.js와 같은 Redis 클라이언트를 사용하여 서버에 액세스하십시오.

See all articles