>백엔드 개발 >Golang >KV 스토어의 열쇠는 어떻게 잠깁니까?

KV 스토어의 열쇠는 어떻게 잠깁니까?

WBOY
WBOY앞으로
2024-02-09 13:20:09964검색

KV Store 中的密钥是如何锁定的?

php 편집기 Zimo가 KV Store의 키 잠금 비밀을 공개합니다. KV Store에서는 일련의 복잡한 알고리즘과 기술을 통해 키 잠금이 달성됩니다. 먼저, 시스템은 각 키에 대한 고유 식별자를 생성하고 이를 해당 값과 함께 데이터베이스에 저장합니다. 동시에 시스템은 보안을 보장하기 위해 해시 함수를 사용하여 키를 암호화합니다. 또한 시스템은 ACL(액세스 제어 목록)을 사용하여 권한이 있는 사용자만 읽기 및 쓰기 작업을 수행할 수 있도록 키에 대한 액세스를 제한합니다. 이러한 보안 조치를 통해 KV Store는 키의 보안과 신뢰성을 보장하고 사용자에게 안전하고 신뢰할 수 있는 데이터 저장 서비스를 제공합니다.

질문 내용

저는 분산 시스템과 동시성에 대해 더 많이 배우기 위해 분산 kv 스토어를 구축하고 있습니다. 제가 구축하고 있는 kv 스토리지의 구현은 메모리 내 트랜잭션 로그를 사용하여 완전히 트랜잭션 방식으로 구현됩니다. 일을 단순하게 유지하기 위해 저장소도 전적으로 메모리에 있습니다. API는 공개 getinsertupdateremove입니다. 모든 엔드포인트는 키 범위가 아닌 단일 키에서 작동합니다.

잠금을 통해 동시성을 관리합니다. 그러나 전체 데이터 저장소를 잠그는 전역 잠금이 있습니다. 이것은 매우 비효율적으로 들립니다. 왜냐하면 k2 时读取 k1 값을 업데이트하려면 k2가 업데이트를 완료할 때까지 기다려야 하기 때문입니다. 그러나 이는 관련이 없습니다.

일부 데이터베이스에서는 더 세분화된 잠금을 사용하는 것으로 알고 있습니다. 예를 들어, mysql 서버에는 행 수준 잠금이 있습니다. 키 수준 잠금을 구현하는 방법은 무엇입니까?

저는 있어요

으아악

이런 것도 추가해야 할까요? :

으아악

이렇게 하면 문제는 locks 必须与 store 保持同步。另一种选择是合并两个映射,但即便如此,如果 remove 请求出现在 get전에 잠금 상태에서 지도 항목을 삭제하는 문제도 겪었다는 것입니다.

솔루션

콘셉트 부분

무역

우선 강력한 일관성에는 트랜잭션 로그가 필요하지 않습니다. 트랜잭션 로그는 산성 특성을 유지하는 데 유용합니다.

트랜잭션은 데이터베이스의 강력한 일관성을 위한 엄격한 요구 사항은 아니지만 많은 상황에서 일관성을 보장하는 데 유용한 도구가 될 수 있습니다.

강한 일관성은 읽기 작업이 수행되는 위치에 관계없이 데이터베이스의 모든 읽기가 가장 최근 쓰기를 반환하도록 보장하는 속성을 나타냅니다. 즉, 강력한 일관성은 모든 클라이언트가 동일한 데이터를 볼 수 있고 데이터가 시스템 전체에서 최신 상태이고 일관되게 유지되도록 보장합니다.

paxos나 raft와 같은 합의 알고리즘을 사용하여 강력한 일관성을 보장할 수 있습니다. 데이터를 저장할 때 데이터의 버전을 저장하고 이를 paxos에서 ID로 사용할 수 있습니다.

kv 저장 잠금

키-값(kv) 저장소에서 키는 일반적으로 뮤텍스 또는 리더-라이터 잠금(@paulsm4 제안)과 같은 일종의 잠금 메커니즘을 사용하여 잠깁니다. 이를 통해 여러 스레드 또는 프로세스가 kv 저장소의 데이터에 동시에 액세스하고 수정할 수 있으면서도 데이터가 일관되고 올바르게 유지되도록 보장할 수 있습니다.

예를 들어 스레드나 프로세스가 kv 저장소의 특정 키를 읽거나 수정하려는 경우 해당 키에 대한 잠금을 획득할 수 있습니다. 이렇게 하면 다른 스레드나 프로세스가 동시에 동일한 키를 수정하여 경쟁 조건 및 기타 문제를 일으키는 것을 방지할 수 있습니다. 스레드나 프로세스가 키 읽기 또는 수정을 마치면 잠금이 해제되어 다른 스레드나 프로세스가 키에 액세스할 수 있습니다.

kv 저장소에서 키를 잠그는 방법에 대한 구체적인 세부 사항은 kv 저장소 구현에 따라 다를 수 있습니다. 일부 kv 저장소는 전역 잠금(이미 수행하고 있는 것처럼 때로는 비효율적임)을 사용하여 전체 데이터 저장소를 잠글 수 있는 반면 다른 kv 저장소는 행 수준 잠금 또는 키 수준 잠금과 같은 보다 세분화된 잠금 메커니즘을 사용할 수 있습니다. 더 많은 작업을 허용합니다. 데이터에 대한 동시 액세스.

그래서, 개념적으로는 당신 말이 맞습니다. 문제는 잠금 구현 세부 사항에 있습니다.

인코딩

잠금에 관한 질문에 엄격하게 답변하려면 @paulsm4가 제안한 Reader Lock을 고려하세요. golang에서 유사한 잠금은 rwmutexrwmutex。它用于 sync。 map입니다. 동기화에 사용됩니다. 지도.

다음은 간단한 예입니다.

으아악

이 외에도 복제본 간의 일관성을 보장하려면 paxos가 필요합니다.

위 내용은 KV 스토어의 열쇠는 어떻게 잠깁니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제