Cassandra

介绍

Apache Cassandra是一个高度可扩展的高性能分布式数据库,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障。这是一种NoSQL类型的数据库。

特点

  • 弹性可扩展性
    是高度可扩展的; 它允许添加更多的硬件以适应更多的客户和更多的数据根据要求。
  • 始终基于架构
    没有单点故障,它可以连续用于不能承担故障的关键业务应用程序。
  • 快速线性性能
    线性可扩展性的,即它为你增加集群中的节点数量增加你的吞吐量。因此,保持一个快速的响应时间。
  • 灵活的数据存储
    适应所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据您的需要动态地适应变化的数据结构。
  • 便捷的数据分发
    通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。
  • 事务支持
    支持属性,如原子性,一致性,隔离和持久性(ACID)。
  • 快速写入
    被设计为在廉价的商品硬件上运行。 它执行快速写入,并可以存储数百TB的数据,而不牺牲读取效率。

  • 详细架构说明参考:https://www.w3cschool.cn/cassandra/cassandra_architecture.html

数据模型

集群(Cluster)》键空间 (Keyspace)》列族 》列 》超级列

参考说明:https://blog.csdn.net/u010859650/article/details/85244056
                  https://cloud.tencent.com/developer/article/2031320

安装Docker版本

# 获取镜像
docker pull cassandra
# 启动镜像
docker run --name some-cassandra -p 9042:9042 -d cassandra:latest
# 进入容器
docker exec -it some-cassandra  bash
# 修改配置文件 cassandra.yaml
authenticator: AllowAllAuthenticator
# 修改为:
authenticator: PasswordAuthenticator
# 这样可以使用用户名和密码,进行远程连接。默认的策略,只能本地连接
# 修改方法
# 复制文件到本地(里面没有 vim 不能编辑)
docker cp fa14e5d96a6f:/etc/cassandra/cassandra.yaml cassandra.yaml
# 修改后,先把原来的删除再复制进去
rm -rf cassandra.yaml 
docker cp cassandra.yaml fa14e5d96a6f:/etc/cassandra/cassandra.yaml 
# 再看下权限是否有问题, 如需要就修改权限
chmod  777 cassandra.yaml 
  默认账户密码为 cassandra cassandra

 docker官方地址:https://hub.docker.com/_/cassandra/

其他 linux 集群部署安装参考:https://www.w3cschool.cn/cassandra/cassandra_installation.html

python 操作

# -*- encoding: utf-8 -*-
from cassandra import ConsistencyLevel
# 引入Cluster模块
from cassandra.cluster import Cluster
# 引入DCAwareRoundRobinPolicy模块,可用来自定义驱动程序的行为
# from cassandra.policies import DCAwareRoundRobinPolicy
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import SimpleStatement
import pandas as pd


# 配置Cassandra集群的IP,记得改成自己的远程数据库IP哦
contact_points = ['1.1.1.1', '2.2.2.2', '3.3.3.3']
# 配置登陆Cassandra集群的账号和密码,记得改成自己知道的账号和密码
auth_provider = PlainTextAuthProvider(username='XXX', password='XXX')
# 创建一个Cassandra的cluster
cluster = Cluster(contact_points=contact_points, auth_provider=auth_provider)
# 连接并创建一个会话
session = cluster.connect()
# 定义一条cql查询语句
cql_str = 'select * from keyspace.table limit 5;'
simple_statement = SimpleStatement(cql_str,consistency_level=ConsistencyLevel.ONE)
# 对语句的执行设置超时时间为None
execute_result = session.execute(simple_statement, timeout=None)
# 获取执行结果中的原始数据
result = execute_result._current_rows
# 把结果转成DataFrame格式
result = pd.DataFrame(result)
# 把查询结果写入csv
result.to_csv('连接远程数据库.csv', mode='a', header=True)
# 关闭连接
cluster.shutdown()

参考:https://www.itdaan.com/blog/2019/02/15/758c4f9d3635617b16ab0eb4d4a965f3.html
           https://www.jianshu.com/p/4ca2c6fdb916

Shell 命令

  • Copy - 此命令将数据从Cassandra复制到文件中
    COPY emp (emp_id, emp_city, emp_name, emp_phone,emp_sal) TO ‘myfile’;
  • Describe cluster -此命令提供有关集群的信息
  • Describe Keyspaces -此命令列出集群中的所有键空间。
  • Describe tables -此命令列出了键空间中的所有表。
  • Describe tables -此命令提供表的描述。

  参考 https://www.w3cschool.cn/cassandra/cassandra_shell_commands.html

键空间

  • 创建键空间

    键空间是一个定义节点上数据复制的命名空间。集群每个节点包含一个键空间。
    CREATE KEYSPACE “键名称”
           WITH replication = {'class': ‘策略名称’, 'replication_factor' : ‘复制因子个数’}
           【AND durable_writes = ‘bool 值’】;
    # CREATE KEYSPACE 语句有两个属性:replication 和 durable_writes。

    复制

    复制选项用于指定副本位置策略和所需副本的数量。下表列出了所有副本位置策略。

    策略名称 描述
    简单的策略 SimpleStrategy 为集群指定简单的复制因子。
    网络拓扑策略 NetworkTopologyStrategy 使用此选项,可以单独为每个数据中心设置复制因子。
    旧网络拓扑策略   使用此选项,可以单独为每个数据中心设置复制因子。

    使用此选项,您可以指示Cassandra是否对当前KeySpace的更新使用commitlog。此选项不是强制性的,默认情况下,它设置为true。

    示例

    下面给出了创建KeySpace的示例。

    • 这里我们创建一个名为TutorialsPoint 的KeySpace。

    • 我们使用第一个副本放置策略,即简单策略

    • 我们选择复制因子为1个副本

    cqlsh.> CREATE KEYSPACE tutorialspoint
    WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};

    验证

    您可以使用命令Describe验证是否创建表。如果对键空间使用此命令,它将显示如下所示创建的所有键空间。

    cqlsh> DESCRIBE keyspaces;
    
    tutorialspoint system system_traces 

    Durable_writes

    默认情况下,表的durable_writes属性设置为true,但可以将其设置为false。您不能将此属性设置为simplex策略

    示例

    下面给出了示例持久写入属性的使用示例。

    cqlsh> CREATE KEYSPACE test
    ... WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 }
    ... AND DURABLE_WRITES = false;

    验证

    您可以通过查询系统键空间来验证test KeySpace的durable_writes属性是否设置为false。此查询提供了所有KeySpaces及其属性。

    cqlsh> SELECT * FROM system.schema_keyspaces;
    
      keyspace_name | durable_writes |                                       strategy_class | strategy_options
    ----------------+----------------+------------------------------------------------------+----------------------------
    
               test |          False | org.apache.cassandra.locator.NetworkTopologyStrategy | {"datacenter1" : "3"}
    
     tutorialspoint |           True |          org.apache.cassandra.locator.SimpleStrategy | {"replication_factor" : "4"}
    
             system |           True |           org.apache.cassandra.locator.LocalStrategy | { }
    
      system_traces |           True |          org.apache.cassandra.locator.SimpleStrategy | {"replication_factor" : "2"}
    
    (4 rows)

    在这里可以观察测试 KeySpace 的 durable_writes 属性设置为 false

  • 修改键空间

    ALTER KEYSPACE 键名称
    WITH REPLICATION = {'class' : '策略名称', 'datacenter1' : 复制因子个数} AND DURABLE_WRITES = true/false;
  • 删除键空间

    DROP KEYSPACE 键名称;

  •  创建表

    CREATE TABLE emp(
       emp_id int PRIMARY KEY,
       emp_name text,
       emp_city text,
       emp_sal varint,
       emp_phone varint
       );
  • 修改表

    # 添加列
    ALTER TABLE emp ADD emp_email text;
    # 删除列
    ALTER TABLE emp DROP emp_email;
  • 创建索引

    CREATE INDEX name ON emp1 (emp_name);
  • 批量处理

    BEGIN BATCH
    <insert-stmt>/ <update-stmt>/ <delete-stmt>  # 多个执行语句 
    APPLY BATCH
    # 示例:
    BEGIN BATCH
    INSERT INTO emp (emp_id, emp_city, emp_name, emp_phone, emp_sal) values(  4,'Pune','rajeev',9848022331, 30000);
    UPDATE emp SET emp_sal = 50000 WHERE emp_id =3;
    DELETE emp_city FROM emp WHERE emp_id = 2;
    APPLY BATCH;

     

     

          参考:https://www.w3cschool.cn/cassandra/cassandra_create_table.html

 插入数据

  • insert

    INSERT INTO emp (emp_id, emp_name, emp_city, emp_phone, emp_sal) VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);
  • update

    UPDATE emp SET emp_city='Delhi',emp_sal=50000 WHERE emp_id=2;
  • select

    SELECT * FROM emp WHERE emp_sal=50000;

     

    参考:https://www.w3cschool.cn/cassandra/cassandra_create_data.html

CQL数据类型

  • 内置数据类型

  • 集合类型

  • 集合类型的使用

    # 创建表
    CREATE TABLE data(name text PRIMARY KEY, email list<text>);
    # 插入数据
    INSERT INTO data(name, email) VALUES ('ramu',['abc@gmail.com','cba@yahoo.com']);
    # 修改数据
    UPDATE data SET email = email +['xyz@tutorialspoint.com'] where name = 'ramu';

     

 可视化软件

           下载地址:http://www.mongodbmanager.com/cassandra/

            

 

 

 

 

 

 

 

 

 

 

  

 

posted on 2022-08-18 10:45  闹不机米  阅读(351)  评论(0编辑  收藏  举报

导航