天天看點

資料源管理 | 分布式NoSQL系統,Cassandra叢集管理一、Cassandra簡介二、叢集環境搭建三、內建SpringBoot架構四、源代碼位址

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、Cassandra簡介

1、基礎描述

Cassandra是一套開源分布式NoSQL資料庫系統。它最初由Facebook開發,用于儲存收件箱等簡單格式資料,此後,由于Cassandra良好的可擴充性,逐漸發展成為了一種流行的分布式結構化資料存儲方案。

2、特點分析

彈性可擴充性

Cassandra是高度可擴充的;它允許添加更多的硬體以适應更多的客戶和更多的資料根據要求,可以根據業務的資料流量輕松擴充叢集規模。

架構特點

Cassandra可以基于分布式運作,并采用了許多容錯機制。由于去中心化無主的政策,是以沒有單點故障。可以做到不停服滾動更新。這是因為Cassandra可以支援多個節點的臨時失效(取決于群集大小),對群集的整體性能影響可以忽略不計。并且Cassandra提供多地域容災。Cassandra允許将資料複制到其他資料中心,并在多個地域保留多副本,十分适用于不能承擔故障的關鍵業務,必須持續提供服務的應用程式。

資料存儲機制

Cassandra适應所有可能的資料格式,包括:結構化,半結構化和非結構化。可以根據業務的需要動态地适應變化的資料結構,并且通過在多個資料中心之間複制資料,可以靈活地在需要時分發資料。有許多案例證明Cassandra可以在金融,醫療,物聯網等領域使用。

資源整合能力

Cassandra可以很容易的跟其他開源元件做內建,其中包括Hadoop,Spark,Kafka,Solr等系列元件,成為大資料業務處理裡面重要的一個角色。

二、叢集環境搭建

1、環境概覽

  • jdk1.8
  • apache-cassandra-3.11.7-bin.tar.gz
  • centos7
  • 三台服務:hop01、hop02、hop03節點

2、安裝包處理

tar -zxvf apache-cassandra-3.11.7-bin.tar.gz
mv apache-cassandra-3.11.7 cassandra3.11           

3、環境變量

[root@hop01 opt]# vim /etc/profile

export CASSANDRA_HOME=/opt/cassandra3.11
export PATH=$PATH:$CASSANDRA_HOME/bin

[root@hop01 opt]# source /etc/profile           

4、建立目錄

# 資料目錄
mkdir -p /data/cassandra/data
# 日志目錄
mkdir -p /data/cassandra/log           

5、叢集配置

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"           

将該配置分發到叢集的每個節點,注意listen_address和rpc_address是節點自己的IP位址即可。

6、啟動叢集

# 叢集下節點依次執行啟動指令
cassandra -R
# 檢視節點狀态
nodetool status           

7、基礎操作

進入指令行

cqlsh hop01           

建立keyspace,并選擇

CREATE KEYSPACE IF NOT EXISTS castest WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':3};

use castest ;           

建立表,寫入資料

CREATE TABLE user_info (id int, user_name varchar, PRIMARY KEY (id) );
INSERT INTO user_info (id,user_name) VALUES (1,'user01');           

查詢資料

select * from user_info ;           

基于其他服務檢視資料,可以看到資料已經在叢集間做了同步過程:

資料源管理 | 分布式NoSQL系統,Cassandra叢集管理一、Cassandra簡介二、叢集環境搭建三、內建SpringBoot架構四、源代碼位址

三、內建SpringBoot架構

1、核心依賴

<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依賴。

2、核心配置

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           

keyspace-name:類似關系型資料庫的名稱;

contact-points:叢集下節點的IP位址;

port:預設端口;

cluster-name:上述配置的叢集名稱;

3、基于Template指令

CassandraTemplate模闆類,實作了一系列操作Cassandra資料庫的基本方法,直接注入即可使用。

@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) ;
    }
}           

4、基于Repository接口

SpringBoot架構中定義的資料庫通路核心接口。

接口實作

import com.cassand.cluster.entity.UserInfo;
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);
    }
}           

5、實體表結構

注意這裡的注解是基于cassandra特定的一套。

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 ;
}           

四、源代碼位址

GitHub·位址
https://github.com/cicadasmile/data-manage-parent
GitEE·位址
https://gitee.com/cicadasmile/data-manage-parent