なにしてるの
- 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 とタイミングが被ると良くないっぽい)