Cassandra經常被問到的問題(一)

1、爲什麼不可以設置listen_address爲0.0.0.0(意思是監聽所有地址)?

Cassandra是一個基於gossip協議的分佈式系統,監聽地址是用來告訴其它節點來訪問的,告訴別的節點說“連接我任何地址都可以”,是一個糟糕的想法,如果集羣中不同的節點使用了不同方式的地址,悲劇的事情就要發生了。

如果你不想爲你集羣中的每個節點單獨配置ip(非常可以理解),你可以不配,空着它,Cassandra將會使用InetAddress.getLocalHost()來選擇地址,然後只要你或者你的運維團隊保證這個是正確的(/etc/hosts/,dns 等等要配置對)。

一個例外是JMX,他默認監聽的地址是0.0.0.0(這個是java的bug 6425769)

請看CASSANDRA-256 和 CASSANDRA-43獲取這方面更多的細節。

2、cassandra用了哪些端口?

默認Cassandra使用7000作爲集羣通信端口(如果開啓了SSL就是7001端口)。9042端口用於native協議的客戶端連接。7199端口用於JMX,9160端口用於廢棄的Thrift接口。內部節點通信以及native協議的端口在cassandra配置文件裏可以配置。JMX端口可以在cassandra-env.sh配置(通過JVM的參數)。所有端口都是TCP的。

3、當往集羣中增加新節點的時候,對於存在的數據發生了什麼?

當一個新節點加入到集羣,它將會自動連接集羣中的其它節點,並且去複製正確的數據到本地,同樣的增加、替換、移動、刪除節點都是這樣的。

4、我刪除了數據,但是磁盤使用率沒有變化,這是爲什麼?

寫入到cassandra裏的數據會被持久化到SSTable文件裏,SSTable文件是不可改變的,也就是說當你執行刪除的時候,數據不會從文件中被去除掉的。相反,一個標記(也叫tombstone)會被寫入用於標記對應記錄的新狀態。不用擔心,當數據和tombstone發生第一次compaction的時候,數據會被刪除掉,相應的磁盤空間也被回收,你可以瞭解關於Compaction的更多細節。

5、爲什麼用nodetool ring只能看到一條記錄? 即便所有節點輸出的日誌裏可以看出,他們都發現彼此加入到了這個ring。

這個發生於你的所有節點都配了通用的token,不要這麼做。

這經常發生於哪些使用VM部署cassandra的用戶,(特別是使用Debian package,它會在安裝完自動啓動cassandra,所以會生成token並保存它。),安裝好後就把VM整個克隆出另外的節點。

增很容易修復,只要把數據目錄以及commitlog目錄刪除,然後保證每個節點是隨機生成的token,再啓動就可以了。

6、我可以修改一個正在運行中的集羣中的keyspace的副本因子嗎?

可以,但是修改後需要執行repair或者cleanup來改變已存數據的副本個數。

首先使用cqlsh修改目標keyspace的副本因子。
如果你是減少副本因子,你可以執行nodetool cleanup去刪除多餘的副本數據,對每個節點都要執行。

如果你是增加副本因子,你需要執行nodetool repair來保證數據的副本個數滿足當前的配置。 Repair只要對每個副本集執行一次即可。這是個敏感的操作,這會影響集羣的性能。強烈建議執行rolling repair,因爲試圖一次修復整個集羣的話,那可能是個坑。

7 可以使用cassandra存儲大的二進制字段嗎?

Cassandra並沒有對存儲大文件或者二進制,以及這樣一個二進制數據被經常讀,也就是整個發送到客戶端的情況進行優化。因爲存儲小的二進制數據(小於1MB)應該不是問題。但是還是建議把大的二進制數據分隔成小塊。

需要特別注意的是,任何大於16MB的值,將被Cassandra拒絕掉,這是由max_mutation_size_in_kb配置項決定的(這個配置項默認是commitlog_segment_size_in_mb的一半,commitlog_segment_size_in_mb默認是32M)。

8、Nodetool連接遠程服務器的時候,提示“Connection refused to host: 127.0.1.1” ,這是爲什麼?

nodetool依賴JMX,JMX依賴RMI。RMI在兩端通信的時候會根據需要創建自己的listenners和connectors。通常,這些都是底層透明的,但是不正確的hostname解析,無論是在連接方還是被連接方,都會導致錯亂和這樣的拒絕異常。

如果你在使用DNS。確保兩端機器的/etc/hosts文件是正確的。如果還是失敗的,你可以嘗試通過jvm選項-Djava.rmi.server.hostname=指定你要連接的遠程機器名稱給JMX接口,配置項大體在cassandra-env.sh文件的靠下的位置。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章