「Apache Cassandra」:修訂間差異

出自Gea-Suan Lin's Wiki
跳至導覽 跳至搜尋
本頁面具有訪問限制。如果您看見此訊息,這代表您沒有訪問本頁面的權限。
 
(未顯示同一使用者於中間所作的 41 次修訂)
行 3: 行 3:
== 需求 ==
== 需求 ==


 開機就大約吃1.3GB左右,用2GB記憶體機器開機完就已經有吃到Swap了,最好是4GB記憶體,我這邊是用[[AWS]]的<code>t4g.medium</code>跑測試環境。
 開機就大約吃1.3GB左右,用2GB記憶體機器開機完就已經有吃到Swap了,最好是4GB記憶體,我這邊是用[[AWS]]的<code>t4g.medium</code>跑測試環境 ,不過當資料量夠大的時候4GB還是不太夠用,建議在正式環境下至少開到8GB的記憶體使用。
 
硬碟空間就是隨著資料量自己抓


== 安裝 ==
== 安裝 ==
行 13: 行 15:
</syntaxhighlight>
</syntaxhighlight>


 再來安裝Cassandra:
 再來安裝Cassandra 4


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
行 38: 行 40:
| 7199/tcp
| 7199/tcp
| JMX
| JMX
|
| 預設是聽<code>127.0.0.1</code>,不一定要開。
|-
|-
| 9042/tcp
| 9042/tcp
行 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架構的話不需要改。


 其他會改的:
 其他會改的:
行 58: 行 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。
=== 清掉初始資料 ===
要注意因為預設裝完Cassandra後會自動跑起來,會需要先清掉<code>/var/lib/cassandra</code>裡面的cluster資料:
<syntaxhighlight lang="bash">
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
</syntaxhighlight>
=== 帳號密碼 ===
Cassandra預設是不檢查帳號密碼的,需要修改設定:
* <code>authenticator</code>改成<code>PasswordAuthenticator</code>。
* <code>authorizer</code>改成<code>CassandraAuthorizer</code>。
* <code>role_manager</code>改成<code>CassandraRoleManager</code>(似乎已經是預設)。
重啟所有節點後,然後用預設的帳號密碼(都是<code>cassandra</code>)連進cluster:
<syntaxhighlight lang="bash">
cqlsh cassandra-1.example.com -u cassandra -p cassandra
</syntaxhighlight>
接下來可以設定最高使用者以及一般使用者:
<syntaxhighlight lang="sql">
CREATE USER root WITH PASSWORD 'rootpassword' SUPERUSER;
CREATE USER alice WITH PASSWORD 'alicepassword';
CREATE USER bob WITH PASSWORD 'bobpassword';
</syntaxhighlight>
請先重新登入確認這些使用者可以用,接著把<code>cassandra</code>這個使用者砍掉:
<syntaxhighlight lang="sql">
DROP USER cassandra;
</syntaxhighlight>
然後先建立對應的keyspace,並且授權<code>alice</code>這個keyspace給<code>alice</code>這個使用者,並且給<code>bob</code>這個使用者查詢:
<syntaxhighlight lang="sql">
CREATE KEYSPACE alice WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
GRANT ALL ON KEYSPACE alice TO alice;
GRANT SELECT ON KEYSPACE alice TO bob;
</syntaxhighlight>
== 常用指令 ==
=== cqlsh ===
使用cqlsh:
<syntaxhighlight lang="bash">
cqlsh cassandra-1.example.com -u root -p password
</syntaxhighlight>
列出所有的keyspace:
<syntaxhighlight lang="sql">
DESCRIBE keyspaces;
</syntaxhighlight>
使用<code>ks1</code>然後列出table:
<syntaxhighlight lang="sql">
USE ks1;
DESCRIBE tables;
</syntaxhighlight>
=== 其他指令 ===
看目前Cluster的狀態(透過JMX,需要在Cluster上的任意一台機器上存取<code>127.0.0.1:7199</code>):
<syntaxhighlight lang="bash">
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>
== 除錯 ==
可以翻翻<code>/var/log/cassandra</code>這邊。


== 連結 ==
== 連結 ==

於 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這邊。

連結