MySQL multimaster replikation med Galera

Multimaster replikation er når en eller flere database servere er koblet sammen og ændringer på en vilkårlig maskine effektueres på samtlige. Metoden beskrevet i dette indlæg er basseret på en tredieparts patch til MySQL og jeg vil demonstrere hvordan man laver det simplest mulige setup, nemlig et setup hvor vi kun benytter to servere.

Først starter jeg med mine to nyinstallerede maskiner lab1.mikjaer.com og lab2.mikjaer.com og installere lidt software på dem begge:

wget https://launchpad.net/codership-mysql/0.8/0.8.2/+download/mysql-server-wsrep-5.1.57-0.8.2-amd64.deb
wget https://code.launchpad.net/galera/0.8/0.8.2/+download/galera-0.8.2-amd64.deb

apt-get -y install libdbi-perl libdbd-mysql-perl mysql-client-5.1 libmysqlclient16 mysql-common libplrpc-perl libnet-daemon-perl vim

dpkg -i galera-0.8.2-amd64.deb mysql-server-wsrep-5.1.57-0.8.2-amd64.deb

Derefter starter vi begge MySQL servere og laver nogle basale adgangsindstillinger før vi starter replikatoren:

/etc/init.d/mysql start

/usr/bin/mysql_secure_installation   

mysql -pPASSWORD -e "SET wsrep_on = OFF; grant all on *.* to 'root'@'%' identified by 'PASSWORD';"

/etc/init.d/mysql stop

Efter kommando nr 2 bliver du guidet igennem MySQL opsætningen, husk og vælg et sikkert password, brug det samme på begge maskiner og anvend samme pasword i kommando nr 3 istedet for de to steder hvor der står PASSWORD.

Nu skal vi ha MySQL til at lytte på internettet efter indkomne forbindelser, rediger /etc/mysql/my.cnf og kommenter flg. linie ud (det betyder at sætte et #-mærke i starten af linie):

bind-address           = 127.0.0.1

Du kan evt. teste forbindelsen, du skal fra en prompt på lab1 kunne forbinde til lab2 og vica versa:

root@lab1:~# mysql -pPASSWORD -h lab2.mikjaer.com -e "select 5+5\G"
*************************** 1. row ***************************
5+5: 10
root@lab2:~# mysql -pPASSWORD -h lab1.mikjaer.com -e "select 5+5\G"
*************************** 1. row ***************************
5+5: 10

Som du kan se virkede det udemærket, og vi kan nu gå videre med at sætte replikering op, stop mysql på begge servere:

root@lab1:~# /etc/init.d/mysql stop
root@lab2:~# /etc/init.d/mysql stop

Derefter redigerer du /etc/mysql/conf.d/wsrep.cnf og sætter flg. værdier ind de rigtige steder (de er spredt lidt ned igennem filen)

wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_sst_auth=root:PASSWORD

og på den første server(lab1), i samme fil:

wsrep_cluster_address="gcomm://"

og på den anden(lab2):

wsrep_cluster_address="gcomm://192.168.0.10"

Her er det selvfølgelig lab1’s ip adresse jeg har brugt, slutteligt starter jeg begge servere igen:

root@lab1:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld.
root@lab2:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld.

Herefter skulle replikering gerne køre, her er testen fra mit test-setup:

root@lab1:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
root@lab2:~# mysql -pPASSWORD -e "create database foobar;";
root@lab1:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foobar             |
| mysql              |
+--------------------+
root@lab1:~# mysql -pPASSWORD -e "create database foobar2;";
root@lab2:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foobar             |
| foobar2            |
| mysql              |
+--------------------+

Et klassisk “ingen-ting-her-ingen-ting-der-scenario” 😉

Håber i kan bruge det … og hvis i overvejer at smide det i produktion så læs lige manualen først 🙂

Udgivet i Knowledge Base, Linux, Old Base, SQL | Skriv en kommentar

MySQL multimaster replikation med Galera

Multimaster replikation er når en eller flere database servere er koblet sammen og ændringer på en vilkårlig maskine effektueres på samtlige. Metoden beskrevet i dette indlæg er basseret på en tredieparts patch til MySQL og jeg vil demonstrere hvordan man laver det simplest mulige setup, nemlig et setup hvor vi kun benytter to servere.

Først starter jeg med mine to nyinstallerede maskiner lab1.mikjaer.com og lab2.mikjaer.com og installere lidt software på dem begge:


wget https://launchpad.net/codership-mysql/0.8/0.8.2/+download/mysql-server-wsrep-5.1.57-0.8.2-amd64.deb
wget https://code.launchpad.net/galera/0.8/0.8.2/+download/galera-0.8.2-amd64.deb

apt-get -y install libdbi-perl libdbd-mysql-perl mysql-client-5.1 libmysqlclient16 mysql-common libplrpc-perl libnet-daemon-perl vim

dpkg -i galera-0.8.2-amd64.deb mysql-server-wsrep-5.1.57-0.8.2-amd64.deb
 Derefter starter vi begge MySQL servere og laver nogle basale adgangsindstillinger før vi starter replikatoren: 
/etc/init.d/mysql start

/usr/bin/mysql_secure_installation   

mysql -pPASSWORD -e "SET wsrep_on = OFF; grant all on *.* to 'root'@'%' identified by 'PASSWORD';"

/etc/init.d/mysql stop
 Efter kommando nr 2 bliver du guidet igennem MySQL opsætningen, husk og vælg et sikkert password, brug det samme på begge maskiner og anvend samme pasword i kommando nr 3 istedet for de to steder hvor der står PASSWORD. Nu skal vi ha MySQL til at lytte på internettet efter indkomne forbindelser, rediger /etc/mysql/my.cnf og kommenter flg. linie ud (det betyder at sætte et #-mærke i starten af linie): 
bind-address           = 127.0.0.1
 Du kan evt. teste forbindelsen, du skal fra en prompt på lab1 kunne forbinde til lab2 og vica versa: 
root@lab1:~# mysql -pPASSWORD -h lab2.mikjaer.com -e "select 5+5\G"
*************************** 1. row ***************************
5+5: 10
root@lab2:~# mysql -pPASSWORD -h lab1.mikjaer.com -e "select 5+5\G"
*************************** 1. row ***************************
5+5: 10
 Som du kan se virkede det udemærket, og vi kan nu gå videre med at sætte replikering op, stop mysql på begge servere: 
root@lab1:~# /etc/init.d/mysql stop
root@lab2:~# /etc/init.d/mysql stop
 Derefter redigerer du /etc/mysql/conf.d/wsrep.cnf og sætter flg. værdier ind de rigtige steder (de er spredt lidt ned igennem filen) 
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_sst_auth=root:PASSWORD
 og på den første server(lab1), i samme fil: 
wsrep_cluster_address="gcomm://"
 og på den anden(lab2): 
wsrep_cluster_address="gcomm://192.168.0.10"
 Her er det selvfølgelig lab1's ip adresse jeg har brugt, slutteligt starter jeg begge servere igen: 
root@lab1:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld.
root@lab2:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld.
 Herefter skulle replikering gerne køre, her er testen fra mit test-setup: 
root@lab1:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
root@lab2:~# mysql -pPASSWORD -e "create database foobar;";
root@lab1:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foobar             |
| mysql              |
+--------------------+
root@lab1:~# mysql -pPASSWORD -e "create database foobar2;";
root@lab2:~# mysql -pPASSWORD -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foobar             |
| foobar2            |
| mysql              |
+--------------------+
 Et klassisk "ingen-ting-her-ingen-ting-der-scenario" ;-) Håber i kan bruge det ... og hvis i overvejer at smide det i produktion så læs lige manualen først :-)
Udgivet i Knowledge Base, Mysql | Skriv en kommentar

En håndfuld interesante tools

Her er lige et par hurtige fra sidebenet, enormt dejlige features som man sjældent vidste man manglede før man stod med dem.

Skift aktiv console på en maskine ude adgang til tastaturet, chvt står for CHAnge Virtual Terminal og det er så simpelt som at skrive: chvt 1 i f.eks. en ssh forbindelse på maskinen, hvorefter maskinens første skærm vil vise terminal 1 og chvt 7 vil vise den grafiske brugerflade.

Observer og overtag en eksisterende console session, hvis nu du ikke har sidet ved din server i mange måneder og bliver i tvivl om hvordan terminalen ser ud så skynd dig og fyr en : apt-get install conspy af på den og bagefter en conspy 1, det der mødte mig i umiddelbart det efterfølgende overblik var flg.

forbindelsen til maskinen afbrydes igen ved at trykke 3 gange hurtigt efter hinanden på ESC … det er også muligt at lave view only med parameteren “-v”.

Send taste-tryk til en igangværende X-Session
Lige i mit tilfælde handlede det om at fjernstyre en storskærm, men mulighederne er jo uendelige: apt-get install xdotool , giver os selve værktøjet mens flg. lille script:

#!/bin/sh
export DISPLAY=:0
xdotool key --clearmodifiers F11

Sender et F11 tastetryk til din grafiske terminal, jeg har haft meget glæde af muligheden for at kunne sætte vores overvågning i fuld skærm uden at skulle op og sætte keyboard til maskinen der viser resultater for vores overvågning på skærmen på væggen ?

Udgivet i Knowledge Base, Linux, Old Base | Skriv en kommentar

Syntax hilighted printouts from vim

To print from vim, first set the following options in vimrc or directly in vim:

:set printoptions=paper:A4,portrait:n,wrap:y,syntax:y,duplex:long

if landscape mode is wanted, set portrait:n, else set portrait:y

next, from vim, create a postscript file using the hardcopy command:

ha > %.ps

Now transfer the postscript file to a box with a printer, and print it out, or convert it to pdf using ps2pdf.
Udgivet i Knowledge Base, Vim | Skriv en kommentar

High Availibility med Ucarp og Debian (Hsrp/Vrp/Carp)

Singlepoint of failures er en driftsmands største mareridt, derfor er der som bekendt flere forskellige måder hvorpå man kan sikre sig mod et altødelæggende takeout. En af de bedre af dem er ved hjælp af en delt-virtuel ip, det fungere ved at to servere f.eks. .1 og .2 tilsammen deler .3 og aftaler indbyrdes hvem der skal svare for ip adressen på et givent tidspunkt.

I Debian er det endda ret nemt at sætte op, i dette eksempel bruger jeg flg. antagelser:

gluster1 : 10.0.0.10
gluster2 : 10.0.0.11
gluster : 10.0.0.13

Både gluster1 og gluster2 er nyinstallerede debian maskiner, ucarp installeret:

root@gluster1:~# apt-get install ucarp
root@gluster2:~# apt-get install ucarp

og /etc/network/interfaces skal se således ud, med den eneste forskel at ip adressen skal rettes i linie 11:

o This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 10.0.0.10
        netmask 255.0.0.0
        gateway 10.0.0.1
        dns-nameservers 8.8.8.8

        ucarp-vid 3
        ucarp-vip 10.0.0.13
        ucarp-password foobar1982
        ucarp-advskew 0
        ucarp-advbase 1
        ucarp-master yes
        iface eth0:ucarp inet static
        address 10.0.0.13
        netmask 255.255.255.255

Genstart begge maskiner, og kør en ifconfig. Master-maskinen, og dermed den som pt. svarer på requests, er den som har flg. entry:

eth0:ucarp Link encap:Ethernet  HWaddr 7e:be:c6:4b:fb:4e
          inet addr:10.0.0.13  Bcast:10.255.255.255  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:8

Start nu en ping til 10.0.0.13 og riv netkablet ud af den maskine, det skulle nu gerne se lidt ala det her:

Mikkels-MacBook-Pro:~ mike$ ping 10.0.0.13
PING 10.0.0.13 (10.0.0.13): 56 data bytes
64 bytes from 10.0.0.13: icmp_seq=0 ttl=56 time=18.906 ms
64 bytes from 10.0.0.13: icmp_seq=1 ttl=56 time=21.460 ms
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
64 bytes from 10.0.0.13: icmp_seq=4 ttl=56 time=18.851 ms
64 bytes from 10.0.0.13: icmp_seq=5 ttl=56 time=20.590 ms
64 bytes from 10.0.0.13: icmp_seq=6 ttl=56 time=19.179 ms
^C
--- 10.0.0.13 ping statistics ---
8 packets transmitted, 5 packets received, 37.5% packet loss
round-trip min/avg/max/stddev = 18.851/19.797/21.460/1.045 ms

Og hvis du følger det op med at lave en ifconfig på den anden maskine vil du se at den nu er blevet master 🙂

Nu mangler du bare at installere din foretrukne service på begge maskiner 🙂

Udgivet i Knowledge Base, Linux, Networking, Old Base | Skriv en kommentar

Layer2 bridge over ssh

De fleste bredbåndsudbydere har en eller anden ide om at “almindelige forbrugere” aldrig nogensinde kan have brug for mere end én ip adresse, hvis det er rigtigt slemt kan de lige anstrenge sig til at give dig 5 … men aldrig uden bøvl.

Derudover er 5 ip adresser da ved gud heller ikke særlig meget, jeg mener, hvis du skal emulere bare et mellemstort hosting-setup så løber du tør for ip adresser langt hurtigere end det.

Set i lyset af det, og så det at vi på vores nye kontor i Århus kun har en 111/11 mbit linie fra Stofa med én fast ip adresse på, så besluttede jeg mig at bruge lidt tid på at finde en elegant løsning på det problem, og jeg syntes selv det gik ret godt.

Jeg har købt en server hos Hetzner, nu havde vi i forvejen behov for en server men hvis ikke du har det kan du nøjes med at købe den mindste de har, de starter ved 19€/mdr dertil kommer 37 € for yderligere 32 IP-Adresser, eller dvs. det er ifølge prislisten, i realiteten er jeg aldrig blevet faktureret ekstra for IP-Adresser, jeg ved ikke om det er en fejl eller om det er politik ved gode kunder,men jeg har ihvertfald ikke tænkt mig at spørge dem, man kunne jo risikere det var en fejl ?

IP Adresserne får du tildelt i ranges og de bliver routed ind, i modsætning til mange andre steder hvor udbyderen enten har ét stort netværks segment eller laver routingen for dig. Jeg fik rangen 78.46.137.32/27, hvilket betyder at jeg har ip adresserne 78.46.137.32 – 78.46.137.63 tilrådighed, og så får man selvfølgelig også en fin whois med eget navn og adresse i, samt mulighed for at skrive en note om f.eks. abuse:

inetnum:         78.46.137.32 - 78.46.137.63
netname:         MIKJAER-APS
descr:           www.mikjaer.com
country:         DE
admin-c:         MC18471-RIPE
tech-c:          MC18471-RIPE
status:          ASSIGNED PA
remarks:         For abuse and security related questions please 
                 contact abuse@mikjaer.com
mnt-by:          HOS-GUN
source:          RIPE # Filtered
 
person:          Mikkel Christensen
address:         Mikjaer Aps
address:         Vesterbrogade 74, 3sal
address:         1620 Koebenhavn V
address:         DENMARK
phone:           +4544401337
nic-hdl:         MC18471-RIPE
mnt-by:          HOS-GUN
source:          RIPE # Filtered

I den modsatte ende har jeg et netværk, med en router leveret af min udbyder som jeg ikke kan (vil) pille ved eller skifte ud, derfor har jeg valgt at jeg vil lave en Layer 2 bridge til mine ip-adresser, det gør jeg ved at tage en Linux maskine som sider på mit netværk og lave en tunnel til min maskine hos Hetzner, og eksponere min range overfor min bridge.

Først scriptet, og så gennemgår jeg det bagefter:

#!/bin/sh
echo Setting up interfaces
brctl addbr br0
brctl addif br0 eth0
ifconfig eth0 up
ifconfig br0 up
ifconfig br0 10.0.1.38/24 up
ifconfig br0:0 78.46.137.35/27 up
ip route add 85.10.210.229 via 10.0.1.1 dev br0
echo Waiting 10 seconds for bridge to settle
 
ping -c 4 85.10.210.229 > /dev/null
sleep 2
ping -c 4 85.10.210.229 > /dev/null
sleep 2
 
echo Tunneling to offshore
ssh -o Tunnel=ethernet -f -w 0:0 85.10.210.229 true
ifconfig tap0 up
brctl addif br0 tap0
sleep 3
echo Setting up routing
ssh 85.10.210.229 ifconfig tap0 78.46.137.34/27 up
route add default gw 78.46.137.34

Scriptet forudsætter at der er installeret SSH-Keys således at ssh kan etablere forbindelse uden at du skal taste din kode hver gang.

Linie 2 og 3 opretter bridge interfacet “br0” , du kan i princippet kalde det hvad du vil, men typisk kalder man det br0, bridge0 el. lign. Derefter (linie 5-8) upper vi vores interfaces og sætter ip adresser op på dem.

Som du kan se i linie 7 hedder mit lokalnet 10.0.1.1/24 og den ip adresse jeg har valgt til mit endpoint på kontoret hedder 78.46.137.35 og både interfaces og ip adresser skal helst være på plads før vores bridge etableres.

I linie 9 opsætter jeg en route til en enkelt ip adresse, nemlig ip adressen på vores server hos Hetzner, bemærk servere ligger helt uden for vores egen range. På den her måde kan vores lokale maskine nu kommunikere med vores server hos Hetzner, men også kún den. (hvilket inkluderer DNS, hvorfor vi netop bruger IP Adresser istedet for hostnames i scriptet).

Installer bridge-utils og kør scriptet:

# apt-get install bridge-utils

Broen skal nu have lidt tid til at finde til rette, jeg har ikke fundet nogen fornuftig forklaring på dette, ligesom jeg heller ikke kan svare på hvorfor mit workaround virker, men det virker ?

Så derfor i linie 10-16 holder vi brugeren lidt for nar mens vi pinger lidt og “sover” lidt, resultatet er at forbindelsen kommer op og bliver klar til linie 18 hvor vi opsætter selve Layer 2 tunellen til serveren.

Den kommando opretter automatisk et interface på hver maskine ved navn hhv. tap0 og tap0 (-w 0:0), i linie 19 up’er jeg interfacet og i linie 20 tilføjer jeg det til min bridge således at den nu “hænger sammen med” mit lan.

I linie 23 logger jeg på serveren i den anden ende igen, og opsætter tap0 interfacet på denne og til sidst afslutter jeg med at sætte default gateway … til maskinen i den anden ende. Efter et par sekunder burde du nu kunne pinge igennem vores fine nye “bro”, test evt. ved at pinge den ip der hos dig svarer til 78.46.137.35 fra en maskine ude på internettet eller evt. fra din telefon, næste skridt er at sætte det op til test på en af de maskiner i mit lab. som har behov for offentlige ip’er til test, og det blærede ved netop den her opsætning er at jeg nu kan sætte maskinerne op _fuldstændig_ som sad de direkte på de offentlige ip’er net.

# ifconfig eth0 78.46.137.45/27
# route add default gw 78.46.137.34

Og nu hvor broen er i luften kan jeg benytte samme fremgangsmåde til at få offentlige ip adresser på samtlige maskiner i kontoret / test lab.’et.

Hvis du gerne vil starte scriptet automatisk når maskinen booter så kald det fra /etc/rc.local … jeg orker ikke at skrive et initscript iaften, klokken er halv fire ?

Udgivet i Knowledge Base, Networking, Old Base | Skriv en kommentar

Simpel overvågning af switch med MRTG

MRTG er et genialt værktøj der kan lave pæne grafer over “ting”, som regel er de ting trafik-grafer, men det kan også være varme, strømforbrug eller andre kvantitive ting. I det her indlæg kobler jeg MRTG op imod en af mine switche og gemmer rapporten på en webserver hvor den er nem at tilgå.

root@lab1:~# apt-get install apache2 mrtg

Svar “Yes” til at køre med mrtg.cfg ejet af root, og giv den nogen sekunder til at blive færdig.

root@lab1:~# mkdir /var/www/mrtg
root@lab1:~# mkdir /var/www/mrtg/switch1

Switchen har IP Adressen 10.0.0.3 og vi har sat SNMP Community name til “public” så laver vi en basal configfil således:

root@lab1:~# cfgmaker public@10.0.0.3 > /etc/mrtg-switch1.cfg

Rediger i /etc/mrtg-switch1.cfg og ret:

#  for Debian
WorkDir: /var/www/mrtg

til:

#  for Debian
WorkDir: /var/www/mrtg/switch1

Herefter skal mrtg køres et par gange, de første par gange får du advarsler, dette er normalt og stopper efter 2. eller 3. gennemkørsel:

root@lab1:~# env LANG=C /usr/bin/mrtg /etc/mrtg-switch1.cfg

og rund så af med at oprette en index.html fil:

root@lab1:~# indexmaker /etc/mrtg-switch1.cfg > /var/www/mrtg/switch1/index.html

Opret herefter et cronjob der kører hvert 5 minut og opdaterer din mrtg:

root@lab1:~# crontab -e

crontab:

# m h  dom mon dow   command
*/5 * * * *     env LANG=C /usr/bin/mrtg /etc/mrtg-switch1.cfg

Afslut, gem og gå ud og lav kaffe 🙂

Efter 5-10 min skulle du gerne kunne se de første par bider af grafen, efter en dags tid burde det se sådan her ud:

Typisk vil man give den en kærlig overhaling i en HTML Editor og så kan det f.eks. se sådan her ud:

Og i modsætning til standard opsætningen kan du opsætte flere MRTG-sessioner ved siden af hinanden. Jeg plejer at have en session pr. switch og/eller pr. lokation.
Copyright

Udgivet i Knowledge Base, Linux, Networking, Old Base | Skriv en kommentar

4 hurtige, Webdruid, Logstalgia, Asql og Ip2host

Vi bevæger os mod inden med hastig skridt, og min liste med værktøjer, tips og tricks til Apache er stadig meter-lang, derfor får i idag som hjemmeopgave selv at fordybe jer i disse 4 værktøjer, som … ja ihvertfald de af dem, nok skal blive nyttige:

Webdruid

WebAlizer har fået en storebror, den her kan lave flotte diagrammer over dine besøgendes færd på din side:

Logstalgia
… er måske et af de mindre seriøse værktøjer, ikke destomindre meget imponerende at have kørende på en skærm på kontoret eller lign 🙂

Det kræver et 3D kort … så du skal nok ikke regne med at din server kan køre det native 🙂

Asql

Den understøtter flere logfiler samtidig … hvilket er smart på produktionsmaskiner med mange kunder:

root@lab1:~# asql
asql v1.5 - type 'help' for help.
asql> load /var/log/apache2/access.log 
Loading: /var/log/apache2/access.log
asql> select count(*) from logs where source="212.27.30.183";
137

Og det er bare ét eksempel … Du kan lave relativt komplekse sql queries, så du kan gennemsøge dine logfiler på kryds og tværs 🙂

Ip2Host

Har du tit ærget dig over at der ikke stod hostnames i dine logfier? Det har ihvertfald tit kunnet gøre livet surt for mig at holde rede i en masse numre istedet for en række navne, det var indtil jeg faldt over ip2host:

root@lab1:~# ip2host < /var/log/apache2/access.log > resultat.log

Nu er resultat.log en tro kopi af access.log, bortset fra at alle ip adresser er ændret til hostname 🙂

Der var ikke så meget kød på idag … tilgengæld fik jeg smidt en masse tools “out there” … håber det kan bruges ?

Udgivet i Apache, Knowledge Base, Linux, Old Base | Skriv en kommentar

Flere webservere på 1 ip med mod_proxy

Hvis du nu kun har én offentlig ip men flere forskellige webservere du gerne vil have eksponeret så kan det godt blive svært, men der kommer mod_proxy heldigvis ind i billedet, det er også metoden du bruger hvis du f.eks. vil have en WordPress på domæne.dk/blog og dit Jsp basserede CRM system på domæne.dk/compiere.

Du skal sørge for at mod_proxy er aktiveret:

root@specialhosting:~# a2enmod proxy
Enabling module proxy.
Run '/etc/init.d/apache2 restart' to activate new configuration!
root@specialhosting:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
root@specialhosting:~# a2enmod proxy_http
Considering dependency proxy for proxy_http:
Module proxy already enabled
Enabling module proxy_http.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Derefter sætter jeg mine proxy-url’s op i din virtual-host config:

<Virtualhost *:80>
        ...
        ProxyPass /server1 http://10.0.0.2/
        ProxyPassReverse /server1 http://10.0.0.2/

        ProxyPass /server2 http://10.0.0.3/
        ProxyPassReverse /server2 http://10.0.0.3/
        ...
</Virtualhost>

Nu vil alle forspørgsler til /server2 og /server1 blive omskrevet og videresendt til de interne servere på ip adresserne 10.0.0.2 og 10.0.0.3, selvfølgelig uden at slutbrugeren ude på internettet bemærker noget 🙂

Dette kan evt. med success bruges som ekstra lag af sikkerhed ovenpå IIS maskiner, således at websitet kun er tilgængelig igennem proxyen, og Windows maskinen på indersiden ikke har adgang til Internettet.

Udgivet i Apache, Knowledge Base, Linux, Old Base, Uncategorized | Skriv en kommentar

WordPress Cluster (Linux, Apache, Mysql, PHP, mysql-proxy)

Et cluster er en klump af maskiner der samarbejder om en bestemt opgave, dvs. vores CDN var faktisk en slags cluster, nu vil jeg tage den skridtet videre og lave vores CDN om til et reelt cluster der kører en WordPress installation.

I forhold til CDN’et nuværende opsætning mangler vi support for PHP og en Mysql database før vi kan køre WordPress på clusteret. Jeg vil starte med at sætte mysql op på begge maskiner, og bagefter sætte master-slave replikation op.

Derefter vil jeg bruge mysql-proxy til at opdele læse/skrive queries og slutteligt vil jeg installere php og WordPress. Jeg vælger at lab1 skal være min master og lab2 skal være min slave.

Først mysql: (udføres på begge maskiner)

root@lab1:~# apt-get install mysql-server
root@lab2:~# apt-get install mysql-server

Du bliver bedt tildele et root-password til MySQL databaserne, hvorefter resten af installationen skulle køre af sig selv. Herefter opsætter jeg lab1 og lab2 ved at redigere /etc/mysql/my.cnf:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
#

rettes til:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0
#

Hermed tillader vi MySQL at kommunikere via nettet, dvs indgående forbindelser til mysql-serveren er nu mulige, og på lab1 (kun lab1 … lab2 fortsætter vi med om lidt) fortsætter vi lidt længere nede i filen:

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name

rettes til:

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = wordpress
#binlog_ignore_db       = include_database_name

Hver node i clusteret skal have et unikt server id, masteren hedder 1 (det er dog ikke et krav … masteren kan have et hvilket som helst nummer) og vi vælger at databasen “wordpress” skal replikeres.

Genstart nu mysql

root@lab1:~# /etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.

Derefter oprettet vi vores database og tilføjer replikation-privilegier:

root@lab1:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Intet af det ovenstående burde være svært på nuværende tidspunkt … vi opretter databasen, tillader replikation og flush’er privilegier. Du bør (selvfølgelig) vælge fornuftige password og sætte et hostname på din grant hvis du laver et offentligt produktionsmiljø.

Nu tager vi fat i lab2 og laver den modsatte øvelse, red følgende i /etc/mysql/my.cnf:

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                        = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name

Til:

server-id               = 2
#log_bin                        = /var/log/mysql/mysql-bin.log
#expire_logs_days       = 10
#max_binlog_size         = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name

master_host=109.202.159.61
master_user=slave
master_password=slavepass
master_connect_retry=60
replicate_do_db=wordpress

Og opret databasen:

root@lab2:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

Genstart MySQL:

root@lab2:~# /etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.

Til sidst logger vi ind på mysql-consolen på lab2 og sætter det hele igang:

root@lab2:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CHANGE MASTER TO MASTER_HOST='lab1.mikjaer.com', MASTER_PORT=3307, MASTER_USER='slave', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0;
Query OK, 0 rows affected (0.56 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

Hvis du vil tjekke at det virker kan du evt. prøve og fyre hhv. “show master status” og “show slave status” af, imellemtiden vil jeg teste at det virker:

Først “ingenting her”:

root@lab2:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use wordpress;
Database changed
mysql> show tables;
Empty set (0.00 sec)

Ingen ting der:

root@lab1:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.1.61-0+squeeze1-log (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use wordpress;
Database changed
mysql> show tables;
Empty set (0.00 sec)

Så opretter vi en sød lille tabel på lab1:

mysql> create table test (foo INT,bar INT);
Query OK, 0 rows affected (0.11 sec)

mysql> show tables;
+---------------------+
| Tables_in_wordpress |
+---------------------+
| test                |
+---------------------+
1 row in set (0.00 sec)

Og nu på lab2, viola:

root@lab2:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.1.61-0+squeeze1 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------+
| Tables_in_wordpress |
+---------------------+
| test                |
+---------------------+
1 row in set (0.00 sec)

Tada 😀 – Det virker, hvis ikke det gør er her et par nyttige queries til fejlfinding:

show slave status \G
show master status \G
SHOW VARIABLES LIKE 'server_id';

Næste skridt på listen er MySQL Proxy, opsætningen af denne foregår på samme måde på begge maskiner:

root@labX:~# apt-get install mysql-proxy

 

Udgivet i Apache, Knowledge Base, Linux, Networking, Old Base | Skriv en kommentar