간혹 시스템을 운영하다 보면 클러스터의 특정 노드가 폭주한다거나 문제가 발생하는 경우가 자주 있습니다. 이때에 스키마를 변경하는 명령을 수행하게 되면 문제 있는 노드들이 스키마를 변경하지 못하고 다음과 같은 장애를 내뱉는 경우가 있습니다.
[code]SchemaDisagreementException()
java.lang.RuntimeException: SchemaDisagreementException()
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:308)
at org.apache.cassandra.cli.CliMain.processStatement(CliMain.java:217)
at org.apache.cassandra.cli.CliMain.main(CliMain.java:345)
Caused by: java.lang.RuntimeException: SchemaDisagreementException()
at org.apache.cassandra.cli.CliClient.executeAddColumnFamily(CliClient.java:1039)
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:226)
… 2 more
Caused by: SchemaDisagreementException()
at org.apache.cassandra.thrift.Cassandra$system_add_column_family_result.read(Cassandra.java:26905)
at org.apache.cassandra.thrift.Cassandra$Client.recv_system_add_column_family(Cassandra.java:1455)
at org.apache.cassandra.thrift.Cassandra$Client.system_add_column_family(Cassandra.java:1430)
at org.apache.cassandra.cli.CliClient.executeAddColumnFamily(CliClient.java:1028)
… 3 more[/code]
Cassandra라는 기본적으로 스키마 설정에 대하여 임의의 버전값을 부여하여 노드들간에 통일성을 유지하도록 동작하고 있습니다. 하지만 저런 에러를 한번만 만나게 되면 클러스터간의 스키마 통일성이 깨지게 됩니다.
cassandra-cli를 실행한 후 다음과 같은 방법으로 스키마의 동기화 상태를 확인할 수 있습니다.
[code][default@unknown] describe cluster;
Cluster Information:
Snitch: org.apache.cassandra.locator.SimpleSnitch
Partitioner: org.apache.cassandra.dht.RandomPartitioner
Schema versions:
75eece10-bf48-11e0-0000-4d205df954a7: [192.168.1.9, 192.168.1.25]
5a54ebd0-bd90-11e0-0000-9510c23fceff: [192.168.1.27][/code]
위와 같이 describe cluster명령을 치게 되면 Schema versions가 나오게 되는데 여기서 192.168.1.27 노드가 어긋나 버린것을 확인할 수 있습니다. 이것을 복구하여 스키마를 일치시켜주기 위해서는 다음과 같은 방법을 사용합니다.
1. 192.168.1.27 서버에 접속
2. cassandra 데몬을 죽임(sudo service cassandra stop / kill <pid>)
3. 카산드라 데이터 디렉토리 안의 system 디렉토리안에 있는 schema*, migration*을 모두 삭제
(기본 설정일 경우 /var/lib/cassandra/data/system 에 위치)
4. 카산드라 재시작, 필요한 정보들이 없다며 에러들이 주르륵 뜬 후에 스키마 정보를 다른 클러스터들로부터 다시 가져와 동기화를 합니다.
[code][default@unknown] describe cluster;
Cluster Information:
Snitch: org.apache.cassandra.locator.SimpleSnitch
Partitioner: org.apache.cassandra.dht.RandomPartitioner
Schema versions:
75eece10-bf48-11e0-0000-4d205df954a7: [192.168.1.9, 192.168.1.25, 192.168.1.27][/code]
이제 위와 같이 하나의 스키마로 통일이 되었습니다.
참고 : http://wiki.apache.org/cassandra/FAQ#schema_disagreement