Önsöz
Sistemin veritabanının büyük bir trafik akışında neredeyse CPU ile dolu olduğu gerçeğinden mi endişeleniyorsunuz? Çeşitli NoSql'lere karıştınız mı, hangisi en iyisi? Bugünün dünün benim, bu da bu makaleyi yazmanın asıl amacı.
Bu makale birkaç aydır yazmak istediğim bir makale ve her zaman öğrenmek istediğim bir şeydi.İnternet uygulayıcıları olarak ilişkisel veritabanlarının (MySql, Oracle) tüm depolama gereksinimlerimizi karşılayamayacağını bilmeliyiz. Bu nedenle, temel depolamanın seçimi, her bir depolama motorunun anlaşılması çok önemlidir. Aynı zamanda geçmiş dönemdeki iş tecrübemden dolayı bu alanla ilgili biraz daha düşüncelerim var ve bunu kendi özetimle yazmak ve herkesle paylaşmak istiyorum.
Yapılandırılmış veriler, yapılandırılmamış veriler ve yarı yapılandırılmış veriler
Yazının başında yapılandırılmış veriler, yapılandırılmamış veriler ve yarı yapılandırılmış verilerden bahsedelim, veri özelliklerindeki farklılıklar nedeniyle depolama motoru teknolojisi seçimini doğrudan etkileyecektir.
İlki, tanım gereği yapılandırılmış verilerdir Yapılandırılmış veriler, mantıksal olarak ifade edilen ve iki boyutlu bir tablo yapısı tarafından gerçekleştirilen, veri formatını ve uzunluk spesifikasyonunu kesinlikle takip eden, aynı zamanda satır verileri olarak da bilinen verileri ifade eder. Özellikler şunlardır: veriler davranış birimlerindedir, bir veri satırı bir varlığın bilgilerini temsil eder ve her veri satırının öznitelikleri aynıdır. Örneğin:
Bu nedenle ilişkisel veritabanları, yapılandırılmış verilerin özelliklerine mükemmel bir şekilde uyar ve ilişkisel veritabanları da ilişkisel veriler için ana depolama ve yönetim motorudur.
Yapılandırılmamış veriler, Düzensiz veya eksik veri yapısı, önceden tanımlanmış herhangi bir veri modeli olmadan, verileri temsil etmek için iki boyutlu mantık tablosu kullanmak uygun değildir Ofis belgeleri (Word), metin, resimler, HTML, çeşitli raporlar, video ve ses vb.
Yapılandırılmış ve yapılandırılmamış veriler arasındaki veriler yarı yapılandırılmış verilerdir, yapılandırılmış bir veri biçimidir, ancak İki boyutlu mantığın veri modeli yapısına uymaz, ancak anlamsal öğeleri ve katman kayıtlarını ve alanlarını segmentlere ayırmak için ilgili etiketleri içerir . Yaygın yarı yapılandırılmış veriler XML ve JSON'dur, örneğin:
< kişi > < isim > Zhang San < / isim > < yaş > 18 < /yaş > < telefon > 12345 < /telefon > < /kişi >Bu yapıya kendi kendini tanımlayan yapı da denir.
İlişkisel bir veritabanında depolama mimarisinin evrimi
İlk olarak, ilişkisel veritabanlarını kullanma yöntemine ve bir kuruluştaki bir sistemin geliştirilmesindeki çeşitli aşamaların mimarisinin evrimine bir göz atalım (çünkü bu makale Sql ve NoSql ile ilgilidir, bu nedenle giriş noktası olarak yalnızca depolama yöntemi kullanılır ve MQ ve ZK diye bir şey yoktur. Ara yazılım içeriği):
Aşama 1: Kuruluşun henüz geliştirdiği en basit aşama Bir uygulama sunucusu ilişkisel bir veritabanı ile donatılmıştır ve veritabanı her seferinde okunur ve yazılır.
Aşama 2: İster MySQL ister Oracle veya diğer ilişkisel veritabanları kullanıyor olun, veritabanı genellikle ilk olarak bir performans darboğazı haline gelmez. Genellikle, kuruluş ölçeği genişledikçe, bir uygulama sunucusu yukarı akış trafiğini işleyemez ve bir uygulama sunucusu Tek bir hata noktası sorunu vardır, bu nedenle bir uygulama sunucusu ekleyin ve trafiğin uygulama sunucusuna eşit olarak dağıtılmasını sağlamak için bir yük dengeleme katmanı yapmak için trafik girişinde Nginx kullanın.
Aşama 3: İşletmenin ölçeği genişlemeye devam ettikçe, şu anda, okuma ve yazma işlemlerinin tümü aynı veri tabanında olduğu için, veri tabanı performansında belirli bir darboğaz vardır. Şu anda, bir okuma ve yazma ayrımı katmanı basitçe gerçekleştirilir ve her defasında ana veri tabanı yazılır ve yedek veri tabanı okunur Ana ve yedek veritabanları arasında binlog aracılığıyla veri senkronizasyonu, bu aşamadaki veritabanı performans sorunlarını büyük ölçüde çözebilir
Aşama 4: İş geliştirme gittikçe daha iyi hale geliyor, iş büyüyor ve büyüyor, veri tabanının baskısı, ayrımı okuduktan ve yazdıktan sonra hala artıyor, şu anda ne yapmalıyız, bir veri tabanı onu tutamaz, sonra onu birkaç taneye böleriz Veritabanını ve tabloyu ayıralım, tabloyu dikey olarak ayıralım ve kitaplığı yatay olarak bölelim. Veritabanının genişletilmesi örnek olarak ele alındığında, belirli bir sipariş numarası (işlem bilet numarası gibi) ve belirli bir kural (modulo gibi) ile iki veritabanı genişletilir İşlem bilet numarası modulo 2, veritabanı 1'e bırakılır. İşlem bilet numarası modulo 2, veri tabanına 2 atılır. Bu şekilde, veri tabanı yazma trafiği iki veri tabanı arasında eşit olarak bölünür. Genel olarak, alt veritabanı ve alt tablo, bağlantı yönetimi, veri izleme için uygun olan ve müşterinin veritabanı ipini algılaması gerekmeyen bir ara katman yazılımı aracılığıyla Shard yöntemini kullanacaktır.
İlişkisel veritabanlarının avantajları
Yukarıdaki yöntem problemi çözebilir gibi görünmektedir (aslında birçok problemi çözebilir) Normalde ilişkisel veritabanı için normal bir okuma-yazma ayrımı + alt veritabanı alt tablosu yapmak ve 1W + okuma ve yazma QPS'yi desteklemek büyük bir problem değildir. Bununla birlikte, ilişkisel veritabanının kendisi ile sınırlı olan bu mimari çözümün hala bariz eksiklikleri vardır.Aşağıda, ilişkisel veritabanı yöntemini kullanarak depolama çözümünün avantajlarını analiz edecek ve daha sonra ikinci kısımdaki dezavantajları analiz edeceğiz. Avantaj ve dezavantajların tam olarak anlaşılması, teknoloji seçimi için bir ön koşuldur.
İlişkisel veritabanlarının dezavantajları
Daha sonra, ilişkisel veri tabanlarının daha belirgin olan eksikliklerine bakıyoruz.
Bu kadar çok yazdıktan sonra, anlayışımın özü ilk üç nokta Yüksek eşzamanlılık altında ilişkisel veri tabanlarının yeteneğinin, özellikle sık yazma / güncelleme durumunda darboğaz olması bir sorunu yansıtıyor. Yani, veritabanı CPU'su yüksek, Sql yürütmesi yavaş ve müşteri, yetersiz veritabanı bağlantı havuzu gibi hataları bildiriyor.Bu nedenle, örneğin 10.000 spike senaryosunda, veritabanı üzerinden doğrudan envanter çıkarmamız kesinlikle imkansız.
Bazı arkadaşlar yüksek eşzamanlılık altında veri tabanının kabiliyetinde bir darboğaz olduğunu söyleyebilir.Firmamızın parası var.İşlemci eklemek, katı hal sürücülere geçmek, alt veri tabanları için sunucu ve veri tabanı almaya devam etmek daha iyidir.Sorun, bunun çok düşük maliyetli bir performans olmasıdır. 10 milyon harcama ile elde edilen etki yöntemi, 1 milyonluk başka bir yöntemle sağlanabilir.Personel ve sunucuların girdi-çıktı oranını dikkate almayan bir lider, niteliksiz bir liderdir ve ilişkisel veri tabanı yöntemi kendisiyle sınırlıdır. Özellikler, para harcadıktan sonra bile istenen etkiyi elde edemeyebilir. 1 milyon harcayarak 10 milyon harcamanın yolu nedir? Aşağıya bakmaya devam edebilirsiniz, bu bahsettiğimiz NoSql.
NoSql ile birleştirilmiş depolama mimarisinin evrimi
Yukarıda analiz edildiği gibi, ilişkisel bir veri depolama motoru olarak, veritabanı ilişkisel verileri depolar.Açık dezavantajların yanı sıra avantajları da vardır.Bu nedenle, genellikle kurumsal ölçeğin sürekli genişlemesi durumunda, körü körüne geçmeyi beklemeyecektir. Veritabanının veri depolama sorununu çözme yeteneğini geliştirin, ancak NoSql olarak adlandırdığımız diğer depolamayı tanıtacaktır.
NoSql'in tam adı, genellikle ilişkisel olmayan veritabanlarına atıfta bulunan Yalnızca SQL Değildir.İlişkisel veritabanlarına bir tamamlayıcıdır.Bu iki kelimeyi tamamlamaya özellikle dikkat edin.Bu, NoSql ve ilişkisel veritabanlarının birbirine zıt olmadığı anlamına gelir. Artıları ve eksileri, birbirlerinin güçlü yönlerinden öğrenmek ve doğru senaryoda doğru depolama motorunu seçmek doğru yaklaşımdır.
Daha basit NoSql önbelleğe almaktır:
Yazılandan daha fazla okunan veriler için bir önbellek katmanı eklenir.Her okuma önbellekten okunur.Önbellekten okunamıyorsa veritabanından alınır.Aldıktan sonra önbelleğe yazılır. Başarısızlık mekanizması genellikle büyük bir sorun değildir. Genel olarak konuşursak, önbelleğe alma, performans optimizasyonu için ilk tercihtir ve en etkili çözümdür.
Bununla birlikte, önbellekler genellikle KV tipi depolamadır ve tüm sorunları çözemeyen sınırlı kapasiteye (belleğe dayalı) sahiptir, bu nedenle daha fazla optimizasyon, diğer NoSql'leri sunmaya devam ediyoruz:
Veritabanı ve önbellek, diğer NoSql ile paralel olarak çalışır ve her bir NoSql'in özelliklerini tam olarak oynar. Tabii ki, NoSql performans açısından ilişkisel veritabanından çok daha iyidir, ancak çoğu zaman bazı özelliklerin eksikliği ile birlikte gelir.En yaygın olanı işlem fonksiyonlarının olmamasıdır.
Yaygın olarak kullanılan NoSql ve bunların temsili ürünlerine bir göz atalım ve her bir NoSql'nin özelliklerine aşina olmak ve teknik seçimi kolaylaştırmak için her NoSql'nin avantajlarını ve dezavantajlarını ve uygulanabilir senaryolarını analiz edelim.
KV NoSql (Temsilci ---- Redis)
KV NoSql, adından da anlaşılacağı gibi, anahtar-değer çiftleri şeklinde depolanan ilişkisel olmayan bir veritabanıdır.En basit, anlaşılması en kolay ve en tanıdık NoSql'dir, bu nedenle hızlı bir şekilde tanıtılacaktır. Redis ve MemCache temsilcilerdir. Redis, KV tipi NoSql arasında en yaygın kullanılan NoSql'dir. KV tipi veritabanı, örnek olarak Redis'i kullanır. En büyük avantajlar iki nokta:
Bu nedenle, KV tipi NoSql'in en büyük avantajı yüksek performanstır.Karşılaştırma testi için Redis ile birlikte gelen BenchMark'ı kullanarak, TPS 100.000 seviyesine ulaşabilir ve performans çok güçlüdür. Aynı Redis'in, tüm KV tipi NoSql'in sahip olduğu bariz eksiklikleri de vardır:
Özetle, KV NoSql için en uygun senaryo önbelleğe alınmış senaryodur:
Örneğin, kullanıcı bilgilerini kullanıcı kimliğine göre sorgulayın, her seferinde önbelleği kullanıcı kimliğine göre sorgulayın ve verileri doğrudan geri döndürün, yoksa ilişkisel veritabanındaki kimliğe göre verileri sorgulayın ve önbelleğe yazın.
Arama NoSql (---- ElasticSearch'ü temsil eder)
Geleneksel ilişkisel veritabanları, hızlı sorgu amaçlarına ulaşmak için esas olarak dizinleri kullanır, ancak tam metin araması bağlamında, dizinler güçsüzdür.Sorgular gibi, tüm belirsiz eşleştirme gereksinimlerini karşılayamaz ve ikinci olarak, kullanım sınırı çok büyüktür ve yanlış kullanım yavaşlığa neden olabilir. Sormak, Aramaya dayalı NoSql'in doğuşu, ilişkisel veritabanlarında zayıf tam metin arama yetenekleri sorununu çözmektir. ElasticSearch, aramaya yönelik NoSql'in temsili ürünüdür.
Tam metin aramanın ilkesi tersine çevrilmiş bir dizindir. Şimdi ters çevrilmiş dizinin ne olduğuna bir bakalım. Tersine çevrilmiş bir dizinden bahsetmek için, önce ileriye doğru dizinin ne olduğuna bakalım. Geleneksel ileriye doğru dizin bir belgedir - > "Tom benim arkadaşım" cümlesi gibi anahtar kelimelerin eşleştirilmesi, onu dört kelimeye böler: "Tom", "eşittir", "benim" ve "arkadaşım" ve arama yaparken belgeyi tarayın. Koşulları karşılayanları bulun. Bu yöntemin prensibi çok basittir, ancak düşük erişim verimliliği nedeniyle, temelde pratik bir değeri yoktur.
Tersine çevrilmiş indeks tam tersidir, bu bir anahtar kelimedir - > Bir tabloda gösterirsem belgenin eşlemesi daha net:
Şu anda dört cümle var demek: "Tom Tom", "Tom benim arkadaşım", "Teşekkür ederim Betty" ve "Tom Betty'nin kocası" Arama motorları bu cümleyi belirli bölümleme kurallarına göre kesecek. N anahtar kelime oluşturun ve anahtar kelime boyutundaki her metinde anahtar kelimelerin geçtiği sayıları koruyun. Dolayısıyla, bir dahaki sefere "Tom" araması yaptığınızda, Tom kelimesi "Tom Tomdur", "Tom benim arkadaşım" ve "Tom Betty'nin kocasıdır" şeklinde üç cümlede göründüğü için bu üç kayıt alınacaktır. , Ve "Tom", "Tom is Tom" cümlesinde iki kez geçtiğinden, bu kayıt "Tom" kelimesiyle en yüksek eşleşmeye sahiptir ve ilk olarak görüntülenir. Bu, arama motoru tersine çevrilmiş dizinin temel ilkesidir. Belli bir anahtar kelimenin bir belgede göründüğünü varsayarsak, ters çevrilmiş dizinde iki bölüm vardır:
Aynı şekilde "Betty Tom" iki kelimesini aradığımız sonucuna varılabilir. Arama motoru, geliştirici tarafından belirtilen memnuniyet oranına göre "Betty Tom" ve "Betty" olmak üzere iki kelimeye böler, örneğin, memnuniyet oranı = 50 %, ardından iki kelimeden biri kayıtta göründüğü sürece, kayıt alınır ve ardından eşleşme derecesine göre görüntülenir.
Arama NoSql, ElasticSearch'ü örnek olarak alır. Avantajları şunlardır:
Benzer şekilde, ElasticSearch de bariz dezavantajlara sahiptir:
Bu nedenle, arama türü NoSql için en uygun senaryo, ilişkisel veritabanlarına alternatif olarak koşullu arama, özellikle tam metin arama senaryosudur.
Ek olarak, arama veritabanları için özellikle önemli bir uygulama senaryosu vardır. Veritabanı tablolara bölündüğünde tek bir tabloda yapılabilecek tüm toplama işlemleri ve istatistiksel işlemler başarısız olur mu diye düşünebiliriz. Örneğin sipariş tablosunu 1024 tablo içeren 16 veri tabanına bölersem emir verisi 1024 tabloya dağılır.Dün Zhejiang Eyaletinde en yüksek işlem tutarının hangi siparişe sahip olduğunu saymak istiyorum, nasıl yapılır? Dünkü tüm siparişleri kronolojik sırayla görüntülemek istiyorum, ne yapmalıyım? Bu, belge tabanlı NoSql'nin bir başka önemli işlevidir.Belge tabanlı NoSql'de alt tablolardan sonra verileri birleştirebilir ve tüm verilerin sorgusunu tamamlamak için belge tabanlı NoSql'in arama ve toplama yeteneklerini kullanabiliriz. .
İkinci yazma olarak KV tipi NoSql'den sonra neden konulduğuna gelince, çünkü genellikle arama tipi NoSql, ilişkisel veritabanını korumak için bir ön önbellek katmanı görevi de görür.
Sütunlu NoSql (temsilci-HBase)
Büyük veri çağındaki en temsili teknolojilerden biri olan Columnar NoSql, HBase tarafından temsil edilmektedir.
Sütunlu NoSql sütunlu depolamaya dayanır. Peki sütunlu depolama nedir? Sütunlu SQL ve ilişkisel veritabanları birincil anahtar kavramına sahiptir. Aradaki fark, ilişkisel veritabanlarının verileri satırlar halinde düzenlemesidir:
Her satırda üç alan olduğunu görebilirsiniz: isim, telefon ve adres Bu bir satır saklama yöntemidir ve verileri id = 2 ile gözlemleyebilirsiniz. Telefon alanı olmasa bile, yine de yer kaplar.
Sütunlu depolama tamamen başka bir yoldur, her sütun tarafından düzenlenen verilerdir:
Bunu yapmanın faydaları nelerdir? Kabaca aşağıdaki noktalar var:
İkinci nokta veri sıkıştırmayla ilgili. Bu ne anlama geliyor? Örnek olarak daha yaygın bir sözlük tablosu sıkıştırma yöntemini ele alalım:
Anlamak için resme dikkatlice bakın, anlamalısınız.
Ardından HBase tarafından temsil edilen sütun tipi NoSql'in avantajları ve dezavantajları hakkında konuşmaya devam edin, avantajları şunlardır:
Bu nedenle, HBase, gelecekte veri büyümesinin tahmin edilemediği KV tipi senaryolar için daha uygundur.Ayrıca, HBase kullanımı, esas olarak RowKey'in tasarımına yansıyan belirli bir deneyim gerektirir.
Belge NoSql (Temsilci-MongoDB)
Açıkçası, iş tecrübeme göre, belge tabanlı NoSql kullanımında nispeten sığ bir deneyime sahibim, bu nedenle bu bölüm size kaba bir giriş sağlamak için yalnızca önceki makaleler ve çevrimiçi makaleler ile birlikte kullanılabilir.
Belge türü NoSql nedir? Belge türü NoSql, yarı yapılandırılmış verileri belgeler olarak depolayan bir NoSql anlamına gelir. Belge türü NoSql genellikle verileri JSON veya XML biçiminde depolar. Bu nedenle, belge türü NoSql'de Şema yoktur, çünkü Şema yoktur Özellikleri ile, verileri istediğimiz zaman saklayabilir ve okuyabiliriz, bu nedenle NoSql belgesinin ortaya çıkışı, ilişkisel veritabanı tablo yapısının uygunsuz genişlemesi sorununu çözmektir.
MongoDB, belge tabanlı NoSql'in temsili ürünüdür ve ayrıca tüm NoSql ürünlerindeki yıldız ürünlerden biridir, bu nedenle MongoDB burada örnek olarak alınmıştır. Anladığıma göre, belge tabanlı bir NoSql olarak MongoDB, ilişkisel veritabanları ile tamamen uyumlu bir ürün. Depolama açısından:
Gördüğünüz gibi ilişkisel veritabanı her alan için adım adım bir sütunda, MongDB'de ise JSON dizesi olarak saklanıyor. İlişkisel veriler isim ve telefon için indekslenebilir. MongoDB ayrıca createIndex komutunu kullanarak sütunları indeksleyebilir. İndekslemeden sonra, sorgu verimliliği büyük ölçüde iyileştirilebilir. Diğer açılardan, temel kavramlar söz konusu olduğunda, ikisi temelde benzerdir:
Bu nedenle, MongDB için, onu yalnızca bir Serbest Şema ilişkisel veritabanı olarak anlamamız gerekir. Avantajları ve dezavantajları bir bakışta nispeten açıktır. Avantajları:
Dezavantajlar:
Sonuç olarak, MongDB'nin kullanım senaryoları büyük ölçüde ilişkisel veri tabanlarına karşı kullanılabilir, ancak birleşimleri olmayan, güçlü tutarlılık gereksinimleri olmayan ve tablo şeması sıklıkla değişen verileri işlemek için daha uygundur.
Özet: Veritabanı ile NoSql ve çeşitli NoSql arasında karşılaştırma
Son bölüm bir özettir. Son tahlilde bu makale iki konu hakkındadır:
Her şeyden önce, ilk konu, ilişkisel veri tabanı ve ilişkisel olmayan veri tabanı seçimi benim anlayışıma göre iki düşünceden başka bir şey değildir:
İlk nokta, çok fazla açıklama anlaşılmamalıdır, ilişkisel olmayan veritabanları, daha yüksek performans elde etmek için ACID özelliklerinden ödün verilerek elde edilir, iki tablo arasında güçlü bir tutarlılık gerekliliği olduğu varsayılırsa, bu tür veriler İlişkisel olmayan veritabanları için uygundur.
İkinci nokta, temel verilerin, kullanıcı tabloları ve sipariş tabloları gibi ilişkisel olmayan veritabanlarını kullanmamasıdır, ancak bu tür temel verilerin birden çok sorgu moduna sahip olduğu bir öncül vardır.Örneğin, kullanıcı tablosunun temel alabileceği dört ABCD alanı vardır. AB kontrolü, temel verileri varsayarak, AC kontrolüne dayalı olabilir, belki D kontrolüne dayalı olabilir, ancak bu, kullanıcının sohbet geçmişi gibi bir KV formudur, daha sonra HBase kaydedilir kaydedilmez yapılacaktır.
Son birkaç yıldaki iş deneyiminden yola çıkarak, temel olmayan veriler, özellikle günlükler ve ardışık düzenler gibi ara veriler ilişkisel veritabanlarına yazılmamalıdır.Bu tür veriler genellikle iki özelliğe sahiptir:
İlişkisel veritabanı depolama motoru olarak kullanıldığında, ilişkisel veritabanının yeteneği büyük ölçüde azalacaktır.Normal okuma ve yazma için düşük QPS'ye sahip çekirdek hizmetler, bu tür veri okuma ve yazma ile aşağı sürüklenecektir.
Ardından ikinci soru geliyor: Depolama motoru olarak ilişkisel olmayan bir veritabanını kullanırsak, nasıl seçeriz? Aslında, yukarıdaki makaleler temelde yazılmıştır, işte sadece bir özet (tüm eksiklikler işlemin noktasını yansıtmayacaktır, çünkü bu, ilişkisel veritabanlarına kıyasla tüm NoSql'lerin ortak bir sorunudur):
Bununla birlikte, burada özellikle aşağıdaki gibi seçimin kitaba göre değil gerçek duruma dayanması gerektiği belirtilmektedir:
Bu nedenle, gerçek durumu dikkate almazsanız, bazı depolama motorları daha uygun olsa da, onları kullanmaya zorlamak ters etki yaratır, sonuçta size en uygun olanlarıdır.