- キャッシュキャッシュ雪崩雪崩
- キャッシュキャッシュの浸透浸透
- キャッシュの内訳ホットスポット無効
3つの質問のキャッシュシステムで
A.ユビキタス・バッファ・
コンピュータ・システム内のキャッシュがRedisのデータベースキャッシュメモリと、キャッシュL1-L3は、CPUレベルで、加速度TLB仮想アドレスと物理アドレスがあり、どこにでもあるLinuxでアプリケーション層のように、ローカルキャッシュは、携帯電話は、ローカルファイルのキャッシュを持っている、というように、ブラウザにあります。
目に見える、コンピュータシステムにおけるキャッシュは非常に重要な位置を持っている、主な役割は、応答速度を改善し、読み込みなど、この記事は非常に並行システムでシステムをキャッシュに焦点を当てたディスクを削減することです。非常に並行システムにおける文のステータス・キャッシング・システムは、その後、次のとおりです。システムは非常に同時ケバブであれば、キャッシュシステムは、クミンの一握りです......
II。並行性の高いシステムキャッシュ- キャッシングシステムの役割
非常に並行システムの役割でシステムをキャッシュすることは巨大であり、何のキャッシュシステムは、C50K(おそらく、この値は非常に楽観的となっている)以上のシーンをサポートすることは困難ではありませんがあります。
SSDまたは機械的なディスクベースのデータベースシステムでは、読み取りと書き込み速度は、データベースのディスクメディアだけでは、高い同時実行性をサポートすることはできませんので、あなたはディスクキャッシュデータベースは、バリアディスクデータベースで保護することであると考えることができ、はるかに遅いRAMを超えています。- キャッシュシステムとデータベースシステムへのアクセス
以下の例のように読んで、シナリオを書くと(実際の読み取りやシーンを書いが少ない)、要求が応答、簡単なプロセスを取得する方法を参照するには、次の要求が到着した後、サービススレッドの最初のアクセスのキャッシュ、キャッシュがヒットし、リターンを打つ場合ではない場合これは、ディスクのデータベース・システムを要求し続け、その結果がキャッシュシステムに戻って書かれており、熟成時間を増やすため、タイムアウトで、その後、あなたは、要求が到着すると、同じキャッシュがヒットすることができています。これらは、並行性の高いシステムキャッシュとディスクデータベースシステム、クライアント要求、問題のフォローアップ分析の間の相互作用している、また、このプロセスに基づいて展開。
システムキャッシュ三三の大課題
、問題をたくさんキャッシュ3つの記事のために、ネットワーク上の3つの問題は、主に言及しました。- キャッシュキャッシュ雪崩雪崩
- キャッシュキャッシュの浸透浸透
- キャッシュの内訳ホットスポット無効
私が言うことができなかった、と明確な違いを気にしない、そう言うことですか曲がっナッツ見るためにGoogleに期待する、しかし、英語では上記の英語の表現ということ、そして中国の翻訳は基本的に同じである上に、私がされている3つの用語については、これだけ強い心。
A.キャッシュ雪崩問題
失う瞬間に頼って、サポートされていた雪と氷の雪崩いわゆる、と瞬時にダウン殺到。このシーンは作られた貯水池雪崩村を救うために、コナン映画の2011年リリースの「サイレント15分、」コナン北沢村のことを思い出します。
注:真央Lilanは彼のショットを探していたときにコナンが雪崩に埋もれた映像ショーは、黄金期を救います並行性の高いシステムへの雪崩見て本当に恐ろしい、バックは、キャッシュシステム障害あれば、キャッシュデータ要求からの多数の要求を完了することはできませんので、データベースで、その結果、ディスクのデータベース・システムに向かって押し寄せるの全額が死亡し、システム全体の総崩壊。
雪崩のキャッシング・ソリューション
観点から主な理由は、これにより、キャッシュシステムの安定性と可用性を増大させる、十分なキャッシュ・システムの可用性はないキャッシュシステムは、キャッシュシステムを向上させる等センチネルセンチネル機構、クラスタリング、永続性の使用を必要とする用途のRedisの目的のために、必要ですHA。
サービスそのものよりも、他の一方HAキャッシュシステムもダウングレードをサポートする必要がある確保に加えて、サービス、降格、雪崩が発生し、問題の程度を減少するために電流制限を実装するために吹きネットフリックスのHystrixを使用することができます。12306からご自宅のチケットを返す毎年どのようにグラブ背面にあること大雪は確かに高速を閉じて完全に通行不能、白はライン上で完全に死んだサービスであることをさせない、と取ることが遅い渋滞の少なくともいくつか、そうでない場合は明確で、リコールください。
B.キャッシュが質問に貫通します
浸透像点は次のとおりです。何が透明ゾーンを同じに合格していないかのように要求が円になりました。
非常に並行システムにおけるキャッシュの浸透、そのような要求REQがキャッシュ内にキーを必要としない場合は、実際には、その後、事業スレッドはディスクデータベース・システムにアクセスするには、しかし、このキー・ディスクのデータベースを持っていないが、残念ながら唯一のスレッド業務に戻ることができますヌル、無駄契約円。
非常に並行システムの小さな確率事象はほとんど表示されるように処理することができない通常のリクエストにつながる、これらの要求が存在しないと、悪意のあるブラストが多数存在していないキーを要求された一定の期間は、サービスが対処しなければならない場合、ある必要となっ問題。
栗の場合:それがあるので、ラーメン博物館のスタッフとシェフが入って来た消費者を拒否することはできませんが、限られた事業範囲ラーメン博物館は、その場合には、悪質な消費者は、オーストラリアのロブスターの5ポンドを命じ、ウェイターを通って、料理人は、この需要に対応することはできません最終的に拒否され、順番にこの時間は、料理を破るために1000年、この悪質な消費者、基本的な麺のお店に来ます。
ソリューションに浸透キャッシュ
高並行システムは、あまりにも、キーは非常に重要である読みするかどうかを決定する前に、スクリーニングの効果があるかどうか、一般的な方法は以下のとおりです。
これは再び、実際には、このアプローチの大きな制限のヒットと同等です。keyがnull程度の書き込みには存在しない、今日は無用の大量を格納するためのシステムやデータベースをキャッシュ、ロブスターの5ポンド、6ポンドにカニ明日ですキー自体は、それが一般的に推奨されていない、無意味です。
B.もう一つのアイデアは、データが大量に存在する場合、空間的複雑性および時間的複雑さを考慮して、キーを検索するために同様の問題を識別するために変換され、ブルームフィルタは、一般的に達成するために使用されます。スローブルームフィルタのプロフィール
ブルームフィルタは、1970年に、良いことである、ブルームが提案し、それが実際にランダムバイナリーベクターとマッピング機能の長いシリーズです。
ブルームシステムを実現することができる含む:スパム検出を、衝突自体に起因する誤検出を低減し、従って、認識精度を向上させるために主にKハッシュ関数と特大のビットのハッシュアレイによって、重にスパイダー爬虫類URLを検索。
ブルームフィルタそこにいくつかの偽陽性が必ずしも存在しないかもしれないかどうかを確認、しているが、単にキーシーンのキャッシュ浸透を解決するので、そこに存在してはならないと判断された場合には、実際に、多くのシステムは、布をベースとしている、使用を見てキャッシュを貫くの問題を解決するためにロングフィルタ。C.キャッシュ破壊の問題
キャッシュは、絶縁破壊状況です:システム時間をキャッシュするホットデータの有効期限が切れたように、メインメモリとキャッシュデータの矛盾の原因には有効期限がない場合、有効期限の時間が長すぎる、一般的ではないので、一定の時間を想像します一方、この部分は、ディスク上のデータベース・システムのデータを要求します、キャッシュ・システムにホットデータのバッチを期限切れ。
ビューの説明から、小規模な雪崩が、データベースへの圧力のようなビットは、非常に小さいですが、同時パフォーマンスに影響しますが、故障バッファ、マルチスレッドのシナリオでは、多くの場合場合、逆キャッシュの浸透や雪崩の頻度でありますキャッシュ内訳として良いとして、そうでない大きな意義の内訳を研究。キャッシュの内訳ソリューション
プログラムは、いくつかの程度使用することができます。
。試しようなそれによって同じ時刻が表示され、キーCacheMissの数を減少させる、正および負の浮動は10msに基づいて、基準値の100ミリ秒を設定するように、ホットデータセットの有効期限に分散。
キャッシュは、Bを読み出す。別のアプローチは、CacheMiss後にロックされたスレッドを発見した最初れたマルチスレッド・ロックであり、そしてキャッシュの内容を取得した後、データベースから書き込まれ、ロックを獲得するために別のスレッドが数ミリ秒後に遮断失敗します、データベース内のデータにアクセスするスレッドの数を低減することができる、あなたは別のロックを使用して、スタンドアロンクラスタ、クラスタ環境を実現するために、分散ロックを使用する必要性に注意を払うする必要がありますが、ため同時ロックのも効率に影響を与えます。
C.は、別のアプローチは、同様のRedisのSETNXコマンドを使用することで、この問題のように見える、要求を得ることができないギャップクリアランスは、メインメモリからデータを取り出すことができないキャッシュデータから保留がされています。
それは、このように期限切れのCacheMissバックを避け、最新のデータベースのデータが更新され、キャッシュシステム内のホットキーを拡張されて得るために期限切れになる場合D。最後の方法は、有効期限が切れるまでに約かどうかを確認するために使用するホットデータのビジネス層であります事前に問題を解決するために同等。キャッシュ破壊のソリューションは、あなたが実現します後、長い時間のために実行するために、おそらくあなたのサービスでは、実際のアドレスへのニーズが、一般的にキャッシュの故障の影響ではなく、あまりにも大規模に応じて、一定のトレードオフがありますそこキャッシュ破壊の問題。
A.ユビキタス・バッファ・
コンピュータ・システム内のキャッシュがRedisのデータベースキャッシュメモリと、キャッシュL1-L3は、CPUレベルで、加速度TLB仮想アドレスと物理アドレスがあり、どこにでもあるLinuxでアプリケーション層のように、ローカルキャッシュは、携帯電話は、ローカルファイルのキャッシュを持っている、というように、ブラウザにあります。
目に見える、コンピュータシステムにおけるキャッシュは非常に重要な位置を持っている、主な役割は、応答速度を改善し、読み込みなど、この記事は非常に並行システムでシステムをキャッシュに焦点を当てたディスクを削減することです。非常に並行システムにおける文のステータス・キャッシング・システムは、その後、次のとおりです。
システムは非常に同時ケバブであれば、キャッシュシステムは、クミンの一握りです......
II。並行性の高いシステムキャッシュ
- キャッシングシステムの役割
非常に並行システムの役割でシステムをキャッシュすることは巨大であり、何のキャッシュシステムは、C50K(おそらく、この値は非常に楽観的となっている)以上のシーンをサポートすることは困難ではありませんがあります。
SSDまたは機械的なディスクベースのデータベースシステムでは、読み取りと書き込み速度は、データベースのディスクメディアだけでは、高い同時実行性をサポートすることはできませんので、あなたはディスクキャッシュデータベースは、バリアディスクデータベースで保護することであると考えることができ、はるかに遅いRAMを超えています。
- キャッシュシステムとデータベースシステムへのアクセス
以下の例のように読んで、シナリオを書くと(実際の読み取りやシーンを書いが少ない)、要求が応答、簡単なプロセスを取得する方法を参照するには、次の要求が到着した後、サービススレッドの最初のアクセスのキャッシュ、キャッシュがヒットし、リターンを打つ場合ではない場合これは、ディスクのデータベース・システムを要求し続け、その結果がキャッシュシステムに戻って書かれており、熟成時間を増やすため、タイムアウトで、その後、あなたは、要求が到着すると、同じキャッシュがヒットすることができています。これらは、並行性の高いシステムキャッシュとディスクデータベースシステム、クライアント要求、問題のフォローアップ分析の間の相互作用している、また、このプロセスに基づいて展開。
システムキャッシュ三三の大課題
、問題をたくさんキャッシュ3つの記事のために、ネットワーク上の3つの問題は、主に言及しました。
- キャッシュキャッシュ雪崩雪崩
- キャッシュキャッシュの浸透浸透
- キャッシュの内訳ホットスポット無効
私が言うことができなかった、と明確な違いを気にしない、そう言うことですか曲がっナッツ見るためにGoogleに期待する、しかし、英語では上記の英語の表現ということ、そして中国の翻訳は基本的に同じである上に、私がされている3つの用語については、これだけ強い心。
A.キャッシュ雪崩問題
失う瞬間に頼って、サポートされていた雪と氷の雪崩いわゆる、と瞬時にダウン殺到。このシーンは作られた貯水池雪崩村を救うために、コナン映画の2011年リリースの「サイレント15分、」コナン北沢村のことを思い出します。
並行性の高いシステムへの雪崩見て本当に恐ろしい、バックは、キャッシュシステム障害あれば、キャッシュデータ要求からの多数の要求を完了することはできませんので、データベースで、その結果、ディスクのデータベース・システムに向かって押し寄せるの全額が死亡し、システム全体の総崩壊。
雪崩のキャッシング・ソリューション
从原因来看主要是缓存系统不够高可用,因此提高缓存系统的稳定性和可用性十分必要,对于使用Redis作为缓存的系统而言需要使用Sentinel哨兵机制、集群化、持久化等来提高缓存系统的HA。
另一方面除了保证缓存系统的HA之外,服务本身也需要支持降级,可以使用奈飞的Hystrix来实现服务的熔断、降级、限流来降低出现雪崩时的故障程度。说白了就是别让服务彻底死掉就行,就像大雪封高速肯定彻底不能通行了,堵车就是慢一些至少可以走,如果还不清楚,回想一下每年你回乡的车票是怎么从12306抢回来的。
B.缓存穿透问题
穿透形象一点就是:请求过来了 转了一圈 一无所获 就像穿过透明地带一样。
在高并发系统中缓存穿透,其实是这样的如果一个req需要请求的key在缓存中没有,这时业务线程就会访问磁盘数据库系统,然而磁盘数据库也没有这个key,无奈业务线程只能返回null,白白处理一圈。
小概率事件在高并发系统几乎要成为必然,也就是如果某时段有大量恶意的不存在的key的爆破请求,那么服务将一直处理这些根本不存在的请求,导致正常请求无法被处理,从而出现问题。
举个栗子:
拉面馆的服务员和厨师不允许拒绝已经进来的消费者,但是拉面馆的经营范围有限,此时恶意消费者点了一只5斤的澳洲龙虾,经过服务员和厨师都无法响应这个需求,因此被最终被拒绝,此时轮流来了1000个这样的恶意消费者,拉面馆基本要歇菜了。
缓存穿透解决方案
高并发系统也是如此,有效甄别是否存在这个key再决定是否读取很重要,常见的做法有:
a.把不存在的key写一下null,这样再来就相当于命中了,其实这种方法局限性很大,今天是5斤龙虾,明天改成6斤的螃蟹,缓存系统和数据库中存储大量无用key本身是无意义的,所以一般不建议。
b.另外一种思路,转换为查找问题,类似于在海量数据中查找某个key是否存在,考虑空间复杂度和时间复杂度,一般选用布隆过滤器来实现。
缓布隆过滤器简介
布隆过滤器是个好东西,在1970年由布隆提出的,它实际上是一个很长的二进制向量和一系列随机映射函数。
布隆可以实现的系统包括:垃圾邮件识别、搜索蜘蛛爬虫url去重等,主要借助K个哈希函数和一个超大的bit数组来降低哈希冲突本身带来的误判,从而提高识别准确性。
布隆过滤器也存在一定的误判,假如判断存在可能不一定存在,但是假如判断不存在就一定不存在,因此刚好用在解决缓存穿透的key查找场景,事实上很多系统都是基于布隆过滤器来解决缓存穿透问题的。
C.缓存击穿问题
缓存击穿是这样一种情况:由于缓存系统中的热点数据都有过期时间,如果没有过期时间就造成了主存和缓存的数据不一致,因此过期时间一般都不会太长,设想某时刻一批热点数据同时在缓存系统中过期失效,那么这部分数据就都将请求磁盘数据库系统。
从描述上来看有点像微小规模的雪崩,但是对数据库的压力就很小了,只不过会影响并发性能,然而在多线程场景中缓存击穿却是经常发生的,相反缓存穿透和雪崩频率不如缓存击穿,因此研究击穿的现实意义更大一些。
缓存击穿解决方案
可以采用的方案大概有几种:
a. 在设置热点数据过期时间时尽量分散,比如设置100ms的基础值,在此基础上正负浮动10ms,从而降低相同时刻出现CacheMiss的key的数量。
b. 另外一种做法是多线程加锁,其中第一个线程发现CacheMiss之后进行加锁,再从数据库获取内容之后写到缓存中,其他线程获取锁失败则阻塞数ms之后再进行缓存读取,这样可以降低访问数据数据库的线程数,需要注意在单机和集群需要使用不同的锁,集群环境使用分布式锁来实现,但是由于锁的存在也会影响并发效率。
c.还有一种办法是使用类似于Redis的SETNX命令,这种貌似存在问题,存在一个gap间隙请求处于无法从缓存获取数据也无法从主存获取数据的未决状态。
d. 最后一种方法是在业务层对使用的热点数据查看是否即将过期,如果即将过期则去数据库获取最新数据进行更新并延长该热点key在缓存系统中的时间,从而避免后面的过期CacheMiss,相当于把事情提前解决了。
缓存击穿的解决方法都有一定的权衡,实际中根据自己的需求来解决,不过缓存击穿的影响一般来说并不会太大,或许在你的服务跑了很久之后你才意识到会有缓存击穿问题。