electionしようと思ったら難しかった話あるクラスタ内に複数ノードがあり、そのうち高々1ノードのみがサービスを提供する仕組みを作りたいと思いました。これはetcdを使うとかんたんに実装できるんじゃないかとおもい試してみました。swapのAPIがあり、キーの前の値や無い時のみにキーを更新できます。electionして、leaderになった後にサービスを起動する仕組みを考えました。他の場所でもよくみる方法だったので、これを使えば実現できるんじゃないかと思い実装してみました。https://github.com/coreos/etcd/issues/225https://www.sandtable.com/etcd3-leader-election-using-python/試しに次のようなシェルスクリプトを書いてみました。結果から言うと、これは正しく動きません。electionでは、TTLを使ってleaderを表すkeyを作り、クライアントはTTL未満でそのノードを上書きし続けます。somethingまでに)ノードがTTLの時間以上停止してしまうとetcdからkeyが消えます。somethingの部分を実行します。TTLベースでlockを取ると上記のことは避けられないようで、別の箇所で回避する必要があります。KubernetesやKafkaでは楽観的ロックを使って複数からのデータ更新を防いでます。うーん分散システムは難しい。(@ueokande)Webの会社のミドルウェアエンジニア。