이 기사는 Redis의 Codis를 이해하고 Codis의 원리를 소개하는 데 도움이 되기를 바랍니다.
빅데이터 동시성 시나리오에서는 Redis의 성능이 아무리 높아도 단일 Redis 인스턴스를 사용하는 것은 매우 어려워집니다.
우선, 데이터 양이 많아질수록, Redis가 더 많은 메모리를 차지하므로 RDB 파일이 너무 커집니다. 동시에 인스턴스가 다시 시작되면 너무 큰 RDB가 로드됩니다. 또한 시작 시간이 길어집니다. [관련 권장 사항: Redis 동영상 튜토리얼]
두 번째로, CPU 사용량 측면에서 Redis의 단일 인스턴스는 하나의 CPU 코어만 사용할 수 있습니다. 하나의 코어에 데이터가 너무 많으면 과부하가 발생하므로 클러스터가 필요합니다. . 이 솔루션은 하나의 인스턴스에서 여러 인스턴스로 엄청난 양의 데이터를 분산시킵니다. Redis의 인기부터 자체 클러스터 솔루션의 공식 지원까지, 타사도 클러스터를 지원하기 위해 자체 구성 요소를 개발하고 있습니다.
Codis는 Go 언어를 사용하여 개발되었으며 Redis 프로토콜을 사용하므로 클라이언트가 Codis에 직접 연결하고 명령을 Redis에 전달할 수 있습니다. 클라이언트측에서는
로 표시되는 Redis 인스턴스가 클러스터 공간이 부족할 경우 동적으로 확장하여 Redis를 계속 추가할 수 있습니다. 동시에 클라이언트가 사용하는 SDK는 변경할 필요가 없습니다. 원래 연결을 redis에서 codis로 변경하면 됩니다.
Codis 자체도 상태 비저장이므로 클러스터를 사용할 수 있습니다. , 콘텐츠 전달만 담당합니다. 여러 Codis를 추가해도 부작용이 없습니다. Codis 중 하나가 실패하면 다른 하나를 사용할 수도 있습니다.
Principle
Codis는 기본적으로 1024개의 슬롯으로 나누어져 있습니다. 클러스터의 각 Redis 인스턴스는 슬롯의 일부에 해당합니다. Codis는 기본적으로 메모리의 슬롯과 Redis 인스턴스 간의 대응 관계를 유지합니다. 클러스터 노드가 많은 경우 개수를 늘릴 수 있습니다.
클라이언트가 보낸 키를 받으면 Codis는 해당 키에 대해 crc32 작업을 수행하여 해시 값을 얻습니다.그런 다음 해시된 정수 값은 모듈로 1024(슬롯 수)를 얻습니다. 나머지는 키가 저장될 슬롯을 사용하면 키를 전송해야 하는 Redis 인스턴스를 찾을 수 있습니다.
의사코드:
hash = crc32(command.key) # 计算hash值 slot = hash % 1024 # 取模得到槽位 redisInstance = slots[slot].redis # 得到redis实例 redis.do(command) # 执行命令复制代码
클러스터 슬롯 동기화
Redis와 슬롯의 매핑 관계는 코디스의 메모리에 존재하므로 코디스 클러스터는 각 노드의 슬롯 매핑 관계가 동기화되는지 확인해야 하므로, Codis Zookeeper 및 Etcd 분산 구성 저장소 미들웨어는 Codis 클러스터 간의 데이터 동기화를 보장하기 위해 슬롯 매핑 관계를 유지하는 데 사용됩니다. 아래와 같이 Codis는 Zookeeper에 슬롯 관계를 저장하고 비트 관계가 변경되면 Codis가 슬롯을 관찰하고 수정할 수 있는 대시보드를 제공합니다. 프록시는 변경 사항을 감지하고 슬롯 관계를 다시 동기화합니다.
용량 확장기존 클러스터가 비즈니스 요구 사항을 충족하지 못하는 경우 클러스터에 새 인스턴스를 추가해야 합니다. 이때 슬롯 매핑 관계를 재배포해야 하며 그 중 일부를 할당해야 합니다. 슬롯은 새 노드에 제공됩니다. Codis는 지정된 슬롯 아래의 모든 키를 순회할 수 있는 새로운 SLOTSSCAN 명령을 추가했습니다. 이 명령을 사용하면 마이그레이션할 슬롯의 모든 키를 스캔한 다음 각 키를 하나씩 순회하여 새 노드로 마이그레이션할 수 있습니다. 마이그레이션 과정에서 코디스는 계속해서 외부세계에 서비스를 제공하고 있는데 이때 마이그레이션되는 슬롯에 이제 해당 슬롯이 기존 노드와 신규 노드에 해당하기 때문에 코디스가 키가 맞는지 확인할 수 없습니다. 이전 노드에서 새 노드로 마이그레이션되었습니다.
이 경우 Codis는 마이그레이션이 완료된 후 즉시 현재 키의 단일 마이그레이션을 강제로 수행합니다. .
의사 코드:
slot_index = crc32(command.key) % 1024 if slot_index in migrating_slots: doMigratingKey(command.key) redis = slots[slot_index].new_redis else: redis = slots[slot_index].redis复制代码
SLOTSSCAN Redis의 자체 Scan 명령과 마찬가지로 스캔된 데이터의 중복은 피할 수 없지만 마이그레이션 후 이전 인스턴스에서 단일 키가 즉시 삭제되므로 마이그레이션의 정확성에는 영향을 미치지 않습니다. 더 이상 스캔되지 않습니다.
자동 균형 슬롯
새 인스턴스가 추가될 때마다 슬롯 매핑 관계를 수동으로 유지하는 것은 너무 번거롭습니다. Codis는 자동 밸런싱을 제공합니다. 이 기능은 시스템이 상대적으로 유휴 상태일 때 각 Redis 인스턴스에 해당하는 슬롯 수를 관찰합니다. 불균형한 경우 자동으로 데이터 마이그레이션 작업인 균형을 유지합니다.
단점
Codis는 Redis에 확장성 이점을 제공하지만 일부 부작용도 발생합니다.
트랜잭션을 지원하지 않습니다
트랜잭션은 여러 키로 작동할 수 있지만 트랜잭션은 단일 인스턴스에서만 완료될 수 있습니다. 그러나 키가 여러 인스턴스에 분산되어 있기 때문에 코디스는 트랜잭션 작업을 지원할 수 없습니다.
rename은 지원되지 않습니다.
한 키의 이름을 다른 키로 지정하지만 두 키가 동일한 슬롯에 해시되지 않고 다른 인스턴스의 슬롯에 있을 수 있으므로 이름 바꾸기는 지원되지 않습니다.
공식적으로 제공되는 지원되지 않는 명령 목록: https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md
확장 지연
Codis는 확장 프로세스 중에 데이터를 변경합니다. 마이그레이션은 직접 마이그레이션하는 것입니다. 해시 구조와 같은 전체 키를 사용하면 Codis가 직접 hgetall을 사용하여 모든 콘텐츠를 가져오고 hmset을 사용하여 새 노드에 넣습니다.
해시 콘텐츠가 너무 크면 지연이 발생합니다. 단일 컬렉션 구조의 전체 크기는 1MB를 초과하지 않는 것이 좋습니다. 비즈니스 측면에서는 버킷 스토리지를 통해 대용량 데이터를 여러 개의 작은 데이터로 분할하여 절충할 수 있습니다.
네트워크 오버헤드
코디스는 클라이언트와 Redis 인스턴스 사이에서 네트워크 프록시 역할을 하기 때문에 추가 레이어가 존재하고 당연히 네트워크 오버헤드도 높아지며, Redis에 직접 연결하는 것보다 성능도 약간 떨어집니다.
미들웨어 운영 및 유지 관리 오버헤드
Codis 클러스터 구성에는 Zk 또는 Etcd를 사용해야 합니다. 이는 Codis 클러스터를 도입하려면 다른 미들웨어 도입이 필요하므로 운영 및 유지 관리 기계 자원 비용이 증가한다는 의미입니다.
장점
Codis는 분산 일관성 문제를 제3자(ZK 또는 Etcd)에게 넘겨 이 영역의 유지 관리 작업을 없애고 구현 코드의 복잡성을 줄입니다.
Redis 공식 분산화와 함께 Cluster는 Raft 및 Gossip 프로토콜은 물론 조정이 필요한 수많은 구성 매개변수를 도입했으며 복잡성이 급격히 증가했습니다.
일괄 획득
mget을 사용하여 여러 키의 값을 얻는 등의 일괄 작업의 경우 Codis는 키가 있는 인스턴스에 따라 키를 여러 인스턴스에 분산시킬 수 있습니다. 그런 다음 각 인스턴스를 하나씩 처리하고 mget을 호출하면 마지막으로 요약이 클라이언트에 반환됩니다.
기타 기능
Codis는 대시보드 인터페이스와 Codis-fe를 제공하여 클러스터를 관리하고, 그룹, 노드를 추가하고, 자동 밸런싱 및 기타 작업을 수행하고, 슬롯 상태 및 해당 Redis를 볼 수 있습니다. 예를 들어, 이러한 기능을 사용하면 작동과 유지 관리가 더 편리하고 쉬워집니다.
Going to History
Codis는 Redis가 공식적으로 클러스터링 개념을 제공하지 않았던 점을 보완하기 위해 등장했습니다. 이제 Redis는 Clustering 기능을 공식적으로 제공합니다. 공식 지원은 당연히 타사보다 더 좋습니다.
동시에 타사 소프트웨어도 공식이 실시간으로 출시하는 새로운 기능에 주의를 기울여야 하며 Cluster는 확실히 다음과 호환됩니다. 새로운 기능이 실시간으로 제공되므로 공식 Cluster를 사용하는 것이 좋습니다. Codis는 과거에 배운 지식 포인트이며 일부 아이디어는 Cluster와 겹칩니다.
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 소개를 방문하세요! !
위 내용은 Redis의 Codis에 대해 자세히 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!