반응형

카산드라 Connection Pooling에 따른 요청수와 요청 처리방법

'카산드라 클러스터 노드수가 많아지면 request처리할 있는 양이 얼마나 많아질까?' 라는 궁금증에서 시작

API서버에서 어떻게 Connection Pool이 설정되어 있고 설정에 따라 카산드라 클러스터 노드(node)당 얼마나 처리할 수 있는지 알아보자

(단순히 datastax문서의 내용에만 의지한 것으로 실제 서비스에서는 Network I/O나 다른 요인들에 의해 영향을 받을 수 있음을 유의하자!!!)

How managed node contactPoints?

// (1)
//ContactPoints 하나라도 존재해야함!!!
Assert.isTrue(StringUtils.hasText(contactPoints), "At least one server is required");

public Builder addContactPoints(String... addresses) {
    for (String address : addresses)
        addContactPoint(address);  (2)
    return this;
}

(3)
public Builder addContactPoint(String address) {
    // We explicitly check for nulls because InetAdress.getByName() will happily
    // accept it and use localhost (while a null here almost likely mean a user error,
    // not "connect to localhost")
    if (address == null)
        throw new NullPointerException();
    try {
        addContactPoints(InetAddress.getAllByName(address)); (4)
        return this;
    } catch (UnknownHostException e) {
        throw new IllegalArgumentException("Failed to add contact point: " + address, e);
    }
}

(5) 
public Builder addContactPoints(InetAddress... addresses) {
    Collections.addAll(this.rawAddresses, addresses);
    return this;
}

(6)
contactpoints는 배열로 관리됨
private final List<InetAddress> rawAddresses = new ArrayList<InetAddress>();

How selected node when API server requests

RounRobinPolicy : 라운드로빈방식에 대해서는 따로 설명하지 않겠다. (단순 동일하게 각 노드에게 돌아가면서 요청하는 방식)

스크린샷 2018-09-13 오전 9.32.04.png

Cassandra 버전 별 허용 Request수

Cassandra versions 1.2 and 2.0 allow the clients to send up to 128 requests without waiting for a response per connection.
Higher versions of Cassandra ( that is 2.1 or greater) allow clients to send up to 32768 requests without waiting for a response.
단순히 이 계산식으로 계산을 했을 때
한 노드 당 14억(1415577600)정도의 요청을 처리 할 수 있음.
http://datastax.github.io/nodejs-driver/features/connection-pooling/
스크린샷 2018-09-13 오전 9.25.46.png


Cassandra 커넥션 맺는 flow 및 ProtocolVersion에 따른 차이

참고 : https://docs.datastax.com/en/developer/java-driver/3.6/manual/pooling/


참고 : https://docs.datastax.com/en/developer/java-driver/3.6/manual/native_protocol/



ContactPoints는 클러스터 모든 서버 목록을 적어줘야하나???

결론을 먼저 말하자면 '그렇지 않다'이다!!!

실질적으로 어플리케이션이 로드될 때 카산드라 드라이버는 컨택포인트에 적어진 노드 하나에 접근하게 되고 

그 노드로부터 실제 클러스터의 노드 정보등을 받아와 메모리상에 메타정보로 관리하게 된다.

따라서 클러스터가 10대로 구성되어 있더라도 ContactPoints에는 2~3대만 기입해줘도 문제가 없다.

다음의 내용을 참고하자.

Contact points setting is a list of one or many node address. When creating a Cluster instance at client side, the driver tries to connect to the nodes specified in the "contact points" in order. If it fails to connect to the first node, try the next ... As long as one node is successfully connected, it does not try to connect the other nodes anymore.

Why it is not necessary to connect to all the contact points is because, each node contains the metadata of all the other nodes, meaning as long as one is connected, the driver could get infomation of all the nodes in the cluster. The driver will then use the metadata of the entire cluster got from the connected node to create the connection pool. This also means, it is not necessary to set address of all your nodes to the contact points setting. The best practice is to set the nodes which responds the fastest to the client as contact points.


자세한 내용이 궁금하다면 다음을 참고하자.


참고 : https://teddyma.gitbooks.io/learncassandra/content/client/which_node_to_connect.html  (Which Node to Connect)




반응형

+ Recent posts