Database sharding nima? Partitioning bilan farqi

Assalamu Alaykum bugun ham databazaga aloqador bir qiziq mavzu sharding haqida gaplashamiz . Bugungi maqolada sharding nimaligi , partitioning bilan farqi va qachon sharding qilinishi kerakligini ko'rib chiqamiz.

Databaza Sharding nima ?

Database sharding — bu ma'lumotni turli xil serverlarda bo'lgan databazalarga bo'lib tashlash jarayoni.

Shardingga ham asosiy sabab bu ma'lumot ko'payib borgani sari queryning sekinlashishi.

Tassavur qiling siz Mediumga o'xshagan platforma qurmoqdasiz va undagi ma'lumotlar juda ko'payib ketdi va u querylarga ta’sir qilmoqda. Va siz databaza qismlarga bo'lish fikriga keldingiz. Buni qaysidir bir aniq field orqali qilinadi va bu shard key deyiladi . Buni oylar orqali yoki hududlar orqali qilishimiz mumkin. Agarda u shunchaki string bo'lsa , bizga consisteng hashing kerak bo'ladi. Ubizga hash funksiyalar orqali qaysi databazaga yozishimiz aniqlab beradi.

Consistent hashing

Masalan sizda 3 ta shard databaza mavjud va buni kelayotgan ma'lumotni shard key fieldni hash funksiyaga berib yuborasiz va u sizga qaysi databazaga yozish kerakligini aniqlab beradi. Bu jarayon readda ham xuddi shunday davom etadi. Siz faqatgina bir databazaga so'rov uzatasiz.

Foydasi va zararlari

Foydasi

  1. Scalability

— Ko'p ma'lumotni saqlay olish

— Serverdagi loadni bo'lib tashlash orqali xotirani kamroq ishlatish .

  1. Xavfsizlik (Foydalanuvchilar faqatgina qaysidir shardlardan o'qiy oladi ). Masalan VIP customerlar boshqa shardda bo'lishi mumkin,

  2. Optimal va kichkina hajmdagi indexlar.

Zarari

  1. Clientdagi(backend) murakkablik . (Shardlardan xabardorlik va so'rovlarni to'g'ri yo'naltirish).

  2. Shardlar aro tranzaksiya qilib bo'lmasligi va rollbackdagi muammolar.

  3. Sxemani o'zgartirish qiyin.

  4. Shardlar aro join (buni qila olamizmi o'zi).

  5. Qaysi shardga murojaat qilishni bilish uchun shard key doim kerak bo'ladi.

Horizontal partitioning va sharding farqlari

Horizontal partitioningda jadval bir databazada bir necha jadvallarga bo'linadi , client (backend) sifatida siz qaysi partitionga murojaat qilayotganingizni bilmaysiz. Sharding katta jadvalni har xil serverdagi databazadagi jadvallarga bo'ladi .Horizontal partitioningda jadval nomlari o'zgarishi mumkin (balki sxema) .Shardingda esa hammasi bir xil faqatgina boshqa serverda. Qachon shardingni qo'llashimiz kerak ?

To'grisini aytganda bu siz qilishingiz kerak bo'lgan oxirgi ish agarda dasturga kerak bo'lmasa qilmaganingiz maqul.Keling ungacha nimalar orqali databazadagi muammolarni yechishimiz mumkinligini ko'ramiz.

  1. Siz juda ko'p read(o'qish) so'rovlarini qabul qilyapsizmi unda indexlang.

  2. Siz haliham ko'p read so'rov qabul qilyapsiz va ular haliyam sekin . Horizontal partitioning qiling (sizda partition qilishga mos jadval bor deb qabul qilyapmiz) .

3.Siz yana serverdagi loadni kamaytirish uchun cachingni ham qo'shishingiz mumkin.

  1. Sizda haliyam server writega nisbatan juda ko'p read orqali bosimga tushyapti . Siz replicationdan foydalangan holda master-slave arxitekturasidan foydalanishigingiz mumkin . Master write uchun va slave read uchun (eventual consistency bilan) .

  2. Sizda haliyam juda ko'p write bor .Siz hudud bo'yich serverlarni ajratishingiz mumkin qachonki serverlar o'rtasidagi conflict kam bo'lganda.

  3. Tepadagi hamma yechimlar sizga yordam bermasa yoki qimmatga tushsa keyin databaza sharding amalga oshirishni o'ylash mumkin.

Scaling reads
Scaling reads

YouTube boshlang'ich 5 yilni bir databazada ishlab o'tkazishgan (sharding qilishdan oldin) . Bu degani sizga bu kamdan kam kerak bo'ladi degani .

Bundan tashqari agarda siz yangi sharding databaza qo'shishni xohlasangiz hash function ushbu databazani qaysidir ma'lumotlarni olish uchun chaqirishni boshlaydi ammo unda bu ma'lumotlar yoq . Va buni to'g'rilash uchun ushbu dbga qolganlaridan ma'lumotlarni migratsiya qilish kerak .(Yana muammo :).

Sharding va Partitioning haqida bir ajoyib gap : “We always shard database and partition the data ’’

Xulosa

Xulosa qilib aytganda Sharding sizga yordam berishi mumkin u lekin dastur darajasidagi juda ko'p murakkablikga olib keladi . Shuning uchun bu tanlovni qilishdan oldin barcha imkoniyatlarni hisobga olish zarur.