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:
  1. users- istifadəçi məlumatları
  2. photos- istifadəçi şəkilləri
  3. 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:
  1. Bir neçə sayda serverdə eyni cədvəl yaradlır(Yalnız cədvəlin strukturu,məlumatlar əlavə edilmir)
  2. 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.
  3. 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')

Mark Test


Advertisement :)
  • pica - high quality and fast image resize in browser.
  • babelfish - developer friendly i18n with plurals support and easy syntax.
You will like those projects!

h1 Heading 8-)

h2 Heading

h3 Heading

h4 Heading

h5 Heading
h6 Heading

Horizontal Rules




Typographic replacements

Enable typographer option to see result.
(c) (C) (r) (R) (tm) (TM) (p) (P) +-
test.. test... test..... test?..... test!....
!!!!!! ???? ,, -- ---
"Smartypants, double quotes" and 'single quotes'

Emphasis

This is bold text
This is bold text
This is italic text
This is italic text
~~Strikethrough~~

Blockquotes

Blockquotes can also be nested...
...by using additional greater-than signs right next to each other...
...or with spaces between arrows.

Lists

Unordered
  • Create a list by starting a line with +, -, or *
  • Sub-lists are made by indenting 2 spaces:
    • Marker character change forces new list start:
    • Ac tristique libero volutpat at
    • Facilisis in pretium nisl aliquet
    • Nulla volutpat aliquam velit
  • Very easy!
Ordered
  1. Lorem ipsum dolor sit amet
  2. Consectetur adipiscing elit
  3. Integer molestie lorem at massa
  4. You can use sequential numbers...
  5. ...or keep all the numbers as 1.
Start numbering with offset:
  1. foo
  2. bar

Code

Inline code
Indented code
// Some comments
line 1 of code
line 2 of code
line 3 of code
Block code "fences"
Sample text here...
Syntax highlighting
``` js var foo = function (bar) { return bar++; };
console.log(foo(5)); ```

Tables

| Option | Description | | ------ | ----------- | | data | path to data files to supply the data that will be passed into templates. | | engine | engine to be used for processing templates. Handlebars is the default. | | ext | extension to be used for dest files. |
Right aligned columns
| Option | Description | | ------:| -----------:| | data | path to data files to supply the data that will be passed into templates. | | engine | engine to be used for processing templates. Handlebars is the default. | | ext | extension to be used for dest files. |

Links

link text
link with title
Autoconverted link https://github.com/nodeca/pica (enable linkify to see)

Images

Minion Stormtroopocat
Like links, Images also have a footnote style syntax
Alt text
With a reference later in the document defining the URL location:

Plugins

The killer feature of markdown-it is very effective support of syntax plugins.

Emojies

Classic markup: :wink: :crush: :cry: :tear: :laughing: :yum:
Shortcuts (emoticons): :-) :-( 8-) ;)
see how to change output with twemoji.

Subscript / Superscript

  • 19^th^
  • H~2~O

\

++Inserted text++

\

==Marked text==

Footnotes

Footnote 1 link[^first].
Footnote 2 link[^second].
Inline footnote^[Text of inline footnote] definition.
Duplicated footnote reference[^second].
[^first]: Footnote can have markup
and multiple paragraphs.
[^second]: Footnote text.

Definition lists

Term 1
: Definition 1 with lazy continuation.
Term 2 with inline markup
: Definition 2
    { some code, part of Definition 2 }

Third paragraph of definition 2.
Compact style:
Term 1 ~ Definition 1
Term 2 ~ Definition 2a ~ Definition 2b

Abbreviations

This is HTML abbreviation example.
It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on.
*[HTML]: Hyper Text Markup Language

Custom containers

::: warning here be dragons :::

Rekursiya

Rekursiya (recursio-latın sözü olub, tərcüməsi qayıtmaq mənasını verir)- metodun özü-özünə müraciət etməsi başa düşülür.
Belə bir deyim də var ki, rekursiyanı başa düşmək üçün gərək rekurisyanın özünü başa düşəsən. :)




Testing folder
Rekursiyanı daha aydın anlamaq üçün bir misala baxaq:
Ana qovluq "testing" olmaqla iç-içə olan bütün qovluqlardakı  faylların siyahısını tərtib etmək lazımdır.

public void listf(String directoryName, List<File> files) {

    File directory = new File(directoryName);



    // Get all files from a directory.

    File[] fList = directory.listFiles();

    if(fList != null)

        for (File file : fList) {     

            if (file.isFile()) {

                files.add(file);

            } else if (file.isDirectory()) {

                listf(file.getAbsolutePath(), files);

            }

        }

    }

}

Istənilən rekursiv alqoritmi iterativ(dövr operatorlarını istifadə etməklə) yolla da yazmaq mümkündür. 
Böyük həcmli proqramlarda bəzən rekursiya iterasiya ilə əvəz edilir.
İş ondadır ki, rekursiya metodunun özünə olan çoxlu müraciətlərin qarşılığında əldə olunan performansın dövr operatorları vasitəsilə yazılmış proqramların icrası ilə bağlı əldə olunan performans göstəricililərindən geri qalırlar.
Lakin rekurisya ilə yazılan proqramlar daha yığcam və aydın olur.
Başqa sözlə dövlər proqramların performans artımını təmin etdiyi halda, rekursiya proqramçıların performans artımını təmin edir.

Bundan əlavə rekursiyadan istifadə edərək ədədi yazı ifadəsinə çevirən koda burada baxa bilərsiniz.


Rekursiyadan istifadə üzrə məsləhətlər

Rekursiyanın tətbiqi vaxtı bu məsləhətləri nəzərdə tutun.

Təhlükəsizliyin sayğaclarının köməyi ilə sonsuz rekursiyanın qarşısını alın sayğac elə bir dəyişən olmalıdır ki, metod özü-özünə müraciət etdikdə bu dəyişəni yenidən yaratmasın.
Rekursiyanı bir metodla məhdudlaşdırın   Dövrü rekursiya(A metodu B metodunu B isə C metodunu ve C metodu A metodunu çağırır) çətin aşkar edildiyindən təhlükəlidir.
Stekə nəzarət edin Rekursiyadan istifadə zamanı proqramın stekdə nə qədər yer tutacağı haqda öncədən məlumatımız olmur.Bundan başqa proqramın özünü necə aparmağını əvvəlcədən müəyyən etmək  olduqca çətindir. Ancaq bəzi yollarla nəzarəti ələ almaq mümkündür.
İlk olaraq, əgər təhlükəsizlik sayğacı dəyişəni nəzərə alınıbsa  onda  proqramın stekdə istifadə edə biləcək ölçünü nəzərə almaq olar. Beləki təhlükəsizlik sayğacına stekdə istifadə olunan ölçüdən daha azını mənimsətməklə stekin dolmasını qarşısını ala bilərik.
Daha sonra rekursiv metodda istifadə olunan lokal dəyişənlərə  yaddaşın ayrılmasına nəzarət etmək lazımdır.  Yaxşı olar ki, kompilyatorun obyektləri stekdə avtomatik yaratması əvəzinə obyektlərin heap də new istifadə eədərək yaradılsın.