數據源管理 | 分佈式NoSQL系統,Cassandra集羣管理

本文源碼:GitHub·點這裏 || GitEE·點這裏java

1、Cassandra簡介

一、基礎描述

Cassandra是一套開源分佈式NoSQL數據庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式數據,此後,因爲Cassandra良好的可擴展性,逐漸發展成爲了一種流行的分佈式結構化數據存儲方案。node

二、特色分析

彈性可擴展性git

Cassandra是高度可擴展的;它容許添加更多的硬件以適應更多的客戶和更多的數據根據要求,能夠根據業務的數據流量輕鬆擴展集羣規模。github

架構特色web

Cassandra能夠基於分佈式運行,並採用了許多容錯機制。因爲去中心化無主的策略,因此沒有單點故障。能夠作到不停服滾動升級。這是由於Cassandra能夠支持多個節點的臨時失效(取決於羣集大小),對羣集的總體性能影響能夠忽略不計。而且Cassandra提供多地域容災。Cassandra容許將數據複製到其餘數據中心,並在多個地域保留多副本,十分適用於不能承擔故障的關鍵業務,必須持續提供服務的應用程序。spring

數據存儲機制數據庫

Cassandra適應全部可能的數據格式,包括:結構化,半結構化和非結構化。能夠根據業務的須要動態地適應變化的數據結構,而且經過在多個數據中心之間複製數據,能夠靈活地在須要時分發數據。有許多案例證實Cassandra能夠在金融,醫療,物聯網等領域使用。apache

資源整合能力vim

Cassandra能夠很容易的跟其餘開源組件作集成,其中包括Hadoop,Spark,Kafka,Solr等系列組件,成爲大數據業務處理裏面重要的一個角色。centos

2、集羣環境搭建

一、環境概覽

  • jdk1.8
  • apache-cassandra-3.11.7-bin.tar.gz
  • centos7
  • 三臺服務:hop0一、hop0二、hop03節點

二、安裝包處理

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

三、環境變量

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

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

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

四、建立目錄

# 數據目錄
mkdir -p /data/cassandra/data
# 日誌目錄
mkdir -p /data/cassandra/log

五、集羣配置

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地址便可。

六、啓動集羣

# 集羣下節點依次執行啓動命令
cassandra -R
# 查看節點狀態
nodetool status

七、基礎操做

進入命令行

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集羣管理

3、集成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>

這裏核心須要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

keyspace-name:相似關係型數據庫的名稱;

contact-points:集羣下節點的IP地址;

port:默認端口;

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

三、基於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) ;
    }
}

四、基於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);
    }
}

五、實體表結構

注意這裏的註解是基於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 ;
}

4、源代碼地址

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

數據源管理 | 分佈式NoSQL系統,Cassandra集羣管理

推薦閱讀:數據源管理系列

序號 標題
01 數據源管理:主從庫動態路由,AOP模式讀寫分離
02 數據源管理:基於JDBC模式,適配和管理動態數據源
03 數據源管理:動態權限校驗,表結構和數據遷移流程
04 數據源管理:關係型分庫分表,列式庫分佈式計算
05 數據源管理:PostGreSQL環境整合,JSON類型應用
06 數據源管理:基於DataX組件,同步數據和源碼分析
07 數據源管理:OLAP查詢引擎,ClickHouse集羣化管理
08 數據源管理:Kafka集羣環境搭建,消息存儲機制詳解
09 數據源管理:搜索引擎框架,ElasticSearch集羣模式
相關文章
相關標籤/搜索