Redis 6 RC1 is out today

Salvatore Sanfilippo

Redis 6 RC1が本日公開

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

ただ面白いのは、機能追加でさえ非常に意見のはっきりしたやり方で行われることだ。RedisのACLは他のシステムで見たものとはほとんど似ていないし、SSL対応も、コアをできる限りクリーンに保つという観点から最も筋が通ったアイデアにたどり着くまで、何度か作り直された。結果にはかなり満足している。

Redis 6はACLやSSLだけではない。私の知る限り、これまでで最大のリリースであり、最も多くの人々が参加したリリースでもある。まずはクレジットから始めよう。誰が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
  • 改善された有効期限のサイクル
  • 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が必要になったのは、より大きな環境で、どのクライアントがどの操作を実行できるかをより適切に制御するために、人々がACLを必要としているからだ。もう一つの大きな理由は、アプリケーションのバグからデータを守るための分離だった。もしワーカーがBRPOPLPUSHしか実行できないなら、デバッグ用に追加したFLUSHALLを新入りの開発者がうっかり本番コードに残してしまい、5時間にわたる悪夢を引き起こす可能性は低くなる。

RedisのACLは無料だ。運用面でも、使わなければ存在すら意識する必要がないという意味で無料だし、パフォーマンスの面でもオーバーヘッドは計測できないほど小さい。導入して損はないはずだ。おまけに、Redisにはモジュール向けのACLインターフェースも用意されたので、カスタムの認証方式を自作することもできる。

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プロキシ

同僚の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はシステムを書くための本当にオープンなプラットフォームだ。

内部実装

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

ステータスと今後の予定

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

このリリースを実現してくれたすべての人々、そして今後数ヶ月でこれを非常に安定した状態へと仕上げてくれる人々に感謝したい。

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

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

原文は Salvatore Sanfilippo により に公開されました。

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