Category Archives: 허접프로그래머

[Ruby] IP주소 필터링 하기(White List)

Rails에 대해 현재 공부중입니다. 다음은 완벽하게 동작하는 화이트리스트 기반 IP 필터링 예시입니다. 단순 IP필터링부터 Subnet마스크를 이용한 범위 설정까지 설정이 가능합니다. 컨트롤러에 before_filter로 설정하여 사용하는 예시입니다.

[code]before_filter :protect

def protect
  @ips = [‘127.0.0.1’, ‘192.168.1.0/24’] # 다수의 IP설정 가능
  allowed = false
  # Remote IP를 Integer형으로 변경합니다.
  bremote_ip = request.remote_ip.split(‘.’).map(&:to_i).pack(‘C*’).unpack(‘N’).first
  @ips.each do |ipstring|
    ip, mask = ipstring.split ‘/’
    # 비교할 IP도 Integer로 변경합니다.
    bip = ip.split(‘.’).map(&:to_i).pack(‘C*’).unpack(‘N’).first
    # 넷마스크값을 정의합니다. 설정되어있지 않을경우 /32로 간주합니다.
    mask = mask ? mask.to_i : 32
    bmask = ((1 << mask) – 1) << (32 – mask)
    if bip & bmask == bremote_ip & bmask
      allowed = true
      break
    end
  end

  if not allowed
     render :text => “You are unauthorized”
     return
  end
end[/code]

참고: http://stackoverflow.com/questions/11636228/whitelisting-list-of-ips-with-some-subnets-in-rails-3-application

[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