Redis 6 RC1 is out today

Salvatore Sanfilippo

Redis 6 RC1、本日リリース

原文は Salvatore Sanfilippo により に公開されました。 このブログを購読する

またしてもそうなった。新しいRedisのバージョンがリリース候補(RC)となり、数カ月もすれば大半のスーパーマーケットの棚に並ぶことになる。これまでで最も“エンタープライズ”なRedisだと私は思う。おかしなことに、“エンタープライズ”がそもそも何を意味するのかを理解するのに、私はかなり時間を要した。はっきり言って好きではない言葉だが、それでも一定の意味は持っている。Redisは今やあらゆるところで使われているが、それでも十分に“スケールダウン”できることに変わりはない。今でもダウンロードして30秒でコンパイルし、設定なしで起動してすぐにハックを始められる。しかし、あらゆるところにあるということは、暗号化やACLが必須となる環境でも使われるということだ。だからRedisは必然的に、そして私のおかげというよりは、むしろ私のシンプルさへの極端なこだわりにもかかわらず、適応してきたのだ。

ただ面白いのは、機能追加でさえ非常に強いこだわりを持って行われ得るということだ。RedisのACLは他のシステムで見たものとはほとんど似ていないし、SSLサポートも、コアをできる限りクリーンに保つという観点から最も理にかなったアイデアを最終的に選び取るために、何度かの試行錯誤を経て書かれた。結果にはかなり満足している。

Redis 6がもたらすのはACLとSSLだけではない。私の知る限り、Redis史上最大のリリースであり、最も多くの人が参加したリリースだ。まずはクレジットから始めよう。誰がRedis 6を作ったのか?以下はコミット数順のコントリビューターリストだ(ひどい指標だが、簡単に生成できるものだ)。2コミット以上で、マージコミットを除いたものになる。なお、私のコミット数は、あちこちの細かな修正を常に行っているため、かなり水増しされている可能性があることにも留意してほしい。

   685  antirez
    81  zhaozhao.zz
    76  Oran Agra
    51  artix
    28  Madelyn Olson
    27  Yossi Gottlieb
    15  David Carlier
    14  Guy Benoish
    14  Guy Korland
    13  Itamar Haber
     9  Angus Pearson
     8  WuYunlong
     8  yongman
     7  vattezhang
     7  Chris Lamb
     5  Dvir Volk
     5  [email protected]
     5  chendianqiang
     5  John Sully
     4  dejun.xdj
     4  Daniel Dai
     4  Johannes Truschnigg
     4  swilly22
     3  Bruce Merry
     3  filipecosta90
     3  youjiali1995
     2  James Rouzier
     2  Andrey Bugaevskiy
     2  Brad Solomon
     2  Hamid Alaei
     2  Michael Chaten
     2  Steve Webster
     2  Wander Hillen
     2  Weiliang Li
     2  Yuan Zhou
     2  charsyam
     2  hujie
     2  jem
     2  shenlongxing
     2  valentino
     2  zhudacai 00228490
     2  喜欢兰花山丘

上記の皆さんに感謝したい。素晴らしいチームワークだった、レディース・アンド・ジェントルメン。変更履歴にある新機能のリストは以下の通りだ。

  • 多数の新しいモジュールAPI
  • 改善されたexpireサイクル
  • SSL
  • ACL
  • RESP3
  • クライアントサイドキャッシング
  • スレッド化されたI/O
  • レプリカでのディスクレスレプリケーション
  • Redis-benchmarkのクラスターサポート+Redis-cliの改善
  • Systemdサポートの書き直し
  • Redis ClusterプロキシがRedis 6とともにリリース(ただし別リポジトリ)
  • DisqueモジュールがRedis 6とともにリリース(ただし別リポジトリ)

ご覧の通り、大きな変更が盛りだくさんだ。いくつかについて少し語ろう。

RESP3

10年を経て、新しいプロトコルが必要になった。この件についてはここで詳しく語ったことがある http://antirez.com/news/125 が、その後考えを改めたため、Redis 6のRESP3プロトコルは“オプトイン”になっている。接続はRESP2モードで始まり、新しいHELLOコマンドでハンドシェイクを行った場合にのみ、新プロトコルモードに入る。

なぜ新しいプロトコルが必要だったのか?古いプロトコルが十分にセマンティックではなかったからだ。RESP3には他にも機能があるが、主な狙いは、Redisから複雑なデータ型を直接返せるようにすることだった。クライアントが、返されたフラットな配列をどの型に変換すべきか、あるいは適切な真偽値の代わりに返される数値をどう扱うかなどを逐一知る必要がなくなるようにするためだ。

RESP3だけがサポートされるプロトコルではないため、普及は予想より遅くなるだろうが、結局のところそれは悪いことではないかもしれない。適応するための時間ができるのだから。

ACL

Redis ACLの最良の入門はACLのドキュメントそのものだ(https://redis.io/topics/acl)。おそらく直前の変更に追従するためのアップデートがまだ必要だが。だからここでは動機について語る方が面白いだろう。RedisにACLが必要になったのは、より大きな環境で、どのクライアントがどの操作を実行できるかをより適切に制御する必要があるからだ。しかしRedisにACLを追加したもう一つの大きな理由は、アプリケーションのバグからデータを守るための隔離だった。ワーカーがBRPOPLPUSHしか実行できないのであれば、新人開発者がデバッグ用に追加したFLUSHALLが誤って本番コードに残り、5時間にわたる悪夢を引き起こす可能性は低くなる。

RedisのACLは実質的に無料だ。運用面では、使わなければその存在すら意識する必要がないし、パフォーマンス面でもオーバーヘッドは計測できないほどだ。搭載しない手はないだろう。おまけに、現在はACL用のRedisモジュールインターフェースも用意されているので、カスタム認証方式を書くこともできる。

SSL

2019年、もはや2020年も間近で、新たな規制もある。唯一の問題は、それを正しくやることだった。そして正しくやるためには、まず間違ったやり方をし、限界を理解し、その上でRedisのコネクションを抽象化して正しくやり直す必要があった。この作業は完全に私の手を借りずに行われたが、それは近年のRedis開発プロセスがどう変わったかを示している。

クライアントサイドキャッシング

この件についてはここでブログに書いた http://antirez.com/news/130 が、今のところこれがRedis 6で最も未成熟な機能だと思う。確かに、サーバーがクライアント側の値のキャッシュを支援してくれるのはクールだが、Redis 6のGAが出る前に改善したい。特に、サーバーがクライアントに関する状態を一切、あるいはほとんど保持する必要のない新しいモードを追加し、その代わりにより多くのメッセージをやり取りするようにできれば非常に良いだろう。さらに現状では、特定の“キャッシュスロット”を無効化するためのメッセージを一つにまとめられない。1月にはこの機能についてまだやるべきことがあるが、良いものになるはずだ。

モジュールとしてのDisque

ついにやった :-) https://github.com/antirez/disque-module、結果にはとても満足している。モジュールとしてのDisqueは、現時点でのRedisモジュールシステムがいかに強力かをはっきりと示している。クラスターのメッセージバスAPI、クライアントのブロックと再開の機能、タイマー、モジュールのプライベートデータに対するAOFとRDBの制御。Disqueが何か知らない人は、リポジトリをチェックしてほしい。READMEはかなり充実している。

Cluster Proxy

同僚のFabioが何カ月もかけて取り組んだRedis Clusterプロキシがこれだ:https://github.com/artix75/redis-cluster-proxy。ずっと前から実現してほしいと思っていた。Redis Clusterサポートに関してクライアントの状況は非常に断片化しているので、多くの面白いことができる(まだ作業中の)プロキシができたのは大きい。主な機能の一つは、クライアントに対してRedis Clusterを、あたかも単一のインスタンスと会話しているかのように抽象化することだ。もう一つは多重化を行うこと、少なくともクライアントがシンプルなコマンドや機能だけを使うような単純なケースではそうできる。ブロックやトランザクションが必要な場合、プロキシはクライアントのために別のコネクション群を割り当てる。プロキシは完全にスレッド化もされているので、CPU時間の大部分がI/Oに費やされている場合にCPU使用率を最大化する良い手段にもなる。ステータスについてはプロジェクトのREADMEを確認して、ぜひ試してみてほしい!

モジュール

Redis 6では、モジュールAPIがまったく新しいレベルに到達した。これはRedisの中でも歴史的に最も速く成熟した部分の一つだ。Redis Labsが初日からモジュールシステムを使って、単なる些細な例ではなく非常に複雑なものを開発してきたからだ。少し前に私はDisqueの移植を始め、これがモジュールシステムに新機能をもたらす動機にもなった。結果としてRedisは、すべてをゼロから作り直すことなくシステムをモジュールとして書くためのフレームワークに本当になったし、BSDライセンスであることも相まって、システムを書くための真にオープンなプラットフォームとなっている。

内部実装

Redisの内部にも大量の改善がある。コマンドがレプリケートされる方法はかなり変わったし、expireの処理もより高速でキャッシュ効率の良い別のアルゴリズムを使うようになった。

ステータスとETA

本日RC1を迎え、3月末から遅くとも5月までにはGAが用意されることを願っている。現時点でRedis 6は間違いなくテスト可能で、バグに遭遇する可能性は非常に小さい。とはいえ、大量のコード変更が含まれており、新機能は誰も本番で動かしたことのない新しいコードで構成されている。もし何か不具合を見つけたら、起きたことをできる限り詳しく説明して、issueシステムで報告してほしい。

このリリースを可能にしてくれたすべての人に、そして今後数カ月でこれを非常に安定した状態に仕上げてくれるであろうすべての人に感謝したい。

あ、忘れるところだった!これがバージョン6のLOLWUTコマンドのインタラクティブアートだ:

実行するたびにランダムに生成された異なる風景が表示される。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント