CLOVER🍀

That was when it all began.

CockroachDBクラスタヌで、ノヌドを増枛・廃止させおみる

これは、なにをしたくお曞いたもの

CockroachDBクラスタヌでノヌドの増枛を行っお、その挙動を芋おみようかなず。

ノヌドの远加ず削陀

ノヌドの远加は、cockroach startコマンドで既存のクラスタヌに参加すれば良さそうですね。

cockroach start | CockroachDB Docs

セキュアなクラスタヌの堎合は、SANを䜿っおあらかじめノヌド名を列挙しおおくか、ワむルドカヌドでノヌド名を
登録しおおくず良い気がしたすね。

cockroach cert / Node key and certificates

ノヌドをクラスタヌから切り離したり廃止、ドレむンする時にはcockroach nodeコマンドを䜿いたす。

cockroach node | CockroachDB Docs

Decommission Node

Decommission Nodeずいう蚀葉が、ドキュメントに出おきたした。

廃止されたノヌドのこずをDecommission Nodeずいい、廃止ノヌドになるシヌケンス䞭に再皌働させるこずを
Recommissionずいうみたいです。

Decommission Nodeに぀いおは、こちらに説明がありたす。

Decommission Nodes | CockroachDB Docs

説明を読んでいるず、クラスタヌから安党にノヌドを切り離す時に䜿いそうな感じがしたす。

ノヌドは、以䞋の2぀の条件を満たすず廃止されたDecommision Nodeになったずみなされるようです。

  • The node has completed the decommissioning process.
  • The node has been stopped and has not updated its liveness record for the duration configured via server.time_until_store_dead, which defaults to 5 minutes.

  • 廃止プロセスが完了した

  • ノヌドが停止しおいお、server.time_until_store_deadで蚭定した時間デフォルト5分、liveness recordを曎新しおいない堎合

廃止プロセス䞭は、ノヌド内のすべおのレンゞレプリカが他のノヌドに転送されたす。この最䞭、もしくは完了埌、
ノヌドは「廃止」ずみなされ、新しいSQL接続を受け付けたす。

デヌタは持っおいなくおも、Decommission Nodeは接続を目的のデヌタにルヌティングするゲヌトりェむずしお
機胜できるようです。

この最䞭に、埩垰Recommissionさせるこずもできるようです。

すべおのレンゞレプリカが転送された埌であれば、SIGTERMシグナルを送信するこずによっおGraceful Shutdownを
行うこずができたす。Graceful Shutdownが始たるず、ノヌドはクラむアント、SQL、リヌスをドレむンされ、
ヘルスチェックは503を返すようになりたす。ドレむン完了埌、liveness recordの曎新を停止し、
server.time_until_store_dead時間が経過埌、廃止されたdecommissionedず芋なされたす。

Decommission Nodeの泚意点

以䞋に、Decommission Nodenの泚意点が曞かれおいたす。

Decommission Nodes / Considerations

Decommision Nodeにするためには、他のノヌドがレプリカを匕き継げる必芁がありたす。

䟋はこちらに曞かれおいたすが

Decommission Nodes / Examples

3ノヌドで構成するクラスタヌでレプリケヌション係数が3の時に、ノヌドをひず぀廃止しようずするず、レンゞレプリカを
他のノヌドに移動できないため廃止プロセスはハングしたす。
※ひず぀のレンゞレプリカに、耇数同じデヌタを持おないため

レプリケヌションの詳现に぀いおは、こちら。

Replication Layer | CockroachDB Docs

では、ドキュメントからの情報はこれくらいにしお、詊しおいっおみたしょう。

なお、Decommision Nodeのこずは「廃止したノヌド」ずいった感じで曞くこずにしたす 。

環境

今回の環境は、こちら。

$ cockroach --version
cockroach version details:
Build Tag:        v21.2.3
Build Time:       2021/12/14 15:23:22
Distribution:     CCL
Platform:         linux amd64 (x86_64-unknown-linux-gnu)
Go Version:       go1.16.6
C Compiler:       gcc 6.5.0
Build Commit ID:  cb0222a1980b96ad59c181c96fab8340aa252571
Build Type:       release
(use 'cockroach version --build-tag' to display only the build tag)

CockroachDBのノヌドは、党郚で5぀甚意するこずにしたす。ノヌド名は、node1.cockroach〜node5.cockroachたでの
5぀ずしたす。

準備

たずは、セキュアなクラスタヌを構築しおおきたす。

CA蚌明曞の䜜成。

$ cockroach cert create-ca \
   --certs-dir=/var/lib/cockroach/security/certs \
   --ca-key=/var/lib/cockroach/security/ca/ca.key

ノヌドの蚌明曞は、DNSワむルドカヌドを䜿っお登録しおおくこずにしたす。

cockroach cert / Node key and certificates

$ cockroach cert create-node \
   localhost \
   *.cockroach \
   --certs-dir=/var/lib/cockroach/security/certs \
   --ca-key=/var/lib/cockroach/security/ca/ca.key

rootナヌザヌず、自前で䜜成するナヌザヌの蚌明曞を䜜成。

$ cockroach cert create-client \
   root \
   --certs-dir=/var/lib/cockroach/security/certs \
   --ca-key=/var/lib/cockroach/security/ca/ca.key

$ cockroach cert create-client \
   myuser \
   --certs-dir=/var/lib/cockroach/security/certs \
   --ca-key=/var/lib/cockroach/security/ca/ca.key

この/var/lib/cockroach/securityディレクトリは、党CockroachDBノヌドで共有しおいるものずしたす。

ずりあえず、3ノヌドでクラスタヌを構成したしょう。

## node1.cockroach
$ cockroach start \
   --certs-dir=/var/lib/cockroach/security/certs \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node1.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach


## node2.cockroach
$ cockroach start \
   --certs-dir=/var/lib/cockroach/security/certs \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node2.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach


## node3.cockroach
$ cockroach start \
   --certs-dir=/var/lib/cockroach/security/certs \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node3.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach

残り2぀のノヌドは、ただ䜿いたせん。

以降、/var/lib/cockroach/security/certsディレクトリを$CERTS_DIRず衚蚘したす。

$ CERTS_DIR=/var/lib/cockroach/security/certs

node1.cockroachで、クラスタヌを初期化。

$ cockroach init --certs-dir=$CERTS_DIR
Cluster successfully initialized

クラスタヌが構成されたした。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)

ナヌザヌも䜜成しお

$ cockroach sql --certs-dir=$CERTS_DIR -e 'create user myuser password "password"; grant admin to myuser;'

サンプルデヌタずしお、movrワヌクロヌドを登録したす。

$ cockroach workload init movr "postgresql://myuser@localhost:26257?sslcert=$CERTS_DIR/client.myuser.crt&sslkey=$CERTS_DIR/client.myuser.key&sslmode=verify-full&sslrootcert=$CERTS_DIR/ca.crt"

デヌタずしおは、これだけ入るようです。

I211219 10:36:24.783400 1 workload/workloadsql/dataload.go:146  [-] 1  imported users (0s, 50 rows)
I211219 10:36:24.843771 1 workload/workloadsql/dataload.go:146  [-] 2  imported vehicles (0s, 15 rows)
I211219 10:36:24.947685 1 workload/workloadsql/dataload.go:146  [-] 3  imported rides (0s, 500 rows)
I211219 10:36:25.047812 1 workload/workloadsql/dataload.go:146  [-] 4  imported vehicle_location_histories (0s, 1000 rows)
I211219 10:36:25.211770 1 workload/workloadsql/dataload.go:146  [-] 5  imported promo_codes (0s, 1000 rows)

cockroach node statusコマンドで、各ノヌドの状態を確認。

cockroach node | CockroachDB Docs

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 10:37:00.427624 |          |         true |    true |               30 |                    30 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 10:37:00.755195 |          |         true |    true |               23 |                    23 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 10:36:57.4232   |          |         true |    true |               20 |                    20 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
(3 rows)

デヌタの分垃状態の確認。

$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 3 | {1,2,3}
rides | 46 | 3 | {1,2,3}
rides | 95 | 3 | {1,2,3}
rides | 94 | 1 | {1,2,3}
rides | 92 | 3 | {1,2,3}
rides | 93 | 2 | {1,2,3}
rides | 90 | 3 | {1,2,3}
rides | 96 | 1 | {1,2,3}
rides | 91 | 2 | {1,2,3}
rides | 70 | 2 | {1,2,3}
user_promo_codes | 49 | 2 | {1,2,3}
users | 44 | 2 | {1,2,3}
users | 53 | 3 | {1,2,3}
users | 52 | 2 | {1,2,3}
users | 51 | 2 | {1,2,3}
users | 67 | 3 | {1,2,3}
users | 50 | 2 | {1,2,3}
users | 66 | 2 | {1,2,3}
users | 64 | 2 | {1,2,3}
users | 65 | 1 | {1,2,3}
vehicle_location_histories | 47 | 2 | {1,2,3}
vehicles | 45 | 3 | {1,2,3}
vehicles | 88 | 2 | {1,2,3}
vehicles | 87 | 2 | {1,2,3}
vehicles | 86 | 2 | {1,2,3}
vehicles | 68 | 1 | {1,2,3}
vehicles | 84 | 3 | {1,2,3}
vehicles | 89 | 2 | {1,2,3}
vehicles | 85 | 2 | {1,2,3}
vehicles | 69 | 2 | {1,2,3}

こちらは、以䞋のSQL文を䜿っおいたす。

SHOW RANGES | CockroachDB Docs

これで、準備完了です。

これ以降、cockroach start 以倖の cockroachコマンドは、すべおnode1.cockroachノヌドで実行しおいるものずしたす。

ノヌドを远加する

ではここで、ノヌドを远加しおみたしょう。

このクラスタヌに、node4.cockroachを远加しおみたす。node4.cockroachノヌドで、以䞋のコマンドを実行。

$ cockroach start \
   --certs-dir=$CERTS_DIR \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node4.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach

4ノヌドになりたした。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
   4
(4 rows)

cockroach node statusを芋るず、リバランスしおいっおいるのが確認できたす。

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 10:38:52.871152 |          |         true |    true |               23 |                    23 |     66 |                  0 |           0            |                63 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 10:38:48.748094 |          |         true |    true |               19 |                    19 |     64 |                  0 |           0            |                63 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 10:38:49.810784 |          |         true |    true |               17 |                    17 |     65 |                  0 |           0            |                64 |       false        |   active   |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 10:38:12.50393  | 2021-12-19 10:38:48.61277  |          |         true |    true |               14 |                    14 |     29 |                  0 |           0            |                29 |       false        |   active   |    false
(4 rows)

ノヌドが远加、停止した時のリバランスに぀いおは、こちらに蚘茉がありたす。

Overview / Membership changes: rebalance/repair

远加時は、こうですね。新しいスペヌスに察しおリバランスを行う、ずしか曞かれおいたせんが。

Nodes added: The new node communicates information about itself to other nodes, indicating that it has space available. The cluster then rebalances some replicas onto the new node.

最終的には、ここで萜ち着きたした。

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 10:40:09.346323 |          |         true |    true |               21 |                    21 |     56 |                  0 |           0            |                56 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 10:40:09.765978 |          |         true |    true |               21 |                    21 |     57 |                  0 |           0            |                57 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 10:40:10.808903 |          |         true |    true |               17 |                    17 |     56 |                  0 |           0            |                56 |       false        |   active   |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 10:38:12.50393  | 2021-12-19 10:40:09.584081 |          |         true |    true |               14 |                    14 |     50 |                  0 |           0            |                50 |       false        |   active   |    false
(4 rows)

デヌタの分垃の確認。

$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 4 | {1,3,4}
rides | 46 | 1 | {1,2,3}
rides | 95 | 2 | {1,2,3}
rides | 94 | 4 | {1,2,4}
rides | 92 | 3 | {1,2,3}
rides | 93 | 2 | {1,2,4}
rides | 90 | 3 | {2,3,4}
rides | 96 | 1 | {1,2,4}
rides | 91 | 3 | {1,2,3}
rides | 70 | 2 | {1,2,3}
user_promo_codes | 49 | 2 | {2,3,4}
users | 44 | 2 | {1,2,3}
users | 53 | 3 | {2,3,4}
users | 52 | 2 | {1,2,3}
users | 51 | 4 | {2,3,4}
users | 67 | 3 | {1,2,3}
users | 50 | 2 | {2,3,4}
users | 66 | 2 | {2,3,4}
users | 64 | 4 | {1,3,4}
users | 65 | 1 | {1,3,4}
vehicle_location_histories | 47 | 2 | {1,2,3}
vehicles | 45 | 3 | {1,2,3}
vehicles | 88 | 4 | {2,3,4}
vehicles | 87 | 3 | {1,3,4}
vehicles | 86 | 3 | {1,3,4}
vehicles | 68 | 1 | {1,3,4}
vehicles | 84 | 1 | {1,2,3}
vehicles | 89 | 2 | {1,2,4}
vehicles | 85 | 4 | {1,2,4}
vehicles | 69 | 2 | {1,2,4}

ノヌド蚌明曞にDNSワむルドカヌドを䜿っおおくず、ノヌド远加が楜にできたすね。

ノヌドを停止する

次に、クラスタヌからノヌドを匷制停止しお削陀しおみたす。

このテヌマに぀いおは、1床こちらで少し扱っおいるのですが。

CockroachDBで、データがどのノードに割り当てられているか確認する - CLOVER🍀

改めお、もう1床。

node4.cockroachで、cockroachプロセスをkillしおみたす。

$ kill `pgrep cockroach`

ちなみに、これだずGraceful Shutdownになるようですが 。

initiating graceful shutdown of server
server drained and shutdown completed

cockroach node statusで芋るず、membershipずis_drainingがfalseになっおいたす。離脱䞭、ですね。

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 10:44:52.822427 |          |         true |    true |               27 |                    27 |     56 |                  0 |           18           |                56 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 10:44:53.214879 |          |         true |    true |               25 |                    25 |     57 |                  0 |           17           |                57 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 10:44:49.81032  |          |         true |    true |               21 |                    21 |     56 |                  0 |           15           |                56 |       false        |   active   |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 10:38:12.50393  | 2021-12-19 10:44:15.548517 |          |        false |   false |               14 |                    14 |     50 |                  0 |           0            |                50 |       false        |   active   |    true
(4 rows)

他のノヌドは、ranges_underreplicatedずいう項目の数字が増えおいたす。これは、レプリカが䜿甚できないレンゞの数を
衚しおいたす。

この数字が0以倖の堎合は、クラスタヌがただ安定しおいないこずを衚しおいるようです。

この時、Web UIで芋るずSUSPECTずいう状態になっおいたす。

f:id:Kazuhira:20211219194825p:plain

さらにしばらく埅っおいるず、DEADになりたす。

f:id:Kazuhira:20211219194959p:plain

ステヌタスの遷移に時間がかかるのは、デヌタのリバランスを開始するたでに5分かけるから、みたいですね。

Nodes going offline: If a member of a Raft group ceases to respond, after 5 minutes, the cluster begins to rebalance by replicating the data the downed node held onto other nodes.

Overview / Membership changes: rebalance/repair

DEADになっおも、クラスタヌのメンバヌ䞀芧にはただ残ったたたです。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
   4
(4 rows)

cockroach node statusではこのようになりたす。ranges_underreplicatedが0になりたした。

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 10:50:48.310116 |          |         true |    true |               27 |                    27 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 10:50:48.727116 |          |         true |    true |               25 |                    25 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 10:50:45.332459 |          |         true |    true |               21 |                    21 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 10:38:12.50393  | 2021-12-19 10:44:15.548517 |          |        false |   false |               14 |                    14 |     50 |                  0 |           0            |                 0 |       false        |   active   |    true
(4 rows)

デヌタずしおも、リバランスが終わりたしたね。

$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 3 | {1,2,3}
rides | 46 | 1 | {1,2,3}
rides | 95 | 2 | {1,2,3}
rides | 94 | 1 | {1,2,3}
rides | 92 | 3 | {1,2,3}
rides | 93 | 2 | {1,2,3}
rides | 90 | 3 | {1,2,3}
rides | 96 | 1 | {1,2,3}
rides | 91 | 3 | {1,2,3}
rides | 70 | 2 | {1,2,3}
user_promo_codes | 49 | 2 | {1,2,3}
users | 44 | 2 | {1,2,3}
users | 53 | 3 | {1,2,3}
users | 52 | 2 | {1,2,3}
users | 51 | 2 | {1,2,3}
users | 67 | 3 | {1,2,3}
users | 50 | 2 | {1,2,3}
users | 66 | 2 | {1,2,3}
users | 64 | 1 | {1,2,3}
users | 65 | 1 | {1,2,3}
vehicle_location_histories | 47 | 2 | {1,2,3}
vehicles | 45 | 3 | {1,2,3}
vehicles | 88 | 2 | {1,2,3}
vehicles | 87 | 3 | {1,2,3}
vehicles | 86 | 3 | {1,2,3}
vehicles | 68 | 1 | {1,2,3}
vehicles | 84 | 1 | {1,2,3}
vehicles | 89 | 2 | {1,2,3}
vehicles | 85 | 2 | {1,2,3}
vehicles | 69 | 2 | {1,2,3}

ずころで、停止したノヌドは䞀芧から削陀できないのでしょうか

ここでcockroach node decommissionを䜿いたす。

$ cockroach node decommission --certs-dir=$CERTS_DIR 4

ドキュメントずしおは、こちらに蚘茉がありたす。

Decommission Nodes / Remove a single node (dead)

このコマンドのレスポンスは、このようになりたす。

  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  false  |        0 |        true        | decommissioning |    true
(1 row)

No more data reported on target nodes. Please verify cluster health before removing the nodes.

cockroach node statusの方では䟝然ずしお衚瀺されたすが、こちらは過去にいたノヌドの情報も含めお
衚瀺するからのようです。
※--decommissionたたは--allを䜿った堎合

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning |   membership   | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+----------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.258227 | 2021-12-19 11:06:06.296492 |          |         true |    true |               27 |                    27 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:06.646529 | 2021-12-19 11:06:06.706032 |          |         true |    true |               25 |                    25 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 10:36:07.746837 | 2021-12-19 11:06:07.817467 |          |         true |    true |               21 |                    21 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 10:38:12.50393  | 2021-12-19 11:05:10.77051  |          |        false |   false |             NULL |                  NULL |   NULL |               NULL |          NULL          |                 0 |        true        | decommissioned |    true
(4 rows)

これがノヌドの廃止、ですね。

ノヌドを廃止する

先ほどは、すでに停止したノヌドに察しおcockroach node decommissionを実行したした。
今床は、起動しおいるノヌドに察しお実行するケヌスを考えおみたしょう。

クラスタヌは再䜜成したした。クラスタヌおよびデヌタの状態。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:14.070428 | 2021-12-19 11:16:36.655673 |          |         true |    true |               26 |                    26 |     62 |                  0 |           29           |                67 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:15.943274 | 2021-12-19 11:16:34.035422 |          |         true |    true |               10 |                    10 |     37 |                  0 |           0            |                43 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:16.096537 | 2021-12-19 11:16:34.245839 |          |         true |    true |               15 |                    15 |     37 |                  0 |           0            |                43 |       false        |   active   |    false
(3 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 2 | {1,2,3}
rides | 46 | 2 | {1,2,3}
rides | 71 | 1 | {1,2,3}
rides | 70 | 2 | {1,2,3}
rides | 68 | 2 | {1,2,3}
rides | 69 | 1 | {1,2,3}
rides | 67 | 1 | {1,2,3}
rides | 60 | 1 | {1,2,3}
rides | 59 | 3 | {1,2,3}
rides | 81 | 2 | {1,2,3}
user_promo_codes | 49 | 2 | {1,2,3}
users | 44 | 1 | {1,2,3}
users | 53 | 3 | {1,2,3}
users | 52 | 3 | {1,2,3}
users | 51 | 2 | {1,2,3}
users | 66 | 2 | {1,2,3}
users | 50 | 2 | {1,2,3}
users | 65 | 3 | {1,2,3}
users | 64 | 3 | {1,2,3}
users | 74 | 3 | {1,2,3}
vehicle_location_histories | 47 | 2 | {1,2,3}
vehicles | 45 | 3 | {1,2,3}
vehicles | 80 | 1 | {1,2,3}
vehicles | 79 | 2 | {1,2,3}
vehicles | 55 | 3 | {1,2,3}
vehicles | 78 | 2 | {1,2,3}
vehicles | 54 | 3 | {1,2,3}
vehicles | 77 | 3 | {1,2,3}
vehicles | 75 | 3 | {1,2,3}
vehicles | 76 | 2 | {1,2,3}

新しくノヌドを远加したす。node4.cockroachで、ノヌドを起動。

$ cockroach start \
   --certs-dir=$CERTS_DIR \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node4.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach

クラスタヌぞの参加およびデヌタのリバランスが完了するたで埅ちたす。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
   4
(4 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:14.070428 | 2021-12-19 11:20:12.677242 |          |         true |    true |               22 |                    22 |     56 |                  0 |           0            |                56 |       false        |   active   |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:15.943274 | 2021-12-19 11:20:10.064974 |          |         true |    true |               19 |                    19 |     57 |                  0 |           0            |                57 |       false        |   active   |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:16.096537 | 2021-12-19 11:20:10.404194 |          |         true |    true |               18 |                    18 |     56 |                  0 |           0            |                56 |       false        |   active   |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 11:18:03.424437 | 2021-12-19 11:20:13.97675  |          |         true |    true |               14 |                    14 |     50 |                  0 |           0            |                50 |       false        |   active   |    false
(4 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 1 | {1,2,3}
rides | 46 | 1 | {1,2,4}
rides | 71 | 1 | {1,3,4}
rides | 70 | 2 | {2,3,4}
rides | 68 | 2 | {2,3,4}
rides | 69 | 4 | {1,2,4}
rides | 67 | 4 | {1,2,4}
rides | 60 | 1 | {1,2,4}
rides | 59 | 3 | {1,2,3}
rides | 81 | 3 | {1,3,4}
user_promo_codes | 49 | 2 | {2,3,4}
users | 44 | 4 | {1,3,4}
users | 53 | 3 | {2,3,4}
users | 52 | 3 | {2,3,4}
users | 51 | 1 | {1,2,3}
users | 66 | 3 | {1,3,4}
users | 50 | 1 | {1,3,4}
users | 65 | 3 | {2,3,4}
users | 64 | 3 | {2,3,4}
users | 74 | 2 | {2,3,4}
vehicle_location_histories | 47 | 2 | {2,3,4}
vehicles | 45 | 4 | {1,3,4}
vehicles | 80 | 1 | {1,2,4}
vehicles | 79 | 2 | {1,2,3}
vehicles | 55 | 1 | {1,2,4}
vehicles | 78 | 2 | {1,2,3}
vehicles | 54 | 1 | {1,2,3}
vehicles | 77 | 3 | {1,3,4}
vehicles | 75 | 3 | {1,2,3}
vehicles | 76 | 2 | {1,2,4}

ここで、ノヌドを廃止する際にはcockroach node decommissionか、cockroach node drainがありそうです。

$ cockroach node -h
List, inspect, drain or remove nodes.

Usage:
  cockroach node [command] [flags]
  cockroach node [command]

Available Commands:
  ls           lists the IDs of all nodes in the cluster
  status       shows the status of a node or all nodes
  decommission decommissions the node(s)
  recommission recommissions the node(s)
  drain        drain a node without shutting it down

〜省略〜

ここから参考にするドキュメントは、こちらです。

Decommission Nodes / Remove a single node (live)

たずはcockroach node decommissionから䜿っおみたしょう。

$ cockroach node decommission --certs-dir=$CERTS_DIR 4

コマンドを実行するず、察象のノヌドのレプリカがどんどん枛っおいく様子が衚瀺されたす。

  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |       50 |        true        | decommissioning |    false
(1 row)
..........
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |       48 |        true        | decommissioning |    false
(1 row)
...
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |       46 |        true        | decommissioning |    false
(1 row)
.......
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |       45 |        true        | decommissioning |    false
(1 row)
......
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |       44 |        true        | decommissioning |    false
(1 row)
........                                                                     

しばらく埅っおいるず、最終的にはレプリカが0になっお完了したす。

.......
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |        3 |        true        | decommissioning |    false
(1 row)
..........
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |        2 |        true        | decommissioning |    false
(1 row)
...........
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |        1 |        true        | decommissioning |    false
(1 row)
.............
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   4 |  true   |        0 |        true        | decommissioning |    false
(1 row)

No more data reported on target nodes. Please verify cluster health before removing the nodes.

デヌタもリバランスされ、ノヌドもクラスタヌから切り離されたした。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning |   membership   | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+----------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:14.070428 | 2021-12-19 11:26:30.621353 |          |         true |    true |               29 |                    29 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:15.943274 | 2021-12-19 11:26:32.508758 |          |         true |    true |               22 |                    22 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:16.096537 | 2021-12-19 11:26:32.685638 |          |         true |    true |               22 |                    22 |     73 |                  0 |           0            |                73 |       false        |     active     |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 11:18:03.424437 | 2021-12-19 11:25:09.355884 |          |        false |   false |             NULL |                  NULL |   NULL |               NULL |          NULL          |                 0 |        true        | decommissioned |    false
(4 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] |
 $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 1 | {1,2,3}
rides | 46 | 1 | {1,2,3}
rides | 71 | 1 | {1,2,3}
rides | 70 | 2 | {1,2,3}
rides | 68 | 2 | {1,2,3}
rides | 69 | 2 | {1,2,3}
rides | 67 | 1 | {1,2,3}
rides | 60 | 1 | {1,2,3}
rides | 59 | 3 | {1,2,3}
rides | 81 | 3 | {1,2,3}
user_promo_codes | 49 | 2 | {1,2,3}
users | 44 | 3 | {1,2,3}
users | 53 | 3 | {1,2,3}
users | 52 | 3 | {1,2,3}
users | 51 | 1 | {1,2,3}
users | 66 | 3 | {1,2,3}
users | 50 | 1 | {1,2,3}
users | 65 | 3 | {1,2,3}
users | 64 | 3 | {1,2,3}
users | 74 | 2 | {1,2,3}
vehicle_location_histories | 47 | 2 | {1,2,3}
vehicles | 45 | 1 | {1,2,3}
vehicles | 80 | 1 | {1,2,3}
vehicles | 79 | 2 | {1,2,3}
vehicles | 55 | 1 | {1,2,3}
vehicles | 78 | 2 | {1,2,3}
vehicles | 54 | 1 | {1,2,3}
vehicles | 77 | 3 | {1,2,3}
vehicles | 75 | 3 | {1,2,3}
vehicles | 76 | 2 | {1,2,3}

これで、ノヌドの廃止ができたした、ず。

次は、cockroach node drainの方を詊しおみるこずにしたす。

node5.cockroachで起動。

$ cockroach start \
   --certs-dir=$CERTS_DIR \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node5.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach

クラスタヌの状態。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
   5
(4 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning |   membership   | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+----------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:14.070428 | 2021-12-19 11:32:53.107335 |          |         true |    true |               24 |                    24 |     57 |                  0 |           0            |                57 |       false        |     active     |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:15.943274 | 2021-12-19 11:32:55.006681 |          |         true |    true |               15 |                    15 |     56 |                  0 |           0            |                56 |       false        |     active     |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:16.096537 | 2021-12-19 11:32:55.183922 |          |         true |    true |               18 |                    18 |     56 |                  0 |           0            |                56 |       false        |     active     |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 11:18:03.424437 | 2021-12-19 11:25:09.355884 |          |        false |   false |             NULL |                  NULL |   NULL |               NULL |          NULL          |                 0 |        true        | decommissioned |    false
   5 | node5.cockroach:26257 | node5.cockroach:26257 | v21.2.3 | 2021-12-19 11:31:40.591356 | 2021-12-19 11:32:57.133676 |          |         true |    true |               16 |                    16 |     49 |                  0 |           0            |                50 |       false        |     active     |    false
(5 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] |
 $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 5 | {1,2,5}
rides | 46 | 1 | {1,3,5}
rides | 71 | 1 | {1,2,3}
rides | 70 | 5 | {2,3,5}
rides | 68 | 1 | {1,3,5}
rides | 69 | 2 | {1,2,5}
rides | 67 | 3 | {1,3,5}
rides | 60 | 3 | {1,2,3}
rides | 59 | 3 | {1,2,3}
rides | 81 | 5 | {1,3,5}
user_promo_codes | 49 | 5 | {2,3,5}
users | 44 | 3 | {1,3,5}
users | 53 | 3 | {2,3,5}
users | 52 | 1 | {1,2,3}
users | 51 | 5 | {1,3,5}
users | 66 | 5 | {1,3,5}
users | 50 | 1 | {1,2,5}
users | 65 | 5 | {2,3,5}
users | 64 | 2 | {1,2,5}
users | 74 | 2 | {2,3,5}
vehicle_location_histories | 47 | 2 | {1,2,5}
vehicles | 45 | 1 | {1,2,3}
vehicles | 80 | 1 | {1,2,3}
vehicles | 79 | 2 | {2,3,5}
vehicles | 55 | 5 | {1,2,5}
vehicles | 78 | 2 | {1,2,5}
vehicles | 54 | 1 | {1,2,3}
vehicles | 77 | 3 | {2,3,5}
vehicles | 75 | 2 | {1,2,3}
vehicles | 76 | 5 | {1,2,5}

では、node5.cockroachをドレむンしおみたす。node1.cockroachから、node5.cockroachをドレむン。

$ cockroach node drain --certs-dir=$CERTS_DIR --host node5.cockroach
node is draining... remaining: 27
node is draining... remaining: 0 (complete)
ok

コマンド自䜓は、すぐに完了したす。

クラスタヌやデヌタの状態を芋おみたす。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
   5
(4 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning |   membership   | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+----------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:14.070428 | 2021-12-19 11:37:00.616747 |          |         true |    true |               30 |                    30 |     57 |                  0 |           0            |                57 |       false        |     active     |    false
   2 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:15.943274 | 2021-12-19 11:36:58.028884 |          |         true |    true |               20 |                    20 |     56 |                  0 |           0            |                56 |       false        |     active     |    false
   3 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 11:16:16.096537 | 2021-12-19 11:36:58.179227 |          |         true |    true |               23 |                    23 |     56 |                  0 |           0            |                56 |       false        |     active     |    false
   4 | node4.cockroach:26257 | node4.cockroach:26257 | v21.2.3 | 2021-12-19 11:18:03.424437 | 2021-12-19 11:25:09.355884 |          |        false |   false |             NULL |                  NULL |   NULL |               NULL |          NULL          |                 0 |        true        | decommissioned |    false
   5 | node5.cockroach:26257 | node5.cockroach:26257 | v21.2.3 | 2021-12-19 11:31:40.591356 | 2021-12-19 11:37:00.138004 |          |         true |    true |                0 |                     0 |     50 |                  0 |           0            |                50 |       false        |     active     |    true
(5 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 1 | {1,2,5}
rides | 46 | 1 | {1,3,5}
rides | 71 | 1 | {1,2,3}
rides | 70 | 2 | {2,3,5}
rides | 68 | 1 | {1,3,5}
rides | 69 | 2 | {1,2,5}
rides | 67 | 3 | {1,3,5}
rides | 60 | 3 | {1,2,3}
rides | 59 | 3 | {1,2,3}
rides | 81 | 3 | {1,3,5}
user_promo_codes | 49 | 2 | {2,3,5}
users | 44 | 3 | {1,3,5}
users | 53 | 3 | {2,3,5}
users | 52 | 1 | {1,2,3}
users | 51 | 1 | {1,3,5}
users | 66 | 3 | {1,3,5}
users | 50 | 1 | {1,2,5}
users | 65 | 3 | {2,3,5}
users | 64 | 2 | {1,2,5}
users | 74 | 2 | {2,3,5}
vehicle_location_histories | 47 | 2 | {1,2,5}
vehicles | 45 | 1 | {1,2,3}
vehicles | 80 | 1 | {1,2,3}
vehicles | 79 | 2 | {2,3,5}
vehicles | 55 | 2 | {1,2,5}
vehicles | 78 | 2 | {1,2,5}
vehicles | 54 | 1 | {1,2,3}
vehicles | 77 | 3 | {2,3,5}
vehicles | 75 | 2 | {1,2,3}
vehicles | 76 | 2 | {1,2,5}

特に、デヌタがリバランスされたりするこずはありたせんね。is_drainingはtrueになっおいたすが。

ここでもう1床drainの説明を芋おみたすが、あたり詳しく曞かれおいないようです。

  drain        drain a node without shutting it down

ただ、この時点でnode5.cockroachにはアクセスできなくなるようです。

$ cockroach node ls --certs-dir=$CERTS_DIR --host node5.cockroach
ERROR: cannot establish secure connection to insecure server.
Maybe use --insecure?

pq: SSL is not enabled on the server
Failed running "node ls"

この埌は、cockroach node decommissionでノヌド廃止、ですね。

$ cockroach node decommission --certs-dir=$CERTS_DIR 5

実際のリバランスは、こちらを契機に行われるようです。

なのですが、今回は途䞭で止たりたした 。なんなんでしょう 。

こちらを芋おいるず、cockroach node drainはより安党にノヌドを切り離したい堎合に䜿われるようですね。

If you need maximum cluster availability, you can run cockroach node drain prior to node shutdown and actively monitor the draining process instead of automating it.

Decommission Nodes / Step 4. Stop the decommissioning node

レプリケヌション係数を䞋回るように、ノヌドを廃止しおみる

こちらに曞かれおいるように、レプリケヌション係数を䞋回る状態になるように、ノヌドを廃止しおみたしょう。

Decommission Nodes / Considerations

たた3ノヌドの状態にしおおきたす。

~$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 12:07:53.270469 | 2021-12-19 12:13:17.318499 |          |         true |    true |               26 |                    26 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   2 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 12:07:54.800607 | 2021-12-19 12:13:18.87348  |          |         true |    true |               20 |                    20 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   3 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 12:07:54.994782 | 2021-12-19 12:13:19.084322 |          |         true |    true |               27 |                    27 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
(3 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'

table_name | range_id | lease_holder | replicas
promo_codes | 48 | 3 | {1,2,3}
rides | 46 | 3 | {1,2,3}
rides | 62 | 1 | {1,2,3}
rides | 60 | 3 | {1,2,3}
rides | 59 | 1 | {1,2,3}
rides | 87 | 3 | {1,2,3}
rides | 58 | 1 | {1,2,3}
rides | 88 | 1 | {1,2,3}
rides | 86 | 3 | {1,2,3}
rides | 61 | 2 | {1,2,3}
user_promo_codes | 49 | 3 | {1,2,3}
users | 44 | 2 | {1,2,3}
users | 67 | 2 | {1,2,3}
users | 66 | 3 | {1,2,3}
users | 64 | 3 | {1,2,3}
users | 53 | 1 | {1,2,3}
users | 50 | 3 | {1,2,3}
users | 52 | 2 | {1,2,3}
users | 51 | 2 | {1,2,3}
users | 65 | 1 | {1,2,3}
vehicle_location_histories | 47 | 3 | {1,2,3}
vehicles | 45 | 3 | {1,2,3}
vehicles | 57 | 3 | {1,2,3}
vehicles | 56 | 2 | {1,2,3}
vehicles | 55 | 2 | {1,2,3}
vehicles | 68 | 2 | {1,2,3}
vehicles | 54 | 1 | {1,2,3}
vehicles | 85 | 1 | {1,2,3}
vehicles | 84 | 2 | {1,2,3}
vehicles | 69 | 1 | {1,2,3}

ここでnode3.cockroachを廃止しようずしおみたす。

$ cockroach node decommission --certs-dir=$CERTS_DIR 3

するず、確かに進たなくなりたす。

$ cockroach node decommission --certs-dir=$CERTS_DIR 3

  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   3 |  true   |       73 |        true        | decommissioning |    false
(1 row)
.............

曞かれおいるずおりですね。

If no other nodes are available, the decommissioning process will hang indefinitely.

Decommission Nodes / Considerations

これが進むようにするには、新しくノヌドを远加する必芁がありたす。今回はnode4.cockroachを远加したしょう。

$ cockroach start \
   --certs-dir=$CERTS_DIR \
   --store=/var/lib/cockroach/data \
   --advertise-addr=node4.cockroach \
   --join=node1.cockroach \
   --join=node2.cockroach \
   --join=node3.cockroach

ノヌドを远加するず、ずっず停止しおいたノヌド廃止プロセスが動き出したす。

                                                                                                                                                             
  id | is_live | replicas | is_decommissioning |   membership    | is_draining                                                                               
-----+---------+----------+--------------------+-----------------+--------------                                                                             
   3 |  true   |       73 |        true        | decommissioning |    false                                                                                  
(1 row)                                                                                                                                                      
...........................                                                                                                                                  
  id | is_live | replicas | is_decommissioning |   membership    | is_draining                                                                               
-----+---------+----------+--------------------+-----------------+--------------                                                                             
   3 |  true   |       69 |        true        | decommissioning |    false
(1 row)
......
  id | is_live | replicas | is_decommissioning |   membership    | is_draining 
-----+---------+----------+--------------------+-----------------+--------------
   3 |  true   |       67 |        true        | decommissioning |    false
(1 row)
......

そしお完了。

.
  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   3 |  true   |        1 |        true        | decommissioning |    false
(1 row)

  id | is_live | replicas | is_decommissioning |   membership    | is_draining
-----+---------+----------+--------------------+-----------------+--------------
   3 |  true   |        0 |        true        | decommissioning |    false
(1 row)

No more data reported on target nodes. Please verify cluster health before removing the nodes.

新しく远加したノヌドでは、リバランスが進んでいきたす。

オマケ レプリケヌション係数を䞋回るように、ノヌドを匷制停止しおみる

最埌に、レプリケヌション係数を䞋回る堎合のノヌドの廃止はうたくいきたせんでしたが、プロセスを匷制的に
停止した堎合の動きを芋おみたしょう。

たずは、たた3ノヌドでクラスタヌを構築、デヌタをロヌド。

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)


$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission
  id |        address        |      sql_address      |  build  |         started_at         |         updated_at         | locality | is_available | is_live | replicas_leaders | replicas_leaseholders | ranges | ranges_unavailable | ranges_underreplicated | gossiped_replicas | is_decommissioning | membership | is_draining
-----+-----------------------+-----------------------+---------+----------------------------+----------------------------+----------+--------------+---------+------------------+-----------------------+--------+--------------------+------------------------+-------------------+--------------------+------------+--------------
   1 | node1.cockroach:26257 | node1.cockroach:26257 | v21.2.3 | 2021-12-19 12:32:20.252109 | 2021-12-19 12:33:23.386698 |          |         true |    true |               30 |                    30 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   2 | node3.cockroach:26257 | node3.cockroach:26257 | v21.2.3 | 2021-12-19 12:32:20.657242 | 2021-12-19 12:33:23.784939 |          |         true |    true |               23 |                    23 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
   3 | node2.cockroach:26257 | node2.cockroach:26257 | v21.2.3 | 2021-12-19 12:32:20.705223 | 2021-12-19 12:33:23.826301 |          |         true |    true |               20 |                    20 |     73 |                  0 |           0            |                73 |       false        |   active   |    false
(3 rows)


$ cockroach sql --certs-dir=$CERTS_DIR --user myuser --database movr --format tsv -e 'show ranges from database movr' | perl -anl -F'\t' -e 'print "$F[0] | $F[3] | $F[5] | $F[7]"'
table_name | range_id | lease_holder | replicas
promo_codes | 48 | 3 | {1,2,3}
rides | 46 | 2 | {1,2,3}
rides | 86 | 1 | {1,2,3}
rides | 85 | 2 | {1,2,3}
rides | 83 | 2 | {1,2,3}
rides | 84 | 2 | {1,2,3}
rides | 81 | 2 | {1,2,3}
rides | 88 | 1 | {1,2,3}
rides | 82 | 2 | {1,2,3}
rides | 87 | 1 | {1,2,3}
user_promo_codes | 49 | 2 | {1,2,3}
users | 44 | 1 | {1,2,3}
users | 55 | 1 | {1,2,3}
users | 54 | 2 | {1,2,3}
users | 52 | 1 | {1,2,3}
users | 53 | 1 | {1,2,3}
users | 50 | 3 | {1,2,3}
users | 66 | 3 | {1,2,3}
users | 64 | 3 | {1,2,3}
users | 65 | 1 | {1,2,3}
vehicle_location_histories | 47 | 1 | {1,2,3}
vehicles | 45 | 2 | {1,2,3}
vehicles | 79 | 3 | {1,2,3}
vehicles | 78 | 3 | {1,2,3}
vehicles | 76 | 2 | {1,2,3}
vehicles | 77 | 3 | {1,2,3}
vehicles | 74 | 2 | {1,2,3}
vehicles | 80 | 3 | {1,2,3}
vehicles | 75 | 3 | {1,2,3}
vehicles | 67 | 3 | {1,2,3}

node2.cockroachずnode3.cockroachを停止しおみたす。

## node2.cockroach
$ kill `pgrep cockroach`


## node3.cockroach
$ kill `pgrep cockroach`

この状態になるず、cockroach node lsのレスポンスは返っおきたすが

$ cockroach node ls --certs-dir=$CERTS_DIR
  id
------
   1
   2
   3
(3 rows)

cockroach node statusなどは、応答が返っおこなくなりたす。

$ cockroach node status --certs-dir=$CERTS_DIR --ranges --decommission

これは、レプリケヌション係数を䞋回った堎合はハングアップするずいうこずでしょうかね 。

To be able to tolerate the failure of any 1 node, use at least 3 nodes with the default 3-way replication factor. In this case, if 1 node fails, each range retains 2 of its 3 replicas, a majority.

Deploy CockroachDB On-Premises / Requirements

たずめ

CockroachDBで、ノヌドの増枛や廃止あたりを觊っおみたした。

ノヌドが停止しただけだずクラスタヌからノヌドがいなくなったこずにはならなかったりず、ちゃんず動きを把握しお
いないずいけなさそうなずころがいく぀かあり。

実際䜿おうず思ったら、このあたりしっかり芋おおかないずですね。