• 카산드라-4부 : 카산드라와 연결하기.

    2018. 9. 16. 22:05

    by. 위지원

    SOCKS 프록시를 이용하여 JConsole과 연결하기


    책에서는 java 설치 경로 아래에 /bin/jconsole을 실행하여 memory등을 확인 할 수 있다고 한다. 하지만 나는 서버용으로 os를 설치했기때문에 바로 ssh로 접근하는 방법을 사용하려고 한다.


    자바 가상머신은 JVM 내부를 상호적으로 모니터링하는 Java Management Extensions(JME)라는 통합 시스템을 가지고 있다. JMX는 Remote Method Invocation(RMI)를 이용하여 시스템 사이에서 통신한다. 초기 연결포트가 있지만, 추후에는 동적으로 포트를 할당한다.


    $ ssh -f -D9998 weejw@129.XXX.XXX.XX 'while true; do sleep 1; done' 으로 SOCKS 프록시를 할당하고


    $ jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyProt=9998\service:jmx:rmi:///jndi/rmi://129.XXX.XXX.XX:8080/jmxrmi 를 이용하여 인자를 넘겨 위에서 만든 프록시를 이용하여 JConsole을 실행할 수 있다.


    *프록시 서버(영어: proxy server 프록시 서버[*])는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터나 응용 프로그램을 가리킨다. -위키



    위에서 설정한 프록시가 타겟 서버에서 열려 작업하는 워크스테이션의 로컬 포트에 터널링 되는 것이라고 한다.


    자바와 스리프트로 카산드라에 연결하기


    카산드라 클라이언트는 Thrift에 의해 생성된 API 클래스로 서버와 통신할 수 있다.


    아래와 같이 코드를 작성하면  된다.


    [weejw@com hpcbuild]$ cat src/java/hpcas/c01/ShowKeyspaces.java
    package hpcas.c01;

    import org.apache.cassandra.thrift.*;
    import org.apache.thrift.protocol.*;
    import org.apache.thrift.protocol.*;
    import org.apache.thrift.transport.*;

    public class ShowKeyspaces{
        public static void main(String[] args) throws Exception{
            String host = System.getenv("host");
            int port = Integer.parseInt(System.getenv("port"));

            TSocket socket = new TSocket(host,port); //카산드라와 통신할 수 있는 client 인스턴스를 생성하기 위한 단계이다.
            TTransport transport = new TFramedTransport(socket);
            TProtocol proto = new TBinaryProtocol(transport);
           
            transport.open();
     
            Cassandra.Client client = new Cassandra.Client(proto);

            System.out.println("version "+client.describe_version()); //연결된 client를 이용하여 클러스터의 정보를 얻어 올 수 있다.
            System.out.println("prtitioner "+client.describe_partitioner());
            System.out.println("cluster name "+client.describe_cluster_name());
         
            for(String keyspace: client.describe_keyspaces()){
                System.out.println("keyspcae "+keyspace);
            }
            transport.close();
        }
    }


    대화의 장 💬