私は現在、Azureで災害復旧設定作業を行っていますが、ある地域でCassandraクラスタが実行されています。計画は、地域に障害が発生した場合にAzure Site Recoveryを利用して、すべてのマシンをセカンダリ地域にフェールオーバーすることです。
各ゾーンには独自のIPセットがあり、ゾーンAは10.1.0.x、ゾーンBは10.2.0.xであるとします。
これはcassandra.yamlファイルを変更する必要があることを意味するので、起動時に次のエントリを変更するcrontabを使用して実行される単純なファイルを作成しました。
- seeds: 10.1.0.101,10.1.0.102,10.1.0.103
rpc_address: 10.1.0.101
listen_address: 10.1.0.101
セカンダリサイトで、次の操作を行います。
- seeds: 10.2.0.101,10.2.0.102,10.2.0.103
rpc_address: 10.2.0.101
listen_address: 10.2.0.101
シードは固定されたリストなので、このようにしました。
# get node IP address
IPADDR=$(ip addr show eth0 | grep 'inet ' | cut -d' ' -f6 | awk '{ print $1}' | cut -d'/' -f1)
# breakdown IP address into IP blocks of sec1.sec2.sec3.sec4
slice="$IPADDR"
count=1
while [ "$count" -le 4 ]
do
declare sec"$count"="${slice%%.*}"
slice="${slice#*.}"
count=$((count+1))
done
# check the sec2 block of the IP and define the IP seed list
if [[ $sec2 == 2 ]]
then
### the below seed list is only for use in ASR testing - need to reconfigure this when running failover/failback in actual production
SEED="10.1.0.101,10.1.0.102,10.1.0.103"
else
SEED="10.2.0.101,10.2.0.102,10.2.0.103"
fi
#change the seed list, rpc_address and listen_address of each cassandra nodes
sed -i "0,/^\s* - seeds:.*/s// \ \- seeds: $SEED/" /etc/cassandra/conf/cassandra.yaml
この部分は正常に機能し、VMをフェイルオーバーするとシードリストが正しく変更されます。
rpc_address と listening_address について次のようにします。
LOCALIPADDR=$(ip addr show eth0 | grep 'inet ' | cut -d' ' -f6 | awk '{ print $1}' | cut -d'/' -f1)
sed -i "0,/^rpc_address:.*/s//rpc_address: $LOCALIPADDR/" /etc/cassandra/conf/cassandra.yaml
sed -i "0,/^listen_address:.*/s//listen_address: $LOCALIPADDR/" /etc/cassandra/conf/cassandra.yaml
シェルからスクリプトを実行すると、うまく動作します。 rpc_address と listening_address の両方が IP アドレスに基づいて更新されます。しかし、起動時にcrontabを実行すると、私が得るものは
rpc_address:
listen_address:
ファイルにリストされているIPアドレスがありません。
クローンタブはこんな感じです。
@reboot /bin/sh /etc/cassandra/conf/asr-address-conf.sh
スクリプトがcrontabで実行されない理由をご存知ですか?