Apache Cassandra:修订间差异
(→設定) |
(→操作) |
||
(未显示同一用户的25个中间版本) | |||
第3行: | 第3行: | ||
== 需求 == | == 需求 == | ||
開機就大約吃1.3GB左右,用2GB記憶體機器開機完就已經有吃到Swap了,最好是4GB記憶體,我這邊是用[[AWS]]的<code>t4g.medium</code>跑測試環境。 | 開機就大約吃1.3GB左右,用2GB記憶體機器開機完就已經有吃到Swap了,最好是4GB記憶體,我這邊是用[[AWS]]的<code>t4g.medium</code>跑測試環境 ,不過當資料量夠大的時候4GB還是不太夠用,建議在正式環境下至少開到8GB的記憶體使用。 | ||
硬碟空間就是隨著資料量自己抓 。 | |||
== 安裝 == | == 安裝 == | ||
第51行: | 第53行: | ||
* <code>cluster_name</code>改成自己要的名稱。 | * <code>cluster_name</code>改成自己要的名稱。 | ||
* <code>listen_address</code>改成自己的IP位置(但不能是<code>0.0.0.0</code>,有擋),這樣外部才能連線。可以考慮直接用<code>listen_interface</code>。 | * <code>listen_address</code>改成自己的IP位置(但不能是<code>0.0.0.0</code>,有擋),這樣外部才能連線。可以考慮直接用<code>listen_interface</code>。 | ||
* <code>rpc_address</code>也要改成自己的IP位置(也不能是<code>0.0.0.0</code>)。 | |||
* <code>seeds</code>改成第一台機器的IP位置與Port,這個參數只在第一次初始化整個Cassandra時用一次,後續的機器資訊都會存到硬碟裡。如果沒有用Cluster架構的話不需要改。 | * <code>seeds</code>改成第一台機器的IP位置與Port,這個參數只在第一次初始化整個Cassandra時用一次,後續的機器資訊都會存到硬碟裡。如果沒有用Cluster架構的話不需要改。 | ||
第59行: | 第62行: | ||
* <code>hints_compression</code>改用<code>LZ4Compressor</code>。 | * <code>hints_compression</code>改用<code>LZ4Compressor</code>。 | ||
* <code>internode_compression</code>改成<code>all</code>。 | * <code>internode_compression</code>改成<code>all</code>。 | ||
=== /etc/cassandra/jvm-server.options === | |||
記得把<code>jvm11-server.options</code>的內容複製進來,另外要注意JVM GC的部份: | |||
* Java 11預設用G1GC,一般建議是在記憶體比較充足的情況下選用(網路上有些文章是建議16GB以上),在記憶體比較小的時候會建議使用CMS。 | |||
=== 清掉初始資料 === | === 清掉初始資料 === | ||
第90行: | 第99行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
然後授權<code>alice</code>這個keyspace給<code>alice</code>這個使用者,並且給<code>bob</code>這個使用者查詢: | 請先重新登入確認這些使用者可以用,接著把<code>cassandra</code>這個使用者砍掉: | ||
<syntaxhighlight lang="sql"> | |||
DROP USER cassandra; | |||
</syntaxhighlight> | |||
然後 先建立對應的keyspace,並且 授權<code>alice</code>這個keyspace給<code>alice</code>這個使用者,並且給<code>bob</code>這個使用者查詢: | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
CREATE KEYSPACE alice WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3}; | |||
GRANT ALL ON KEYSPACE alice TO alice; | GRANT ALL ON KEYSPACE alice TO alice; | ||
GRANT SELECT ON KEYSPACE alice TO bob; | GRANT SELECT ON KEYSPACE alice TO bob; | ||
第126行: | 第142行: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
nodetool status | nodetool status | ||
</syntaxhighlight> | |||
利用profileload可以看到目前有哪些指令在跑(這個指令主要不是用來做這個用途的,只是目前沒有其他方法可以看): | |||
<syntaxhighlight lang="bash"> | |||
nodetool profileload | |||
</syntaxhighlight> | |||
== 操作 == | |||
=== 修復 === | |||
這邊提供的修復方式是直接放棄現有本地節點的資料,透過其他節點恢復,所以需要在資料有設定多份replication的前提下才能這樣用: | |||
* 移除<code>/var/lib/cassandra</code>,或是搬到<code>/var/lib/cassandra.old</code>(如果空間夠的話)。 | |||
* 到<code>/etc/cassandra/cassandra-env.sh</code>裡面的<code>JVM_OPTS</code>加上<code>-Dcassandra.replace_address=10.1.2.3</code>(自己的IP位置)。 | |||
* 重跑Cassandra。 | |||
接著應該會在<code>/var/log/cassandra/system.log</code>裡看到一些記錄,另外透過網路流量之類的資訊應該也可以看到正在同步。 | |||
=== 移除節點 === | |||
<syntaxhighlight lang="bash"> | |||
nodetool decommission | |||
</syntaxhighlight> | |||
=== 刪除節點 === | |||
<syntaxhighlight lang="bash"> | |||
nodetool removenode 01234567-89ab-cdef-0123-456789abcdef | |||
nodetool removenode status | |||
nodetool removenode force | |||
</syntaxhighlight> | |||
=== 清理節點的多餘資料 === | |||
<syntaxhighlight lang="bash"> | |||
nodetool cleanup | |||
</syntaxhighlight> | </syntaxhighlight> | ||
2022年7月11日 (一) 17:44的最新版本
Apache Cassandra是一套数据库。
需求
开机就大约吃1.3GB左右,用2GB内存机器开机完就已经有吃到Swap了,最好是4GB内存,我这边是用AWS的t4g.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
这边。