天天看點

故障分析 | cassandra 叢集資料故障轉移

作者:愛可生

作者:楊文

DBA,負責客戶項目的需求與維護,會點資料庫,不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。

本文來源:原創投稿

* 愛可生開源社群出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。

一、前情提要:

我們知道 cassandra 具有分區容錯性和強一緻性,但是當資料所在主機發生故障時,該主機對應的資料副本該何去何從呢?是否跟主控端一樣變得不可用呢?想知道答案的話,就跟我一起往下看吧。

二、實驗環境:

叢集模式下跨資料中心:

資料中心 節點IP 種子節點 DC1 10.186.60.61、10.186.60.7、10.186.60.118、10.186.60.67 10.186.60.61、10.186.60.7 DC2 10.186.60.53、10.186.60.65、10.186.60.94、10.186.60.68 10.186.60.53、10.186.60.65

首先一起來瞅一瞅節點加入叢集過程中的 owns 變化:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.7    88.29 KiB  16      46.0%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  69.07 KiB  16      37.7%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.25 KiB  16      34.2%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.65   69.04 KiB  16      41.4%             89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   83.18 KiB  16      41.7%             7c91c707-abac-44f2-811O-b18f03f03d13  rack2

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.67   74.01 KiB  16      24.7%             9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    88.29 KiB  16      27.5%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  83.16 KiB  16      28.9%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.25 KiB  16      30.3%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.65   83.17 KiB  16      27.7%             89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   83.18 KiB  16      29.8%             7c91c707-abac-44f2-811O-b18f03f03d13  rack2
UN  10.186.60.94   69.05 KiB  16      31.1%             c8fa86e4-ee9a-4c62-b00b-d15edc967b9f  rack2

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.67   74.01 KiB  16      21.4%             9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    88.29 KiB  16      25.2%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  83.16 KiB  16      27.1%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   83.19 KiB  16      28.9%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.186.60.68   88.55 KiB  16      21.6%             a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   83.17 KiB  16      24.0%             89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   83.18 KiB  16      25.4%             7c91c707-abac-44f2-811O-b18f03f03d13  rack2
UN  10.186.60.94   69.05 KiB  16      26.4%             c8fa86e4-ee9a-4c62-b00b-d15edc967b9f  rack2           

可以看到,剛建立的叢集,owns 的總和時刻保持在 200% ,但單個資料中心的 owns 不是 100% 。

三、具體實驗:

3.1、實驗1:

[cassandra@data01 ~]$ cqlsh 10.186.60.61 -u cassandra -p cassandra
CREATE KEYSPACE "dcdatabase" WITH REPLICATION = {'class':'NetworkTopologyStrategy', 'dc1' : 4, 'dc2' : 4};
use dcdatabase;
create table test (id int, user_name varchar, primary key (id) );
insert into test (id,name) VALUES (1,'test1');
insert into test (id,name) VALUES (2,'test2');
insert into test (id,name) VALUES (3,'test3');
insert into test (id,name) VALUES (4,'test4');
insert into test (id,name) VALUES (5,'test5');
           

檢視叢集狀态:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      100.0%            9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    88.29 KiB  16      100.0%            4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      100.0%            c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.37 KiB  16      100.0%            af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.23 KiB  16      100.0%            a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   83.17 KiB  16      100.0%            89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.36 KiB  16      100.0%            7c91c707-abac-44f2-811O-b18f03f03d13  rack2
UN  10.186.60.94   74.23 KiB  16      100.0%            c8fa86e4-ee9a-4c62-b00b-d15edc967b9f  rack2
           

可以看到叢集中,每個資料中心的 owns 都是 400% ,符合四副本的設定;

檢視資料在節點上的分布情況:

[cassandra@data01 ~]$ nodetool getendpoints dcdatabase test 1
10.186.60.7
10.186.60.94
10.186.60.65
10.186.60.118
10.186.60.67
10.186.60.61
10.186.60.53
10.186.60.68
[cassandra@data03 ~]$ nodetool getendpoints dcdatabase test 5
10.186.60.67
10.186.60.94
10.186.60.7
10.186.60.53
10.186.60.65
10.186.60.118
10.186.60.61
10.186.60.68
           

可以看到叢集資料分布在所有資料中心的所有節點上,符合資料的分布原理。

測試并檢視叢集中出現故障節點後的資料分布情況:

94機器關閉服務:systemctl stop cassandra

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      100.0%            9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    88.29 KiB  16      100.0%            4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      100.0%            c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.37 KiB  16      100.0%            af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.23 KiB  16      100.0%            a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   83.17 KiB  16      100.0%            89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.36 KiB  16      100.0%            7c91c707-abac-44f2-811O-b18f03f03d13  rack2
DN  10.186.60.94   74.23 KiB  16      100.0%            c8fa86e4-ee9a-4c62-b00b-d15edc967b9f  rack2
           

可以看到,94節點已經宕掉,但是 dc2 資料中心的 owns 分布并未改變。

檢視資料分布在哪個節點:

[cassandra@data01 ~]$ nodetool getendpoints dcdatabase test 5
10.186.60.67
10.186.60.94
10.186.60.7
10.186.60.53
10.186.60.65
10.186.60.118
10.186.60.61
10.186.60.68
           

可以看到,資料仍分布在94節點上;

把故障節點94移除叢集:

[cassandra@data02 ~]$ nodetool removenode c8fa86e4-ee9a-4c62-b00b-d15edc967b9f
           

檢視叢集狀态:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      100.0%            9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    88.29 KiB  16      100.0%            4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      100.0%            c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.37 KiB  16      100.0%            af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.23 KiB  16      100.0%            a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   83.17 KiB  16      100.0%            89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.36 KiB  16      100.0%            7c91c707-abac-44f2-811O-b18f03f03d13  rack2
           
[cassandra@data02 ~]$ nodetool getendpoints dcdatabase test 5
10.186.60.67
10.186.60.7
10.186.60.53
10.186.60.65
10.186.60.118
10.186.60.61
10.186.60.68
           

可以看到,資料不在94節點上了;

說明:對于 cassandra 停止服務或移出叢集,仍是可以使用的,隻是不能登入自己的 cassandra 資料庫,但仍可以登入其他 cassandra 資料庫。

3.2、實驗2:

CREATE KEYSPACE "dcdatabase" WITH REPLICATION = {'class':'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 3};
           

檢視叢集狀态:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      73.2%             9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    89.39 KiB  16      74.7%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      77.4%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.42 KiB  16      74.7%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.22 KiB  16      100.0%            a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   84.14 KiB  16      100.0%            89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.30 KiB  16      100.0%            7c91c707-abac-44f2-811O-b18f03f03d13  rack2
           

可以看到叢集中,每個資料中心的 owns 都是 300% ,符合三副本的設定;

測試并檢視叢集中出現故障節點後的資料分布情況:

94機器關閉服務,并移除叢集:

[cassandra@data02 ~]$ nodetool removenode c8fa86e4-ee9a-4c62-b00b-d15edc967b9f
           

檢視叢集狀态:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      73.2%             9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    89.39 KiB  16      74.7%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      77.4%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.42 KiB  16      74.7%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.22 KiB  16      100.0%            a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   84.14 KiB  16      100.0%            89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.30 KiB  16      100.0%            7c91c707-abac-44f2-811O-b18f03f03d13  rack2
           

此時,資料不在94節點上了,故障節點上的資料已移動到其他節點上,是以可以看到,在 dc1 資料中心中,資料随機仍隻分布在其中三個節點上,而 dc2 資料中心的資料将分布在了僅有的三個節點上,發生了資料轉移;

如果此時 dc2 資料中心還有節點繼續故障,那麼故障節點上的資料不可能再移動到其他節點上了,dc1 是不變的,owns 還是300% ,但是 dc2 的 owns都是100% ,沒辦法故障轉移了,隻能存在自身的資料了;

此時重新開機所有主機,所有主機 Cassandra 服務都會開啟,包括之前故障模拟的節點也會自啟,那麼此時就會達到了另一種效果:故障模拟節點後的狀态,再添加到了叢集中,那麼此時資料又會進行了自動的分發。

檢視叢集狀态:

[cassandra@data01 ~]$ nodetool status
Datacenter: dc1
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.67   96.55 KiB  16      73.2%             9d6d759b-c00c-488b-938d-3e1ef9b92b02  rack1
UN  10.186.60.7    89.39 KiB  16      74.7%             4702178e-9878-48dc-97e7-9211b7c9f2e7  rack1
UN  10.186.60.118  88.33 KiB  16      77.4%             c920c611-2e8b-472d-93a4-34f1abd5b207  rack1
UN  10.186.60.61   88.42 KiB  16      74.7%             af2e0c42-3a94-4647-9716-c484b690899i  rack1

Datacenter: dc2
=================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  owns (effective)  Host ID                               Rack
UN  10.186.60.68   74.22 KiB  16      73.2%             a7307228-62bb-4354-9853-990cac9614ab  rack2
UN  10.186.60.65   84.14 KiB  16      74.7%             89683bf8-aff8-4fdc-9525-c14764cf2d4f  rack2
UN  10.186.60.53   88.30 KiB  16      74.7%             7c91c707-abac-44f2-811O-b18f03f03d13  rack2
UN  10.186.60.94   90.12 KiB  16      77.4%             c8fa86e4-ee9a-4c62-b00b-d15edc967b9f  rack2
           

繼續閱讀