2009-12-26 4 views
1

데이터를 공유해야하는 여러 가지 fastcgi 프로세스가 있습니다.C 또는 C++ - 디스크 백업 공유 메모리를 동적으로 확장/축소

데이터는 세션 (고유 세션 ID 문자열)에 바인딩되며 서버 재부팅시에도 계속 작동 할 수 있어야합니다. 세션 수에 따라 공유 데이터가 너무 커서 주 메모리에 맞지 않을 수 있습니다. 이상적으로, 공유 데이터가 특정 임계 값을 초과하는 경우 가장 활동이 적은 세션에 바인드 된 데이터는 디스크에만 존재해야하며 가장 활동적인 세션 데이터는 주 메모리에서 사용할 수 있어야합니다. 세션이 잠시 동안 비활성화 된 후에는 세션 데이터가 삭제됩니다.

날이 꽤 털이 문제를 해결하는 데 도움이 될 수있는 방법 또는 라이브러리가 있습니다

내 질문 (C/++에 초보자 인)인가?

비활성 세션 데이터를 삭제해야한다는 요구 사항을 고려하여 mmap()을 공유 메모리와 함께 사용할 수 있습니까?

답변

3

bmargulies에 대한 의견을 듣고 나 자신이 설명하는 것을 시도 했으므로주의해야하며 ACID 데이터베이스를 작성하고 있음을 알았습니다. 이 데이터베이스 시스템의 역할 프로세스

사이

  • 데이터 공유 지속성

    • 통계 캐싱
    • 데이터 : 요약하자면, 당신은 요구했다. 다른 사람들이 쓴 글을 사용하는 것이 훨씬 낫습니다. IMO 선택은 sqliteberkeley-db.입니다. Sqlite는 병렬 액세스가 아니지만 berkeley-db는 매우 확장 가능이지만 데이터 모델로 문자열 문자열 사전을 사용합니다.

      BDB는 전체적으로 메모리가 있거나 디스크에 직렬화되고 메모리에 캐시되는 정상적인 방법을 사용할 수 있습니다. 또한 ACID 의미를 사용자의 특정 요구 사항에 맞게 조정할 수 있습니다. 즉, 내구성있는 쓰기를 비활성화 할 수 있습니다. 그러면 내구성이 강한 데이터 내구성을 희생하면서 즉각적인 쓰기 특성을 얻을 수 있습니다.

      더 많은 고급 솔루션이 있지만 실제 문제 (예 : 클러스터를 구축해야 함) 용입니다.

  • +0

    안녕하세요 하산! 경고 및 bdb 조정 포인터를 주셔서 감사합니다. 버클리 DB에 대해 철저히 조사 할 것입니다. – user238707

    +0

    수락 해 주셔서 감사합니다. P –

    3

    글쎄, 대부분은 사람들이 SQL 데이터베이스를 사용하고 캐시를 구현하거나 데이터베이스에 의존하여 최근 사용한 캐싱을 수행합니다. 비활성 파괴는 백그라운드 스레드의 작업입니다. 재부팅 할 때 오래된 죽은 세션에서 남은 부분을 제거해야합니다.

    솔루션의 '무게'는 재미있는 것입니다. 데이터베이스를 사용하는 경우 코드가 적고 돌고래와 푸른 고래가 수영을하는 경우가 있습니다. 지속성 메커니즘을 처음부터 만들면 코드가 많이 생깁니다.

    중간 대안으로 bdb를 살펴보십시오.

    +0

    답장을 보내 주셔서 감사합니다. - 전체 (또는 심지어 절반) 날아간 RDBMS보다 훨씬 가벼운 무언가를 찾고 있는데 ... – user238707

    +0

    나는 처음부터 영속성 메커니즘을 구축 할 필요가 없기를 진심으로 바랍니다. :).Oracle은 "Berkeley DB는 원격 데이터베이스 서버를 사용하는 프로세스 간 통신 지연을 피하면서 응용 프로그램과 동일한 프로세스에서 실행되는 C 라이브러리입니다."- 이렇게하면 bdb가 공유 메모리로 직접 유지하는 데이터에 액세스 할 수 있음을 의미합니다 기억? – user238707

    +0

    아니오, 직접적으로 아닙니다. 그것은 실현 가능하지 않을 것입니다 - 그러나 당신은 메모리 복사본에 대해서만 지불합니다. –