That's Done!

thatsdone's (mostly technical) memorandum

[ja] pythonからetcdを使いたい


今回は、これまでqiitaやらblogspotに記事を書いてきた記事をここに集約するシリーズではなく今年になってから気づいた話。

Kubernetesの制御データを置くのにetcdを使っていることもあって、etcdをデータベースにして分散制御するというのはよくある話だと思います。

Pythonの場合、Pypiで探してみると、元々...というか、etcd 2.x時代くらいまではこれが

使われていたようですが、残念ながら(?)2014年でリリースが止まっており、現在はこちらがつかわれているようです。フルスクラッチで作り直しているようですね。

Pypiのページにもサンプルが載っていますが、素直で使いやすい仕様で作られているように思います。

さて、私は、3ノードのetcdサーバのどれか1台が倒れても、もろもろ処理継続できる実験をしたかったのでした。

それで当初は、readthedocsのmanualにあるetcd3.Etcd3Clientの仕様を眺めながら、「あれ?3ノードにコネクション張ってFail Overさせたい時ってどうすればいいんじゃ?」とひとしきり試行錯誤の後「もしかしてサポートされてない?」とコードを読み始めたところ、 MultiEndpointEtcd3Client()を使えばいいことがわかりました。

練習用に作ってみたやつ(本記事執筆時点でまだTo Be Updated)がここにおいてありますが、以下のような感じで etcdサーバ1台ずつ Endpoint classを作った上でリストにし、MultiEndpointEtcd3Client()endpoint= で渡してあげればよいようです。 最初、stringで '192.168.1.101:2379' と書いてリストにしていて動かなかったので、あれれ?と思ったのですが、やっぱりソースを眺めていて気づきました(笑)

(snip)
 39     eps = []
 40     if args.endpoints:
 41         for ep in args.endpoints:
 42             eps.append(etcd3.Endpoint(host=ep.split(':')[0], port=int(ep.spl    it(':')[1]), secure=False))
 43     else:
 44         print('Specify -e / --endpoints')
 45         sys.exit()
 46
 47     client = etcd3.MultiEndpointEtcd3Client(endpoints=eps,
 48                                             timeout=args.timeout,
 49                                             failover=True)
(snip)

ちなこのライブラリ、etcdに対する単純なkey/valueのCRUDだけではなく、lock やtransactionも使えるようになっています。 便利ですね :)

なお、ある意味これが一番重用な話になりますが、現状Pypiからインストールできる最新版の 0.2.0 は2020/04/01にリリースされたもので、古いです。 MultiEndpointEtcd3Client() も含まれていません。使いたい場合は、ソースからインストールする必要があります。

そろそろ次のリリース出したほうがいいんじゃないの?とissueも切ってみて、賛同の声もほどほどあるようなのですが、さてどうなりますか...