cassandra权威指南读书笔记--客户端

DataStax驱动最成熟。
默认,驱动程序会使用第一个连接的节点作为支持的版本协议。如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容。
驱动支持压缩客户端和cassandra节点之间的消息。目前支持2种压缩算法:LZ4和SNAPPY。默认为NONE,即不压缩。可以调用Cluster.Bilduer.withCompression()操作来覆盖这个设置。
认证和加密
驱动可插拔实现com.datastax.driver.core.AuthProvider。比如支持PlainTextAuthProvider(明文用户名密码校验)。服务器也可以配置加密选项,驱动得对应支持。有个Scram的方案,可以实现不传递用户名密码的方式实现用户名密码校验。
一个Session会维护一个集群的连接,有个连接池,连接所有的节点,开销很大,所以要尽量复用。默认每个节点一个连接。CQL原生协议是异步的,允许每个连接可以有多个请求。v2协议同时有128个请求,v3和v4允许最多32768个请求。PoolingOption可以设置向上或向下扩展连接数。同时有连接的缓存期,防止不断地建立和撤销连接。

com.datastax.driver.core.Statement类,Statement抽象类,SimpleStatement、PreparedStatement、BoundStatement、BatchStatement、BuiltStatement

定制编译码器 codec
ResultSet中的Row。getString()请求id列,可能会收到一个CodecNotFoundException,表示驱动不知道将CQL类型uuid映射到java.util.String. 驱动默认维护了一个默认的映射列表。编译码器codec包含java与CQL类型映射,用来应用和cassandra之间来回转换数据。驱动提供com.datastax.driver.core.TypeCodec<T>,可以Cluster管理CodecRegistry注册。
cluster.getConfiguration().getCodecRegistry().register(myCustomCodec).
映射到备选的日期/日期格式;列表映射到集合等等。

反复查询使用PreparedStatement,专门为高效查询准备。第一次会向节点发送一次这个语句的结构进行准备,然后返回这个语句的一个句柄。使用这个准备语句时,只需要发送句柄和参数。PreparedStatement可以防止注入攻击,可以设置一致性级别,重试策略和跟踪。PreparedStatement.getPreparedID()看到句柄。
PreparedStatement不是Statement的子类,这样可以避免传入一个未绑定的PreparedStatement导致错误。

com.datastax.driver.core.querybuilder.QueryBuilder,流式API,适用查询结构有变化,防止注入。
这种情况很难使用PreparedStatement。QueryBuilder使用BuiltStatement。

对象映射器
对象映射API在cassandra-driver-mapping.jar.对象映射器会抽取注解,使用注解将java类映射到表或者用户自定义类型(UDT)。

策略
java驱动提供多个策略接口,可以用来驱动程序行为调优。包括负载均衡,重试请求,管理节点连接等等。
负载均衡策略
防止单节点作为过多请求的协调节点,可以实现com.datastax.driver.core.policies.LoadBalancingPolicy接口实现。每个LoadBalancingPolicy必须提供一个distance(),根据HostDistance枚举将集群中各个节点划分为本地节点和远程或忽略节点。驱动更愿意和本地节点交互。newQueryPlan(),根据查询的顺序返回一个节点列表。LoadBalancingPolicy还可以根据节点上线下线给通知,防止查询计划包含下线节点。
基本的负载均衡策略:RoundRobinPolicy,DCAwareRoundRobinPolicy。
RoundRobinPolicy和DCAwareRoundRobinPolicy的区别是,DCAwareRoundRobinPolicy会尽量选本地DC。RoundRobinPolicy在所有节点中负载均衡。
TokenAwarePolicy,根据分区键选择一个副本的节点进行请求。
TokenAwarePolicy下再包装RoundRobinPolicy或DCAwareRoundRobinPolicy。

重试策略
cassandra节点不可达,驱动会透明的尝试其他节点并在后台调度重新连接死亡节点。驱动还提供重试机制:

com.datastax.driver.core.RetryPolicy:onReadTimeout,onWriteTimeout,onUnavaliable.
RetryPolicy的实现:
DefaultRetryPolicy:非常有限条件下重试
FallthroughRetryPolicy:从来不建议重试,总是建议抛出异常
DowngradingConsistencyRetryPolicy:降低一致性级别,使得查询更可能成功。
可以使用LoggingRetryPolicy包装,每次重试可以记录日志。
集群的RetryPolicy应用在该集群的所有查询,除非在Statement.setRetryPolicy去覆盖某次的查询策略。

预测执行策略
如果一个协调节点在预定时间间隔没响应,就会在不同的协调节点启动相同查询,有一个节点响应,就返回结果,取消别的节点查询。默认采用NoSpeculativeExecutionPolicy,不会执行任何预测执行。ConstantSpeculativeExecutionPolicy,按一个固定延迟(毫秒)调度重试。PercentileSpeculativeExecutionPolicy,根据观察到的协调节点的延迟,在一个延迟之后预测执行。

地址转换器
com.datastax.driver.core.policies.AddressTranslator接口转换地址。默认转换器:IdentityTranslator,保留IP地址不变(rpc_address).

元数据
Cluster.getMetadata()
com.datastax.driver.core.Metadata类会提供集群有关信息,包括集群名,schema,集群中已知的主机。Cluster对象会维护与一个节点的长连接,用来维护集群的状态和拓扑信息,获取到所有节点。
驱动可以监控节点,Host.StateListener接口注册监听器,onAdd,onRemove,onUp,onDown.

schema的创建,是在一个节点完成再gossip同步的。
cassandra日志默认debug级别。
java驱动提供客户端监控程序,使用Dropwizard Metric去提供指标,包括有关连接,任务队列,查询和错误(连接错误,超时,重试,预测执行的指标)等。
Cluster.getMetric()获取本地驱动指标。
Metric和Jmx结合获取远程监控指标。默认启用JMX报告。


支持多种语言的驱动
Java、Python、C/C++、C#、Ruby、Node.js、PHP

posted @ 2020-07-24 00:16  DevinDC  阅读(556)  评论(0编辑  收藏  举报