An in-depth look at database and cache internals, and the tradeoffs in each. ScyllaDB, dormando (Memcachediner) ve Danny Kopping'ı bu projeye katkılarından ve desteğinden ve sabrından dolayı teşekkür etmek ister. uyumak Danny Kopp Ölçekte tahmin edilebilir performans için veritabanı olan ScyllaDB'nin arkasındaki mühendisler, her iki teknolojiyi ortaklaşa, tedarikçi tarafsız bir şekilde karşılaştırmak için Memcached'le birlikte çalıştılar. Sonuçlar şunu gösteriyor: Hem Memcached hem de ScyllaDB, diskleri ve ağ bant genişliğini en üst düzeye çıkarırken, benzer koşullar altında yoğunlaşırken, genel olarak benzer performansları sürdürür. ScyllaDB, ağ geçişi tamamen doyurmak için veri modelleme değişiklikleri gerektirirken, Memcached, disk I/O doyurmak için ek IO iplikleri gerektirir. ScyllaDB, disk için Memcached pipelined istekleri ile karşılaştırıldığında daha iyi gecikmeler göstermiş olsa da, Memcached gecikmeler bireysel istekleri için daha iyiydi. Bu belge, bu testler için motivasyonumuzu açıklıyor, test edilen senaryoların ve sonuçların bir özetini sunuyor, daha sonra ScyllaDB ve Memcached arasında karar verebilecek herkese öneriler sunuyor. var da var Testleri ve sonuçları daha kapsamlı bir şekilde inceleyin ve testleri kendiniz gerçekleştirmek için kullanabileceğiniz belirli yapılandırmalara bağlantılar. Bu proje için ayrıntılı bir Gitbook, Bonus: dormando ve ben son zamanlarda performans ve düşük gecikme mühendisliği hakkında yüksek teknik bir konferans olan P99 CONF'de bu projeyi tartıştık. Talep üzerine bakın Bonus: dormando ve ben son zamanlarda performans ve düşük gecikme mühendisliği hakkında yüksek teknik bir konferans olan P99 CONF'de bu projeyi tartıştık. Watch on demand Talep üzerine bakın Neden bunu yaptık? Her şeyden önce, ScyllaDB, veri yoğun uygulamalar için tahmin edilebilir düşük gecikmeler sunmak için veritabanımızı optimize etmek için çok fazla zaman ve mühendislik kaynakları harcadı. Hiçbir şey paylaşmayan mimari, ve (Linux sayfasını tamamen geçmek) bu optimizasyonların bazı önemli örnekleri. Yüzeysel Yüzeysel UserSpace I/O Programlayıcı Internal Cache Uygulaması İkincisi: Performans zamanla birleşiyor. Hafıza içi bellekler (uzun zamandır) en hızlı altyapı bileşenlerinden biri olarak kabul edilmektedir. Bununla birlikte, bu aralık çözümü flash diskler alanına bakmaya başladıktan bu yana birkaç yıl geçti. If an in-memory cache can rely on flash storage, then why can’t a persistent database also work as a cache? Cevap: Daha önce de bahsettiğimiz Son zamanlarda bazı takımların nasıl başarılı olduklarını görüyoruz. . Veritabanınızın Önünde Cache Yapmamak İçin 7 Neden Cache’leri ScyllaDB ile değiştirdi Dördüncü olarak, geçen yılki P99 CONF'de Danny Kopping bize aydınlatıcı bir konuşma yaptı. Memcached Extstore’un Grafana Labs’a maliyetleri düşürürken 42 katına çıkarmalarına nasıl yardımcı olduğunu açıklamıştı. Mümkünse sakla beni Son olarak, performans referanslarının aldığı (valid) eleştirilere rağmen, benchmarks inovasyonları teşvik etmek için hala önemli bir rol oynamaktadır. Şimdi karşılaştırmaya geçelim. setup Mahkemeler Testler aşağıdaki AWS varsayım türlerini kullanılarak gerçekleştirildi: Yükleyici: c7i.16xlarge (64 vCPU, 128GB RAM) Memcached: i4i.4xlarge (16 vCPU, 128GB RAM, 3.75TB NVMe) ScyllaDB: i4i.4xlarge (16 vCPU, 128GB RAM, 3.75TB NVMe) Tüm kurumlar teslim edebilir 25Gbps ağ bant genişliği. özellikle vaat edilen ağ kapasitesini en üst düzeye çıkarmak için testler sırasında fark ettik. . yukarıda “Bandwidth Down to the Baseline Capacity” (Başlangıç hattı kapasitesine kadar bant genişliğini azaltma) Optimizasyonlar ve Ayarlar Potansiyel engelleri aşmak için, aşağıdaki optimizasyonlar ve ayarlar uygulanmıştır: AWS tarafı: Tüm varsayımlar AWS Dokümanları'na göre bir Cluster yerleştirme stratejisi kullandı: "Bu strateji, çalışma yüklerini, yüksek performanslı bilgisayar (HPC) uygulamaları için tipik olan sıkı bağlantılı düğme-düğme iletişim için gerekli olan düşük gecikme ağ performansını elde etmelerini sağlar." Memcached: sürüm 1.6.25, Extstore etkinleştirilmiş ile oluşturulmuştur. belirtildiği yer hariç, belirli CPU'lara bağlanan 14 iplikle çalıştırılmıştır. Geriye kalan 2 vCPU, seastar perftune.py'de sq_split modunda belirtildiği gibi Network IRQ'leri işlemek için CPU 0'ya (core & HT sibling) atandı. CAS operasyonları, her öğenin üstünde yer tasarrufu sağlamak için devre dışı bırakılmıştır. Tam komut hattı argümanları:taskset -c 1-7,9-15 /usr/local/memcached/bin/memcached -v -A -r -m 114100 -c 4096 -lock-memory -threads 14 - scylla -C ScyllaDB: ScyllaDB Enterprise 2024.1.2 AMI (ami-id: ami-018335b47ba6bdf9a) tarafından i4i.4xlarge'de yapılandırılan varsayılan ayarlar. Stresli Çekirdekler için, biz kullandık , memcached'in resmi test paketinin bir parçası. Uygulanabilir stres profilleri GitHub depolama alanı. McShredder Hakkında Çiçekler / Shredders ScyllaDB için, kullandığımız , ScyllaDB ile gönderildiği gibi ve Memcached için kullanılanlar gibi karşılaştırılabilir iş yüklerini belirtti. Kaspersky Stres Testler ve Sonuçlar Aşağıda yaptığımız testlerin ve sonuçlarının bir özetini veriyoruz.Daha ayrıntılı bir açıklama ve analiz istiyorsanız, . Bu projenin genişletilmesi RAM Kaydetme Verimliliği RAM'e yerleştirebileceğiniz daha fazla öğe, cache hitlerini elde etme şansınız daha iyidir. daha fazla cache hit, disklere gitmekten çok daha hızlı erişim sağlar. Bu proje, her veri depolama alanında kaç öğeyi depolayabileceğimizi ölçerek başladı. testlerimiz boyunca, anahtar Memcached için 4 ila 12 bayt (key0 .. keyN) arasında ve ScyllaDB için 12 bayt arasındaydı. Memleketi Memcached, çıkarılmaya başlanana kadar yaklaşık 101 milyon öğe depoladı. Hafıza verimli. Memcached'in 114G atanan hafızasından, bu, anahtar boyutunu ve diğer bayrakları dikkate almadan yaklaşık 101G değeridir: ScyllaDB ScyllaDB boşaltmalar başlamadan önce 60 ila 61 milyon öğeyi depoladı. bu şaşırtıcı değil, çünkü protokolü bir yazma parçası olarak depolanması gereken daha fazla veri gerektirir (örneğin, yazma zaman tescilinden beri, satır canlılığı, vb). ScyllaDB ayrıca daha sonra disk arama için Bloom Filtreleri (ve opsiyonel olarak Endeksleri) hafızada depolanması gerektiği anlamına gelir. Takeaways Memcached, ScyllaDB’den yaklaşık %65 daha fazla bellek içi öğe depoladı. ScyllaDB satırları, geniş sütun yönlendirmeyi desteklemek için öğe başına daha yüksek bir üst noktaya sahiptir. ScyllaDB'de, Bloom Filtres, Index Caching ve diğer bileşenler de verimli disk arama işlemlerini desteklemek için hafıza içinde depolanır ve bu da bir başka aşamaya katkıda bulunur. Sadece Okunma Için Memory Workload ve (Ancak gerçekçi olmayan) bir cache için çalışma yükü, tüm verilerin RAM'e yerleştiği bir yerdir - bu nedenle okuma disk erişimi gerektirmez ve hiçbir boşalma veya eksiklik meydana gelmez. hem ScyllaDB hem de Memcached, hafızayı serbest bırakmak için LRU (En Az Son Kullanılan) mantığını kullanır: Sistem basınç altında çalıştığında, öğeler LRU'nun sırtından çıkarılır; bunlar genellikle en az aktif öğelerdir. ideal Görüntünün dışına çıkarma ve cache eksiklerini çıkarmak, her iki veri depoları için de performans temelini ölçmeye ve ayarlamaya yardımcı olur. Bu tür iş yükleri için en önemli olanlara odaklanır: okuma geçiş ve isteğin gecikmesi. Bu testte, önce önceki testte kullanılan aynı payload boyutlarıyla her iki mağazayı ısıtmıştık. Memcached Memcached, saniyede etkileyici 3 milyon kazanç elde etti ve AWS NIC bant genişliğini (25 Gbps) tam olarak maksimize etti! Memcached sabit bir 3M rps tuttu, NIC geçişini tamamen maksimize etti Parçalı p99.999 cevapları 1ms altında tamamladı: sonuçları Çözüm : cmd_get : Toplam Ops: 5503513496 Sayı: 3060908 / s ııııııııııııııı 0 0 0 0 0 0 0 0 0 0 0 10-99us 343504394 %6.238 100-999us 5163057634 %93.762 1-2ms 11500 0.00021% ScyllaDB ScyllaDB'de daha fazla satır okumak için, protokol özellikleri nedeniyle müşteri istekleri için daha iyi bir veri modeli tasarlamak zorunda kaldık (özellikle, herhangi bir boru hattı yok). Bir gruplama anahtarı ile, ScyllaDB'nin önbelleğini tam olarak maksimize edebilirdik, bu da önbelleklenen satırların sayısında önemli bir iyileşme sağladı. Sonuç olarak, önceden gösterilen anahtar değer sayıları ile karşılaştırıldığında cache içindeki kayıt sayısı önemli ölçüde iyileştirildi. dormando doğru bir şekilde belirttiği gibi (teşekkürler!), bu yapılandırma önceki Memcached kurulumundan önemli ölçüde farklıdır. Memcached iş yükü her zaman bireysel bir anahtar değer çiftini çekerken, ScyllaDB'de tek bir isteğin birden fazla satır döndürülmesine neden olur. Bu değişikliklerin nedenlerini anlattık. Orada, CQL protokolünün özelliklerini (örneğin, tek anahtar alırken ScyllaDB'de geniş bölünmeleri daha verimli hale getiren tek öğe overhead [memcached ile karşılaştırıldığında] ve pipelining desteği yok) ele aldık. Detaylı yazımda Bu ayarlarla, yükleyicilerimiz 30 dakika boyunca saniyede toplam 187K okuma işlemi yaptı. Memcached'e benzer şekilde, ScyllaDB de NIC geçişini en üst düzeye çıkardı. yalnızca hafıza içi verilerden yaklaşık 3M satır/saniyede hizmet verdi: ScyllaDB, ağ olmadan gecikmeyi analiz etmek için faydalı olan sunucu tarafındaki gecikme bilgileri ortaya çıkarır. test sırasında, ScyllaDB'nin sunucu tarafındaki p99 gecikme 1ms sınırları içinde kaldı: Müşteri tarafındaki percentiller şaşırtıcı bir şekilde, 0.9ms'lik bir okuma P99 ile sunucu tarafındaki latanstan daha yüksektir. Takeaways Hem Memcached hem de ScyllaDB, ağı tamamen doyurdu; saniyede maksimum ağ paketlerinin doyurulmasını önlemek için, Memcached, ScyllaDB'nin geniş sütun yönlendirmesine geçiş yaparken, talep pipeliningine dayanıyordu. ScyllaDB'nin önbelleği, önceki basit anahtar değer yönelimine kıyasla daha fazla öğe depolayabilen geniş sütun şemasına göre önemli kazançlar gösterdi. Protokol düzeyinde, Memcached protokolü daha basit ve hafiftir, ScyllaDB'nin CQL ise daha zengin özellikler sunar, ancak daha ağır olabilir. Diskler resimlere eklenir Flash depolama performansını ölçmek kendi zorluklarını ortaya koyar, bu da belirli bir çalışma yükünü tam olarak gerçekçi bir şekilde karakterize etmek neredeyse imkansız hale getirir. Diskle ilgili testler için, en pesimistik durumu ölçmeye karar verdik: İki çözümün de (çoğunlukla) blok depolama verilerini sunan çözümleri karşılaştırın, bilerek ki: Bunu yapan gerçekçi çalışma yüklerinin olasılığı neredeyse sıfırın yakınındadır. Kullanıcılar, önceki iyimser cache iş yükü ve pratikte pesimistik disk bağlantılı çalışma yükü arasında sayılar beklemelidir. Memcached Extstore ve Yüksek düzeyde, memcached'in hash tablosunu ve anahtarlarını hafızada tutmasına izin verir, ancak değerleri dış depolama alanına saklar. Ekstra Wiki Sayfası Testlerimiz sırasında, 1KB değer boyutu ve 14 byteye kadar anahtar boyutu olan 1.25B öğelerle memcached doldurduk: Extstore ile, boşaltmalar başlarken (daha yukarıdaki resimde sağ el panelinde gösterildiği gibi) önceki bellek içi iş yüküne kıyasla öğelerin sayısının yaklaşık 11 katını depoladık). 11X zaten etkileyici bir sayı olmasına rağmen, flash üzerinde depolanan toplam veri, AWS örneği tarafından sağlanan toplam 3.5 TB'dan sadece 1,25 TB'dır. Read-Only Performance Gerçek performans testleri için, 1KB ve 8KB öğe boyutlarına karşı Extstore'u vurguladık. Test Type Items per GET Payload Size IO Threads GET Rate P99 perfrun_metaget_pipe 16 1KB 32 188K/s 4~5 ms perfrun_metaget 1 1KB 32 182K/s <1ms perfrun_metaget_pipe 16 1KB 64 261K/s 5~6 ms perfrun_metaget 1 1KB 64 256K/s 1~2ms perfrun_metaget_pipe 16 8KB 16 92K/s 5~6 ms perfrun_metaget 1 8KB 16 90K/s <1ms perfrun_metaget_pipe 16 8KB 32 110K/s 3~4 ms perfrun_metaget 1 8KB 32 105K/s <1ms Çıkartma_metaget_pipe 16 1 kB 32 188 K / s 4 - 5 ms Çanakkale - Metatrader 1 1 kB 32 182 K / s · 1ms Çıkartma_metaget_pipe 16 1 kB 64 261 K / s 5 - 6 ms Çanakkale - Metatrader 1 1 kB 64 256 K / s 1 - 2ms Çıkartma_metaget_pipe 16 8 kB 16 92 K / s 5 - 6 ms Çanakkale - Metatrader 1 8 kB 16 90k / s · 1ms Çıkartma_metaget_pipe 16 8 kB 32 110 K / s 3 - 4 ms Çanakkale - Metatrader 1 8 kB 32 105 K / s · 1ms ScyllaDB ScyllaDB'yi memcached için kullanılan aynı sayıda öğeyle popülerleştirdik. ScyllaDB, memcached'den daha yüksek GET oranlarını göstermiş olsa da, memcached'in pipelining olmayan çalışma yüklerine kıyasla biraz daha yüksek sıralama gecikmeleri altında bunu yaptı. Test Type Items per GET Payload Size GET Rate Server-side P99 Client-side P99 1KB Read 1 1KB 268.8K/s 2ms 2.4ms 8KB Read 1 8KB 156.8K/s 1.54ms 1.9ms 1 kB Okunma 1 1 kB 268.8 K / s 2ms 2.4ms için 8 KB Okunma 1 8 kB 156.8 K / s 1.45ms için 1.9ms için Takeaways Extstore, flash depolama I / O'nu tamamen doyurmak için ayarlarına önemli ölçüde uyum gerektirdi. Memcached mimarisi nedeniyle, daha küçük payloads kullanılabilir disk alanını tam olarak kullanamaz, ScyllaDB'ye kıyasla daha küçük kazançlar sağlar. ScyllaDB oranları genel olarak, özellikle daha yüksek payload boyutları altında, anahtar değer yöneliminde Memcached'den daha yüksekti. İş yükünü aşın Daha önceki Disk sonuçlarımızdan sonra, her iki çözümü aynı geçiş (250K ops / s) hedefleyen, çoğunlukla okunan bir çalışma yükünde karşılaştırdık. Yüzde 10’u “en kötü senaryo” olarak nitelendirilmektedir. ExtStore için “Basic” Test Memcached Memcached, test sırasında 249K'dan biraz daha düşük bir oran elde etti. yazma oranları test süresince sabit olmasına rağmen, okuma oranlarının hafifçe değişmediğini gözlemledik. : Tüm koşuşturma boyunca Aynı zamanda biraz yüksek Düşük okuma oranlarına rağmen metrikler, ancak gecikmeler hala düşük kalmıştır. Sıfırlama_Sıfırlama Operation IO Threads Rate P99 Latency cmd_get 64 224K/s 1~2 ms cmd_set 64 24.8K/s <1ms cmd - alabilir 64 224 K / s 1 - 2 ms cmd set 64 4.8 K / s · 1ms ScyllaDB ScyllaDB testi, her birinin hedef hızı yarısı olan 2 yükleme cihazı kullanılarak gerçekleştirildi. ScyllaDB'nin biraz daha yüksek bir geçiş kapasitesine sahip olmasına rağmen (259.5K), yazma gecikmeleri çalışması boyunca düşük tutuldu ve okuma gecikmeleri daha yüksekti (memcached ile benzer şekilde): Aşağıdaki tablo, iki yükleme aracı arasındaki müşteri tarafı çalıştırma sonuçlarını özetliyor: Loader Rate Write P99 Read P99 loader1 124.9K/s 1.4ms 2.6 ms loader2 124.6K/s 1.3ms 2.6 ms Yükle1 124.9 K / s 1.4ms için 2.6 Müşteri Lojistik2 124.6 K / s 1.3ms için 2.6 Müşteri Takeaways Hem Memcached hem de ScyllaDB yazma oranları istikrarlıydı, okuma sayısı tüm sürüş boyunca hafifçe değişiyordu. ScyllaDB hala sıcak yazma yolunda oturan commitlog overhead'in hesabını yazıyor ScyllaDB sunucusu tarafındaki gecikmeler, Memcached sonuçlarında gözlemlenenlere benzerdi, ancak müşteri tarafındaki gecikmeler biraz daha yüksekti. Bu proje için Gitbook'ta daha ayrıntılı bir analiz okuyun Çekiliş Up Hem memcached hem de ScyllaDB, tüm testlerde temel donanım kullanımını en üst düzeye çıkarmayı başardı ve gecikmeleri tahmin edilebilir şekilde düşük tuttu. Mevcut çalışma yükünüz basit bir anahtar değer modeline sahipse ve boru hattından faydalanırsa, memcached ihtiyaçlarınızı daha iyi karşılamalıdır. Memcached'e takılmanın bir diğer nedeni: kolayca bir NIC'nin desteklediğinden çok daha fazla trafiği sağlar. dormando, daha büyük bir sunucu için 55 milyon okuma ops / s'ye kadar genişletebileceğini belirtti. bu nedenle, mevcut bellek ve disk ayak izi çalışma yükünüzün gereksinimlerini karşılayacak şekilde benzer bir çalışma yükünü sürdürmek için daha küçük ve/veya daha ucuz örnek türlerini kullanabilirsiniz. Haberler Hacker Haberleri Düşünmeniz gereken başka bir açı ise veri kümesi büyüklüğü. Extstore, RAM dışındaki öğeleri depolamanıza izin vererek büyük maliyet tasarrufu sağlarken, bellek GB başına kaç anahtarı yerleştirebileceğinize dair bir sınır vardır. Çok küçük öğelerle çalışma yükleri, daha büyük öğelerle karşılaştırıldığında daha küçük kazançlar görmelidir. Bu, boyutlarına bakılmaksızın milyarlarca öğenin depolanmasına izin veren ScyllaDB ile bu durum değildir. Eğer öyleyse, o zaman ScyllaDB'yi kopyalanmış dağıtılmış bir bellek olarak çalıştırmak size daha fazla dayanıklılık ve durmaksızın operasyonlar sağlar, kompromisin (ve Bu replikasyon, etkili cache boyutunuzu yarıya düşürür. Ne yazık ki, Extstore sıcak yeniden başlatmayı desteklemiyor ve böylece tek bir düğmenin başarısızlığı veya bakımının cache eksikliği oranlarını yükseltme eğilimindedir. Bu kabul edilebilir mi yoksa kabul edilemez mi, uygulamalarınızın semantikine bağlıdır: Bir cache eksikliği veri tabanına bir tur yolculuğuna eşdeğerse, o zaman bit-to-end latency anlık olarak daha yüksek olacaktır. Haklı Devletler Hakkında Bilgi Düzenli hashing ile ilgili olarak, memcached müşteriler dağıtılmış sunucularınızda anahtarları dağıtmaktan sorumludur.Bu, farklı müşteri yapılandırmaları anahtarları farklı şekilde atamaya neden olduğu için bazı hiccups getirebilir ve bazı uygulamalar birbirleriyle uyumlu olmayabilir. ScyllaDB farklı bir yaklaşım alır: tutarlı hashing sunucu düzeyinde yapılır ve bağlantı ilk kurulduğunda müşterilere yayılır. Memcached's ConfiguringClient wiki Hakkında Yani kim kazandı (veya kim kaybetti)? Evet... Bu, her çözüm için her bir düşünceyi özetleyen bir yarışma veya kapsamlı bir liste olmamalıdır. hem ScyllaDB hem de memcached, temel altyapıyı verimli bir şekilde kullanmak için farklı yaklaşımlar kullanır. Doğru yapılandırıldığında, her ikisinin de büyük maliyet tasarrufu sağlayabileceği potansiyeli vardır. ScyllaDB'nin endüstri tarafından tanınan Memcached'in rakamlarıyla eşleştiğini görmekten memnun kaldık. Tabii ki, veritabanımızın "hızlı" olmasını beklemiyorduk.