Redisのレイテンシを計測

やりたいこと Redis に TCP でコマンドを投げた時 DNS Lookup Initial Connection Request Sent Waiting(TTFB) Content Download というような流れで処理される。 この一連の流れでRedis の内部処理にかかった Waiting(TTFB) を除く通信の時間を計測する方法をメモ。 通信のレイテンシ Redis には疎通確認向けのコマンド PING がある。クライアントがこのコマンドを実行すると、サーバーは PONG を返すだけ。 このコマンドに対してサーバー(Redis)の処理は極めて軽微なため、PING を実行してから PONG がかえってくるまでの時間をレイテンシとみなして計測するのが次のコマンド。 上の例で言えば 103 回 PING を実行し(samples) レイテンシの 最短(min)/最長(max)/平均(avg) がそれぞれ 0ms/2ms/0.18ms となる。 AWS ElastiCache Redisでは AZ をまたぐと同一 AZ での通信に比べてレイテンシが10倍だったりするので、レイテンシを何としても切り詰めたいときは  1コマンド1リクエストとせず Mass Insert を利用してリクエスト回数を減らす マルチ AZ Redis クラスターを諦めて 同一Continue reading “Redisのレイテンシを計測”

[AWS]マルチAZなElastiCache Redisの永続性についてメモ

Redis のデータを永続化させるには RDB : point in time スナップショット AOF : write ahead logging(WAL) の2種類の方法がある。 AWS ElastiCache Redis で Multi-AZ かつ自動フェイルオーバーなレプリケーショングループを組んでいる Redis での動きをメモ。 このようなレプリケーショングループの作り方は次のURLを参照 http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/AutoFailover.html Redis の RDB と AOF について RDB について RDB は point-in-time にダンプしたファイル。 通常の Redis であれば SAVE または BGSAVE(バックグランドで非同期に処理)コマンドで作成するが ElastiCache ではこれらコマンドは無効化されている。 ElastiCache では作成された RDB ファイルはスナップショットとして利用可能。 スナップショットファイルの作成は Replication Group 設定画面のバックアップ系設定で行う。 ElastiCache ではキャシュ処理とスナップショット作成のような管理機能がメモリーを奪い合わないように reserved-memoryContinue reading “[AWS]マルチAZなElastiCache Redisの永続性についてメモ”

AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する(お手軽版)

2014/10/24 の機能追加により、Redis はマルチAZ構成でノードを配置し、自動フェイルオーバーに対応した。 Multi-AZ Support / Auto Failover for Amazon ElastiCache for Redis http://aws.amazon.com/blogs/aws/elasticache-redis-multi-az/ 自分が知るかぎり、この機能が追加される前は異なる AZ に自前でクラスター配置しないとマルチAZにならなかったけど、機能追加後はマネージメントコンソールからボタンポチでマルチAZできるようになった。 このマネージメントコンソールの機能追加はコマンドライン aws cli (というかAPI)にも反映されているので、高可用性な Redis クラスターをサクッと構築してみる。 自前でゴリゴリやる手順は過去に書いた。 AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する https://siguniang.wordpress.com/2014/09/27/create-elasticache-redis-multi-az-read-replica/ 作業の流れ VPC & サブネットの作成 ElastiCache向けサブネットの作成 レプリケーショングループの構築 サブネットの作成 VPC に ElastiCache 用の異なる AZ のサブネットを作成。 これらサブネットを Cache Sbunet Group としてまとめる。 まとめたサブネットグループが foosubnet 2 つあるサブネットの SubnetAvailabilityZone が 1b と 1cContinue reading “AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する(お手軽版)”

AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する

ゴール AWS ElastiCache は RDS と同じくマルチ AZ に対応している。 Q: Does Amazon ElastiCache for Redis support Multi-AZ operation? Yes, with Amazon ElastiCache for Redis you can create a read replica in another AWS Availability Zone. Upon a failure of the primary node, we will provision a new primary node. In scenarios where the primary node cannotContinue reading “AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する”

AWS CLIを使ってElasciCache Redisのパラメーターを変更する

通常の Redis では、パラメーターは CONFIG コマンド経由で変更する。 http://redis.io/topics/config 一方で、マネージド・サービスである AWS ElasciCache Redis では、運用にインパクトを与える CONFIG のようなコマンドは利用できないようになっている。(redis.conf で rename-command CONFIG “”のように設定すれば良い) Restricted Commands In order to deliver a managed service experience, ElastiCache restricts access to certain cache engine-specific commands that require advanced privileges. … For cache clusters running Redis, the following commands are unavailable: bgrewriteaof bgsave config debug migrateContinue reading “AWS CLIを使ってElasciCache Redisのパラメーターを変更する”

Redisでアクセスランキングを実装

ニュースサイトのサイドメニューでよく見かける「アクセスの多かった記事」のようなランキングを Redis のデータ型 Sorted Set で実装する方法をメモ。 東洋経済の例 Redis の Sorted Set を使ったアクセスランクの表現 Redis のデータ型 sorted set は文字通り順序付けられた集合。 key 単位で集合を定義でき、各メンバーはスコアを持ち、スコアによって集合内で順位付けられる。 メンバーを記事、スコアをアクセス数とみなして、アクセスランクを表現する。 日別ランキングであれば下図のようになる。 週別ランキングであれば下図のようになる。 スコアの大きい順(=アクセスの多い順)に並べればアクセスランキングの完成となる。 Sorted Set の操作 次にアクセスされた時の Sorted Set の操作を考える。 キーは YYYYMMDD で持ち、アクセスされるたびに、記事のスコアを1増やす。 スコアを明示的に指定してメンバー追加するときは ZADD を使って ZADD key score member というようにやるけれど、1ずつインクレメントするので ZINCRBY をつかう。 コマンドのシンタックスは ZINCRBY key increment member ZINCRBY myzset 1 “two” の例でもわかるように、メンバーが存在しない場合はスコアの初期値は 0 となる。Continue reading “Redisでアクセスランキングを実装”

Redisで最新更新されたN件を実装

最近更新されたN件を表示させるには 最近更新したアイテムほど上位に表示 下位・ランク外のアイテムも、更新すれば最上位に表示 同じアイテムが短期間に複数更新されても重複表示しない N件を超えたアイテムの情報は不要なので破棄 といったことが必要になる。 このデータ構造を Redis のデータ型 Sorted Set で実装する方法をメモ。 Sorted Set を少し触ってみる Redis のデータ型 sorted set は文字通り順序付けられた集合で Z で始まるコマンドを使ってデータを操作する。 ZADD key score member のシンタックスで集合のメンバーを追加 計算量は O(log(N)) myzset 集合のメンバーを score でソート メンバー baz のスコアを3から1に変更 myzset 集合のメンバーを score のランキング順で再ソート 集合なのでメンバー baz は重複登録されず、スコアが 2 のメンバー bar よりも上位に表示されている。 Sorted Set で 最近のN件を実装 音楽再生サイトを運営しているとして、この Sorted Set を使って最近再生された曲N件を実装してみる。Continue reading “Redisで最新更新されたN件を実装”

ElastiCacheのRedisクラスターをバックアップ/リストアする

AWS ElastiCache の Redis クラスターに対して、定期実行・手動実行でスナップショットを作成できるようになった。 Announcing Backup and Restore capability for Amazon ElastiCache for Redis http://aws.amazon.com/jp/about-aws/whats-new/2014/04/24/announcing-backup-and-restore-capability-for-amazon-elasticache-for-redis/ この機能を使うと、Redis に閉じたキャッシュデータだけでなく、ElastiCache のクラスター情報(インスタンスタイプ、パラメータ、サブネットなど)も保存される。 新規にクラスターを作成するときにこのスナップショットを指定すると、キャッシュだけでなくクラスター情報も含めて復元されたクラスターが立ち上がる。 この機能をマネージメントコンソールと AWS CLI から操作する方法をメモ スナップショットの作成 マネージメントコンソールからのスナップショット設定 次のブログを参照 Backup and Restore ElastiCache Redis Clusters http://aws.typepad.com/aws/2014/04/backup-and-restore-elasticache-redis-nodes.html ElastiCache の Cache Clusters 一覧画面で、modify ボタンからスナップショットの作成スケジュールを設定できる。 作成日時(Backup Window) スナップショット保持期間(Backup Retention Period) が指定可能。 AWS CLI からスナップショット設定をする 既存クラスターの設定変更 $ aws elasticache modify-cache-cluste コマンドでスナップ設定をする。Continue reading “ElastiCacheのRedisクラスターをバックアップ/リストアする”

[PostgreSQL][Redis]redis_fdwを使ってみた

大量のユーザリクエストを Redis に書き込み、foreign data wrapper(FDW) を使って定期的に PostgreSQL にロードするユースケースが PgCon 2013 で発表されていた。 Using PostgreSQL with Redis Using native wrappers and a Foreign Data Wrapper for two-way Redis integration http://www.pgcon.org/2013/schedule/events/574.en.html フロントエンドの Redis では高速にリクエストを処理しつつ、バックエンドの PostgreSQL ではデータウェアハウス的な処理を行うのが狙い。 トークでは redis_fdw redis_wrapper の2つの Redis 向け FDW が紹介されている。 面白そうだったので redis_fdw の方を触ってみた。 foreign data wrapper(FDW) とは 外部データを SQL で操作する SQL/MED(MED は Management ofContinue reading “[PostgreSQL][Redis]redis_fdwを使ってみた”

Redisでオートコンプリート(5) 転置インデックス

Redisを使ったいろいろな autocomplete のアルゴリズムをメモ。 前方一致 zrange 範囲指定 @antirez trie inverted index これまでの実装例は、検索語が一語に限られている。 RubyGem の soulmate は転置インデックスを用いて、複数語の autocomplete に対応している。 今は実装が変わっているかもしれないけれども、転置インデックスを使った2011年11月当時の実装が次のブログにまとめられているので、これをベースにメモ http://patshaughnessy.net/2011/11/29/two-ways-of-using-redis-to-build-a-nosql-autocomplete-search-index 転置インデックス T[0] = “it is what it is” T[1] = “what is it” T[2] = “it is a banana” というような3つのテキストがあり、上から順に 0, 1, 2 と ID が付けられているとする。 各テキストを単語で分割し、各語とテキストの対応関係を {単語 : テキストIDの集合} のペアで持つ。 上の例であれば、 となる。 このマッピングがあると “is” を含んだテキストはContinue reading “Redisでオートコンプリート(5) 転置インデックス”