本文翻译主要来自Datastax的cassandra1.2文档。http://www.datastax.com/documentation/cassandra/1.2/index.html。此外还有一些来自于相关官方博客。
该翻译作为实验室大数据组的学习材料的一部分,适合对Cassandra已经有一定了解的读者。
未经本人许可,请勿转载。
一个Cassnadra的简介。(下文有时候又将Cassandra简称C)
Cassandra被设计来通过没有单点故障的多节点模式去处理海量数据工作负载。他的架构是基于 理解系统和硬件故障可以而且会发生 的基础上的。C通过所有节点都相同并且数据分布在所有节点上的p2p分布式系统来解决故障问题。集群中的每个节点每秒都在交换信息。每个节点上的commit log 捕获写行为来确保数据的持久化。数据也会被写到一个内存结构中,叫做memtable,然后当内存结构满了的时候就写数据到磁盘文件中,叫做SSTable。所有的写入都是自动分区和复制的。
cassandra是一种面向行的数据库。C的架构允许任何授权的用户连接任意数据中心的任意的节点,并使用cql访问数据。为了简化使用,cql使用和sql类似的语法。从cql的视角出发,database是由tables组成的。典型地,一个集群中 每个应用拥有一个keyspace。开发者可以通过cqlsh调用cql,也可以使用其他驱动。
客户端的读写请求可以到达集群的任意节点。当一个客户连接到一个节点做了一个请求时,那个节点服务器就作为这个特定的客户操作的一个coordinator了。协调器扮演了客户应用和拥有用户请求的数据的节点之间的代理(proxy)的角色。协调器决定了集群环中的哪些节点应该响应请求。(更多信息,请查阅关于用户请求)
配置C的关键组件列表:
gossip信息也被每个节点保存在本地,这样当一个节点重启时,它能够立刻使用这些信息。你可能会想清空某个节点上的gossip历史,比如节点ip地址改变了等原因。(译者注:大概就是system.local表)
你必须设置分区器的类型,并且指派给每个节点一个num_tokens值。如果没有使用虚拟节点的话,使用initial_token来代替。(译者注:虚拟节点是1.2中新增的)
默认的,一个节点被设置为存储他管理的数据到/var/lib/cassandra目录。在一个生产环境中,你需要修改commitlog目录到一个其他硬盘上去(别和data file 在一个硬盘上)。
(该翻译作为实验室大数据组的学习材料的一部分,适合对Cassandra已经有一定了解的读者。未经本人许可,请勿转载。)
关于内部通信Gossip:
cassandra使用称为gossip的协议来发现加入C集群中的其他节点的位置和状态信息。这是一个p2p的交流协议,每个节点定期的交换他们自己的和他们所知道的其他人的状态信息。gossip进程每秒都在进行,并与至多三个节点交换状态信息。节点交换他们自己和所知道的信息,于是所有的节点很快就能学习到整个集群中的其他节点的信息。gossip信息有一个相关的版本号,于是在一次gossip信息交换中,旧的信息会被新的信息覆盖重写。
要阻止分区进行gossip交流,那么在集群中的所有节点中使用相同的seed list(译者注:指的是cassandra。yaml中的seeds)。默认的,在重新启动时,一个节点记得他曾经gossip过得其他节点。
注意:种子节点的指定除了启动起gossip进程外,没有其他的目的。种子节点不是一个单点故障,他们在集群操作中也没有其他的特殊目的,除了引导节点以外..
设置Gossip设置
任务:
当一个节点第一次启动的时候,他去yaml中读取配置,得到集群的名字,并得到从哪些seeds中获取其他节点的信息,还有其他的一些参数,比如端口,范围等等。。
属性 描述 cluster_name listen_address 与其他节点连接的ip seed_provider storage_port 内部节点交流端口(默认7000),每个节点之间必须相同 initial_token 在1.1以及之前,决定节点的数据的管理范围 num_tokens 在1.2以及之后,决定节点的数据的管理范围
清理gossip状态:
-Dcassandra.load_ring_state= false
关于故障检测和修复
C使用信息来避免路由用户的请求到坏了的节点(C还能避免路由到可用但是性能很差的节点,通过动态snitch技术)
Rather than have a fixed threshold for marking failing nodes, Cassandra uses an accrual detection mechanism to calculate a per-node threshold that takes into account network performance, workload, or other conditions. During gossip exchanges, every node maintains a sliding window of inter-arrival times of gossip messages from other nodes in the cluster. In Cassandra, configuring the phi_convict_threshold property adjusts the sensitivity of the failure detector. Use default value for most situations, but increase it to 12 for Amazon EC2 (due to the frequently experienced network congestion).
(译者注:这是04年的一篇论文的失效检测算法
1.Hayashibara, N., Defago, X., Yared, R. & Katayama, T. The phi; accrual failure detector. in Proceedings of the 23rd IEEE International Symposium on Reliable Distributed Systems, 2004 66–78 (2004). doi:10.1109/RELDIS.2004.1353004
)
一个节点的当机往往不代表这个节点永远的离开了,因此并不会自动的从环中删除。其他的节点会定期的尝试与失效节点联系看看他们恢复了没。要永久的改变一个节点的关系,administrators must explicitly add or remove nodes from a Cassandra cluster using the nodetool utility.
当一个节点返回的时候,他可能错过了他需要维护的副本数据的写入命令。一旦失效检测标记一个节点当机了,错过的写入就会被存储到其他的副本中一段时间,叫做 hinted handoff。 当一个节点当机超过max_hint_windows_in_ms(默认3小时),hints就不在存储了。这时候你应该等节点启动后运行修复程序了。
此外,你应该日常地运行nodetool repair 在所有的节点上,以保证他们的数据的一致性。
For more explanation about recovery, see Modern hinted handoff.
(该翻译作为实验室大数据组的学习材料的一
本文翻译主要来自Datastax的cassandra1.2文档。http://www.datastax.com/documentation/cassandra/1.2/index.html。此外还有一些来自于相关官方博客。
该翻译作为实验室大数据组的学习材料的一部分,适合对Cassandra已经有一定了解的读者。
未经本人许可,请勿转载。
一个Cassnadra的简介。(下文有时候又将Cassandra简称C)
Cassandra被设计来通过没有单点故障的多节点模式去处理海量数据工作负载。他的架构是基于 理解系统和硬件故障可以而且会发生 的基础上的。C通过所有节点都相同并且数据分布在所有节点上的p2p分布式系统来解决故障问题。集群中的每个节点每秒都在交换信息。每个节点上的commit log 捕获写行为来确保数据的持久化。数据也会被写到一个内存结构中,叫做memtable,然后当内存结构满了的时候就写数据到磁盘文件中,叫做SSTable。所有的写入都是自动分区和复制的。
cassandra是一种面向行的数据库。C的架构允许任何授权的用户连接任意数据中心的任意的节点,并使用cql访问数据。为了简化使用,cql使用和sql类似的语法。从cql的视角出发,database是由tables组成的。典型地,一个集群中 每个应用拥有一个keyspace。开发者可以通过cqlsh调用cql,也可以使用其他驱动。
客户端的读写请求可以到达集群的任意节点。当一个客户连接到一个节点做了一个请求时,那个节点服务器就作为这个特定的客户操作的一个coordinator了。协调器扮演了客户应用和拥有用户请求的数据的节点之间的代理(proxy)的角色。协调器决定了集群环中的哪些节点应该响应请求。(更多信息,请查阅关于用户请求)
配置C的关键组件列表:
gossip信息也被每个节点保存在本地,这样当一个节点重启时,它能够立刻使用这些信息。你可能会想清空某个节点上的gossip历史,比如节点ip地址改变了等原因。(译者注:大概就是system.local表)
你必须设置分区器的类型,并且指派给每个节点一个num_tokens值。如果没有使用虚拟节点的话,使用initial_token来代替。(译者注:虚拟节点是1.2中新增的)
默认的,一个节点被设置为存储他管理的数据到/var/lib/cassandra目录。在一个生产环境中,你需要修改commitlog目录到一个其他硬盘上去(别和data file 在一个硬盘上)。
(该翻译作为实验室大数据组的学习材料的一部分,适合对Cassandra已经有一定了解的读者。未经本人许可,请勿转载。)
关于内部通信Gossip:
cassandra使用称为gossip的协议来发现加入C集群中的其他节点的位置和状态信息。这是一个p2p的交流协议,每个节点定期的交换他们自己的和他们所知道的其他人的状态信息。gossip进程每秒都在进行,并与至多三个节点交换状态信息。节点交换他们自己和所知道的信息,于是所有的节点很快就能学习到整个集群中的其他节点的信息。gossip信息有一个相关的版本号,于是在一次gossip信息交换中,旧的信息会被新的信息覆盖重写。
要阻止分区进行gossip交流,那么在集群中的所有节点中使用相同的seed list(译者注:指的是cassandra。yaml中的seeds)。默认的,在重新启动时,一个节点记得他曾经gossip过得其他节点。
注意:种子节点的指定除了启动起gossip进程外,没有其他的目的。种子节点不是一个单点故障,他们在集群操作中也没有其他的特殊目的,除了引导节点以外..
设置Gossip设置
任务:
当一个节点第一次启动的时候,他去yaml中读取配置,得到集群的名字,并得到从哪些seeds中获取其他节点的信息,还有其他的一些参数,比如端口,范围等等。。
属性 描述 cluster_name listen_address 与其他节点连接的ip seed_provider storage_port 内部节点交流端口(默认7000),每个节点之间必须相同 initial_token 在1.1以及之前,决定节点的数据的管理范围 num_tokens 在1.2以及之后,决定节点的数据的管理范围
清理gossip状态:
-Dcassandra.load_ring_state= false
关于故障检测和修复
C使用信息来避免路由用户的请求到坏了的节点(C还能避免路由到可用但是性能很差的节点,通过动态snitch技术)
Rather than have a fixed threshold for marking failing nodes, Cassandra uses an accrual detection mechanism to calculate a per-node threshold that takes into account network performance, workload, or other conditions. During gossip exchanges, every node maintains a sliding window of inter-arrival times of gossip messages from other nodes in the cluster. In Cassandra, configuring the phi_convict_threshold property adjusts the sensitivity of the failure detector. Use default value for most situations, but increase it to 12 for Amazon EC2 (due to the frequently experienced network congestion).
(译者注:这是04年的一篇论文的失效检测算法
1.Hayashibara, N., Defago, X., Yared, R. & Katayama, T. The phi; accrual failure detector. in Proceedings of the 23rd IEEE International Symposium on Reliable Distributed Systems, 2004 66–78 (2004). doi:10.1109/RELDIS.2004.1353004
)
一个节点的当机往往不代表这个节点永远的离开了,因此并不会自动的从环中删除。其他的节点会定期的尝试与失效节点联系看看他们恢复了没。要永久的改变一个节点的关系,administrators must explicitly add or remove nodes from a Cassandra cluster using the nodetool utility.
当一个节点返回的时候,他可能错过了他需要维护的副本数据的写入命令。一旦失效检测标记一个节点当机了,错过的写入就会被存储到其他的副本中一段时间,叫做 hinted handoff。 当一个节点当机超过max_hint_windows_in_ms(默认3小时),hints就不在存储了。这时候你应该等节点启动后运行修复程序了。
此外,你应该日常地运行nodetool repair 在所有的节点上,以保证他们的数据的一致性。
For more explanation about recovery, see Modern hinted handoff.
(该翻译作为实验室大数据组的学习材料的一
1、简单的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd">
<mongo:mongo host="127.0.0.1" port="27017"/>
<bean id="mongoTemplate" >
<constructor-arg ref="mongo"/>
<constructor-arg name="databaseName" value="app_DB"/>
</bean>
</beans>
2、通用DAO
1)接口
package cn.luxh.app.repository;
import java.util.List;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
public interface MongoDBDao {
void save(Object obj);
<T> T findOne(Class<T> clazz, Query query);
<T> List<T> findAll(Class<T> clazz);
<T> T findById(Class<T> clazz,Object id);
<T> List<T> find(Class<T> clazz, Query query);
<T> List<T> findList(Class<T> clazz,Query query,int currentPage,int pageSize);
<T> long findCount(Class<T> clazz,Query query);
<T> int update(Query query,Update update,Class<T> clazz);
}
2)接口实现
package cn.luxh.app.repository;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
@Repository
public class MongoDBDaoImpl implements MongoDBDao{
@Autowired
private MongoTemplate mongoTemplate;
@Override
public <T> T findOne(Class<T> clazz, Query query) {
return mongoTemplate.findOne(query, clazz);
}
@Override
public void save(Object obj) {
mongoTemplate.save(obj);
}
@Override
public <T> List<T> findAll(Class<T> clazz) {
return mongoTemplate.findAll(clazz);
}
@Override
public <T> T findById(Class<T> clazz, Object id) {
return mongoTemplate.findById(id, clazz);
}
@Override
public <T> List<T> find(Class<T> clazz, Query query) {
return mongoTemplate.find(query, clazz);
}
@Override
public <T> List<T> findList(Class<T> clazz, Query query, int currentPage,
int pageSize) {
//计算起始位置
int startIndex = ((currentPage - 1)<0?0:(currentPage - 1))*pageSize;
query.skip(startIndex);
query.limit(pageSize);
return mongoTemplate.find(query,clazz);
}
@Override
public <T> long findCount(Class<T> clazz, Query query) {
return mongoTemplate.count(query, clazz);
}
@Override
public <T> int update(Query query, Update update, Class<T> clazz) {
return mongoTemplate.updateFirst(query, update, clazz).getN();
}
}
3、通用Service
1)接口
package cn.luxh.app.service;
import java.util.List;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import cn.luxh.app.util.Pagination;
public interface MongoDBService {