cassandra的连接池配置

cassandra的连接池配置

cassandra的datastax驱动使用的是异步nio实现的,发出去的请求,不会阻塞线程,当有响应的时候会通知你。所以cassandra客户端和服务器之间不需要太多的连接,因为发送一个请求是很快的,只要一个线程不断监听响应就可以了。

cassandra的配置方式如下:

1
2
3
4
5
6
7
8
9
10
PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions
.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, 32);
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 2);
poolingOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, 4);
 
Cluster cluster = Cluster.builder()
.addContactPoints("192.168.1.101")
.withCredentials(username, password)
.withPoolingOptions(poolingOptions)

这就完成了一个对连接池的配置。
setCoreConnectionsPerHost(HostDistance.LOCAL, 2);
表示和集群里的机器至少有2个连接。注意是和集群里的每个机器都至少有2个连接。
setMaxConnectionsPerHost(HostDistance.LOCAL, 4);
最多有4个连接
setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, 32);
每个连接允许32请求并发。

也就是说你这个配置,最多允许(32*4*机器个数)个并发请求。如果太多的并发可能会发生获取连接失败。

以上是说的集群部署在一个机房,只有一个数据中心DC的情况,如果有多个数据中心。要设置REMOTE连接数。

1
2
3
4
5
6
7
PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions
.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, 32);
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 2);
poolingOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, 4);
poolingOptions.setCoreConnectionsPerHost(HostDistance.REMOTE, 2);
poolingOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, 4);

配置完之后,获取session,就可以全程序单例使用了。

  1. 杨真真说道:

    你说的,一个session就是一个连接池,那我是不是可以这样理解:假如一个集群里有6台机器,那这6个机器都有对应的一个连接池,这6个连接池对应着一个session?

  2. 杨真真说道:

    既然session是全程序单例使用,那么连接池的意义何在

  3. 艾俊波说道:

    您好,我有个问题想请教下。
    每个机器有2个连接,每个连接有32个并发。
    这个2,32是你随意写的吗,我想知道下cassandra这两个数字的上限是多少,另外设置成多少算是合理?如何计算?
    看到后请回复下我,谢谢了!很急!!!!

    1. 大岩不灿说道:

      是的,经验值,cassandra是异步请求,2个链接应该就够了,只有32个并发,应该看你的业务请求量和时延,假设你的请求很少,那就少一点并发,如果请求量很大,那就多一点并。并发高了也会导致cassandra负载高,你要及时扩容集群,这个都是根据实际情况调整的。

  4. 云顶吹风说道:

    持续关注朋友的cassandra。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *