ラベル Redis の投稿を表示しています。 すべての投稿を表示
ラベル Redis の投稿を表示しています。 すべての投稿を表示

2011/02/08

redisの実用例。redis速いよredis


こんにちは!hiroshiです!

今回は、最近DECOLOG界隈で大ブームのredisについて、その利用用途や導入方法についてお話ししたいと思います。

今回のお話と関連する過去エントリに以下がありますので、こちらに目を通していただいた上で本エントリを読んでいただくと分かりやすいと思います。



…と、これまでのエントリからは実運用できてるのかどうか微妙なタッチになっているかもしれませんが、結論からいうと実運用できてます!

redis導入後にトラブル発生、そのレポート」ではTTLを設定した場合にうまくいかないケースがあったのですが、TTLなしのデータでは特に問題なく運用できました。



現在のredisの利用用途


今のところ以下の用途ですね。
  • カウンターデータ
  • 広告配信データ
  • ユーザーのアクティビティ統計データ


最初に導入してみたのは、広告配信データでした。

なぜこれを選んだか、ですが、MySQL以外のツールを探し始めたきっかけが、readよりもwrite負荷、つまりmaster負荷が原因でスループットがあがらない処理がいくつかあり、そこをなんとかしたかったんです。

shardingすれば済むし、実際にそうやって対応していましたが、処理内容(カウントアップするだけ)や保持しているデータ(前述のデータはkey-value形式なデータで、valueは数値のみ)を考えると、なんとも「サーバがもったいない。富豪エンジニアリングになってしまってるなあ。」という感を強く持っていました。
※「富豪エンジニアリング」は必ずしも悪だとは考えてないです。念のため。

余談ですが、金をかければだいたいのことが解決するわけです。なので技術陣は他所からの要求をただ実現するだけでなく「低コスト」でやってナンボだと思っています。「サーバ増やせばできるよ」という結論も多々あると思いますが、「サーバを増やさずできる」方法を常日頃から考えておきたいところです。

話を元に戻します。前述の課題となっていたウチのデータ群では広告配信データがもっとも更新負荷が高いデータだったので、「ここがイケれば全部イケル」ということからここを選びました。

更に広告配信データは「DECOLOGでのMySQL Archiveエンジンの使い方」と同じスキームでやっていました。つまり

  1. archiveエンジンを使ってとにかくinsert
  2. 定期的にテーブルスワップし、スワップしたテーブルに対して集計プログラムを走らせる
  3. で、その結果を集計DBに格納


といった按配です。

広告配信データは、1日に1回のテーブルスワップだと半端ないデータ量になってしまうのと、運用側としてもimpressionなどの集計データの本日分が参照できないのはリアルタイム性にかけすぎるので、テーブルスワップのサイクルは1時間に1回でやっていました。

なので、「ここがイケれば全部イケル」という理由に加えて、集計スパンを既存に合わせれば、仮に導入試験中にredisが原因で未集計のデータがぶっ飛ぶようなことがあっても「MAX1時間分のデータがパーになる」というのが想定される最大の被害規模であり、それだったら基本的に内部以外に迷惑かけずに済む、という算段もありました。



設計


設計ってほどのことでもないですが、1台でどこまでいけるのか?というのを試したかったのでredisサーバは1台のみです。仮にぶっ壊れたりしたとしても、プログラムをを2,3行コメントアウトしてリリースすればよいですし。

ところでredisにはdatabaseという概念があります。これは数字で指定する、ちょうど配列の添字みたいなものです。この単位でデータは管理されています。なので、データのflushもこの単位でできます。で、これは上限があるのかどうかわからないんですが、任意の数を指定できます。この添字的なものをdbidと言うっぽいです。

データ構造のイメージとしてはこんな感じ。
[0] {
array(key1 => value, key2 => value, key3 => value ・・・)
},
[1] {
 array(key1 => value, key2 => value, key3 => value ・・・)
}
:
:
[n] {
 array(key1 => value, key2 => value, key3 => value ・・・)
}

※設定ファイルに指定した数-1

広告は1時間ごとに集計したいので、この仕様を利用して、databaseの数を24にしておきます。こうするとDBは0~23の範囲を指定できます。

プログラムでも、この仕様に合わせる形を取っておきます。
<?php
class   My_Redis_AdViewLog extends My_Redis {
    const   KEY_PREFIX = "ad_view";

    function    __construct($last_hour=false) {
        // redisのDBは時間(h)と同期をとる。つまり0~23の範囲をとる。
        $time = strtotime(($last_hour ? "-1 hour" : "now"));
        $index = date("G", $time);

        parent::__construct(REDIS_SERVER_AD_VIEW, $index);
    }

    function logging($ad_id, $carrier) {
        $this->increment($ad_id."/".$carrier);
    }


これはいわゆるDBクラスですね。
parent::__construct(REDIS_SERVER_AD_VIEW, $index);

の$indexがdbidです。

現在時間(h)をdbidとして扱っているため、10時のデータはdbid=10のところに入っているわけです。

KEY_PREFIXは、keyの一部になります。ベースクラスで、このKEY_PREFIXを元に
{ENV}/{KEY_PREFIX}/{KEY}
というkeyを組み立てるようにしてあります。

$this->increment($ad_id."/".$carrier);

のincrementですが、redisにはincrというコマンドがあり、これがチョー便利です。
valueが数値だった場合に$deltaの数だけインクリメントしてくれる、というシンプルなものなのですが、何が便利って該当するkeyがない場合にエラーとしないで、key=$deltaを自動的に作ってくれるんです!

「キーが存在すればupdate、存在しなければinsert」みたいなコードを書かなくていいのはすごく気持ちがいいです。

こんな感じでデータを収集していきます。

24時間経つと、dbidが重複することになってしまいますが、1時間ごとにデータ集計バッチが走るので、そこで現在時間-nのDBをflushする、というコマンドを入れて対応しています。



導入に当たって


新しいものを導入するときのウチの基本なのですが、いきなり切り替えず、既存ロジックと平行させて導入します。
かつ、100分の1で新しい処理を通るようにする、みたいなコードを入れて、グラフを見ながら徐々に100%にあげていきます。

100%になれば、既存ロジックの集計結果と同じになるはずなので、それを確認します。
広告集計結果をストアするsummaryというテーブルがあるとすると、summary_testというまったく同じスキーマのテーブルを用意します。
redisで取得したデータの集計データは、summary_testに格納します。あとは、確認するだけです。

で、これがけっこうあっさりうまくいっちゃったので、苦労話とか特に無いです。いや、これをやること自体がそれなりに苦労するんですけど。

しかもこれまで7台でやっていたものを1台で受けきってかれこれ数ヶ月問題も起きていません。


感想


いやー、7台が1台になっちゃいました!
正確にいうと、7台で構成されていた既存DBは、actionlog、ランキングデータ、広告配信データが格納されており、いずれもそれぞれ別のredisサーバに分けられたので「7台が3台になった」が正しいですね。ただ、こう書くと約半分程度なので、ちょっとインパクトに欠けるかもしれません(?)が、この例ではないところで4台が1台にできたのは確認できています。

実際は、valueにオブジェクトも格納でき、それを利用しているところもあるのですが、がっちり使っているのはvalueに数値を持ち、カウントアップしていく性質のデータを対象としています。

っていうか、そういうデータだったらかなり最強の部類に入るのではないか、と思っています。

また、redisの開発はかなり活発です。あまりにも活発すぎて燃え尽きないか、と心配になるくらいです。
DECOLOGが使っているphpクライアントのphpredisの開発も活発です。

こういうのは多くの人が使えば、今後ももっともっと活発に活動し続けてくれると思うので、みなさん奮ってご利用ください!!

see also:「仲間大募集のお知らせ

ではでは!

2010/11/01

redis導入後にトラブル発生、そのレポート


こんにちわ、ミツバチワークス stoneです。

今回は、redisシリーズ第3弾、実際にredisをサービスの投入してみて、うまく行かなかった事例についてご紹介します。

redisの使用用途


今回、いくつかあるセッションデータのうち2つをMySQLからredisへ移行させました。
これらのセッションデータ、MySQL上では、セッションIDの他に複数のカラムから構成されているのですが、redis上では、この複数のカラムをserialize()して、
key(string) => value(string)
という形で格納するようにしました。

ちゃんとソースコードで確認はしていないのですが、memcachedでも、TTLが設定できますが、TTLを過ぎたデータを監視してクリアしていないですよね。
また、memcached内部のslabの構成次第では、TTLまでデータが保持されずに、データがクリアされてしまうケースにも遭遇したことがあります。
(まぁ、キャッシュだから当たり前の話なのですが)
反面、redisの場合、TTLまでデータが残っていて、かつ、TTLを過ぎたデータは、定期的にクリアされています。
(これは、ソースコードレベルでも、実際の状態監視でも確認できました。)

運用中の状態


サービスに投入後の、ピークタイムでのredisの状態です。

ロードアベレージ

redisのロードアベレージは、MySQLより低め、memcachedよりは高めで推移します。
こんな風にギザギザのロードアベレージは、初めて見る形です。
瞬間的にロードアベレージが上がるのは、バックグラウンドでのsnapshotの保存によるもののようです。

トラフィック

こちらも、初めて見る形のトラフィックグラフでした。
どうやら、バックグラウンドでsnapshotを保存するタイミングで、リクエストが滞留したり、滞留していたリクエストが一気に解消したり、というのを繰り返しているようです。
コレはこれで問題だったので、後ほど取り上げます

メモリの使用量

このグラフは、時間の尺が12時間なのですが、ピークタイムを過ぎて、TTLを過ぎたデータが、クリアされて行くのが、よくわかります。
最初にグラフを見たときには、とても感動しました。


問題1: リクエストが詰まる


現象

上記のredisのトラフィックが、サイト全体のパフォーマンスにまで、影響していました。
redisのトラフィックが詰まるタイミングで、サイト全体のトラフィックも低下する現象が見られるようになってきたのです。
下のリバースプロキシのグラフで、ざくっと切れ込みの様にトラフィックが下がっている部分は、redisの「詰まっている」タイミングと同じタイミングで起きていました。

対処

少し調べてみたのですが、なかなか原因はつかめません。
ひとまず、わかっているのは、
・snapshotの保存のタイミングで、トラフィックが低下する
・snapshotの保存のタイミングでは、CPUの使用率が上がる
の2点のみ。
そこで、保存の際に少しでもCPUの使用率を下げる為に、
rdbcompression no
(デフォルトはyes)
としてみました。

また、事前に別サーバーで、redisを立ち上げて、
1) "rdbcompression yes"で1万件程度のデータをストア
2) redis-serverをシャットダウン
3) redis.confを"rdbcompression no"に変更
4) redis-serverを起動
としても、データは保全されていることを確認しました。

結果(解決)






上記の問題があった時間帯の翌日のredisとリバースプロキシのトラフィックのグラフです。
ほぼ同じような形で見分けがつきにくいですが。。。。

redis

rev-proxy

問題だった詰まる→解消→詰まる→解消の現象が解消されています。ひとまず、ほっとしました。


問題2: 応答が極端に遅くなる


こちらは、残念ながら、解消できていない問題です。

現象

問題が起きた時間帯のredisのトラフィックのグラフです。
グラフを見ると一目瞭然なのですが、ある瞬間を境にして、トラフィックがかなり乱れているのがわかります。
同じ時間帯のロードアベレージを見てみると。。。。

これらのグラフから見て取るに、問題の現象は、
1) 内部的に「何か」が起きる
2) ロードアベレージがじわじわ上がる
3) その「何か」が分水嶺を超える
4) トラフィックが乱れる
というシナリオのようです。

この状態になると、redis-cliでも、応答が悪くなりました。
それにつれて、サイト全体のパフォーマンスが悪化して行きました。

対処

この現象が起きた場合、redis-serverを再起動すると、すんなりと問題が解消します。
が、TERMシグナルを発行しても、サさってシャットダウンできない場合もあり、実際に人のオペレーションが必要な状況でした。
問題が発覚してから、数日は、夜中まで監視を行い、問題が起きた場合はリスタート、という運用をしていたのですが、さすがに数人で運用してる現状では、無理がかかりすぎるため、MySQLに戻しました。



redis導入後、このトラブルが起きていないケースもあるので、原因の特定がまったくできていない状態です。
問題が起きていないケースでは、トラブルがあったケースに比べて、
・データのTTLが長いため、順次データがクリアされる状態になっていない
・データ件数が1/10程度
となっていて、今後、データのTTLが切れ始めるタイミングが要注意だと考えています。

今回は、トラブルに合いましたが、やはり、redisのスピード感は魅力です。
そのため、今後は、TTLが設定されない、永続的なデータについても、実験をしてみることにしています。

では、また次回に♪

2010/10/25

redisのサービスへの投入



こんにちわ、ミツバチワークス stoneです。

今回は、前回、ベンチマークをとったredisをサービスに投入した、その方法について、ご紹介します。

1 redisのセットアップ


1.1 redisをインストール

redisは、2.0.2を使用しました。
redisのインストールは、
# tar zxvf redis-2.0.2.tar.gz
# cd redis-2.0.2
# make install
ですんなり出来ました。
コンパイルされたバイナリは、/usr/local/bin/以下にコピーされています。

1.2 コンフィグ

DECOLOGでは、ApacheとMySQLを除いて、daemontoolsを利用して運用しています。
そのため、redisのコンフィグは、デフォルトのredis.confから、以下の項目を修正してあります。
(デフォルトのredis.confは、redis-2.0.2ディレクトリにあります。)
daemonize no
loglevel notice
dir /var/lib/redis/
maxmemory 8gb
これを、/etc/redis.confに保存しておきます。

1.3 ユーザーとディレクトリを設定

redis用のアカウント/グループとディレクトリを設定しておきます。
# groupadd redis
# useradd -g redis -d /var/lib/redis -s /sbin/nologin redis
アカウントとグループは、設定する必要はないのですが、なんか習慣的に作ってます。

# chmod 755 /var/lib/redis
# find /var/lib/redis/ -type f -exec rm {} \;
(useraddで作られるファイルを削除)

# mkdir -p /var/log/redis
# chmod 1777 /var/log/redis
(ログ用ディレクトリ)

1.4 daemontools用の設定

DECOLOGのサーバーでは、daemontoolsでプロセス管理する場合、/serviceに直接ディレクトリやファイルを作成しません。
/etc/superviseというディレクトリを用意して、その下にディレクトリ/ファイルの実体を作成します。
今回の場合なら、
/etc/supervise/redis/run
/etc/supervise/redis/log/run
です。
これらの確認が終わった後、
# ln -s /etc/supervise/redis /service/redis
として、daemontoolsのプロセス管理に制御を任せます。
以下では、話を簡単にするため、/serviceでのパス表記にしておきます。

file: /service/redis/run
#! /bin/sh
exec /usr/local/bin/redis-server /etc/redis.conf

file: /service/redis/log/run
#! /bin/sh
exec /usr/local/bin/setuidgid redis /usr/local/bin/multilog n20 s16777215 /var/log/redis
redisのログにもタイムスタンプが記述されるため、multilogのオプション"t"はつけませんでした。

2. redisの起動/シャットダウン


2.1 起動

daemontoolsが動いているので、/service/redis/runが作成された時点で、redisは起動されます。
手動オペレーションで、redisを落とした場合は、
# svc -u /service/redis
で、redisが起動されます。

2.2 シャットダウン

該当するドキュメントを見つけられなくて、結局、ソースコードを追っかけてわかったのですが、redisは、TERMシグナルを受け取ると、データのsnapshotを保存した後にプロセスを終了します。
なので、
# svc -t /service/redis
で、キレイにシャットダウンすることが出来ます。

2.3 再起動

単純に、
# svc -tu /service/redis
で、再起動をかけます。

再起動にかかる時間は、ほぼsnapshotを保存する時間です。
なので、事前にログを見て、所要時間を予測することが可能です。
いままでの実績で言うと、30Mbytes程度なら1秒以下、1〜2GBytesでは30秒程度かかります。

3. 監視項目


サービスに投入する前に、状態監視できるようにしておきます。
※DECOLOGでは監視にZABBIXを使っています→http://tech.dclog.jp/2010/09/decolog.html

数年前にZABBIXを導入してから、状態が監視できない状態で何かオペレーションするというのが、ものすごく怖く感じるようになりました。
なにか、目隠し状態で作業しているような感覚です。
何か新要素を投入を決めるときは、「稼働状態を取得できる」というのも大事な要素になります。

3.1 状態の取得

redisには、redis-cliという便利なクライアントツールが用意されています。
これを利用して、稼働中のredisの状態を監視します。

redisには、infoというコマンドが用意されていて、redis-serverの状態を出力してくれます。
$ /usr/local/bin/redis-cli info
redis_version:2.0.2
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
process_id:27077
uptime_in_seconds:786661
uptime_in_days:9
connected_clients:1
connected_slaves:0
blocked_clients:0
used_memory:34944584
used_memory_human:33.33M
changes_since_last_save:4903
bgsave_in_progress:0
last_save_time:1287647443
bgrewriteaof_in_progress:0
total_connections_received:12550855
total_commands_processed:37684666
expired_keys:6830
hash_max_zipmap_entries:64
hash_max_zipmap_value:512
pubsub_channels:0
pubsub_patterns:0
vm_enabled:0
role:master
db1:keys=59136,expires=59136

1分ごとにredisにinfoコマンドを発行して、状態を取得します。
file: /etc/cron.d/redisstat
* * * * * root /usr/local/bin/redis-cli info > /var/log/redisstat.log.new; mv /var/log/redisstat.log.new /var/log/redisstat.log
一度、redisstat.log.newに出力してから、redisstat.logにmvしているのは、
「redis-cli info」がredisサーバーからの応答を待ってる間に、ZABBIXが値を取りにきて、おかしな値が出力されるケースがある為です。
今のところ、redisでは、そういうケースはありませんが、ApacheやMySQLでは、そういう、いわば「滞空時間」にZABBIXが値を取得しにくるケースに遭遇したことがあります。


3.2 ZABBIXに項目を追加

infoから出力されるデータのうち、used_memoryとconnected_clientsを監視することにしました。
zabbixへの項目追加は、以下のようになります。
UserParameter=redis.connections,grep connected_clients /var/log/redisstat.log | cut -d':' -f2
UserParameter=redis.used_memory,grep 'used_memory:' /var/log/redisstat.log | cut -d':' -f2

これ、より汎用的に
UserParameter=redis.stat[*],grep $1: /var/log/redisstat.log | cut -d':' -f2
でも、いいかもしれませんね。
今、思いつきました(笑)

3.3 スクリーンを作成

ZABBIX上で、上記の2項目の他に、
・ロードアベレージ
・ネットワークのin/out
をまとめて、スクリーンを作って、監視体制の整備は、完成です。



新しい要素を加える場合、だいたい上記のような流れで、監視体制までを準備してから、サービスへ投入しています。
今回、redisをサービスに投入した後に出くわしたトラブルについても書こうと考えていたのですが、サービス投入までの記述が思った以上の分量だったので、トラブルについては、次回以降にしたいと思います。

では、また次回に♪

2010/10/20

NoSQL redisとMySQLのベンチマーク比較

こんにちは、ミツバチワークス stoneです。

「NoSQL」という言葉を、最近知りました。
確かに、データベースをテーブルごとに小分けして行くと、トランザクションとか、SQLのjoinとか使わなくなって、DECOLOGでも、MySQLを単純なKey-Valueストア的な使い方をしている箇所がいくつかあります。

Key-Valueストアと言えば、DECOLOGでもmemcachedを使用していますが、memcachedのスピード感でデータが揮発しないというのは非常に魅力的です。
DECOLOGのデータ群の中でも、簡単なKey-Valueストアで、話がすむデータがいくつかあり、
現状のMySQLよりも速い方法があるのなら、ぜひ、試してみたいところです。

そこで、今回、hiroshiが見つけてきたredisがよさそうなので、「そもそも本当に速いの?」というのを、簡単なベンチマークを取って、試してみました。

このベンチマークの環境は、DECOLOGで使用しているものがベースになっています。
そのため、ツッコミどころはたくさんあると思いますが、

「DECOLOGの環境では、こういう結果でした」


というご紹介だという前提で、読み進めてください。


1. ベンチマークの環境


サーバーは、4台用意しました。
サーバーのハードウェアは、すべて同じで、
CPUIntel Xeon L5410 × 2
Mem12GBytes
HDD685G(RAID1)
Net100Mbps
という構成です。

サーバーA

ベンチーマークを取るサーバー
このサーバー上で、abを走らせます

サーバーB

Apache + PHPのサーバー
DECOLOGで、実際にサービスしているWebサーバーと
同じセットアップをしてあります。
関係ありそうなソフトのバージョンを上げておくと。。。
Apache
2.2.x(MaxClients 200)
PHP
5.2.x(APC 3.0.x)
MySQLへの接続
PEAR::DB
Redisへの接続1
owlient-phpredis-2.0.4-5
Redisへの接続2
Rediska0.5.0
と、なっています。

サーバーC

MySQLサーバー
バージョン: 5.0.x
ストレージは、InnoDB、BlackHole、Archiveを使用しました。
InnoDBのパラメーターのうち、スピードに関係ありそうなモノのは、
こんな↓感じで設定しています。
innodb_buffer_pool_size=9216M
innodb_flush_log_at_trx_commit=2
innodb_file_per_table

サーバーD

Redisサーバー
バージョン: 2.0.1
パフォーマンスに関係しそうな設定は、こんな↓ところでしょうか?
save 900 1
save 300 10
save 60 10000
appendonly no
vm-enabled no

2.ベンチマークの方法


サーバーAから、abコマンドで、
$ ab -c 200 -n 100000 http://server-b/path/to/benchmark/script.php
として、abの出力のうち、
Requests per second
という項目に注目しました。

また、事前に、MySQL、Redisともに12万件程度の、id(int) => value(int)という形式の
データを事前にストアしてあります。

3. テスト項目

3.1 インクリメントのテスト

idをキーにして、valueをインクリメントする、というのをテストしました。

SQLにすると、こんな↓感じです。
update counter set count_value=count_value+1 where id=?
Redisなら、incrコマンドですね。

3.2 insertのテスト

現在、Archiveエンジンでロギング+バッチで集計、としている部分を、
redisのincrで置き換えられないか?というのも試してみたかったので、
一緒にベンチマークを取ってみました。

4. PHPのredisインターフェースについて


redisのプロジェクトホームへ行くと、
Predis、Rediska、redis.php、phpredisの順で、PHPのインターフェースが記載されています。
Rediskaは、PHPのみで記述されていること、phpredisは、PECLのmemcacheに使用感が似ていたこと、
からこの2つを取り上げました。

5. ベンチマークの結果


さて、前置きはコレぐらいにして、ベンチマークの結果です。
それぞれ、5回試行して、最大/最小値をカット、中間値の3つの値の平均を取っています。

で、結果は、こんな↓感じでした。
MySQL
コマンドストレージreq/sec
updateBlackHole3650.94
updateInnoDB3204.03
insertBlackHole3400.94
insertArchive3435.64

Redis
コマンドクライアントreq/sec
incrphpredis6553.42
incrRediska2955.51


ついでに、select/getも各々1パターンだけとってみました。
エンジンreq/sec
MySQL(InnoDB)3699.17
redis(phpredis)6317.66

それぞれをグラフにするとこんな感じです。
図.コマンド/ストレージ


図.コマンド/クライアント




図.エンジン

6.感想


このベンチマークの結果、DECOLOGの環境では(←ここ、大事です)、redis+phpredisが頭抜けて速いことがわかりました。

また、ベンチマークを取っていたときは、
「すげーっ!!redis、速ぇーーーっ!!」と興奮していたのですが、
少し間を置いてから、冷静になって考えてみると、
・phpredisとRediskaの結果の対比
・RediskaとMySQLがほぼ変わらない
を考えると、PHPのコードが多分に影響してるように思えます。
MySQLの接続は、DECOLOGの歴史的な要因で、PEAR::DBですし。。。

が、「現状のDECOLOGの環境」をベースに考えれば、
やっぱり、redis+phpredisが断然速いので、redisをサービスへの投入することを決めました。
新しい要素の投入は、結構、この程度のノリでやってます。
実際にサービス投入/運用してみて、初めて見えてくる問題とかありますし。。。

7. サービスに投入してみたけれど。。。


この記事を書いてる時点で、redisをサービスに投入して、
うまく行った事例が1つと、うまく行かなかった事例が1つあります。

うまく行かなかった事例では、問題が2つ発生しました。
1つはパラメーターの調整で解決できたのですが、
もう1つの問題は解決できずに、サイトへのアクセスに影響が出るトラブルになってしまったので、
MySQLに戻しました。

うまくいった事例では、本当にスムースに、期待通りに稼働してくれています。
サーバーのロードアベレージもMySQLに比べて低めで推移してますね。

redisのサービスへの投入方法や、うまくいかなかった事例については、
次回以降に、ご紹介しようと考えています。

では、また次回に♪