MySQL slave maken of repareren met innobackupex

Door Heli0s op woensdag 29 juni 2016 17:45 - Reacties (3)
Categorie: -, Views: 750

Het is enige tijd geleden dat ik wat gepost heb, maar het was wat druk in huize heli0s. Tussen werk school en een tweeling had ik niet veel tijd meer over. Maar nu de 'vakantie' is begonnen heb ik wat meer tijd. In de hoop dat ik iemand kan helpen hierbij een post over mysql slaves.

Op de zaak draaien wij Percona, maar op MySQL werkt het ook, met een slave database. Voorheen starten wij een slave met mysqldump, maar dat locked de database. Als dus de slave kapot gaat, moet je wachten tot buiten kantoor uren om de slave te repareren. Dat is natuurlijk niet alleen vervelend, maar je zult altijd zien dat dan net je master ook de geest geeft.

Met Perconna innobackupex kan je een hot-backup maken van je database. Innobackupex is een Perl wrapper om xtrabackup en is afgeleid van innobackup van Oracle.

Op de Master
Draai op de master innobackupex om een backup te maken van de master. Dit kan gewoon overdag omdat innobackupex de database niet locked.

code:
1
TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 /path/to/backupdir


Na het maken van een backup moet het query log wat gemaakt word tijdens backup 'afgespeeld' worden over de backup:

code:
1
TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /path/to/backupdir/$TIMESTAMP/


rsync nu de backup naar de slave server.

Op de Slave
Stop mysql: /etc/init.d/mysql stop

Verplaats /var/lib/mysql naar /var/lib/mysql_old/

Verplaats of kopieer de backup naar /var/lib/mysql/

zet de rechten goed op de mysql dir:

code:
1
chown -R mysql:mysql /var/lib/mysql


start mysql weer

zet de slave settings nu goed, master_log_file en master_log_position staan in de xtrabackup_binlog_info file in de backup dir

code:
1
2
3
4
5
6
CHANGE MASTER TO
     MASTER_HOST='$master_ip',                  
     MASTER_USER='$repl_user',
     MASTER_PASSWORD='$password',            
     MASTER_LOG_FILE='mysql-bin.001345',                  
     MASTER_LOG_POS=455974220;


mocht je het password van de slave user niet meer weten kan je deze goed zetten op de master met:

code:
1
GRANT REPLICATION SLAVE ON *.*  TO '$repl_user'@'1$slave_ip' IDENTIFIED BY '$password';


start nu de slave met: START SLAVE;
je kan dan met SHOW SLAVE STATUS\G; controleren of de slave draait:

code:
1
2
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


als deze alletwee op Yes staan dan is alles ok en heb je een werkende slave.

Configuration Managment met Ansible

Door Heli0s op vrijdag 27 februari 2015 07:43 - Reacties (5)
Categorie: -, Views: 2.923

De eerste keer dat ik Ansible gebruikte, was om een update te doen aan onze servers waar nog geen Puppet draait. Ik vind het altijd verschrikkelijk als ik iets meer dan 2 keer moet doen en probeer het dan onmiddellijk te automatiseren. Het werkte erg simpel en het was de investering van tijd meer dan waard.
Wat is Ansible?
Volgens Ansible zelf: "Ansible is the simplest way to automate.". Ansible is software om de configuratie van een Server (Of client) te beheren. Het voordeel van dit soort software is dat je alles vanaf een plek kan beheren. Dit zorgt er voor dat je makkelijker, sneller en met minder fouten meer server kan beheren.
Er is een hele Waslijst aan verschillende pakketten om uit te kiezen, dus waarom Ansible?

Voor mij is het aller grootse voordeel van Ansible dat het zonder client werkt. Dit doet Ansible door gebruik te maken van OpenSSH en een aantal standaard tools. De enige vereiste voor de client is Python 2.4 of later en als je een Python versie eerder dan 2.5 draait heb je python-simplejson nodig. Heb je dit en kan je naar de machine ssh'en dan kan je met Ansible werken.

Ansible zelf adviseert om het via je package managment te installeren (Op de machine vanaf waar je wilt beheeren) of via pip.
Maar hoe werkt het dan?
Als je Ansible hebt geinstallerd op je beheer machine kan je testen of het werk met:


code:
1
ansible server_naam -m ping -u root



Als je op deze machine geen ssh-key hebt, moet je de optie --ask-pass mee geven. Mocht je voor een commando sudo rechten nodig hebben moet je de optie --ask-sudo-pass mee geven. Als alles goed is zou je de volgende response terug moeten krijgen:


code:
1
2
3
4
server_naam | success >> {
    "changed": false,
    "ping": "pong"
}



Top, het werk! Alleen moet ik nu nogsteeds elke server apart een commando geven, dat is nog steeds een hoop hand werk. Om dit op te lossen heeft Ansible een hosts file. Deze word geschreven in een INI formaat:


code:
1
2
3
4
5
[servers]
192.168.0.1
192.168.0.3
server1
server2



Dit is dus een lijst met een kopje voor de groeps naam, en dan een lijst met DNS namen of IP adressen. Je kan nu door de file mee te geven het commando op een groep of op alle servers uit de lijst:


code:
1
2
3
4
5
# Alle hosts:
ansible all -m ping -u root -i hosts_file_naam

# Een groep:
ansible groep_naam -m ping -u root -i hosts_file_naam

Playbooks
De echte kracht van Ansible zit hem in wat ze Playbooks noemen. Een playbook is een YAML config file die beschrijft wat er moet gebeuren. Playbooks worden stap voor stap uitgevoerd en kunnen dus een workflow uit voeren. Denk bijvoorbeeld aan het volgende:
  • zet server in maintenence mode
  • haal de server uit de load balancer
  • doe een software update
  • draai de tests
  • zet de server terug in de load balancer
  • haal de server weer uit maintenece mode
Door de structuur van een playbook is als volgt:


YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
# Welke hosts
- hosts: all
  # Als welke user moet ik inloggen
  remote_user: root
  # Moet ik sudo gebruiken
  sudo: yes
  #Welke taak moet ik uitvoeren
  tasks:
    - name: Test connection
      ping:
    - name: Setup key
      authorized_key: user=root
                      key="{{ lookup('file', '/home/heli0s/.ssh/id_rsa.pub') }}"



In dit geval doe ik de eerder gedraaide ping test en maak ik gebruik van de ingebouwde system module om mijn ssh key toe te voegen aan de authorized_key file van de user root. Deze module controleert ook of de key al in de file staat. Dit brengt mij bij het volgende punt.
Idempotentie
Idempotentie betekend volgens wikipedia:
Idempotentie is de eigenschap van een object (of systeem) en/of een operatie daarop dat het object niet meer verandert als de operatie nogmaals wordt uitgevoerd.
Of als ik mijn Playbook een 2de keer uitvoer zouden er geen wijzigingen moeten plaats vinden op de machine. Als je er voor zorgt dat je playbooks idempotent zijn kan je bijvoorbeeld elke 30 minuten een run doen en er zo voor zorgen dat je servers geen configuration drift vertonen. Een ander voordeel is dat je (net als alle andere Configuration Managment pakketen) je config in een version managment pakket kan bij houden.

Zoals je ziet, is Ansible een mooie tool. Voor mij is het vooral handig dat ik op afstand een commando kan uitvoeren zonder al te veel instellingen. Ansible heeft ook een aantal modules die het leven makkelijk kunnen maken. Een playbook is ook snel gemaakt om wat complexere taken uit te voeren op meerdere servers.
Links

SSH proxy met FireFox

Door Heli0s op woensdag 3 december 2014 07:42 - Reacties (4)
Categorie: -, Views: 2.955

Onlangs moets ik een IP adres van de http://www.sorbs.net/ spam lijst af halen. Het probleem waar ik tegen aan liep was dat je dit alleen zelf kon doen als je de website benaderd vanaf het te delisten ip. Gelukkig is dit super simpel te regelen (Vooral als je op een OSx of Linux machine werkt, maar het kan ook met Putty).

De SSH connectie


code:
1
ssh -NCD 5000 user@remotehost



De gebruikte opties hier zijn:

-N voer geen commando uit op de remote host. Omdat we toch alleen willen tunnelen hebben we geen shell access nodig. Het lijkt hier door wel alsof je ssh commando 'hangt' maar dat is noormal, met ctrl+c kan je de verbinding weer verbreken.

-C Gebruik compressie voor de sessie, dit is wel aan te raden anders is het rete traag.

-D gebruik "dynamic" port forwarding. Dit zorgt er voor dat als de site van http (poort 80) naar https (poor 443) je niet je verbinding kwijt raakt. Je kan namelijk ook een enkele poort forwarden met de -L optie.

De Firefox Settings
In Firefox ga je naar settings -> advanced -> network -> settings. Vervolgens vul je bij SOCKS Host in 'localhost' en bij de poort 5000. Laat de rest op de standaard waarde staan.

Optioneel kan je in een nieuw tab blad about:config invoeren en network.proxy.socks_remote_dns op true zetten zodat je ook de DNS op de remote host af handeld.

Dat is alles wat nodig is om een ssh tunnel als proxy te gebruiken. Je zou dit ook kunnen gebruiken om een encrypted connectie op te zetten als je in een hotel zit. Let wel op dat het verkeer alleen encrypted is tot de ssh host, vanaf daar is het gewoon web verkeer (tenzij je een site via https bezoekt natuurlijk :) )

Inbox en Python

Door Heli0s op dinsdag 8 juli 2014 18:00 - Reacties (4)
Categorie: -, Views: 3.597


code:
1
2
3
DISCLAIMER: in deze handleiding word uitgelegd hoe je inbox-sync installeert. 
Omdat hier verder geen beveiliging op zit kan theoretisch iedereen bij je 
mail, je bent gewaarschuwd!



Gister stond er een stukje op de frontpage over een nieuwe mail api die het mogelijk maakt om je Gmail te benaderen via een simple Rest API. Omdat ik al lang met het idee loop om een email client te maken (Omdat het kan en je er van kan leren) ben ik eens gaan kijken hoe het in elkaar steekt.

Op het moment van schrijven is er nog geen live omgeving om mee te werken, en is de enige optie om hier mee te spelen door een Vagrant test machine te maken. De uitleg op de site van Inbox is erg duidelijk, maar voor de compleetheid zet ik hem hier ook even neer:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
For development, we recommend installing it on a VirtualBox or VMWare Fusion 
virtual machine and running it with Vagrant:

1: Install VirtualBox

2: Install Vagrant

3: git clone git@github.com:inboxapp/inbox.git

4: cd inbox

5: vagrant up

6: vagrant ssh

At this point you should be SSH’d into a shiny new Ubuntu 12.04 VM.

7: cd /vagrant

The inbox directory you started with should be synced to /vagrant. If this 
directory is empty, then logout and run vagrant reload and vagrant 
ssh again.

At this point the Inbox Sync Engine is installed and ready to process mail! 
The next steps are to start the processes that come with the open-source 
toolkit and authenticate a mail account.



Voor mensen die met Vagrant werken is dit denk ik wel duidelijk. Ik moest zelf eerst nog een vagrant reprovision doen om het allemaal werkent te krijgen, maar dat kwam waarschijnlijk door wat netwerk hickups.

Als je nu een werkende Vagrant omgeving hebt, kun je verder om de Inbox sync aan het werkt te krijgen. Hiervoor moet je met ssh in je Vagrant machine inloggen, en naar de /vagrant directory gaan. Hier moet je een aantal commando's uitvoeren:

Start de sync service, dit kan je het besten doen vanuit een screen sessie of in een aparte shell, omdat deze open blijft :

code:
1
$ bin/inbox-start



Nu kan je je email account toegang geven:


code:
1
2
3
$ bin/inbox-auth [YOUR_ACCOUNT]@gmail.com

$ bin/inbox-sync start [YOUR_ACCOUNT]@gmail.com



inbox-auth loopt je door het toegang geven van je account en inbox-sync start (zoals de naam al zegt) start de sync. Dit syncen kan, afhankelijk van de hoeveelheid mail in je gmail account, de eerste keer erg lang duren!

Als laatste moet je de api starten:


code:
1
$ bin/inbox-api



Nu kan je vanaf je host machine testen of het werkt met


code:
1
$ curl http://localhost:5555/n/



Als dit werk, heb je met succes de Inbox-sync test omgeving opgezet en kunnen we aan het echte werk beginnen!

Als eerst hebben we het namespace_id nodig, deze heb je al even gezien toen we de test deden. Het is naamelijk het id veld uit de JSON reply de we kregen van de test omgeving:


code:
1
2
3
4
5
6
7
8
{
    "id": "awa6ltos76vz5hvphkp8k17nt",
    "object": "namespace",
    "namespace": "awa6ltos76vz5hvphkp8k17nt",
    "account": "c5zc216uat483slypx67mu8i3",
    "email_adddress": "ben.bitdiddle@gmail.com",
    "provider": "Gmail",
}



je can deze ook achterhalen door http://localhost:5555/n/ in je browser op te vragen. Voor alle rest calls heb je dit basis url verder nodig. Bijvoorbeeld het opvragen van je labels:


code:
1
http://localhost:5555/n/<namespace_id>/tags



Het is nu erg makkelijk om informatie op te vragen via je browser, en de api documentatie is over het algemeen erg duidelijk. Het enige waar ik tegen aan liep, is het versturen van mail. Ik heb hiervoor een klein voorbeeld scriptje in python geschreven:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import json

url = "http://localhost:5555/n/3clbum5iozyjjl5s63ardrkv4/send"
headers = {'Content-Type': 'application/json'}


payload = {
    "to": [{"name": "Test", "email": "test@gmail.com"}],
    "body" : "Testing 1, 2, 3",
}

r = requests.post(url, data=json.dumps(payload), headers=headers)



Belangrijk hierbij is dat je de headers mee stuurt en dat je echt een json object aan levert. Vergeet ook niet de requests module te installeren.

Meer informatie vind je in de API documentatie

Ubuntu en KVM

Door Heli0s op woensdag 5 maart 2014 14:35 - Reacties (8)
Categorie: -, Views: 3.465

Ik herinstaller mijn pc meerdere keeren per maand. Ik probeer graag niewue Linux distros, maar ik heb ook regelmatig dat ik mijn install vernaggel met het uitproberen van software. Omdat mijn vrouw nog wel eens op precies dat moment wat van mijn pc nodig heeft, moest ik opzoek naar een oplossing.
Enter KVM
KVM of Kernel-based Virtual Machine is een zogenamde type-2 Hyper Visor. Dit betekend dat hij daait op het OS (Een type 1 zoals Citrix XenServer, VMware ESX/ESXi en Microsoft Hyper-V draait op 'bare-metal') zoals plaatje aangeeft:

Lees verder »