MongoDB vs.레디스 vs.쓰기 속도가 빠른 임시 행 스토리지 솔루션을 위한 Cassandra
저는 광고 인상과 클릭을 추적하고 확인하는 시스템을 구축하고 있습니다.즉, 많은 삽입 명령(약 90/초 평균, 250으로 정점에 도달)과 일부 읽기 작업이 있지만, 성능에 중점을 두고 매우 빠른 속도로 실행할 수 있습니다.
시스템은 현재 MongoDB에 있지만, 그 이후로 저는 Cassandra와 Redis를 소개받았습니다.MongoDB에 머무르는 것보다 이 두 가지 솔루션 중 하나로 이동하는 것이 좋을까요?왜 그런가요? 혹은 왜 그렇지 않은가요?
감사해요.
이와 같은 수확 솔루션을 위해서는 다단계 접근법을 참조하십시오.레디스는 실시간 의사소통을 잘합니다.Redis는 메모리 내 키/값 저장소로 설계되었으며 메모리 데이터베이스로서 O(1) 목록 작업과 같은 몇 가지 매우 좋은 이점을 상속합니다.서버에서 사용할 RAM이 있는 한, Redis는 목록 끝까지 푸시하는 속도를 늦추지 않습니다. 이는 항목을 매우 빠른 속도로 삽입해야 할 때 유용합니다.유감스럽게도 Redis는 보유한 RAM 용량보다 큰 데이터 세트(디스크에만 기록되며 읽기는 서버를 다시 시작하거나 시스템이 손상된 경우를 위한 것임)로 작동할 수 없으며, 사용자와 애플리케이션이 확장을 수행해야 합니다.(일반적인 방법은 키를 여러 서버에 분산시키는 것이며, 일부 Redis 드라이버, 특히 Ruby on Rails 드라이버에 의해 구현됩니다.)Redis는 또한 간단한 게시/구독 메시징을 지원하며, 이는 때때로 유용할 수도 있습니다.
이 시나리오에서 레디스는 "1단계"입니다.각 특정 유형의 이벤트에 대해 고유한 이름으로 Redis에 목록을 만듭니다. 예를 들어, "페이지 보기" 및 "링크 클릭"이 있습니다.간단히 설명하기 위해 각 목록의 데이터가 동일한 구조인지 확인합니다. 클릭한 링크에는 사용자 토큰, 링크 이름 및 URL이 포함될 수 있지만, 표시된 페이지에는 사용자 토큰과 URL만 포함될 수 있습니다. 첫 번째 관심사는 발생했다는 사실을 알고 필요한 모든 데이터를 푸시하는 것입니다.
다음으로 레디스의 손에서 미친 듯이 삽입된 정보를 빼내는 간단한 처리 작업자들이 있습니다. 목록의 끝에서 항목 하나를 빼내어 넘겨주도록 요청함으로써 말이죠.작업자는 모든 조정/중복/ID 조회는 데이터를 적절하게 보관하고 보다 영구적인 저장 사이트로 전달하는 데 필요했습니다.레디스의 기억력을 유지하기 위해 필요한 만큼 이 작업자들을 가동시키십시오.Redis 드라이버(대부분의 웹 언어가 현재 사용)와 원하는 스토리지(SQL, Mongo 등)만 있으면 원하는 모든 항목(Node.js, C#, Java 등)에서 작업자를 작성할 수 있습니다.
MongoDB는 문서 저장을 잘합니다.Redis와 달리 RAM보다 큰 데이터베이스를 처리할 수 있으며 자체적으로 샤딩/복제를 지원합니다.SQL 기반 옵션에 비해 MongoDB의 장점은 미리 정해진 스키마를 사용할 필요가 없으며 언제든지 원하는 방식으로 데이터를 저장할 수 있다는 것입니다.
그러나 처리를 위해 데이터를 보유하고 사후 처리된 데이터를 저장하기 위해 기존 SQL 설정(Postgres 또는 MSSQL 등)을 사용하는 "1단계" 단계를 Redis 또는 Mongo에 제안합니다.클라이언트 동작 추적은 "이 페이지를 보는 모든 사용자 표시" 또는 "이 사용자가 지정된 날짜에 몇 페이지를 보았습니까?" 또는 "어느 요일에 전체적으로 가장 많은 사용자를 보았습니까?"로 이동하고 싶을 수 있으므로 관계형 데이터처럼 들립니다.분석 목적을 위한 훨씬 더 복잡한 조인 또는 쿼리가 있을 수 있습니다. 성숙한 SQL 솔루션은 이러한 필터링의 대부분을 수행할 수 있습니다. NoSQL(Mongo 또는 Redis)은 다양한 데이터 집합에서 조인 또는 복잡한 쿼리를 수행할 수 없습니다.
저는 현재 매우 큰 광고 네트워크에서 일하고 있으며 우리는 플랫 파일에 씁니다 :)
저는 개인적으로 몽고 팬이지만, 솔직히, 레디스와 카산드라는 더 잘하거나 더 못 할 것 같습니다.제 말은, 여러분이 하는 일은 메모리에 물건을 집어넣고 백그라운드에서 디스크로 플러시하는 것뿐입니다(Mongo와 Redis 둘 다 이렇게 합니다).
빠른 속도를 원하는 경우 다른 옵션은 로컬 메모리에 여러 개의 인상을 저장한 다음 매 분마다 디스크를 플러시하는 것입니다.물론, 이것은 기본적으로 Mongo와 Redis가 당신을 위해 하는 일입니다.이사를 해야 하는 진짜 강제적인 이유는 아닙니다.
이 세 가지 솔루션(플랫 파일을 포함할 경우 네 가지)은 모두 매우 빠른 쓰기 속도를 제공합니다.비관계형(nosql) 솔루션은 재해 복구를 위해 조정 가능한 내결함성을 제공합니다.
규모 면에서 MongoDB 노드가 3개뿐인 테스트 환경은 초당 2-3,000건의 혼합 트랜잭션을 처리할 수 있습니다.8개 노드에서 초당 12k~15k의 혼합 트랜잭션을 처리할 수 있습니다.카산드라는 훨씬 더 높은 확장성을 가질 수 있습니다. 250개의 읽기는 문제가 되지 않습니다.
더 중요한 질문은 이 데이터로 무엇을 할 것인가 하는 것입니다.운영 보고?시계열 분석?임시 패턴 분석?실시간 보고?
MongoDB는 컬렉션 내의 여러 속성을 기반으로 임시 분석을 수행하는 기능을 원하는 경우에 적합한 옵션입니다.인덱스는 메모리에 저장되지만 컬렉션에 최대 40개의 인덱스를 저장할 수 있으므로 크기를 확인하십시오.그러나 결과는 유연한 분석 솔루션입니다.
카산드라는 중요한 상점입니다.주 인덱스로 사용할 정적 열 또는 열 집합을 정의합니다.Cassandra에 대해 실행되는 모든 쿼리는 이 인덱스로 조정해야 합니다.보조 장치를 설치할 수는 있지만, 그 정도입니다.물론 MapReduce를 사용하여 저장소에서 키가 아닌 속성을 검색할 수 있지만, 저장소 전체에 대한 직렬 검색이 가능합니다.또한 Cassandra는 서버 노드에서 "좋아요" 또는 정규식 작업이라는 개념을 가지고 있지 않습니다.이름이 "알렉스"로 시작하는 모든 고객을 찾으려면 전체 컬렉션을 스캔하고 각 항목의 이름을 꺼내 클라이언트 측 정규식을 통해 실행해야 합니다.
저는 Redis에 대해 똑똑하게 말할 만큼 충분히 친숙하지 않습니다.미안하다.
비관계형 플랫폼을 평가하는 경우 CouchDB 및 Riak도 고려할 수 있습니다.
이게 도움이 되길 바랍니다.
방금 이것을 찾았습니다: http://blog.axant.it/archives/236
가장 흥미로운 부분을 인용합니다.
이 두 번째 그래프는 Redis RPUSH 대 Mongo $PUSH 대 Mongo 삽입에 관한 것입니다. 저는 이 그래프가 정말 흥미롭다고 생각합니다.최대 5000개의 항목 mongodb $push는 Redis RPUSH와 비교해도 더 빠릅니다. 그러면 엄청나게 느려집니다. 아마도 mongodb 어레이 유형은 선형 삽입 시간을 가지고 있기 때문에 점점 느려집니다. mongodb는 일정한 시간 삽입 목록 유형을 노출하여 약간의 성능을 얻을 수 있습니다.그러나 선형 시간 배열 유형(일정한 시간 조회를 보장할 수 있음)에서도 작은 데이터 집합에 대한 응용 프로그램이 있습니다.
적어도 데이터 유형과 볼륨에 따라 모든 것이 달라질 수 있습니다.가장 좋은 조언은 일반적인 데이터 세트를 벤치마킹하여 자신을 확인하는 것입니다.
Benchmarking Top NoSQL Databases(여기 다운로드)에 따르면 저는 Cassandra를 추천합니다.
만약 당신이 선택권이 있다면 (그리고 플랫 파이에서 멀어져야 한다면) 저는 레디스와 함께 갈 것입니다.이 제품은 매우 빠르고, 사용자가 말하는 부하를 편안하게 처리할 수 있지만, 더 중요한 것은 플러싱/IO 코드를 관리할 필요가 없다는 것입니다.나는 그것이 꽤 간단하다는 것을 이해하지만 관리할 코드가 적은 것이 더 낫습니다.
또한 파일 기반 캐싱에서는 얻을 수 없는 Redis의 수평 확장 옵션도 제공됩니다.
저는 MongoDB로 $350 Dell로 초당 약 30,000 삽입을 받을 수 있습니다.만약 당신이 약 2k inserts/sec만 필요하다면, 나는 MongoDB를 고수하고 확장성을 위해 그것을 공유할 것입니다.또한 Node.js로 무언가를 하는 것이나 더 비동기적으로 만들기 위해 비슷한 것을 고려할 수도 있습니다.
데이터베이스에 삽입할 때의 문제는 일반적으로 각 삽입에 대해 디스크의 임의 블록에 써야 한다는 것입니다.원하는 것은 10개 정도 삽입할 때마다 디스크에 기록하는 것이며, 이상적으로는 순차 블록에 기록하는 것입니다.
플랫 파일이 좋습니다.요약 통계(예: 페이지당 총 히트 수)는 병합 정렬 맵 축소 유형 알고리즘을 사용하여 확장 가능한 방식으로 플랫 파일에서 얻을 수 있습니다.자신의 것을 굴리는 것은 그리 어렵지 않습니다.
SQLite는 이제 쓰기 사전 로깅을 지원하므로 적절한 성능을 제공할 수도 있습니다.
저는 몽고드브, 카우치드브, 카산드라에 대한 실제 경험이 있습니다.나는 많은 파일을 base64 문자열로 변환하고 이 문자열을 nosql에 삽입했습니다.
빠릅니다. 가 가장. mongodb가 가장 느립니다. cassandra가 가장 느립니다. . couchdb가 가장 빠릅니다.
나는 mysql이 그들 모두보다 훨씬 빠를 것이라고 생각하지만, 나는 아직 내 테스트 케이스를 위해 mysql을 시도하지 않았습니다.
언급URL : https://stackoverflow.com/questions/3010224/mongodb-vs-redis-vs-cassandra-for-a-fast-write-temporary-row-storage-solution
'programing' 카테고리의 다른 글
선택 옵션 '선택됨'을 설정합니다(값 기준). (0) | 2023.05.15 |
---|---|
ObjectStateManager에서 개체를 찾을 수 없으므로 개체를 삭제할 수 없습니다. (0) | 2023.05.15 |
Git 하위 모듈을 추가할 때 분기/태그를 지정하려면 어떻게 해야 합니까? (0) | 2023.05.15 |
창이 최대화될 때 모든 컨트롤의 크기가 비례적으로 조정되도록 하는 방법은 무엇입니까? (0) | 2023.05.15 |
신속 - URL 인코딩 (0) | 2023.05.15 |