http://redmine.nehome.net/redmine/projects/nosql/wiki/Cassandra_-_Replica-Strategy_and_Snitch-Strategy_and_Partitioner-Strategy



Replica-Strategy

  • Keyspace 생성시 설정한다.
    [default@unknown] CREATE KEYSPACE score with placement_strategy='org.apache.cassandra.locator.NetworkTopologyStrategy' and strategy_options={0:3};
    
  • Cluster내에서 Replica들을 어떻게 분산 시킬지를 결정
  • Type에는 2가지 지원
    • SimpleStrategy
    • NetworkTopologyStrategy

SimpleStrategy

  • Row키에 대한 MD5 Hash결과에 의해 Data저장 노드가 결정되면, 무조건 Ring에서 시계방향으로 바로 다음(Next) 노드들에게 Replica를 배치 시키는 방식.
  • 뒤에 나올 내용인 Snitch-Strategy의 설정은 모두 무시된다. 단순히 Ring의 시계방향만 고려됨.

NetworkTopologyStrategy

  • 먼저 Cassandra에서 말하는 "DataCenter"란?
    Replication-Group(복제 그룹)을 의미 하며, 복제를 목적으로 클러스트 내에서 묶여진 논리적인 그룹이다.주의할 것은 물리적인 DataCenter을 의미하는 것이 아님.
    
  • DataCenter/Rack에 걸쳐 정확하게 Replica를 배치 하기위해 Snitch정보에 의존적이다.
  • SimpleSnitch 모드가 아닌 Snitch-Strategy에 의해 정의된 Replication-Group(or Each DataCenter)정보를 기준으로 Replica를 적절히 배치.
  • Replica 배치는 각각의 DataCenter별로 독립적으로 설정한다.(비대칭 Replica 수 운영 가능)
    DC1에는 3개, DC2에는 2개 이런식으로...
    
  • 첫 Replica들은 각각의 DataCenter들에 우선적으로 하나씩 결정(배치)된다.(by Partitioner)
  • 나머지 Replica들은 각각의 DataCenter들에 지정된 갯수만큼 배치되는데, 이때 Snitch정보인 Replication-Group정보(Rack)를 참조해서, 각 DataCenter의 Ring정보에서 시계방향으로 돌면서, 이전 Replica와 비교해 동일 Replication-Group이 아닌 Rack이 나올때까지 검색해서 배치한다.
  • 단, 분리 배치 할 노드가 부족할 경우에는 동일 Rack이라도 배치하게 된다.
  • 얼마나 많은 Replica를 사용할지를 결정할 때 고려해야 할 것
    • DataCenter간의 지연시간을 투자하지 않고, 로컬의 데이타(Local-Data)를 읽을 수 있게 한다.
    • 여러가지 장애 상황에 대한 대처가 가능해야 한다.
  • Multi-DataCenter구조하에서 아래와 같은 2가지 방법이 추천된다.
    • 각각에 DataCenter에 2개의 Replica를 두는 것.
      • Replication-Group당 하나의 노드장애를 커버 가능하고, 장애상황하에서 "Consistency-Level ONE"으로 Local-Data 읽기가 가능.
    • 각각의 DataCenter에 3개의 Replica를 두는 것.
      • "Strong Consistency Level Local_QUORUM"모드에서, Replication-Group당 하나의 노드장애를 커버 가능하거나, "Consistency-Level ONE"모드에서는 Replication-Group당 다중(2대) 노드의 장애가 커버 가능.
  • Snitch는 복제 범위 내에서 효율적으로 노드간 통신을 하며, 클라이언트 응용프로그램과 카산드라 사이의 요청처리에는 여향을 미치지 않는다.
  • Cluster의 모든 노드는 동일한 Snitch를 사용해야 한다.(cassandra.yaml)

Snitch-Strategy

  • Snitch ??
    노드가 전체 네트워크 토플로지에서 그룹화 되는 방법을 정의 하는 역할
    

SimpleSnitch

  • cassandra.yaml 에서 설정.
  • DataCenter/Rack에 대한 구분이 없다.
  • Partitioner에 의해 저장될 노드가 정해지면, Replica에 대해서는 무조건 시계방향으로 나머지 Replica개수 만큼 Next(다음) 노드들에게 순차적으로 배치 시킨다.

RackInferringSnitch

  • 클러스트 내에서, 노드의 IP정보를 기반으로 그룹화 한다. (옥텟 기반)
  • IP가 10.DDD.RRR.NNN 이라고 한다면,
    • DDD값은, DataCenter를 의미, 동일하면 같은 DataCenter로 간주.
    • RRR값은, Rack을 의미, 동일하면 같은 Rack으로 간주.
    • NNN값은, 노드를 구분.
  • DDD와, RRR 값이 중요하다.
  • NetworkTopologyStrategy와 사용하면 유리.

PropertyFileSnitch

  • 클러스트 내에서, 노드들의 그룹화를 특정 속성파일(cassandra-topology.properties)을 통해 정의 한다.
  • 모든 노드정보를 속성파일에 기술해야 한다. (관리의 번잡)
  • 모든 노드는 동일 속성파일을 유지 해야 한다.
  • 관리 정보는 RackInferringSnitch와 유사
    • 노드별 DataCenter/Rack 정보 정의

Partitioner

  • cassandra.yaml 에서 설정.
  • Data(Replica가 아님)가 저장될 노드를 결정하는 방식 정의.

RandomPartitioner (RP)

  • Data의 Row-Key에 대해 MD5 Hash값을 기준으로, 저장할 노드 결정.
  • Data가 어느 노드에 저장될지 예측 불가.
  • 저장과 동시에 정렬 불가.
    • Full-Text Search 불가.
    • Range Scan 불가.
    • 부하 분산 유리.
    • 확장성/Data재분배 유리(가능)

ByteOrderedPartitioner (BOP)

  • Data의 Row-Key 자체가 노드가 된다.
  • Row-Key값으로 노드가 결정되므로, 저장과 동시에 정렬이 된다.
    • Full-Text Search 가능.
    • Range Scan 가능.
    • 부하 분산 불균형
    • 확장성/Data재분배 불리(어려움)

Posted by 사랑줍는거지
,
1. 메모리에서(in-memory) 처리하기 어렵다.
2. 디스크가 매우 느리다.
3. 분산이 쉽지 않다. 
Posted by 사랑줍는거지
,

Partition tolerance refers to the ability for a system to continue to operate in the presence of a network partitions.  For example, if I have a database running on 80 nodes across 2 racks and the interconnect between the racks is lost, my database is now partitioned.  If the system is tolerant of it, then the database will still be able to perform read and write operations while partitioned.  If not, often times the cluster is completely unusable or is read-only.



Consistency : all nodes see the same data at the same time
Availability : node failures do not prevent survivors from continuing to operate
Partition Tolerance : the system continues to operate despite arbitrary message loss


Posted by 사랑줍는거지
,
  우선 금번 포스팅은 지극히 개인적인 생각이다. 나만의 시각일 뿐임... 특히 MR같은 특수한 기능 측면 보다는 기존 RDB에 비춰 NoSQL의 일반적 특성이 뭘까 고민 해본 정도??

  작년엔 IaaS로 후끈~ 달아 오르더니 딱 1년 지나니... 조용.......... 뭔가 모든걸 해결해 줄듯~ 기세등등한 "Oral-Clouder"들의 천국(전부가 다 그렇단 이야긴 아니니 오해 없길...)이었던 것 같다... 한 1년 겪어보니 이게 장난이 아니구나~ 싶었던걸까...... 그러던 "IT깡국 대한민국"이... 올해는NoSQL, Big-Data로 난리도 아닐것 같다... 뭐가 됐든, 붐이 이는건 좋다... 다만, 걱정되는건 작년 IaaS 처럼... 반짝~ 하고 말게 되지나 않을까 하는거.....

  NoSQL의 개념이나, 등장 하게된 배경...등은 위키피디아를 참고 하시고... 여기서 하고 싶은 이야기는 그것의 본질적 목적이 무엇인가~에 대한 것이다...

 
  같은 값이면 다홍치마~ 라고 했던가? NoSQL이면서, RDB의 기능을 커버할 수 있다면 오죽 좋으련만... 세상에 겁나 싸면서, 기름 열라 작게 먹고, 그런데 승차감은 죽이는데, 속도는 마하급.. 그리고 실내는 버스만큼 넓은~ 그런차는... 몰라 훗날엔 존재할지도 모르겠지만, 당장은 절대로 없다... 무슨 말이냐... RDB의 특징을 유지하면서는, 대용량(기존의 전통적 시스템으로 커버 불가능한 용량) 서비스가 불가능 하기에, 일정 부분 불편함이나, 기능 포기를 감수하고서라도 그러한 대용량 서비스에 대해 탄력적으로 대응이 가능하고 원활한 서비스가 가능케 할 수 있는 방법이 뭘까~ 고민, 고민 하다 나온게(어쩌면 울며 겨자먹기식 차선책일지도 모른다) NoSQL 아닐까.. 싶다.

급조된(?) 아래 그림을 보자...


  가로축은 서비스 이용자 규모다.... 가운데 즈음의 회색 점선을 기준으로 과거 RDB가 커버 가능한 사용자 규모와, 불가능한 규모를 가정하여 잘라둔것...
  세로축은 성능이다... 단, 이 "성능"이라는 말에는 퍼포먼스 뿐만이 아니라, 기능, 그외 사용자가 느끼는 모든 것들을 포괄한 넓은 개념의 그 무엇이라고 보면된다... 그게 일관성이든, 트랜잭션이든, 응답성이든, 기능이든 뭐든...

   다음으로, 파란선은 기존의 RDB를 가정하여 그린 곡선이다. 과거의 전통적인 시스템에서는 하이엔드급 단일 시스템 또는 역할이 분리된 서버군으로 처리가 가능하였다.. 그러나 사용자수가 일정규모를 넘어서는 시점(요즘 말하는 대용량..)부터는 성능이 급감하게 된다... 소위 동적 수평 확장이 어려워 증가하는 사용자 규모에 대해 탄력적 대응이 어렵다..

  반면 빨간선 그래프는 요즘 뜨고 있는 NoSQL이라 생각하고 그려 본 것이다.. 딱 보면, 성능이 사용자 규모의 증가에 적절히 대처 하고 있을 것이라 예상되어 저렇게 그렸던 것이다... 왜? 동적 수평 확장이 가능하기에... 뭐 어디까지나 이론적이지만,,, 아쉽게도 수백대의 NoSQL로 그러한 규모의 사용자에 대한 서비스 처리를 직접 경험해본 적은 없다... 

  여기까진 개략적인 설명이고, 이 그림에서 주목할 부분은 왼쪽의 그래프 시작부분의 빨간선과 파란선의 초기 "성능"값이 다르다는 것이다. 즉, RDB가 NoSQL에 비해, 성능(사용자가 느끼는 모든 부분의...)에서는 월등하다.. 그게 편리함이건, 퍼포먼스건 뭐건... 이 부분에서 사람들이 착각하기 쉬운게 아닐까? 그런 손해를 감수 하고서라도, 그래프의 오른쪽의 대규모 사용자 영역에서 빛을 발하도록 고안된게 NoSQL일 것이다.

  그런 NoSQL을 왼쪽, 다시 말해 전통적인 규모에서 RDB의 기능들을 어설프게 따라 가려 하다가는, 진짜 자기 영역인 오른쪽 영역에서 RDB만도 못한 기대치를 보여줄 가능성이 매우 높을 것이라는 것이다...

  앞서도 언급했지만, "같은 값이면 다홍치마"면 얼마나 좋으려나~ 그러나 절대로 RDB와 NoSQL이 같은 "값"이 아니다.. 그 목적하는 바와 규모, 용도가 전혀 다르다...적어도 현재는... 수년이 지나면 RDB가 NoSQL의 장점을 일부 흡수하게되고(지금도 그런 움직임이 오라클이나, MySQL쪽에서 일고 있다..), NoSQL도 허용가능한 범위에서 RDB의 편리한 점은 흡수하려 할것이다.. 그러나 태생적으로 그 둘 모두의 장점을 결합한 그 무엇은 단기간 내에 보기는 힘들 것이다...

  저 그래프가 시간이 지났을 때를 예측한다면, RDB 입장에선 성능이 급감하는 시점(사용자 규모)을 더 오른쪽으로 최대한 옮길려고 할테고, 그에 대항해 NoSQL은 전체적인 성능을 올리는, 즉 그래프를 조금씩이라도 위쪽으로 옮기려 할 것이다... 뭐 NoSQL이나 Big-Data보다는 Virtualization에 훨씬 관심이 많지만, 이 분야도 앞으로 어떻게 전개될지 흥미는 있을것 같다...


Posted by 사랑줍는거지
,