Replikasiya və Şarding
Məlumat bazasının genişləndirilməsi(miqyaslanma) layihənin böyüməsi zamanı ən çətin məsələdir. Bütün səylərin 90% -i ümumiyyətlə məlumatların və onlarla aparılan əməliyyatların həcminin böyüməsi ilə əlaqəli işlərin üzərinə düşür.
Bir verilənlər bazası serveri hər hansı bir anda yükün öhdəsindən gəlməyi bacarmarsa, onda burada təsvir edilən miqyaslama üsulları tətbiq oluna bilər.
Strategiyalar
Məlumatların genişləndirilməsi Veb tətbiqlərinin genişləndirilməsi ilə eyni prinsipə əsaslanır. Bu, məlumatların qruplara bölünməsi və ayrı-ayrı serverlərə ayrılmasıdır. Ümumiyyətlə iki əsas strategiya var - replikasiya və şardinq.
Replikasiya
Replikasiya məlumat bazasının tam dublikatını yaratmağa imkan verir.
Master-Slave
Ən çox istifadə olunan master-slave sxemidir:
- Master- bütün məlumatların daxil olunduğu əsas serverdir. Məlumatlardakı bütün dəyişikliklər(yeni məlumatın əlavə edilməsi,cari məlumatda dəyişikliyin olunması,məlumatın silinməsi) bu serverdə olmalıdır.
- Slave- masterdə olan məlumatları özünə köçürən verilənlər bazasının köməkçi serveridir. Bu serverdən məlumatları yalnız oxumaq lazımdır. Bu tip server müxtəlif sayda ola bilər
Replikasiya bir server yerinə 2 və daha çox serverdən istifadəyə imkan verir. Məlumatların oxunması(SELECT) əməliyyat sayı, məlumatların redaktəsi(INSERT/UPDATE) əməliyyat sayından dəfələrlə çoxdur. Buna görə, replikasiya məlumatların oxunması əməliyyatını slave server(lər)nə daşımaqla master serverin yüklənməsini azaltmış olur.
Bununla bağlı tətbiqdə məlumat bazasıyla iki sayda birləşmə olacaq:
<?$master = mysql_connect('10.10.0.1', 'root', 'pwd');$slave = mysql_connect('10.10.0.2', 'root', 'pwd');$q = mysql_query('INSERT INTO users ...', $master);$q = mysql_query('SELECT * FROM users WHERE...', $slave);
Replikasiya DBMS tərəfindən dəstəklənir(məsələn, MYSQL) və hazırladığmız tətbiqdən asılı olmayayaraq sazlanması mümkündür.
Qeyd etmək lazımdır ki, replikasiya əlverişli miqyaslanma mexanizmi sayılmır. Buna səbəb, məlumatların sixronlaşmaması və masterdən slave edilən köçürmə əməliyyatlarında müşahidə olunan gecikmələrdi. Buna baxmayaraq bu mexanizm dayanaqlığın qorunmasında yüksək keyfiyyətə malikdir. Master serverdə problem yaranarsa slave serverə və ya bunun əksini keçid etmək mümkündür. Etibarlılıq baxımından replikasiyanın şardinglə birgə istifadəsinə tez-tez rast gəlmək mümkündür.
Şarding(Sharding)
Şarding -miqyaslanmanın başqa bir növüdür. Bu mexanizmin əsas məqsədi məlumat bazasının hissələrə bölünərək müxtəlif serverlərə yerləşdirilməsidir. Bu prosesin icrası məlumat bazasının strukturundan asıllıdır.
Şaquli şarding(Vertical Sharding)
Bu cədvəlin və ya hər hansi qrup cədvəllərin ayrı serverlərə çıxarılmasıdır. Misal olaraq tətbiqimizdə bu cədvəllər mövcuddur:
- users- istifadəçi məlumatları
- photos- istifadəçi şəkilləri
- albums- istifadəçi albomları
users cədvəlini bir serverdə saxlamaqla photos və albums cədvəllərini digər serverlərə çıxarırıq. Bu halda tətbiqdə bütün cədvəllərlə işləmək üçün məlumat bazasına olan birləşmələri(connections) nəzərə almaq lazımdır.
<?$users_connection = mysql_connect('10.10.0.1', 'root', 'pwd');$photos_connection = mysql_connect('10.10.0.2', 'root', 'pwd';$q = mysql_query('SELECT * FROM users WHERE ...', $users_connection);$q = mysql_query('SELECT * FROM photos WHERE...', $photos_connection);$q = mysql_query('SELECT * FROM albums WHERE...', $photos_connection);
Replikasiyada fərqli olaraq şarding mexanizmində müxtəlif cədvəllarlə işləmək üçün məlumat bazasına aid olan müxtəlif sayda birləşmələrdən istifadə etmək məcburiyyətindəyik.
Üfüqi şarding(Horizontal sharding)
Bu bir cədvəlin müxtəlif serverlər arasında paylanmasıdır. Bu mexanizm bir serverə yerləşməyən böyük həcmli cədvəllər üçün şamil olunur. Cədvəlin hissələrə bölünməsi bu prinsipə görə aparılır:
- Bir neçə sayda serverdə eyni cədvəl yaradlır(Yalnız cədvəlin strukturu,məlumatlar əlavə edilmir)
- Tətbiqdə məlumat bazasına olan birləşmə ilə bağlı öncədən şərt təyin olunmalıdır. Misal olaraq cüt saylı sətirlər bir serverdə tək saylı sətirlər digər serverdə saxlanılsın.
- Cədvələ edilən hər müraciətin əvvəlində məlumat bazasına olan birləşmə seçimi olunur.
Tutaqki, bizim tətbiqimiz özündə çoxlu sayda istifadəçi şəkillərini saxlayan böyük həcmli cədvəllə işləyir. Bu cədvəl üçün 2 server hazırlayırıq. Tək saylı istifadəçilər üçün 1 ci server digərləri üçün 2 ci serveri istifadə edəcəyik. Beləliklə, hər bir serverdə istifadəçi fotoşəkilləri haqqında bütün məlumatların yalnız bir hissəsi olacaqdır.
<?$photo_connections = ['1' => '10.10.0.1','2' => '10.10.0.2',];$user_id = $_SESSION['user_id'];$connection_num = $user_id % 2 == 0 ? 1 : 2;$connection = mysql_connect($photo_connections[$connection_num], 'root', 'pwd');$q = mysql_query('SELECT * FROM photos WHREE user_id = ' . intval($user_id), $connection)
Bu tip şarding bütün cədvəllərə tətbiq olunmamalıdr. Cədvəldəki məlumatların sayı 100 milyonlarla olduqda bu haqda düşünmək olar.
Birgə istifadə
Şarding və replikasiya tez-tez birgə istifadə olunur. Bizim misalımızda hər şard olmuş cədvəl üçün 2 server istifadə edə bilərik.
- photos_mater_1
- photos_slave_1
- photos_master_2
- photos_slave_2
<?$photo_connections = ['1' => ['master' => '10.10.0.10','slave' => '10.10.0.11',],'2' => ['master' => '10.10.0.20','slave' => '10.10.0.21',],];$user_id = $_SESSION['user_id'];$connection_num = $user_id % 2 == 0 ? 1 : 2;$connection = mysql_connect($photo_connections[$connection_num]['slave'], 'root', 'pwd');$q = mysql_query('SELECT * FROM photos WHREE user_id = ' . intval($user_id), $connection);$photo_id = 7;$connection_num = $user_id % 2 == 0 ? 1 : 2;$connection = mysql_connect($photo_connections[$connection_num]['master'], 'root', 'pwd');$q = mysql_query('UPDATE photos SET views = views + 1 WHREE photo_id = ' . intval($photo_id), $connection);
Bu tip sxem miqyaslanma üçün deyil, dayanıqlığın artırılması üçündür. Şard serverlərdən birinin sıradan çıxması dayanıqlığı qoruyaraq digər şard serverlərdən biri istifadə olunacaq.
Key-value tipli məlumat bazaları
Qeyd etmək lazımdır ki, bir çox key-value tipli məlumat bazaları şardingi platforma səviyyəsində dəstəkləyir. Misal olaraq, Memcache qeyd etmək olar.
Bu halda sadəcə qoşulma üçün server siyahısını qeyd edirik. Digər işləri platforma öz üzərinə götürür.
<?$m = new Memcache;$m->addServer('10.5.0.1');$m->addServer('10.5.0.2');$m->addServer('10.5.0.3');...$m->get('user1')