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
cassandra权威指南读书笔记--客户端的更多相关文章
- cassandra权威指南读书笔记--Cassandra架构(3)
分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...
- cassandra权威指南读书笔记--安全
认证和授权driver,JMX和cassandra服务器支持SSL/TLS,cassandra节点间也支持SSL/TLS.密码认证器cassandra还支持自定义,可插拔的认证机制.默认的认证器:or ...
- cassandra权威指南读书笔记--性能调优
cassandra自带测试工具cassandra-stress.nodetool proxyhistograms可以在多个节点运行,发现最慢的协调节点.nodetool tablehistograms ...
- cassandra权威指南读书笔记--监控&维护
cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...
- cassandra权威指南读书笔记--读写数据
写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...
- cassandra权威指南读书笔记--配置cassadnra
配置集群时,要求所有节点的集群名,分区器,snitch必须相同.种子节点最好相同. 种子节点:最好每个DC,配置2个,这样即使一个DC中一个种子节点挂了,仍然有一个中子节点可用.种子节点被认为是最先加 ...
- cassandra权威指南读书笔记--Cassandra架构(2)
环和令牌cassandra的数据管理是用一个环来表示.为环中的每个节点分配一or多个数据范围,用token描述.token由64位整数ID表示,范围-2^(63)~2^(63)-1.使用对分区键进行一 ...
- cassandra权威指南读书笔记--Cassandra架构(1)
结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...
- cassandra权威指南读书笔记--数据建模
没有join操作.有轻量级事务和批处理,但是没有外键等.反规范化.3.0支持物化视图,允许在一个表上创建数据的多个物化视图.使用cassandra要从查询入手,而不是先从数据模型开始.先对查询建模,然 ...
随机推荐
- apply 和 call的用法、区别
1.JavaScript中函数是对象的方法,如果一个函数不是js对象的方法那一定是全局对象的函数,每个函数的对象都有apply和call方法,即每个对象都有call and apply apply:调 ...
- Npoi XWPF Word 导出时插入图片无法显示 bug 完美解决
一.来自客户的需求 最近客户来个新需求生成一个word 标签纸,并且需要在标签纸上插入一个logo,并且将erp 中的数据取出来自动写在文档上,不由得淡淡一笑,这不难呀! 于是乎我就写下了这样的代码: ...
- 【C++】《Effective C++》第二章
第二章 构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 默认函数 一般情况下,编译器会为类默认合成以下函数:default构造函数.copy构造函数.non-virtual析构函数. ...
- 剑指offer 面试题10.1:青蛙跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 编程思想 对于本题,前提只有 一次 1阶或者2阶的跳法.a.如果两种跳 ...
- LeetCode53 最大子序列问题
题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], ...
- 【Python】国内pip节点
pip在国内使用国内节点: http://pypi.douban.com/simple 现在已经无法使用了,新版的python3需要使用https://pypi.douban.com/simple/ ...
- 【Linux】 多个会话同时执行命令后history记录不全的解决方案
基本认识 linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场 ...
- leetcode 470. 用 Rand7() 实现 Rand10() (数学,优化策略)
题目链接 https://leetcode-cn.com/problems/implement-rand10-using-rand7/ 题意: 给定一个rand7()的生成器,求解如何产生一个rand ...
- 【开源】我和 JAP(JA Plus) 的故事
JA Plus 故事 程序员的故事如此简单之绕不过去的开源情结 我们准备做一件伟大的事,也可以说是一件真真正正普惠的事. 絮 是的,你没有看错,就是"絮"而非"序&quo ...
- springmvc 字符串转日期格式
http://www.mamicode.com/info-detail-2485490.html