#3 Replikacja serwera www wraz z bazą danych – GlusterFS + Mysql(Master-Slave)

SMITHCLONES
You. Yes, me. 🙂 me, me, me. Me too 🙂

0. Wstęp

Replikacja – najprosciej ujmując, jest to mechanizm/proces do powielanie tej samej informacji do innej niezależnej jednostki. Daj nam to przede wszystkim:

  • Skalowalność – nadmiarowy serwer możemy wykorzystać do rozłożenia obciążenia.
  • Bezpieczeństwo – w chwili awarii głównego serwera( gdyby spadłby na niego np. Tomahawk) szybko możemy przywrócić usługę do życia.
  • Wygodę – zawsze możemy wykorzystać nadmiarowy serwer do testowania, wykonywanie operacji wymagających dużego obciążenia ( statystyki, analiza, raporty).
  • Minus – musimy kupić drugą taką puszkę, która tez potrzebuje prądu i miejsca w szafie.

Serwer Mysql działa w oparciu o model Master-Slave, czyli pojawia się zmiana na masterze, slave synchronizuje się i grzecznie wykonuje te same zapytania.
Za to GlusterFS można przyrównać do działania chmury, która może mieć wiele swoich klonów (Bricks).

0.1. CEL

Replikacja z głównego serwera web1 zasobu /www i bazy danych na drugi niezależny serwer rep1. W zasobie /www będzie się znajdować nasza strona www oparta na WordPressie.
replikacja_gluster_i_mysql

0.2. Wykorzystane technologie

  • Mysql 14.14
  • Apache 2.4.10
  • Debian 8.2
  • glusterfs 3.5.2
  • php 5.6
  • WordPress 4.7

1. Przygotowanie i Konfiguracja

Żeby dodać volumin z replikacją w GLusterFS wymaga już działającego demona glusetrfs po obu stronach. Dla tego też musimy podzielić naszą pracę na dwa etapy – przygotowanie i uruchomienie replikacji.

a) Przygotowanie serwera web1

Zaczynam od instalacji potrzebnego oprogramowania:

# # Server : web1 # # Oprogramowanie potrzebne do GLusterFS apt-get install glusterfs-server glusterfs-client # Oprogramowanie potrzebne do postawienia strony na wordpressie apt-get install apache2 php5 php5-mysql php5-curl php5-gd apg-get install mysql-server mysql-client # Każdy lubi nazwy 🙂 echo -e "192.168.50.51 web1.uchacz.it\n192.168.50.61 rep1.uchacz.it" >> /etc/hosts

Edytujemy plik /etc/mysql/my.cnf
Odhasujemy te pozycje i zmieniamy bind-address na adres ip od serwera web1

bind-address = 192.168.50.51 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
/etc/mysql/my.cnf

  • server-id – 1 – master, każdy kolejny to slave.
  • bind-address – adres ip, na którym nasłuchuje serwer mysql.
  • log_bin – w tym pliku są zapisywane zapytanie, które mają zostać wykonane na slavach.

Następnym krokiem jest dodanie użytkownika, bazy i replikacji.

# Restartujemy usługe MySql service mysql restart #Logujemy sie do konsoli MySql> mysql -u root -p # Tworzymy bazę i użytkownika dla wordpressa # mysql> CREATE DATABASE wp_db; CREATE USER 'uszatek'@'localhost' IDENTIFIED BY 'kolorowywihajster'; GRANT ALL PRIVILEGES ON wp_db.* TO 'uszatek'@localhost; # Tworzymy bazę i użytkownika dla REPLIKACJI # mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%' IDENTIFIED BY 'kolorowywihajster'; FLUSH PRIVILEGES; FLUSH TABLES WITH READ LOCK; UNLOCK TABLES;

b) Przygotowanie serwera rep1

# # Server : rep1 # # Potrzebne oprogramowanie apt-get install glusterfs-server glusterfs-client mysql-server mysql-client # Każdy lubi nazwy 😛 echo -e "192.168.50.51 web1.uchacz.it\n192.168.50.61 rep1.uchacz.it" >> /etc/hosts # Konfiguracja GLusterFS gluster peer probe web1.uchacz.it gluster volume create www replica 2 transport tcp rep1.uchacz.it:/www web1.uchacz.it:/www force gluster volume start www

Edytujemy plik /etc/mysql/my.cnf
Odhasujemy te pozycje i zmieniamy bind-address na adres ip od serwera rep1

bind-address = 192.168.50.61 server-id = 2 log_bin = /var/log/mysql/mysql-bin.log
/etc/mysql/my.cnf

2. Uruchomienie Replikacji

Mając przygotowane dwa serwery, możemy zabrać się do uruchomienia docelowej replikacji. Najpierw w GlusterFS, a później w MySql. Dlaczego taka kolejność? musimy przesłać pliczek rzutu z bazy danych web1, wykorzystamy do tego zamontowany dysk glusterfs.

a) Uruchomienie na serwerze web1

# Konfiguracja GLusterFS gluster peer probe web1.uchacz.it gluster volume create www replica 2 transport tcp rep1.uchacz.it:/www web1.uchacz.it:/www force gluster volume start www # Montujemy nasz nowy skarb 🙂 mkdir /www mount -t glusterfs web1.uchacz.it:/www /www service mysql restart # Tablica z mysql potrzebna do uruchomienia replikacji na rep1 i struktura mysqldump -u root -p --all-databases > /www/frist.sql mysql -u root -p show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 107 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
  • show master status – wyświetla nam bardzo ważną tabele, potrzebujemy znać dwa parametry do ustawienia slava :
    • File -aktualny pilik z zapytaniami
    • Postion – ostatnia pozycja w tym pliku

b) Uruchomienie na serwerze rep1

# montujemy zasób z GlusterFS mkdir /www mount -t glusterfs rep1.uchacz.it:/www /www # uruchomienie replikacji Mysql typu Master-Slave mysql -u root -p < /www/frist.sql mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.50.51',MASTER_USER='slave1', MASTER_PASSWORD='kolorowywihajster', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS= 107; START SLAVE;
  • MASTER_USER – użytkownik replikacji.
  • MASTER_PASSWORD – jego hasło.
  • MASTER_LOG_FILE – aktualny plik, patrz pod uruchomienie web1.
  • MASTER_LOG_POS – aktualna pozycja, patrz pod uruchomienie web1.

3. Uruchomienie WordPressa na web1

Edytujemy plik /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /www/wordpress/ RewriteEngine On ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
/etc/apache2/sites-enabled/000-default.conf

Pobieramy najnowszą odsłonę wordpressa i konfigurujemy Apacha2:

cd /www wget https://wordpress.org/latest.tar.gz tar -zxvf latest.tar.gz # Dodajemy prawa do Zasobu echo -e "<Directory /www/wordpress/>\nOptions Indexes FollowSymLinks\nAllowOverride None\nRequire all granted\n</Directory>" >> /etc/apache2/apache2.conf chown -R www-data:www-data wordpress/

Tworzymy pliczek z konfiguracją do wordpressa /www/wordpress/wp-config.php

<?php define('DB_NAME', 'wp_db'); define('DB_USER', 'uszatek'); define('DB_PASSWORD', 'kolorowywihajster'); define('DB_HOST', 'localhost'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); define('AUTH_KEY', 'put your unique phrase here'); define('SECURE_AUTH_KEY', 'put your unique phrase here'); define('LOGGED_IN_KEY', 'put your unique phrase here'); define('NONCE_KEY', 'put your unique phrase here'); define('AUTH_SALT', 'put your unique phrase here'); define('SECURE_AUTH_SALT', 'put your unique phrase here'); define('LOGGED_IN_SALT', 'put your unique phrase here'); define('NONCE_SALT', 'put your unique phrase here'); $table_prefix = 'wp_'; define('WP_DEBUG', false); if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); require_once(ABSPATH . 'wp-settings.php');
/www/wordpress/wp-config.php

Restartujemy apacha2 i gotowe 🙂

# web1 service apache2 restart # Tworzymy bloga przez kreatora wordpress i # sprawdzamy stan replikacji MySql # web1 show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 986337 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) #rep1 show slave status; +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+ | Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+ | Waiting for master to send event | 192.168.50.51 | slave1 | 3306 | 60 | mysql-bin.000002 | 986337 | mysqld-relay-bin.000002 | 66337 | mysql-bin.000002 | Yes | Yes | | | | | | | 0 | | 0 | 986337 | 66494 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | | | 1 | +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+-----------------------------+------------------+ 1 row in set (0.00 sec) #Sprawdzamy stan replikacji GlusterFS gluster volume status wwww

strona-wordpress-hello

4. GitHub – clone & run 🙂

GitHub – blog 3
Aby to odtworzyć – potrzebujemy:

  • Ansible
  • Virtualbox
  • Vagrant

W sprawie jak sie bawić z tymi wynalazkami zapraszam tutaj #blog -1 Automatyzacja środowiska Wirtualnego przy użyciu Ansible + Vagrant

git clone https://github.com/leszekuchacz/3-blog_uszatek-replikacja-serwera-www-wraz-baza-danych.git cd 3-blog_uszatek-replikacja-serwera-www-wraz-baza-danych chmod +x przygotuj_srodowisko.sh # Podajemy adres ip dla web1 i rep1 # skrypt edytuje /etc/hosts . setup.yml i VagrantFil ./przygotuj_srodowisko.sh vagrant box add debian/jessie64 https://atlas.hashicorp.com/debian/boxes/jessie64 --provider virtualbox vagrant init vagrant up # jak zielone - jedziemy dalej 🙂 ansible -i ./inventory.ini all -m ping -u vagrant ssh-keyscan web0 db >> ~/.ssh/known_hosts ansible -i ./inventory.ini all -m ping -u vagrant ansible-playbook setup.yml -i ./inventory.ini -u vagrant

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.