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.
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
- 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
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>
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');
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
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