単一システムを長く動かす ── すり減るものを、無駄にすり減らさない設計|ストレージ再考 第9話

長寿命化とは「消耗を無駄にしない・必要な使い方に徹する」こと。一台のシステムを長く動かす設計を、書き込み削減・機能分離・ログの外出し・媒体の使い切り・物理の土台まで整理した、ストレージ再考の集大成。

システムを設計するとき、私たちはつい「速さ」や「機能の多さ」に目を向けてしまう。だが、長く動き続けるシステムを作りたいのなら、本当に設計すべきは別のところにある。

本稿で扱うのは、その中でも最も基本的な舞台──たった一台のシステムを、いかに長く動かすかである。

そして、ここで言う長寿命化とは何かを、先に一文で定めておきたい。長寿命化とは、消耗するものを無駄に消耗させず、必要な使い方に徹しさせることだ。 本稿はこの一点に貫かれている。

長寿命を実現する道筋には、段階がある。まず一台のシステムそのものを長持ちさせる。それでも足りなければ、複数台でサービスを止めない継続性の設計に進み、本当の最後の手段として、システムごと作り替える。後ろの二つは今回は参考程度にとどめ、本稿は最初の一段──単一システムでの長寿命に集中したい。

第7話では、メモリやストレージはどれも万能ではなく、最後は「構成」で決まると書いた。本稿はその結論の、いわば実践編にあたる。速さでも容量でもなく、寿命という軸で、一台のシステムを眺め直してみたい。なお「速くする」話そのものは別稿で扱ったので、ここでは触れない。


「壊れないシステム」は存在しない

最初に身も蓋もない前提を置いておく。壊れないシステムは存在しない。

電子部品は経年で劣化し、ディスクは回り続ければ摩耗し、Flashは書けば書くほど寿命を削る。永遠に壊れないものを作ることはできない。

ならば、一台のシステムを長く動かすとは何か。それは「壊れないもの」を目指すことではない。冒頭で定めたとおり、消耗するものを無駄に消耗させず、必要な使い方に徹しさせること──すり減る場所を限定し、すり減りを必要最小限に抑え、持っている寿命を最後まで引き出す。これが一台を長く生かす設計の正体である。

そして消耗を最も加速させる要因の一つが、ほかでもない「書き込み」だ。まずはここから入っていこう。


システムはどこから消耗するか ── 「書く」が寿命を削る

第7話で整理した表を思い出してほしい。NAND Flashの書換上限は、おおよそ10³〜10⁵回のオーダーだった。SRAMやDRAMが実質無制限なのに対し、不揮発で安価なFlashは「何度書けるか」に明確な限界を持つ。つまりFlashは、紛れもない消耗品である。

ここで効いてくるのが、「読む」より「書く」のほうが寿命を削るという非対称性だ。データを読み出すだけなら、デバイスはほとんど摩耗しない。寿命を削るのは、ひたすら上書きされ続けるデータのほうである。

では、一台のシステムの中で「書き続けられる」データとは何か。

  • ログ(イベント、アクセス、デバッグ出力)
  • 一時ファイル・キャッシュ
  • データベースのジャーナルやインデックス更新
  • 各種の状態ファイル・カウンタ

これらは、システムが動いている限り、静かに、しかし絶え間なく消耗品を削り続ける。一台を長持ちさせる設計とは、突き詰めれば「無駄に書かない」設計から始まる。どこに何を書くかを決めずに組んだシステムは、最も書き込みの多い場所から、静かに寿命を迎える。


設計その1:ストレージを「階層」で考える

第7話の結論は「適材適所」だった。これを寿命の観点で言い直すと、データを“消えていいもの”と“残すべきもの”と“書き続けるもの”に分け、それぞれを別の場所に置く、ということになる。

データの性質(何に使うか)置き場所この置き方のメリット
消えてよい一時データ(キャッシュ、作業中ファイルなど)揮発メモリ(RAM / tmpfs)どうせ消えてよいデータなので、その書き込みで不揮発媒体をすり減らさずに済む
高速な読み出しが重要で、更新頻度が低いデータ(OS本体・プログラム・設定など)不揮発の読み取り中心の領域必要な読み出しに応えつつ、書き込みによる消耗をほとんど生まない
常時書き続けるデータ(ログなど)外部・遠隔・集約先避けられない摩耗を、本体そのものから切り離せる
データを置き分ける
データを置き分ける

ポイントは、すべてを1つの速くて便利なストレージに任せないことだ。速いデバイスは消えやすく、安いデバイスは摩耗する。それぞれの弱点を、データの性質と引き合わせて配置する。これが階層という発想であり、消耗品を「必要な使い方に徹しさせる」ための、最初の一手である。


設計その2:機能分離 ── 一台の「中で」役割を分ける

40年以上前のワンボードマイコンには、SRAMとEPROMを必要に応じて差し替えられる作りのものがあった。役割の違うデバイスが、それぞれ別のソケットに挿さっていたからこそ、片方だけを交換・増設できた。

一台のシステムを長く動かすうえでも、この発想は効く。ここで言う分離は、別の箱に分ける(それは継続性の話だ)のではなく、一台の中で、領域とプロセスと役割を分けることである。

  • OS領域・データ領域・ログ領域を、パーティションやデバイスで分けておく
  • プロセスを分離し、一部の暴走やリソース食いつぶしが、全体を巻き込まないようにする

1台・1ディスク・1プロセスに全部を載せてしまうと、どこか1点の消耗が全体を巻き込む。 役割を分けておけば、傷んだ部分だけを切り離せる。そして「必要なものだけを載せる」という抑制は、そのまま「余計な書き込みを生まない」ことにもつながる。詰め込まないこと自体が、消耗を必要な範囲に閉じ込める設計なのだ。


設計その3:ログの置き場所を変える

消耗を減らす設計を語るうえで、ログは象徴的な存在だ。ログは「書き続ける」ことが宿命づけられたデータであり、しかも普段はほとんど読まれない。つまり、寿命を削るだけ削って、見返されないまま蓄積する

ここに、ひとつの逆説がある。

観測のための記録が、観測対象そのものを壊す。

無駄に書かない
無駄に書かない

健全性を確かめるために残したログが、それを書き込むFlashやSDカードを真っ先に摩耗させ、システムの寿命を縮めていく。だからこそ、ログは「外に出す」ことを基本に据えたい。具体的な方向性は2つある。

(1) リモート化する ── ログの出力先を、別のホストやログ集約の仕組みへ向ける。書き込みの負荷と摩耗を、システム本体から物理的に切り離してしまう。集めたログを一箇所で見られるようになる、という運用上の利点も大きい。

(2) Flashの対象外にする ── どうしてもローカルに出すなら、揮発側(RAM上の領域)に逃がす。電源を切れば消えてしまうが、「消えて困らないログ」であれば、それでよい。残したいものだけを選び、定期的に外へ送る。本体のFlashは、できるだけ「書かない領域」として温存する。

あわせて、小さな積み重ねも効く。「読むだけ」のアクセスで更新時刻が書き込まれるのを止める(noatimeの発想)、swapを常用してFlashを削らない、ログレベルを運用時は絞りローテーションで肥大を防ぐ、書き込みをまとめてコミット間隔を調整する──いずれも「無駄に書かない」ための地味だが確実な一手だ。最終的には、書く場所を最初から限定して設計することに行き着く。


設計その4:消耗品を使い切る ── 無駄に削らず、寿命まで

書き込みを減らしてもなお、ストレージ媒体は消耗品である。長寿命化のもう半分は、その消耗品を早すぎる廃棄で無駄にせず、持っている寿命を最後まで引き出すことにある。

  • 容量を使い切らない(オーバープロビジョニング) ── 一見、矛盾して聞こえるが逆だ。空き領域は、ウェアレベリングが書き込みを分散させるための“逃げ場”になる。常にぎりぎりまで詰め込むと同じ場所が集中的に摩耗し、かえって早く尽きる。余白を残すことが、結果として寿命を最後まで使い切る道になる。
  • 用途に合った高耐久媒体を選ぶ ── 安価なSDカードで済ませるのか、書換上限の高いデバイスを選ぶのか。第7話の表が示すとおり、媒体ごとに「何度書けるか」は桁で違う。必要な使い方に対して、過不足のない媒体を当てる。
  • 摩耗を見える化する ── SMARTのような仕組みで残り寿命や書き込み量を監視すれば、「まだ使えるのに捨てる」無駄も、「ある日突然死ぬ」不意打ちも、どちらも避けられる。
  • 媒体を消耗品と割り切る ── 本体側を、媒体だけを差し替えられる作りにしておく。すり減った媒体を替えるだけで、一台をそのまま生かし続けられる。

「壊れたら一台ごと終わり」ではなく、「すり減る部品を、寿命まで使い、替える」。この割り切りが、単一システムの寿命を大きく左右する。


土台としての物理 ── 熱・可動部・電源

ここまではソフト寄りの工夫だが、一台の寿命を最終的に決めるのは物理だ。

電子機器の寿命を最も削るのは、実は熱である。放熱・設置環境・埃への配慮、定格ギリギリで使わず余裕(マージン)を持たせること、ファンやディスクのような可動部品をできるだけ減らすこと、そして安定した電源。これらもまた、「消耗を無駄に増やさない」という同じ原理の上にある。熱も振動も電源の乱れも、要は余計な負荷=余計な消耗だ。土台が脆ければ、上でどれだけ書き込みを工夫しても、その努力は無に帰す。長寿命設計は、案外この足元から始まっている。


コラボ事例として ── 「本体を汚さない」という構成

設計思想の実例として、当サイトがコラボレーションしているスマートホーム環境「hsBox」の構成に触れておきたい。

hsBoxは、USBから起動するUbuntu環境という作りを採っている。これは寿命の観点で見ると示唆に富む。起動環境そのものを差し替え可能なメディアに載せ、本体側のストレージを直接汚さないという構成は、本稿で述べた「ログの外出し」「機能分離」、そして「媒体を消耗品として使い切る」という発想を、一台のレベルで体現した一例といえる。古いワンボードマイコンのソケットから現代のスマートホーム環境まで、一台を長く動かす発想の芯は、驚くほど変わっていない。


参考:本稿の外にある話

最後に、本稿が「あえて踏み込まなかった」隣接領域を、地図として置いておく。いずれも大切だが、軸が違う。

止めない(可用性)の話。 ウォッチドッグや自動再起動、グレースフルデグラデーションといった「自分で立ち直る」仕組みは、しばしば長寿命と混同される。だがこれは消耗を減らす話ではなく、壊れても止めないための仕組み──可用性の観点だ。寿命を延ばすわけではないが、運用を支える別の柱として、頭の片隅に置いておきたい。

延ばしきれなくなったら。 一台でできる延命には限りがある。それを超えたとき、複数台でサービスを止めない継続性の設計(冗長化・フェイルオーバー)が次の段に控える。そして本当の最後の手段が、システムごとの作り替えだ。老朽化する前に計画的に新しくする発想で、ソフトウェアでは「犠牲的アーキテクチャ」とも呼ばれる。

これらはいずれも単一システムの枠を超える。継続性や作り替えに頼る前に、まず一台でやれることを、やり切ろう──というのが本稿の立場である。


まとめ ── 一台を長く生かすという設計

単一システムを長く動かすための要点は、振り返ってみればシンプルだ。すべては冒頭の一文に収れんする。消耗するものを無駄に消耗させず、必要な使い方に徹しさせる。

  • 書き込みを減らし、外へ逃がす(無駄に削らない)
  • 役割を一台の中で分け、余計を載せない(必要な使い方に徹する)
  • 消耗する媒体を、監視し、寿命まで使い切る
  • 熱・電源・可動部という物理の土台を侮らない

壊れないことを目指すのではない。すり減る場所を限定し、すり減りを必要最小限に抑え、持っている寿命を最後まで引き出す。可用性や継続性、作り替えという次の段に頼る前に、まず一台でやれることは、驚くほど多い

 一台のシステムを長く生かす鍵は、「壊さない」ことではなく、「すり減るものを、無駄にすり減らさず、必要なところにだけ使う」こと。長寿命とは、消耗の設計である。


関連記事

parameter/使い分けの軸を定義する──データとデバイスの分析パラメータ|ストレージ再考 第4話

ストレージはデバイスではなくデータの性質で選ぶ時代へ。
重要度・更新頻度・レイテンシ感度などの観点から、
HDD・SSD・NASの使い分けを整理する「ストレージ再考」第4話。

前回は、さまざまな記憶装置や媒体が生まれては消えながら、多様な記憶デバイスが存在してきたこと、そしてそれらを組み合わせてシステムが構築されてきたことを振り返った。
そして、それらをいかに使いこなすかという点において、「うまく使い分ける」という発想が重要であることを確認した。

では、その使い分けは、何を基準に行えばよいのだろうか。

記憶デバイスの選択は、どうやって行われてきたのか。
基本的な方向性は、「安い」「速い」の二つの軸であろう。

この二つの指標は、長い時間をかけて記憶装置の進化を方向づけてきた。
容量単価は下がり、速度は向上し、それに合わせてシステムの構成も変わってきた。
「より安く、より速く」という判断は、きわめて合理的だったと言える。

しかし実際の運用の現場では、この二軸だけでは説明できない選択が数多く存在する。

storages1

高速ではない媒体に、あえて重要なデータを置く。
コストが高くなるにもかかわらず、冗長化を行う。
頻繁に使うわけではないのに、低遅延の領域に配置する。

「安い」「速い」という基準だけでは、これらの判断は説明できない。

では、何が判断を分けているのか。

その起点は、デバイスではなく、データそのものにある。


データの性質からしか説明できない選択がある

同じ容量のデータであっても、扱い方がまったく異なることがある。
それは、データごとに「性質」が異なるからだ。

業務のためのデータ。
記録として残すデータ。
分析のために蓄積されるデータ。
残すこと自体が目的となるデータ。

同じ「ファイル」という形をしていても、その意味は同じではない。
意味が違えば、置き方も変わる。

ここで初めて、ストレージの選択は「速度」や「容量」だけでは決められないものになる。


データは、それぞれ違う目的で存在している

データは、単に保存されるために存在しているわけではない。
必ず「何に使うか」という目的を持っている。

日々の業務を動かすためのもの。
あとから参照するための記録。
将来の分析に備える素材。
長く残し続けること自体が意味になるもの。

目的が変われば、求められるストレージの姿も変わる。

ここで、選択の起点はデバイスから離れ、
「どのようなデータなのか」という問いへと移っていく。


データごとに“待てる時間”が違う

すぐに取り出せなければならないデータがある。
多少待っても問題のないデータがある。
今すぐ使う予定はないが、いつか必要になるかもしれないデータもある。

速度は、単なる性能指標ではない。
そのデータが「どれだけ待てるか」という性質の表れでもある。

ここで初めて、「速いこと」の意味が定まる。
すべてを高速にする必要はない。
必要な場所にだけ速さが求められる。


変わり続けるデータ、変わらないデータ

書き換えられ続けるデータがある。
追記されながら成長していくデータがある。
一度書いたら、そのまま動かないデータもある。

この違いは、見た目には分かりにくい。
しかし、ストレージとの相性を大きく左右する。

頻繁に更新されるデータは、書き込み性能や耐久性を必要とする。
ほとんど変化しないデータは、安定した保管が優先される。

データの「変化の仕方」が、置き場所を決めていく。


失えないデータがある

ここで、もう一つの視点が現れる。

失っても問題のないデータと、失ってはならないデータがある。

この違いは、容量や速度では測れない。
それは「価値」の問題である。

重要なデータほど、守るための仕組みが必要になる。
冗長化やバックアップは、コストの問題ではなく、価値に対する設計になる。

ここに至って、ストレージの選択は、
単なる性能比較から「守るための構成」へと変わっていく。


データは時間の中に存在している

データには寿命がある。

短期間だけ使われて消えていくもの。
数年にわたって参照されるもの。
長く残し続けることが前提となるもの。

時間が変われば、データの価値の形も変わる。
役割が終わったあとに、記録として残る場合もある。

ここでストレージは、「保管場所」という意味を越え、
時間の中でデータを支える器としての役割を持ち始める。


ここまで見てくると、ストレージの選択は、
「どのデバイスを使うか」という問題ではなくなっている。

データがどのような目的を持ち、
どれだけ待てるのか、
どれほど変化し、
どれほどの価値を持ち、
どのくらいの時間の中に存在するのか。

その性質の組み合わせによって、置き場所が決まっていく。

ストレージは「デバイスで選ぶ」のではない。
「データの性質から設計される」のである。


関連記事

関連外部リンク

https://aws.amazon.com/jp/s3/storage-classes/intelligent-tiering

https://cloud.google.com/blog/ja/products/databases/introducing-bigtable-tiered-storage

https://qiita.com/tomozilla/items/152b76195e9ced933efb

https://docs.aws.amazon.com/ja_jp/msk/latest/developerguide/msk-enable-cluster-tiered-storage-cli.html