专栏首页duanliuyaoCassandra应用实践
原创

Cassandra应用实践

Cassandra安装

1、安装依赖项

2、安装并启动Cassandra

tar -xzvf apache-cassandra-3.11.4-bin.tar.gz
  • 修改文件属性。Cassandra不能使用root来启动,假设使用user_00用户来启动,chown -R user_00.users apache-cassandra-3.11.4
  • 添加环境变量。修改~/.bashrc 添加Java和Cassandra相关路径的环境变量
  • 修改Cassandra的配置。编辑conf/cassandra.yaml文件,路径相关的根据实际情况来修改
# Directory where Cassandra should store hints.
# If not set, the default directory is $CASSANDRA_HOME/data/hints.
hints_directory:/data/cassandra/hints

# Directories where Cassandra should store data on disk.  Cassandra
# will spread data evenly across them, subject to the granularity of
# the configured compaction strategy.
# If not set, the default directory is $CASSANDRA_HOME/data/data.
# data_file_directories:
#     - /var/lib/cassandra/data
data_file_directories:
    - /data1/cassandra/data
    - /data2/cassandra/data
    
# commit log.  when running on magnetic HDD, this should be a
# separate spindle than the data directories.
# If not set, the default directory is $CASSANDRA_HOME/data/commitlog.
commitlog_directory: /data/data/cassandra/commitlog

# saved caches
# If not set, the default directory is $CASSANDRA_HOME/data/saved_caches.
saved_caches_directory: /data/cassandra/saved_caches

# any class that implements the SeedProvider interface and has a
# constructor that takes a Map<String, String> of parameters will do.
seed_provider:
    # Addresses of hosts that are deemed contact points. 
    # Cassandra nodes use this list of hosts to find each other and learn
    # the topology of the ring.  You must change this if you are running
    # multiple nodes!
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "10.10.10.1,10.10.10.2"
          
# Set listen_address OR listen_interface, not both. Interfaces must correspond
# to a single address, IP aliasing is not supported.
listen_interface: bond1
  • 启动Cassandra。命令行调用bin/cassandra启动Cassandra进程,bin/nodetool status查看集群情况
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens       Owns    Host ID                               Rack
UN  10.10.10.1     11.7 TiB     256          ?       85ad2d5f-10af-475a-915f-f95dd705e133  rack1
UN  10.10.10.2     10.1 TiB     256          ?       568eb231-eaa4-429c-b2fa-9b3a7db36ffd  rack1
UN  10.10.10.3     10.4 TiB     256          ?       4bf77471-4a83-4217-ba5c-96ce1bbd7647  rack1

Cassandra使用

1、命令行启动

执行bin/cqlsh ip即可cassandra的shell客户端,可以执行的CQL命令和mysql比较类似。

# 创建keyspace(类似mysql的database),replication_factor表示副本数,class可选SimpleStrategy和NetworkTopologyStrategy
# 如果集群分布在多个数据中心,class选择NetworkTopologyStrategy。durable_writes表示更新记录时是否使用commit log
create keyspace mykeyspace with replication={'class':'SimpleStrategy','replication_factor':3} AND durable_writes = true;
use mykeyspace;

#创建表,其中domain是partition key
CREATE TABLE t(
    domain text,
    day text,
    key text,
    value int,
    PRIMARY KEY (domain, day, key)
) WITH CLUSTERING ORDER BY (domain DESC);

# 表的增、删、改、查操作类似mysql
INSERT INTO t (domain, day, key, value) VALUES ('test.com', '2019-02-24', 'key0', 10);
SELECT * FROM t;

2、查询条件

Cassandra查询时只支持主键列及索引列的查询,主键查询必须按照主键顺序指定查询条件。

  • 主键查询
CREATE TABLE t(
    domain text,
    day text,
    key text,
    value int,
    PRIMARY KEY (domain, day, key)
) WITH CLUSTERING ORDER BY (domain DESC);
可以支持的查询条件
select * from t where domain = ?
select * from t where domain = ? and day = ?
select * from t where domain = ? and day > ?
如果要以domain和key作为查询条件,需要加上allow filtering
select * from t where domain = ? and key = ? allow filtering
  • 索引查询

Cassandra的索引实际上是建立了一张新的表,将原始表格的索引字段作为新的索引表的primary key,并且存储的值为原始表的primary key。所以实际上并不推荐使用二级索引,如果需要根据非primary key字段来做条件过滤,通常是业务侧新创建一个表,以索引字段作为primary key。

Cassandra增加、删除节点

1、增加节点

  • 将jdk和cassandra文件copy到新的节点
  • 启动新节点上的cassandra服务
bin/cassandra &
如果要同时增加多台机器,则增加一个-Dcassandra.consistent.rangemovement=false选项

2、移除节点

 bin/nodetool removenode host_id
 host_id 通过bin/nodetool status查看每个节点的host_id
 如果任务一直未完成,可以执行
 bin/nodetool removenode force

使用时遇到的一些坑

1、节点扩容时有的文章建议先关闭cassandra节点的压缩(bin/nodetool disableautocompaction),但从实际的情况来看,如果集群数据量较大时,扩容后节点之间的数据迁移可能需要数小时才能完成。在扩容的过程中会产生大量的小文件,重新开启压缩时有大量文件需要压缩,有可能导致磁盘IO飙升而影响使用

2、创建Cassandra表时,不要在多个地方同时执行create table命令,即使加了 if not exists。多个client同时创建表有可能导致cassandra出现org.apache.cassandra.db.UnknownColumnFamilyException的错误

3、某些commit log损坏导致Cassandra进程关闭并且无法启动,如果Cassandra有多副本的话,删除损坏的commit log文件并重启就行

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt官方示例-Http

    Qt君
  • 记一次对钓鱼网站的多次渗透

    0x01 首先我们对目标进行目录扫描,发现admin.php 进入发现是后台界面,右击查看网页源码

    天钧
  • 【GPLT】L1-024 后天

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 天天算法 LeetCode-216-组合总和 III

    https://leetcode-cn.com/problems/combination-sum-iii/

    灵魂画师牧码
  • 2020 年 Web 开发展望

    祝大家新年快乐!由于本文的发表日期是 2020 年1月1日,所以我认为这是讨论未来的 366 天中 Web 开发的最佳时机!因为。。。是的,2020年是闰年!

    疯狂的技术宅
  • CV学习笔记(九):光流法的实现

    在这一篇文章中,我们使用OpenCV中的calcOpticalFlowPyrLK()函数来实现,是基于金字塔LK光流算法,计算某些点集的稀疏光流。

    云时之间
  • CV学习笔记(九):光流法的实现

    在这一篇文章中,我们使用OpenCV中的calcOpticalFlowPyrLK()函数来实现,是基于金字塔LK光流算法,计算某些点集的稀疏光流。

    云时之间
  • Crypto算法库详解

    Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前...

    py3study
  • 一文打尽目标检测NMS | 精度提升篇

    众所周知,非极大值抑制NMS是目标检测常用的后处理算法,用于剔除冗余检测框,本文将对可以提升精度的各种NMS方法及其变体进行阶段性总结。

    AI算法与图像处理
  • C++ 多线程互斥锁(mutex,lock,lock_guard)

           根据这两个问题,可以来举个例子说明一下,假如现在我们要求1-10000的和,然后我们为了提高效率,我们建立两个线程同时去计算[1,5000)的和以...

    Ch_Zaqdt

扫码关注云+社区

领取腾讯云代金券