1. 노드 영역 분할:
Redis 키 또는 사용자 ID와 같은 특정 데이터를 사용한 다음 공식: hash(key)%N을 사용하여 해시를 계산합니다. 데이터가 매핑되는 노드를 결정하는 데 사용되는 노드 수 N 값.
이 솔루션의 문제점은 다음과 같습니다.
노드 수가 변경되면 해시가 필요합니다.
2. 일관성 해시 알고리즘
일관성 해시 알고리즘의 구현 아이디어는 각 노드에 토큰을 할당하는 것입니다. 시스템에서 0~2^32 범위의 토큰은 A 해시 링을 구성합니다. 노드 검색 작업을 수행하기 위해 데이터를 읽고 쓸 때 먼저 키를 기반으로 해시 값을 계산한 다음보다 크거나 같은 첫 번째 토큰 노드를 찾습니다. 해시와 시계 방향으로 동일합니다.
이점:
이 방법의 가장 큰 장점은 노드를 추가하거나 삭제할 때 해시 링의 인접한 두 노드에만 영향을 미치며 아무런 영향도 미치지 않는다는 것입니다.
질문:
3. 가상 슬롯 알고리즘
분산이 좋은 해시 함수를 사용하여 모든 데이터를 슬롯(슬롯)에 매핑합니다. 0~16383(2^14) 범위입니다. 일반적으로 슬롯 수는 인스턴스 수보다 훨씬 많습니다.
슬롯은 클러스터 데이터 관리 및 마이그레이션의 기본 단위입니다. 대규모 슬롯은 데이터 분할 및 클러스터 확장을 용이하게 합니다.
각 인스턴스는 슬롯 범위의 일부를 매핑합니다.
기능:
1 . 데이터와 노드 간의 관계를 분리하여 확장 및 잠금의 어려움을 단순화합니다.
2. 노드 자체가 슬롯의 매핑 관계를 유지하며, 클라이언트나 프록시 서비스가 슬롯의 메타데이터를 유지하도록 요구하지 않습니다. 슬롯 파티션.
3. 데이터 라우팅, 온라인 개폐식 조명 장면을 위한 노드, 슬롯 및 키 간의 매핑 쿼리를 지원합니다.
해시태그(인터뷰)
Mset k1 v1 k2 v2 k3 v3
샤딩을 통해 데이터를 합리적으로 나눌 수 있습니다. 다른 노드에서는 이것이 좋은 일이었습니다. 하지만 때로는 관련 비즈니스를 원자적인 방식으로 운영하고 싶을 때도 있습니다. 간단한 예를 들자면
단일 노드에서 MSET를 실행합니다(m은 다중을 의미하며 여러 키와 값을 한 번에 redis로 설정합니다). 이는 주어진 모든 키가 필요합니다. 동시에 설정해야 하며, 지정된 일부 키는 업데이트되고 다른 지정된 키는 업데이트되지 않는 상황이 있을 수 없습니다. 그러나 클러스터 환경에서는 여전히 MSET 명령을 실행할 수 있지만 해당 작업은 더 이상 원자적 작업이 아닙니다. 여러 키가 다른 키에 할당될 수 있으므로 지정된 일부 키는 업데이트되지만 다른 지정된 키는 변경되지 않습니다. 기계.
그러므로 여기서 모순이 발생하게 되는데, 키는 최대한 서로 다른 머신에 분산시켜야 하고, 관련된 일부 키는 같은 머신에 할당해야 합니다.
면접 때 쉽게 물어보는 얘기이기도 하다. 어떻게 해결하나요?
이전 분석에서 우리는 샤딩이 실제로 해싱 프로세스라는 것을 배웠습니다. 키는 해시된 다음 여러 머신으로 나뉩니다.
그렇다면 이 문제를 해결하기 위해서는 연관된 키의 해시 값을 동일하게 만드는 방법을 고려해야 할까요? 모든 키가 동일하면 비현실적입니다. 그렇다면 어떻게 해결해야 할까요? HashTag 개념은 redis에 도입되어 데이터 분포 알고리즘이 키의 특정 부분을 기반으로 계산한 다음 관련 키가 동일한 데이터 샤드에 속하도록 허용합니다.
간단한 예를 들어, 사용자 정보가 저장된 경우
redis:store:1001, redis:store:1002
해시태그를 통해
redis:{store } :1001, redis:{store}:1002; 의미
키에 {}가 포함되어 있으면 전체 키가 해시되지 않고, {}에 포함된 문자열만 해시됩니다.