なにしてるの

  • errant transaction の検知
  • errant transaction の修正
  • can-replicate-from-gtid を叩く

errant transaction の検知

function check_errant {
for cluster in "${CLUSTERS[@]}"
do
replicas=( $( orchestrator -c which-replicas -i "${cluster}") )
for replica in "${replicas[@]}"
do
local result=$( orchestrator -c which-gtid-errant -i "${replica}" )
if [ -n "${result}" ]; then
inject_empty_transaction "${replica}"
fi
done
done
}

レプリカが errant transaction を持っていた場合は、
inject_empty_transaction を実行する。

local result=$( orchestrator -c which-gtid-errant -i "${replica}" )
if [ -n "${result}" ]; then
inject_empty_transaction "${replica}"
fi

errant transaction の修正

function inject_empty_transaction {
local replica="${1}"
orchestrator -c gtid-errant-inject-empty -i "${replica}"
}

なんで問答無用で inject empty transaction してるかというと、、、
次の記事に書く予定。

can-replicate-from-gtid を叩く

function can_replicate {
for cluster in "${CLUSTERS[@]}"
do
replicas=( $( orchestrator -c which-replicas -i "${cluster}") )
for replica_i in "${!replicas[@]}"
do
for other_i in "${!replicas[@]}"
do
if [ ${replica_i} -eq ${other_i} ]; then
continue
fi
source_replica="${replicas[${replica_i}]}"
destination="${replicas[${other_i}]}"
set +e
result=$( orchestrator -c can-replicate-from-gtid -i "${source_replica}" -d "${destination}" )
if [ $? -ne 0 ]; then
echo -e "${source_replica} to ${destination} cannot replicate\nError: ${result}\nCheck errant gtid http://prd-orchestrator01.mogg.qualiarts.vm.tky02a.cycloud.io:3000/web/cluster/alias/prd-dbs07"
exit 2
fi
set -e
done
done
done
}

マスターを除く全てのレプリカ同士でレプリケーションが貼れるかどうかを調べる。

Mackerel で使う

[plugin.checks.can_replicate_from_gtid]
command = "bash /usr/local/bin/canreplicate.sh"
notification_interval = 10
max_check_attempts = 3
check_interval = 3

max_check_attempts = 3 こうしてるのはタイミング悪いと can-replicate-from-gtid が失敗するから(register-candidate とタイミングが被ると良くないっぽい)