Apache Cassandra

来自Gea-Suan Lin's Wiki
Gslin讨论 | 贡献2022年7月11日 (一) 17:44的版本 →‎操作
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

Apache Cassandra是一套数据库。

需求

开机就大约吃1.3GB左右,用2GB内存机器开机完就已经有吃到Swap了,最好是4GB内存,我这边是用AWSt4g.medium跑测试环境,不过当资料量够大的时候4GB还是不太够用,建议在正式环境下至少开到8GB的内存使用。

硬盘空间就是随着资料量自己抓。

安装

先安装OpenJDK 11:

sudo apt install -y openjdk-11-jdk; sudo apt clean

再来安装Cassandra 4:

curl -L https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -; echo "deb http://www.apache.org/dist/cassandra/debian 40x main" | sudo tee /etc/apt/sources.list.d/cassandra.list; sudo apt update; sudo apt install -y cassandra

设定

防火墙

Port Usage Comment
7000/tcp Cluster communication
7001/tcp Cluster communication (TLS mode)
7199/tcp JMX 预设是听127.0.0.1,不一定要开。
9042/tcp Native protocol

/etc/cassandra/cassandra.yaml

基本上一定会改的:

  • cluster_name改成自己要的名称。
  • listen_address改成自己的IP位置(但不能是0.0.0.0,有挡),这样外部才能连线。可以考虑直接用listen_interface
  • rpc_address也要改成自己的IP位置(也不能是0.0.0.0)。
  • seeds改成第一台机器的IP位置与Port,这个参数只在第一次初始化整个Cassandra时用一次,后续的机器资讯都会存到硬盘里。如果没有用Cluster架构的话不需要改。

其他会改的:

  • commitlog_compression改用LZ4Compressor
  • endpoint_snitch改成Ec2Snitch或是Ec2MultiRegionSnitch,如果你的Cassandra架在AWS上。
  • hints_compression改用LZ4Compressor
  • internode_compression改成all

/etc/cassandra/jvm-server.options

记得把jvm11-server.options的内容复制进来,另外要注意JVM GC的部分:

  • Java 11预设用G1GC,一般建议是在内存比较充足的情况下选用(网络上有些文章是建议16GB以上),在内存比较小的时候会建议使用CMS。

清掉初始资料

要注意因为预设装完Cassandra后会自动跑起来,会需要先清掉/var/lib/cassandra里面的cluster资料:

sudo service cassandra stop; sudo rm -rf /var/lib/cassandra; sudo mkdir /var/lib/cassandra; sudo chown cassandra:cassandra /var/lib/cassandra; sudo service cassandra start

账号密码

Cassandra预设是不检查账号密码的,需要修改设定:

  • authenticator改成PasswordAuthenticator
  • authorizer改成CassandraAuthorizer
  • role_manager改成CassandraRoleManager(似乎已经是预设)。

重启所有节点后,然后用预设的账号密码(都是cassandra)连进cluster:

cqlsh cassandra-1.example.com -u cassandra -p cassandra

接下来可以设定最高使用者以及一般使用者:

CREATE USER root WITH PASSWORD 'rootpassword' SUPERUSER;
CREATE USER alice WITH PASSWORD 'alicepassword';
CREATE USER bob WITH PASSWORD 'bobpassword';

请先重新登入确认这些使用者可以用,接着把cassandra这个使用者砍掉:

DROP USER cassandra;

然后先建立对应的keyspace,并且授权alice这个keyspace给alice这个使用者,并且给bob这个使用者查询:

CREATE KEYSPACE alice WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
GRANT ALL ON KEYSPACE alice TO alice;
GRANT SELECT ON KEYSPACE alice TO bob;

常用指令

cqlsh

使用cqlsh:

cqlsh cassandra-1.example.com -u root -p password

列出所有的keyspace:

DESCRIBE keyspaces;

使用ks1然后列出table:

USE ks1;
DESCRIBE tables;

其他指令

看目前Cluster的状态(透过JMX,需要在Cluster上的任意一台机器上存取127.0.0.1:7199):

nodetool status

利用profileload可以看到目前有哪些指令在跑(这个指令主要不是用来做这个用途的,只是目前没有其他方法可以看):

nodetool profileload

操作

修复

这边提供的修复方式是直接放弃现有本地节点的资料,透过其他节点恢复,所以需要在资料有设定多份replication的前提下才能这样用:

  • 移除/var/lib/cassandra,或是搬到/var/lib/cassandra.old(如果空间够的话)。
  • /etc/cassandra/cassandra-env.sh里面的JVM_OPTS加上-Dcassandra.replace_address=10.1.2.3(自己的IP位置)。
  • 重跑Cassandra。

接着应该会在/var/log/cassandra/system.log里看到一些记录,另外透过网络流量之类的资讯应该也可以看到正在同步。

移除节点

nodetool decommission

删除节点

nodetool removenode 01234567-89ab-cdef-0123-456789abcdef
nodetool removenode status
nodetool removenode force

清理节点的多余资料

nodetool cleanup

除错

可以翻翻/var/log/cassandra这边。

连结