今回は、これまで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も切ってみて、賛同の声もほどほどあるようなのですが、さてどうなりますか...