2013-03-12 49 views
3

作爲生產問題的一部分,我們希望將生產1.0.9集羣升級到1.2.1/2。Cassandra 1.0.9集羣的滾動升級到1.2.1

雖然在我們的開發環境中測試升級,我發現了以下情況例外,而這樣做使用CLI一個簡單的列表操作升級的集羣節點之一的:(只是一個節點出3升級)

[[email protected]] list testCF; 
Using default limit of 100 
Using default column limit of 100 
null 
TimedOutException() 
at org.apache.cassandra.thrift.Cassandra$get_range_slices_result.read(Cassandra.java:12932) 
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_range_slices(Cassandra.java:734) 
at org.apache.cassandra.thrift.Cassandra$Client.get_range_slices(Cassandra.java:718) 
at org.apache.cassandra.cli.CliClient.executeList(CliClient.java:1485) 
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:272) 
at org.apache.cassandra.cli.CliMain.processStatementInteractive(CliMain.java:210) 
at org.apache.cassandra.cli.CliMain.main(CliMain.java:337) 

我得到運行非升級的節點上同一列表的操作(1.0.9)相同的異常:

[[email protected]] list testCF; 
Using default limit of 100 
null 
TimedOutException() 
at org.apache.cassandra.thrift.Cassandra$get_range_slices_result.read(Cassandra.java:12830) 
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_range_slices(Cassandra.java:762) 
at org.apache.cassandra.thrift.Cassandra$Client.get_range_slices(Cassandra.java:734) 
at org.apache.cassandra.cli.CliClient.executeList(CliClient.java:1390) 
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:269) 
at org.apache.cassandra.cli.CliMain.processStatementInteractive(CliMain.java:220) 
at org.apache.cassandra.cli.CliMain.main(CliMain.java:348) 

當嘗試另一個1.0.9節點我沒有得到任何錯誤,在同一列表的操作,我假設此節點擁有唯一的副本:

[[email protected]] list testCF; 
Using default limit of 100 
------------------- 
RowKey: 0a 
=> (column=0a, value=0a, timestamp=1362642828623000) 

1 Row Returned. 
Elapsed time: 11 msec(s). 

我正在使用的testCF只有一個鍵和值,超時異常 是一致的。 我使用的複製因子爲1,但所有三個節點似乎都已啓動,並且 已同步。

它似乎是最簡單的升級版本,可以從1.0.3開始,從 1.2.1/2開始,它仍然無法使用範圍(?)掃描。 從cql客戶端使用select *查詢時發生同樣的錯誤。 我沒有做任何特殊的測試,所以我猜這個問題應該發生在 任何從1.0.9升級,這將是很容易重現。

nodetool環顯示所有節點都在運行(所有節點上運行):

-bash-4.1$ nodetool -h localhost ring 

Datacenter: US 
========== 
Replicas: 1 

Address Rack Status State Load Owns Token 
113427455640312821154458202477256070485 
33.33.33.2 RAC1 Up Normal 39.31 KB 33.33% 0 
33.33.33.3 RAC1 Up Normal 63.39 KB 33.33% 567137278201564105772291
33.33.33.4 RAC1 Up Normal 63.39 KB 33.33% 113427455640312821154458202477256070485 

一旦我完成所有節點上的升級,集羣恢復到正常的。

這是爲什麼? 它不應該那樣?對?根據我的理解,Cassandra應該能夠支持像這樣的滾動升級,對吧? 如果有人遇到這個問題,或者認爲他知道問題可能是什麼, 請指教, 或。

+0

你在cassandra日誌中遇到錯誤嗎?通常,一致的超時異常意味着存在異常。日誌通常位於/var/log/cassandra/system.log中。 – Richard 2013-03-12 15:45:38

回答

0

滾動升級是可能的,我一直在做。你可能不應該跳過兩個主要版本1.0 - 1.2。我知道它被歸類爲一個點的發佈,但很多改變。

您應該滾動升級到1.1.X,然後在所有節點上運行upgradesstables,然後在所有節點上進行修復。

然後滾動升級到1.2.X,然後在所有節點上運行upgradedesstables,然後在所有節點上修復。

因此,支持滾動更新,但您應該以合理的方式來降低風險。你的3個節點集羣不應該花很長時間。