Réplication et Log binaires

6 April 2007 par pébé

Qui n’a jamais utilisĂ© MySQL sans la rĂ©plication? La rĂ©plication permet Ă  votre application de supporter un nombre de lecture beaucoup plus important. Les updates se font sur une base de donnĂ©e “maĂ®tre” (master) et sont ensuite rĂ©pliquĂ©es sur plusieurs “esclaves” (slaves). Le maĂ®tre n’a pas Ă  supporter les requĂŞtes venant de clients qui sont gĂ©rĂ©es par les esclaves. Un autre jour je rentrerai plus en dĂ©tails la dessus mais en rĂ©sumĂ©, le maĂ®tre Ă©crit dans des fichiers toutes les requĂŞtes qui ont modifiĂ© ses informations (insert, update et delete). Les slaves viennent Ă  leur tour rĂ©cupĂ©rer ces fichiers (binary logs) et les “copie” localement (relay logs) avant de les rejouer.

Il est conseillĂ© en gĂ©nĂ©ral de dĂ©dier un disque pour ces fichiers car beaucoup d’Ă©criture entraĂ®ne une baisse de vos performances. Dans le cas qui nous intĂ©resse, l’activitĂ© du CPU m’a très Ă©tonnĂ©. En effet jusqu’Ă  60% du temps CPU Ă©taient utilisĂ© par ‘USER’ juste en activant la rĂ©plication.

Suite Ă  cela j’ai dĂ©cidĂ© avec mon ami Laurent de faire un peu de profiling… sommes nous un peu DBCSI? (comprenez database crime scene investigators ;)) Pour cela un outil intĂ©ressant est oprofile.

Pour tester ça, nous avons un DELL 2850 sous RHEL4 1 disque (hélas) et 2Go de RAM. Le programme de test à été exécuté pendant 30 minutes, et voila les résultats surprenant.

  • Avec binlog
  • Profiling through timer interrupt
    samples % image name symbol name
    1680924 47.9708 /lib64/tls/libc-2.3.4.so __ctype_toupper_loc
    1651101 47.1197 /usr/libexec/mysqld dict_create_foreign_constraints_low
    54986 1.5692 /usr/libexec/mysqld yylex(void*, void*)
    9083 0.2592 /usr/libexec/mysqld __do_global_ctors_aux
    8541 0.2437 /usr/libexec/mysqld buf_pool_init
    8284 0.2364 /lib64/tls/libc-2.3.4.so memcpy
    5918 0.1689 /usr/libexec/mysqld my_snprintf_ucs2
    4934 0.1408 /usr/libexec/mysqld log_buffer_flush_to_disk
    4640 0.1324 /usr/libexec/mysqld my_strntod_ucs2
    4268 0.1218 /usr/libexec/mysqld MD5Transform
    3650 0.1042 /usr/libexec/mysqld my_parse_charset_xml

  • Sans binlog
  • Profiling through timer interrupt
    samples % image name symbol name
    34847 9.7094 /usr/libexec/mysqld __do_global_ctors_aux
    30416 8.4748 /lib64/tls/libc-2.3.4.so memcpy
    30041 8.3703 /usr/libexec/mysqld buf_pool_init
    20615 5.7439 /usr/libexec/mysqld my_snprintf_ucs2
    17065 4.7548 /usr/libexec/mysqld my_strntod_ucs2
    16656 4.6408 /usr/libexec/mysqld log_buffer_flush_to_disk
    14908 4.1538 /usr/libexec/mysqld dict_create_foreign_constraints_low
    9154 2.5506 /lib64/tls/libpthread-2.3.4.so pthread_mutex_trylock
    8354 2.3277 /lib64/tls/libc-2.3.4.so __ctype_toupper_loc
    8216 2.2892 /lib64/tls/libpthread-2.3.4.so pthread_mutex_unlock
    5347 1.4898 /usr/lib/debug/lib/modules/2.6.9-22.ELsmp/vmlinux copy_user_generic
    3380 0.9418 /usr/libexec/mysqld buf_flush_try_page

On remarque que lorsque les logs binaires sont activĂ©s, beaucoup de temps CPU est utilisĂ© par cette fonction “dict_create_foreign_constraints_low”. Ce qui très Ă©trange, car elle est supposĂ© ĂŞtre utilisĂ© lorsque d’une modification de DDL (crĂ©ation de tables,…) pour effectuer des vĂ©rifications sur les clĂ©s Ă©trangères. Et sur cette application, mĂŞme si nous sommes en InnoDB, il n’y en a aucune.

Des que nous aurons un peu de temps devant nous, nous referons le test sous MySQL 5.0.



Autres billets susceptibles de vous intéresser :
  • Les covering index, de la thĂ©orie Ă  la pratique avec MyISAM et InnoDB
  • 15 secondes pour installer une rĂ©plication MySQL avec MySQL Sandbox, pari tenu ?
  • Dessine-moi MySQL : la rĂ©plication Master-Slave
  • CardinalitĂ©, sĂ©lectivitĂ© et distributivitĂ© d’un index MySQL : quel impact sur le plan d’exĂ©cution ?
  • GĂ©nĂ©rer un jeu de donnĂ©es : shell, mysqlslap, et procĂ©dure stockĂ©e
  • Laisser un commentaire