저는 현재 Azure에서 재해 복구 설정 작업을 진행 중이며 한 지역에서 Cassandra 클러스터가 실행되고 있습니다. 계획은 해당 지역에 오류가 발생하면 Azure Site Recovery를 활용하여 모든 머신을 보조 지역으로 장애 조치(failover)하는 것입니다.
각 영역에는 자체 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에서 실행되지 않는 이유를 아시나요?