Cassandra无单点故障的高可扩展伸缩数据库
2023-04-12 23:13:00 0 举报
AI智能生成
Cassandra无单点故障的高可扩展伸缩数据库,应用于电商、大数据等以数据驱动的项目或产品开发。
作者其他创作
大纲/内容
05.集群环境搭建
环境信息
安装包获取
官网:https://cassandra.apache.org/
下载:https://cassandra.apache.org/download/
安装过程:https://cassandra.apache.org/doc/latest/getting_started/installing.html
历史版本:http://archive.apache.org/dist/cassandra/
最新rpm版本:https://downloads.apache.org/cassandra/redhat
http://apache.mirror.digitalpacific.com.au/cassandra/
下载:https://cassandra.apache.org/download/
安装过程:https://cassandra.apache.org/doc/latest/getting_started/installing.html
历史版本:http://archive.apache.org/dist/cassandra/
最新rpm版本:https://downloads.apache.org/cassandra/redhat
http://apache.mirror.digitalpacific.com.au/cassandra/
jdk1.8
apache-cassandra-3.11.7-bin.tar.gz
centos7
三台服务:hop01、hop02、hop03节点
apache-cassandra-3.11.7-bin.tar.gz
centos7
三台服务:hop01、hop02、hop03节点
1.安装包处理
tar -zxvf apache-cassandra-3.11.7-bin.tar.gz
mv apache-cassandra-3.11.7 cassandra3.11
2.环境变量
[root@hop01 opt]# vim /etc/profile
export CASSANDRA_HOME=/opt/cassandra3.11
export PATH=$PATH:$CASSANDRA_HOME/bin
[root@hop01 opt]# source /etc/profile
export CASSANDRA_HOME=/opt/cassandra3.11
export PATH=$PATH:$CASSANDRA_HOME/bin
[root@hop01 opt]# source /etc/profile
3.创建目录
# 数据目录
mkdir -p /data/cassandra/data
# 日志目录
mkdir -p /data/cassandra/log
mkdir -p /data/cassandra/data
# 日志目录
mkdir -p /data/cassandra/log
4.集群配置
vim /opt/cassandra3.11/conf/cassandra.yaml
# 配置集群名称
cluster_name: 'CasCluster'
# 配置数据目录
data_file_directories:
- /data/cassandra/data
# 配置日志目录
commitlog_directory: /data/cassandra/log
# 设置监听地址,当前服务IP
listen_address: 192.168.72.132
# 配置RPC服务
start_rpc: true
rpc_address: 192.168.72.132
# 配置集群节点
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.72.132,192.168.72.138,192.168.72.139"
# 配置集群名称
cluster_name: 'CasCluster'
# 配置数据目录
data_file_directories:
- /data/cassandra/data
# 配置日志目录
commitlog_directory: /data/cassandra/log
# 设置监听地址,当前服务IP
listen_address: 192.168.72.132
# 配置RPC服务
start_rpc: true
rpc_address: 192.168.72.132
# 配置集群节点
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.72.132,192.168.72.138,192.168.72.139"
将该配置分发到集群的每个节点,注意listen_address和rpc_address是节点自己的IP地址即可。
5.启动集群
# 集群下节点依次执行启动命令
cassandra -R
# 查看节点状态
nodetool status
cassandra -R
# 查看节点状态
nodetool status
7199 - JMX(8080 pre Cassandra 0.8.xx)
7000 - 节点间通信(如果启用了TLS,则不使用)
7001 - TLS节点间通信(使用TLS时使用)
9160 - Thrift客户端API
9042 - CQL本地传输端口
7000 - 节点间通信(如果启用了TLS,则不使用)
7001 - TLS节点间通信(使用TLS时使用)
9160 - Thrift客户端API
9042 - CQL本地传输端口
06.数据库操作
进入命令行
cqlsh hop01
创建keyspace,并选择
CREATE KEYSPACE IF NOT EXISTS castest WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':3};
use castest ;
use castest ;
创建表,写入数据
CREATE TABLE user_info (id int, user_name varchar, PRIMARY KEY (id) );
INSERT INTO user_info (id,user_name) VALUES (1,'user01');
INSERT INTO user_info (id,user_name) VALUES (1,'user01');
查询数据
select * from user_info ;
07.Springboot集成
核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
这里核心需要cassandra依赖和操作的API依赖。
核心配置
spring:
data:
cassandra:
keyspace-name: castest
contact-points: 192.168.72.138,192.168.72.132,192.168.72.139
port: 9042
cluster-name: CasCluster
data:
cassandra:
keyspace-name: castest
contact-points: 192.168.72.138,192.168.72.132,192.168.72.139
port: 9042
cluster-name: CasCluster
keyspace-name:类似关系型数据库的名称;
contact-points:集群下节点的IP地址;
port:默认端口;
cluster-name:上述配置的集群名称;
contact-points:集群下节点的IP地址;
port:默认端口;
cluster-name:上述配置的集群名称;
基于Template命令
@Repository
public class UserInfoTemplate {
@Resource
private CassandraTemplate cassandraTemplate ;
// 查询全部数据
public List<UserInfo> getList (){
return cassandraTemplate.select("SELECT * FROM user_info",UserInfo.class) ;
}
// 添加数据
public UserInfo insert (UserInfo userInfo){
return cassandraTemplate.insert(userInfo) ;
}
// 根据主键查询
public UserInfo selectOneById (Integer id){
return cassandraTemplate.selectOneById(id,UserInfo.class) ;
}
// 修改数据
public UserInfo update (UserInfo userInfo){
return cassandraTemplate.update(userInfo) ;
}
// 删除数据
public Boolean deleteById (Integer id){
return cassandraTemplate.deleteById(id,UserInfo.class) ;
}
}
public class UserInfoTemplate {
@Resource
private CassandraTemplate cassandraTemplate ;
// 查询全部数据
public List<UserInfo> getList (){
return cassandraTemplate.select("SELECT * FROM user_info",UserInfo.class) ;
}
// 添加数据
public UserInfo insert (UserInfo userInfo){
return cassandraTemplate.insert(userInfo) ;
}
// 根据主键查询
public UserInfo selectOneById (Integer id){
return cassandraTemplate.selectOneById(id,UserInfo.class) ;
}
// 修改数据
public UserInfo update (UserInfo userInfo){
return cassandraTemplate.update(userInfo) ;
}
// 删除数据
public Boolean deleteById (Integer id){
return cassandraTemplate.deleteById(id,UserInfo.class) ;
}
}
CassandraTemplate模板类,实现了一系列操作Cassandra数据库的基本方法,直接注入即可使用。
基于Repository接口
接口实现
import com.cassand.cluster.entity.UserInfo;
import org.springframework.data.repository.CrudRepository;
public interface UserInfoRepository extends CrudRepository<UserInfo,Integer> {
}
import org.springframework.data.repository.CrudRepository;
public interface UserInfoRepository extends CrudRepository<UserInfo,Integer> {
}
接口用法
@Service
public class RepositoryService {
@Resource
private UserInfoRepository userInfoRepository ;
// 保存
public UserInfo save (UserInfo userInfo){
return userInfoRepository.save(userInfo) ;
}
// 查询
public UserInfo getById (Integer id){
return userInfoRepository.findById(id).get() ;
}
// 修改
public UserInfo update (UserInfo userInfo){
// 主键ID存在的情况即为修改
return userInfoRepository.save(userInfo);
}
// 删除
public void deleteById (Integer id){
userInfoRepository.deleteById(id);
}
}
public class RepositoryService {
@Resource
private UserInfoRepository userInfoRepository ;
// 保存
public UserInfo save (UserInfo userInfo){
return userInfoRepository.save(userInfo) ;
}
// 查询
public UserInfo getById (Integer id){
return userInfoRepository.findById(id).get() ;
}
// 修改
public UserInfo update (UserInfo userInfo){
// 主键ID存在的情况即为修改
return userInfoRepository.save(userInfo);
}
// 删除
public void deleteById (Integer id){
userInfoRepository.deleteById(id);
}
}
实体表结构
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;
@Table("user_info")
public class UserInfo {
public UserInfo(Integer id, String userName) {
this.id = id;
this.userName = userName;
}
@PrimaryKey
private Integer id ;
@Column(value = "user_name")
private String userName ;
}
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;
@Table("user_info")
public class UserInfo {
public UserInfo(Integer id, String userName) {
this.id = id;
this.userName = userName;
}
@PrimaryKey
private Integer id ;
@Column(value = "user_name")
private String userName ;
}
01.数据库介绍
A scalable multi-master database with no single points of failure
可伸缩可扩展无单点故障的数据库。
可伸缩可扩展无单点故障的数据库。
Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,此后,由于Cassandra良好的可扩展性,逐渐发展成为了一种流行的分布式结构化数据存储方案。
Cassandra 的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对 Cassandra 的一个写操作,会被复制到其他节点上去,对 Cassandra 的读操作,也会被路由到某个节点上面去读取。对于一个 Cassandra 群集来说,扩展性能 是比较简单的事情,只管在群集里面添加节点就可以了。
Cassandra 是一个混合型的非关系的数据库,类似于 Google 的 BigTable。其主要功能比 Dynomite(分布式的 Key-Value 存 储系统)更丰富,但支持度却不如文档存储 MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库 的。支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。)Cassandra 最初由 Facebook 开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以 Amazon 专有的完全分布式的 Dynamo 为基础,结合了 Google BigTable 基于列族(Column Family)的数据模型。P2P 去中心化的存储。很多方面都可以称之为 Dynamo 2.0。
Cassandra 是一个混合型的非关系的数据库,类似于 Google 的 BigTable。其主要功能比 Dynomite(分布式的 Key-Value 存 储系统)更丰富,但支持度却不如文档存储 MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库 的。支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。)Cassandra 最初由 Facebook 开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以 Amazon 专有的完全分布式的 Dynamo 为基础,结合了 Google BigTable 基于列族(Column Family)的数据模型。P2P 去中心化的存储。很多方面都可以称之为 Dynamo 2.0。
02.应用场景
互联网类应用
Cassandra能够支持大并发低延时的访问需求,具备高可用和弹性扩容能力,适合日志、消息、feed流、订单、账单、网站等各种大数据量的互联网在线应用场景。
物联网数据存储分析
Cassandra可以处理高速数据,因此它是数据来自不同设备或传感器的数据速度非常快的应用程序的绝佳数据库。
数据驱动的业务
云数据库Cassandra可以支持数百个节点的集群规模,适合大数据量的存储。在一些需要应用大量数据对用户行为进行分析的场景中,可以通过整合多种数据来源,存储用户行为数据,构建用户画像,实时存储在Cassandra中,提供大数据风控、推荐等服务。
写密集、统计和分析型工作
Cassandra是为优异的写吞吐量而特别优化的,能够支持很高的多客户线程并发写性能和突发的峰值,这些特性使得Cassandra能够很好支持写多于读的场景,例如用户状态更新、社交网络、建议/评价以及应用统计等。
业务灵活多变
云数据库Cassandra的数据模型灵活,对表结构的变更是一个非常轻量级的操作,非常适用于初创型的业务需求,让您的数据库能更快地跟上业务改进的步伐。
多活
Cassandra原生支持多DC部署方式,实现更好的可用性和容灾能力。云数据库Cassandra可以很容易添加新的数据中心,不同的数据中心可以设定不同的副本数,既可以作为跨数据中心多活高可用,也可以作备份容灾或离线分析使用。
特点分析
弹性可扩展性
Cassandra是高度可扩展的;它允许添加更多的硬件以适应更多的客户和更多的数据根据要求,可以根据业务的数据流量轻松扩展集群规模。
架构特点
Cassandra可以基于分布式运行,并采用了许多容错机制。由于去中心化无主的策略,所以没有单点故障。可以做到不停服滚动升级。这是因为Cassandra可以支持多个节点的临时失效(取决于群集大小),对群集的整体性能影响可以忽略不计。并且Cassandra提供多地域容灾。Cassandra允许将数据复制到其他数据中心,并在多个地域保留多副本,十分适用于不能承担故障的关键业务,必须持续提供服务的应用程序。
数据存储机制
Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。可以根据业务的需要动态地适应变化的数据结构,并且通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。有许多案例证明Cassandra可以在金融,医疗,物联网等领域使用
资源整合能力
Cassandra可以很容易的跟其他开源组件做集成,其中包括Hadoop,Spark,Kafka,Solr等系列组件,成为大数据业务处理里面重要的一个角色。
突出特点
模式灵活 :使用 Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部 署上。
真正的可扩展性 :Cassandra 是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。
特色功能
范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。
列表数据结构 :在混合模式可以将超级列添加到 5 维。对于每个用户的索引,这是非常方便的。
分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。
03.名词解释
Cassandra:是在线可靠的NoSQL分布式数据库服务,支持类SQL语法CQL,支持多地多活,提供了安全、容灾、监控、备份恢复等企业级能力。
CQL: CQL(Cassandra Query Language)是cassandra中提供的一种类SQL查询语言,具体用法可参考cassandra文档。
数据中心:云数据库Cassandra中,数据中心(Data Center,简称DC)是指在同一地域下,电力、网络隔离的一组节点。在多DC的部署架构下面,DC之间内网互通,同一DC内网络延时更小,不同DC之间故障隔离。
Partitioner: partitioner用来确定将数据均衡分布在节点上的策略。云数据库Cassandra中,默认使用Murmur3Partitioner。
副本数: 副本数表示数据在集群中存了几“份”(副本),例如副本数为2表示每行数据在集群中保存了两个副本,每个副本都在不同的节点上面。云数据库Cassandra中,副本数由用户在创建keyspace时指定。
副本策略: 副本策略用来确定将副本存放在哪个节点上面。云数据库Cassandra中,副本策略由用户在创建keyspace时指定。推荐您使用NetworkTopologyStrategy策略,可更便捷地将集群扩展至多个DC。
KeySpace :一个KeySpace下包含若干个表,用户可以在keyspce这个级别指定副本策略。
04.架构简介
架构讲解
Cassandra被设计用来处理跨多个节点的大数据工作负载,没有单点故障。Cassandra通过采用跨同构节点的对等分布式系统来解决故障问题,其中数据分布在集群中的所有节点中。每个节点使用点对点gossip通信协议频繁地交换自己和集群中其他节点的状态信息。每个节点上按顺序写入的提交日志被捕获写入活动,以确保数据的持久性。然后,数据被编入索引并写入内存结构,称为memtable,它类似于回写缓存。每次内存结构满了,数据就被写到一个SSTables数据文件的磁盘上。所有写操作都会自动分区并在整个集群中复制。Cassandra定期使用一个称为压缩的进程合并SSTables,丢弃用tombstone标记为要删除的过时数据。为了确保集群中的所有数据保持一致,需要使用各种修复机制。
Cassandra是一个分区的行存储数据库,其中行被组织成具有所需主键的表。Cassandra的体系结构允许任何授权用户连接到任何数据中心中的任何节点,并使用CQL语言访问数据。为了易于使用,CQL使用与SQL类似的语法并处理表数据。通常,集群中的每个应用程序都有一个键空间,由许多不同的表组成。
客户端读或写请求可以发送到集群中的任何节点。当客户端使用请求连接到某个节点时,该节点充当该特定客户端操作的协调器。协调器充当客户端应用程序和拥有所请求数据的节点之间的代理。协调器根据集群的配置方式确定环形中的哪些节点应该获得请求。
核心结构
Node
存储数据的地方。它是Cassandra的基础设施组件
datacenter
相关节点的集合。数据中心可以是物理数据中心,也可以是虚拟数据中心。不同的工作负载应该使用单独的数据中心,无论是物理的还是虚拟的。复制由数据中心设置。使用单独的数据中心可以防止Cassandra事务受到其他工作负载的影响,并使请求彼此接近以降低延迟。根据复制因子,可以将数据写入多个数据中心。数据中心绝不能跨越物理位置。
Cluster
一个集群包含一个或多个数据中心。它可以跨越物理位置。
Commit log
为了持久性,所有数据写入之前都要首先写入提交日志(日志写入优先)。所有数据都刷新到SSTables之后,就可以对其进行归档、删除或回收。
SSTable(Sorted String Table)
一个SSTable是一个不可变的数据文件,Cassandra定期将memtables写入其中。仅追加SSTables并按顺序存储在磁盘上,并为每个Cassandra表维护SSTables。
CQL Table
按表行获取的有序列的集合。一张表由多列组成,并且有一个主键。
核心组件
Gossip
一种对等通信协议,用于发现和共享Cassandra集群中其他节点的位置和状态信息。Gossip息也由每个节点本地保存,以便在节点重新启动时立即使用。
Partitioner
分区程序确定哪个节点将接收一段数据的第一个副本,以及如何跨集群中的其他节点分发其他副本。每一行数据都由一个主键唯一地标识,主键可能与其分区键相同,但也可能包含其他集群列。Partitioner是一个哈希函数,它从一行的主键派生标记。分区程序使用令牌值来确定集群中的哪些节点接收该行的副本。Murmur3Partitioner是新Cassandra集群的默认分区策略,几乎在所有情况下都是新集群的正确选择。
Replication factor
整个集群中的副本总数。副本因子1表示在一个节点上每一行只有一个副本。副本因子2表示每一行有两个副本,其中每个副本位于不同的节点上。所有的副本都同样重要,没有主副本。你可以为每个数据中心定义副本因子。通常,应该将副本策略设置为大于1,但不超过集群中的节点数。
Replica placement strategy
Cassandra将数据的副本存储在多个节点上,以确保可靠性和容错能力。副本策略决定将副本放在哪个节点上。数据的第一个副本就是第一个副本,它在任何意义上都不是唯一的。强烈建议使用NetworkTopologyStrategy策略,因为在将来需要扩展时,可以轻松扩展到多个数据中心。创建keyspace时,必须定义副本放置策略和所需的副本数。
Snitch
snitch将一组机器定义为数据中心和机架(拓扑),副本策略使用这些数据中心和机架放置副本。
在创建集群时,必须配置一个snitch。所有的snitch都使用一个动态的snitch层,该层监视性能并选择最佳副本进行读取。它是默认启用的,建议在大多数部署中使用。在cassandra.yaml配置文件中为每个节点配置动态snitch阈值。
在创建集群时,必须配置一个snitch。所有的snitch都使用一个动态的snitch层,该层监视性能并选择最佳副本进行读取。它是默认启用的,建议在大多数部署中使用。在cassandra.yaml配置文件中为每个节点配置动态snitch阈值。
cassandra.yaml
用于设置集群的初始化属性、表的缓存参数、调优和资源利用率的属性、超时设置、客户端连接、备份和安全性的主要配置文件。
自由主题
0 条评论
下一页