Tag Archives: 스키마

[NoSQL] Cassandra 스키마 불일치 문제 해결 하기

사용자 삽입 이미지
간혹 시스템을 운영하다 보면 클러스터의 특정 노드가 폭주한다거나 문제가 발생하는 경우가 자주 있습니다. 이때에 스키마를 변경하는 명령을 수행하게 되면 문제 있는 노드들이 스키마를 변경하지 못하고 다음과 같은 장애를 내뱉는 경우가 있습니다.
[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

[iPhone] URL스키마를 이용한 다른 어플리케이션 실행하기

아이폰 어플리케이션은 다른 외부의 어플리케이션을 URL을 사용하여 실행 할 수 있습니다. 예를 들어 다음의 어플리케이션들을 이와같은 URL을 이용하여 실행할 수 있습니다.

1. 일반 웹브라우저 호출

내가 원하는 임의의 페이지로 이동하는 방법은 간단합니다. 앞으로 소개해 드릴 방법 역시 다음과 같은 방법으로 URL을 호출하시면 됩니다.
[code]NSURL *url = [NSURL URLWithString:@”http://theeye.pe.kr”];
[[UIApplication sharedApplication] openURL:url];[/code]

2. 구글맵 실행

다음과 같이 구글맵은 검색을 위한 문자열을 사용하여 원하는 위치로 이동을 할 수 있습니다.

http://maps.google.com/maps?q=${QUERY_STRING}

여기서 중요한것은 ${QUERY_STRING}을 사용하기 위해서는 URL 인코딩을 하여야 한다는 것입니다. 간단한 예제는 다음과 같습니다.
[code]// 쿼리문 생성
NSString* searchQuery = @”1 Infinite Loop, Cupertino, CA 95014″;
 
// 특수 문자 처리를 위해 인코딩을 합니다.
searchQuery = [addressText stringByAddingPercentEscapesUsingEncoding:
                      NSUTF8StringEncoding];
 
// URL 문자열을 생성합니다.
NSString* urlString = [NSString stringWithFormat:
                              @”http://maps.google.com/maps?q=%@”,
                              searchQuery];
 
// 실행
[[UIApplication sharedApplication]
  openURL:[NSURL URLWithString:urlText]];[/code]

3. 메일 에이전트 실행

위와 마찬가지로 매우 쓸만하고 간단하고 빠르게 메일을 발송할 수 있는 메일 에이전트를 호출합니다. 기본적으로 들어있는 것을 호출하는 것뿐이지만 받는 사람 주소가 미리 입력되어있습니다. 메일을 발송하기 위한 기본적인 형태는 HTML의 그것과 매우 똑같습니다.

mailto://${EMAIL_ADDRESS}

예를 들어 test@abcd.com으로 발송하기 위해서는 다음과 같이 사용하면 됩니다.
[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:
  @”mailto://test@abcd.com”]];[/code]

4. 전화걸기 (아이폰에서만 사용 가능)

마찬가지로 openURL을 사용하여 전화도 걸 수 있습니다. 한가지 장점은 전화를 종료하였을 때 어플리케이션으로 복귀를 할 수 있다는 점입니다. J2ME나 WML에서 사용하는 UML 스키마의 형태와 비슷합니다. 예를 들어 02-1234-1234로 전화를 걸 경우 다음과 같이 하면 됩니다.
[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”tel://0212341234″]];[/code]

5. SMS 보내기

전화걸기와 마찬가지로 아이팟 터치등에서는 사용할 수 없습니다. 매우 빠르게 SMS 클라이언트를 호출 할 수 있습니다. SMS의 URL은 전화와 달리 //를 사용하지 않습니다.

sms:${PHONENUMBER_OR_SHORTCODE}

[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”sms:55555″]];[/code]

6. 앱스토어 실행하기

앱스토어에서 나의 어플리케이션의 구매 버튼이 있는 페이지로 바로 이동시키는것은 꽤 중요한 일입니다. 앱스토어 링크의 경우엔 따로 URL스키마를 사용할 필요가 없습니다. 단지 아이튠즈의 URL링크를 그대로 사용하면 됩니다. URL이 다음과 같이 보인다고 가정하겠습니다.

[code]NSURL *appStoreUrl = [NSURL URLWithString:@”http://itunes.apple.com/us/app/id396402081?mt=8″];
[[UIApplication sharedApplication] openURL:appStoreUrl];[/code]

잘 되는군요^^

출처: http://iphonedevelopertips.com/cocoa/launching-other-apps-within-an-iphone-application.html