애플리케이션이 데이터에 크게 의존하고 데이터베이스와 자주 상호 작용하는 경우 캐싱은 관련 비용을 완화하는 데 매우 중요합니다. 캐싱을 사용하여 데이터 검색 속도를 높이고 강력한 데이터 복제 및 일관성을 구현하는 온라인 애플리케이션은 필수입니다.
데이터 복제는 여러 서버에 걸쳐 중요한 데이터의 백업을 생성하여 정확하고 접근 가능한 정보를 보장하는 데 매우 중요합니다. 마찬가지로 이러한 일관성 메커니즘은 배포된 복사본을 원활하게 동기화하여 애플리케이션 프로세스의 불일치를 방지하는 데 매우 중요합니다. 따라서 애플리케이션이 정확한 최신 데이터와 상호 작용하도록 보장하려면 백업, 고가용성 및 데이터 일관성을 위해 이러한 기능을 사용해야 합니다.
운 좋게, NCache 이러한 분산 시스템을 위한 안정적인 복제 및 동기화 메커니즘 세트를 제공합니다. 이 블로그에서는 방법을 자세히 설명합니다. NCache 이러한 조건을 충족합니다.
NCache 토폴로지
에서 지원하는 캐싱 토폴로지 NCache 를 포함 미러 토폴로지, 복제된 토폴로지, 파티션 및 파티션-복제 토폴로지및 클라이언트 캐시 토폴로지.
- 미러 토폴로지: 미러 캐시 토폴로지의 모든 읽기 및 쓰기 작업에 대해 클라이언트 노드는 클러스터의 활성 서버 노드에만 연결됩니다. 활성 서버 노드가 다운되면 클라이언트 애플리케이션은 즉시 이전 수동 노드와의 연결을 설정합니다.
- 복제된 토폴로지: 복제된 토폴로지는 여러 서버에 동시에 장애가 발생하더라도 각 서버에 동일한 데이터 복사본이 있으므로 데이터가 손실되지 않도록 보장합니다.
- 파티션 토폴로지: 모든 클라이언트 응용 프로그램을 캐시 서버에 연결함으로써 파티션 토폴로지는 데이터를 청크로 나누어 높은 데이터 가용성을 제공하므로 모든 클라이언트 응용 프로그램을 캐시 서버에 연결합니다. 이런 방식으로 애플리케이션은 연결된 서버가 다운되더라도 다른 서버에 요청하여 필요한 데이터를 가져옵니다.
- 파티션-복제본 토폴로지: 파티션-복제 토폴로지는 동적 파티션을 생성할 뿐만 아니라 다른 서버 노드에 이러한 파티션의 동적 복제본을 생성하여 연결 실패 또는 노드 실패 시 백업 역할을 합니다. 이러한 상황에서는 NCache 레플리카 노드로부터 데이터를 얻어서 배포합니다.
- 클라이언트 캐시 토폴로지: 클라이언트 캐시 토폴로지에서 캐시는 애플리케이션과 매우 가까이 위치하며 분산 캐시에서 데이터를 빠르게 캐시할 수 있습니다.
블로그에서 토폴로지에 대해 자세히 알아보세요. 확장 및 유지: 토폴로지 탐색 NCache.
데이터 복제 NCache
데이터 복제의 주요 목표는 데이터 일관성, 가용성 및 내결함성을 보장하는 것입니다. 서로 다른 위치에 동일한 데이터 복사본을 유지함으로써 시스템은 성능을 향상하고 대기 시간을 줄이며 잠재적인 데이터 손실이나 서버 오류로부터 시스템을 보호할 수 있습니다.
사용된 토폴로지에 따라 동기식 또는 비동기식입니다. 동기 복제에서는 NCache 데이터가 기본 캐시 서버와 해당 복제본에 동시에 기록되도록 합니다. 그러나 이 방법을 사용하면 강력한 데이터 일관성이 보장되지만 모든 캐시 쓰기 작업은 모든 복제본의 확인을 기다려야 하므로 성능이 저하될 수 있습니다.
또는 비동기식 복제는 기본 캐시 서버에 데이터를 쓴 후 복제본을 업데이트합니다. 이러한 캐시 쓰기 작업은 복제본 확인을 기다리지 않으므로 이 전략은 더 큰 성능 이점을 제공합니다. 이 전략을 사용하면 복제본과 기본 캐시 서버 간에 일시적인 데이터 불일치가 발생할 수 있습니다.
동기 및 비동기 데이터 복제를 위한 토폴로지
논의된 각 토폴로지는 고유한 특성 세트를 제공하지만 모든 토폴로지가 데이터 복제에 적합한 것은 아닙니다. 예를 들어, 동기화된 복제는 미러링된 캐시 토폴로지, 기본 노드와 복제본 노드에 동시에 기록하여 데이터 일관성을 보장합니다. 반면에 기본 노드에 먼저 쓰고 나중에 복제본을 업데이트함으로써 비동기식 복제가 사용됩니다. 복제된 캐시 토폴로지, 효율성이 향상되지만 때때로 오류가 발생할 수 있습니다.
다행히도 파티션-복제본 토폴로지 분할 캐시 토폴로지와 복제 캐시 토폴로지의 장점을 결합하여 중복성, 가용성 및 성능 간의 균형을 유지합니다. 사용자는 요구 사항에 따라 최상의 기술을 선택할 수 있습니다.
데이터 일관성 메커니즘
데이터 일관성은 시스템이나 데이터베이스 전반에 걸친 정보의 신뢰성과 정확성을 의미하며, 다양한 운영 전반에 걸쳐 데이터가 정확하고 안정적으로 유지되도록 보장합니다. 데이터 일관성을 보장하기 위해, NCache 메커니즘을 제공합니다 분산 잠금 동시 업데이트 중에 특정 캐시 항목을 잠글 수 있습니다. 여러 사용자는 잠금을 적용하여 데이터 무결성을 손상시키지 않고 다양한 캐시 항목에 대해 동시에 작업할 수 있습니다. 따라서 캐시 잠금은 분산 환경에서 공유 리소스를 관리하는 데 유용합니다.
데이터 일관성을 유지하려면, NCache 분산 잠금 관리자 역할을 하며 두 가지 유형의 잠금을 제공합니다. 낙관적 잠금(캐시 항목 버전) 과 비관적 잠금(배타적 잠금). 낙관적 잠금 사용 캐시 항목 버전 관리. 이러한 유형의 잠금에서 Add 메서드는 캐시에 새 항목을 추가하고 처음으로 항목 버전을 저장하는 반면, insert 메서드는 기존 항목의 값을 덮어쓰고 해당 항목 버전을 업데이트합니다. 다음 예에서는 LockHandle을 생성한 다음 Product:1001 키를 사용하여 10초 간격으로 항목을 잠그므로 10초 후에 항목이 자동으로 잠금 해제됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Prerequisite: Cache is already connected // Item is already added in the cache // Specify the key of the item string key = $"Product:1001"; // Create a new LockHandle LockHandle lockHandle = null; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = TimeSpan.FromSeconds(10); // Lock the item for a time span of 10 seconds bool lockAcquired = cache.Lock(key, lockSpan, out lockHandle); // Verify if the item is locked successfully if (lockAcquired == true) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } |
또는 비관적 잠금은 다음을 사용하여 항목을 잠급니다. 잠금 핸들, 다른 모든 사용자가 해당 캐시 항목에 대한 쓰기 작업을 수행하지 못하도록 차단합니다. 항목을 가져오는 동안 잠금을 성공적으로 획득하면 이제 응용 프로그램은 이 잠금이 있는 동안 다른 응용 프로그램이 이 항목을 가져오거나 업데이트할 수 없다는 것을 알고 안전하게 작업을 수행할 수 있습니다. 다음 예에서는 캐시의 항목을 잠근 다음 lockHandle을 사용하여 항목을 가져옵니다. 그런 다음 항목이 업데이트되고 Insert API를 사용하여 캐시에 다시 삽입됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Specify the key of the item string key = $"Product:1001"; // Set acquireLock flag as true bool acquireLock = true; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = new TimeSpan(0, 0, 10); // Initialize the lockHandle LockHandle lockHandle = null; CacheItem item = cache.GetCacheItem(key, acquireLock, lockSpan, ref lockHandle); var product = new Product(); product = item.GetValue(); // Update the unitsinstock for the product product.UnitsInStock = 200; bool releaseLock = true; // Item is already locked with a LockHandle // Update the item and release the lock as well since releaseLock is set true // Make sure that the LockHandle matches with the already added LockHandle cache.Insert(key, item, null, lockHandle, releaseLock); |
데이터 복제 및 일관성을 위한 모범 사례
이제 우리는 데이터 복제와 일관성 메커니즘에 대해 배웠습니다. NCache, 이러한 맥락에서 권장되는 사례를 살펴보겠습니다. 복제된 토폴로지는 고가용성이 필요하고 데이터 손실 없이 (n-1) 노드 오류를 견딜 수 있는 애플리케이션에 가장 적합한 선택입니다. 반면, 파티션-복제본 토폴로지는 증가하는 데이터 요구 사항을 충족할 수 있는 고가용성과 용량을 모두 제공합니다.
복제된 토폴로지만큼 가용성이 높지는 않지만 데이터 손실 없이 노드 오류를 견딜 수 있습니다. 각 파티션에는 백업이 있습니다. 따라서 각 노드에는 본질적으로 파티션과 다른 파티션의 백업이 있습니다. 반면, 미러링 토폴로지는 액티브 노드에서 패시브 노드로의 비동기 복제를 통해 데이터 안정성과 가용성을 제공합니다.
NCache 캐시 데이터를 만료시키기 위한 시간 기반 데이터 무효화 전략도 지원합니다. 데이터 무효화 만료 즉, 데이터가 캐시에 남아 있는 기간(그 이후에는 만료됨)을 지정할 수 있다는 의미입니다. 이러한 방식으로 캐시는 다음 클라이언트 요청 시 최신 데이터를 갖게 되므로 오래된 데이터를 제거하여 데이터 일관성을 보장합니다. 무효화를 통한 종속성 데이터베이스에 변경 사항이 발생할 때마다 캐시 데이터가 제거되도록 합니다.
결론
데이터 복제 및 일관성은 안정적인 고성능 애플리케이션의 백본입니다. 다행히도 NCache를 사용하면 가장 복잡한 데이터 요구 사항도 처리할 수 있는 확장성이 뛰어나고 내결함성이 있는 애플리케이션을 만들 수 있는 강력한 기능에 액세스할 수 있습니다.