Got feedback? We’d love to hear it!

軽く検索するとS3のレイテンシは1桁ミリ秒、帯域はクライアント側のネットワークがボトルネックになるまで(つまり100Gbpsレベル)出るようですね。しかも99.999999999%(11ナイン)の耐久性という数字は生半可な努力で出せる数字ではありません。

なぜそんな高速なストレージがこんなに安いのかというのは一言では「経済の力」となりますがもう少し噛み砕くといくつかの要素があります。

S3はまき餌かも知れない

クラウドビジネス各社ではオンプレミスやコロケーションで顧客自身が契約している物理ハードウェアからサービスそのままで自社のクラウド上に引っ越して貰うこと、通称リフトアンドシフトが基本戦略の一つです。その中でデータ置き場を顧客が自社管理しているNASなどからS3に引っ越してもらうのは重要なマイルストーンです。S3に置いて貰ってそこから煮るなり焼くなりしてもらうのはクラウドを使い込んでもらうために重要な起点となりますのでAWSはそのアップロードの敷居を下げるためにSnowballなどのサービスを整備しています。またS3にアップロードしたペタバイトクラスのデータを外に改めて持ち出すのはとても大変なので、AWSにロックインさせる事を目的としてS3は原価以下の価格で提供してもサービス全体では投資が回収できるという目論見でいわゆる逆ザヤをやっているのではないかという説もあります(実際の所どうなっているかは知りません)。とにかくそれぐらいやってもおかしくない戦場がクラウドのオブジェクトストレージです。

帯域は金で買える

S3を運用する側が一体何台のコンピュータを使ってサービスを回しているかはまるでわかりません。ですがクラウド事業者の持つデータセンター内データ帯域は市販品とは別のライフサイクルで強化され続けており、EC2で借りれるマシンの中には100Gbpsのネットワーク帯域が出る物もあります。そしてハードディスクなどのストレージデバイスはクラウド事業者は途轍もない規模で買うのでいわゆる電気屋で一般人が買う価格と比べると圧倒的に安くなると言われています。ですので「とにかく大量のデータを保存したいから大量のマシンを調達して横に並べて負荷分散してするぞ!」と覚悟さえ決めればハードウェア的には25ドル/TB/月は実現可能な範囲にあると感じます。もちろんソフトウェアや運用のコストが掛かるのでゼロからクラウド事業を初めた人がお金だけでどうにか解決できるとは思いません。何にせよ、大量調達による仕入れ原価の削減は重要な要素です。そしてサービスのインタフェースとしてはオブジェクトストレージなのでサーバ台数を増加させることによる帯域幅の拡大は比較的自然に行うことができます、いわゆるシャーディングですね。HDDはヘッドシークに10ms程の時間が掛かってしまうのでそこが支配項にならざるを得ません、ですので可能な限り内部では並列化して帯域を稼いでいます。

レイテンシは知恵でしか買えない

S3は公開情報によると複数のAZ(例えば同じ地域の別の建物など)に常に複製し終わってから初めてクライアントに完了と返事をする仕組みでその完了レイテンシは10ms前後に有るようです。S3 Express One Zoneというストレージクラスを明示的に選ぶことで一時的な耐久性を少し犠牲にしてレイテンシを1桁ミリ秒へと短縮することができると書いてあるので、その辺りがアルゴリズム的な上限に引っかかる境界なのだと見受けられます。つまり顧客から受け取ったデータを複数のAZに複製し終わるのを待つかどうかで数msの遅延が有るか無いかが変わってくるので最初に書き込み依頼を受けたサーバはローカルに書くかすぐ隣のマシンにも送るか等をして自身が即クラッシュしてもデータが永続化された状況を作り出す事で高い耐久性を実現していると考えられます。

データを複製すると言ってもナイーブな方法では故障に弱いのでちゃんとアルゴリズム的に強く検証したものを使用する必要があり、形式手法を用いて確認を行ったという話などは探すといくらか出てきます。アルゴリズムやサービスのバリエーションなどの側面でもレイテンシを縮める工夫を凝らしているようです。

僕は以下のブログを流し読みしかしていませんが、実態は絶え間ないエンジニアリングの努力の果てにできているサービスであることをしみじみと感じました。

https://highscalability.com/behind-aws-s3s-massive-scale/

Behind AWS S3’s Massive Scale

This is a guest article by Stanislav Kozlovski, an Apache Kafka Committer. If you would like to connect with Stanislav, you can do so on Twitter and LinkedIn. AWS S3 is a service every engineer is familiar with. It’s the service that popularized the notion of cold-storage to the

highscalability.com

9時間
💌 スーパーレターへの回答方針

機密事項は一切答えません。


0 / 20000
¥0

利用規約プライバシーポリシーに同意の上ご利用ください

熊崎 宏樹さんの過去の回答
  • 再帰とか抽象構文木とかマクロですかね…。人によって「最低限」の基準が違うので論じにくい話です。

    この手のメタな知識はまさにLISPの世界で熱心に研究され続けて来たので「計算機プログラムの構造と解釈」通称SICPという本に集まっており、だからこそ熱心なプログラマはこの分厚い本を崇めたりLISP使いになったりします。昔はSICPがマサチューセッツ工科大学の教科書だったりしたのですが最近はPythonをやるようになったという噂もあって、それほどLISPが必須知識として見做されなくなってきた風潮を感じます。もちろん興味が有るのであれば是非邁進してください。

    11時間
  • テック企業で働く気ならスキルセットをテックに寄せる方が近道ですし、アメリカ系の企業なら社内の公用語は英語でしょうから英語を社内公用語に使っている会社なら英語の練習にもなっていいですね。

    英語が公用語かつテック系で日本にオフィスを置いている会社は都内にたくさんありますのでぜひ検索してみてください。

    1か月
  • そんなに高い志など無く、自分が好きな分野の中で社会から需要がある所を選んだ感じです。ただし、MLとかデータサイエンティストなどは数式とにらめっこする時間の方が長そうなので、数学力ではなくてCPUアーキテクチャとかそういう知識が活かせそうな分野を選びました。

    最近は「異世界転生するなら俺TUEEEできる所を狙いたい」というモチベーションぐらいで充分なんじゃないかと思っています。

    1か月
  • いつもXでmondの回答拝見して参考にさせて頂いたいます。 今回初質問になりますが、よろしくお願い致します。 相談内容は「どうすれば自分がわからない部分を言語化して自分で解決して理解できるようになるか」です。 自分は普段Webアプリケーション開発に従事しておりエンジニア歴は6年目になります。 簡単なCRUDのAPIを実装したり、フロントエンドで画面を構築はできるつもりです。 しかし、少しでも知識の深掘りが要求されると途端につまづいてしまいます。 例としてパフォーマンスの高いSQLを書けるようになるためRDBMSにおけるB-Tree Indexの仕組み(なぜインデックスを貼るとクエリ処理が早くなるのか)を勉強したものの、どんな入門書やネットの解説記事、各種RDBMSの公式リファレンスを読んでも理解出来ませんでした。 他にもRDBだけでなくアルゴリズムとデータ構造やネットワークなどあらゆる分野で少し難しいレベルが要求されると何が分からないのかが分からず八方塞がりになってしまいます。 そんな状態がここ2,3年続いており、自分のエンジニアとしての技術レベルが停滞しています。認めたくないものの自分のエンジニアとしては限界なのかもしれないと感じています。 もちろん、他の方が自分の何倍も技術に向き合われていて単に自分の努力不足であることは承知しております。 しかし、「何を勉強しても何を勉強しても何が分からないのかを言語化できず、自学自習のサイクルを回せない」のではエンジニアとして失格であると考えています。 しかしエンジニアであることを諦められないため、「どうすれば自分がわからない部分を言語化して自分で解決して理解できるようになるか」をアドバイス頂きたいです。 お手数おかけしますがお手数おかけしますが、ご回答頂けますと幸いです。

  • お世話になっております。コンピュータサイエンスについて質問があります。 現在 23 歳の高卒ソフトウェアエンジニアで CS を体系的に学びたく学士を取得しようと思っています。やる気があれば修士以降もやりたいです。 単純にコンピュータやコードを書くのが好きでもっと詳しくなりたかったり、自分に出来ることを増やしたりビッグテックで働いてみたいなど理由は色々あります。 選択肢は2つ考えていて、働きながら海外の大学のオンライン講義を受けるか、国内の大学で学ぶため受験からやり直すかです。 単純に比較をするのは難しく懸念点も様々ですが、気にしているのは卒業後の年齢で入社しようとしても足切りされるのではないかという点を心配しています。高度な仕事をやりたくて勉強したのに土俵に立つことすら出来なくなってしまったら少し悲しいです。社会人大学生としてやっていく方がリスクが少ないのは分かっているのですが、まだ決め切れておらず kumagi さんが同じ立場だったらどうするか意見をいただきたいです。 色んな求人を見たりするのですが大体必須条件に CS の学士・修士または同等の実務経験と書かれていることが多く CS に関する知識の必要性を日々感じています。コーディングテスト?は受けたことが無いので分からないのですが一応 AtCoder 黄なのでなんとか行けるかな、、と思っていたりもするのですが… 競プロをやってきて凄い人に沢山出会うのですが、経歴を見ると大体東大を通っていて凄い事をやりたいなら自分もそういうところで学ぶべきなのかと考えてしまいます。 長文になってしまいました、申し訳ありません。 お手数をおかけしますがご回答いただけますと幸いです。

  • 全くですね。アセンブラを眺めるのなんて顕微鏡で拡大して観察するようなもので、今どこを見ているかを把握することすら難儀です。

    僕はアセンブラと日常的に戯れるエンジニアではないのですが、自分の書いたC++が自分の狙った通りの機械語に変換されているかを確認するために godbolt.org にコード片を入れています。ベンチマークを取っている時にタイトなループの内側でインライン化することを期待していた関数がやけに遅い時などに役立ちます。

    4か月
  • どれだけ正確に覚えているかは個人差があると思いますが、うちの子は語ってくれます。ただし「ママのおなかのなかにいるときにあーまーどこあくりあしたの」ぐらい適当な事いうので僕も「うんうん、お腹の中は暇だろうからプレステ入れといたんだよね」と応じています。

    6か月
  • 僕ならPostgreSQLを選びます。

    ローカルで立ち上がるのでアプリ開発中のデバッグが簡単なのとSpannerやAlloy DBやAurora PostgreSQL等のクラウドネイティブなRDBMSが互換インタフェースを備えている事が理由です。

    追記型という形を取っているため行内の更新が多いとインデックス側の更新が多くなりMySQLに乗り換えるUberのような事例もありますがそういうのは発生してから対策しても遅くないのでEarly Optimizationと割り切って行きます。

    1年