MySQL Master <-> Master Replikation aufsetzen

MySQL kann keine Master <-> Master Replikation. Wir machen das trotzdem mal mit Ubuntu 12.04 und MySQL 5.5 und hoffen, dass es funktioniert und wir in keine Split Brain Situation laufen. Wir sprechen der Einfachheit halber von db1 und db2 als unterschiedliche MySQL Server Instanzen.

Wir legen auf db1 einen Benutzer mit Replikationsrechten an

GRANT REPLICATION SLAVE , REPLICATION CLIENT ON * . * TO 'repuser'@'%' IDENTIFIED BY 'superpassword'; 

Jetzt passen wir die beiden MySQL Konfigurationen an. log_bin muss auf beiden natürlich aktiviert sein.

my.cnf auf db1:

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
auto-increment-increment = 2
auto-increment-offset = 2

my.cnf auf db2:

server-id               = 2
log_bin                 = /var/log/mysql/mysql-bin.log
auto-increment-increment = 1
auto-increment-offset = 2

Diese auto-increment Optionen dienen dazu, dass es keine Probleme bei Primärschlüsseln, die automatisch hochgezählt werden, gibt.

Jetzt sind wir Faul. Wir stoppen MySQL auf db1 und db2.

$ service mysql stop

Dann löschen oder verschieben wir das MySQL Datadir auf db2. Default liegt das in /var/lib/.

Dann auf db1 als root:

$ rsync -avh --progress --stats /var/lib/mysql db2:/var/lib/

Fein, damit haben jetzt beide Instanzen den gleichen Datenbestand. Da wir als root kopiert haben sollten die Dateirechte stimmen.
Nun starten wir beide Instanzen

$ service mysql start

Wir connecten uns via mysql auf db1 und db2 und schauen mit

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
            File: mysql-bin.000003
        Position: 107
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

an welcher Stelle sich db1 und db2 befinden und merken uns das. Es sollte zu der Zeit niemand anderes auf db1 und db2 arbeiten. Dann gehen wir via mysql auf db1 und tippen folgendes ein

CHANGE MASTER TO MASTER_HOST='db2', MASTER_USER='repuser', MASTER_PASSWORD='superpassword', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

bei den Daten MASTER_LOG_FILE und MASTER_LOG_POS geben wir die Daten ein, die wir vorher bei db2 ausgelesen haben.

Dann sind wir mutig und machen ein

mysql> start slave;

mit

mysql> show slave status\G

schauen wir ob die Replikation läuft. Da sollte dann

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

auftauchen. Nun gehen wir via mysql auf db2 und machen dort das gleiche

CHANGE MASTER TO MASTER_HOST='db1', MASTER_USER='repuser', MASTER_PASSWORD='superpassword', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

MASTER_LOG_FILE und MASTER_LOG_POS ist der „SHOW MASTER STATUS\G“ von db1.

dann starten wir auch dort den slave mit

mysql> start slave;

und schauen mit

mysql> show slave status\G

ob die Slave Prozesse laufen

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Fertig, jetzt testen wir ein bisschen und legen auf beiden MySQL Instanzen Datenbanken und Benutzer und und schauen ob diese repliziert werden.

Bemerkungen:
So geht das theoretisch. Auf Sicherheit wurde kein Wert gelegt, da geht eh jeder einen anderen Weg. Slave_IO_Running, Slave_SQL_Running und Seconds_Behind_Master sollte muss man mit Nagios & Co überwachen. Geschrieben werden sollte immer nur auf eine MySQL Instanz, nicht auf die Idee kommen mit mysql-proxy oder so was ein write scale out umsetzen zu wollen.  Man kann eine Instanz auf read only setzen so verhindert man ungewollte Manipulation auf dem „Slave“. Der Replikationsuser und root dürfen aber schreiben, sollte man im Hinterkopf behalten.  Davor am besten noch pacemaker packen, so das im Notfall problemlos auf den „Slave“ geschwenkt werden kann. Ist man sich sicher was man da tut kann man auch das read only weg lassen. Sollten die Datenbanken irgendwie Inkonsitent werden ist das der Replikation egal solange kein Replikationsfehler geworfen wird.

Mir ist bekannt das es andere und bessere Lösungen gibt, ich wollt es nur mal aufgeschrieben haben.

Notizen via Jabber online posten

Ich hoffe es gibt bessere Lösungen, aber ich erzähle mal meine beiden.
Ich brauche eine einfache Möglichkeit Notizen via jabber (xmpp) zu posten. Diese sollen über eine Webseite angezeigt werden und durchsuchbar sein.
Jabber deshalb, weil es in der Regel häufig läuft wenn ich am Rechner sitze. Ich möchte nicht extra eine Seite öffnen um mir etwas zu notieren. Die meisten Notizen sind den Aufwand nicht wert.
Dazu nutze ich schon seit langer Zeit laconica/status.net unter mexdc.exdc.net. Funktioniert wunderbar, da gibt es einen netten Jabberbot der postet einfach alles was ich ihm schreibe. Auf Wunsch kann man sich auch anderen status.net Nutzern mitteilen.
Im Laufe der Zeit ist diese Notiz Funktion immer wichtiger für mich geworden, vernetzen via identi.ca, twitter&co dabei immer nebensächlicher. Natürlich kann man sich eine dedizierte status.net Instanz für diese Funktion aufsetzen. Habe ich auch gemacht, aus diversen Gründen bin ich aber unzufrieden damit. Einer der Hauptgründe ist, dass die aktuelle status.net Software (1.1.0) ziemlich fehlerbehaftet ist und z.B. der xmpp bot nicht das tut was er soll, daher bleibe ich auch noch bei der 0.9.9er.

Nun bin ich zufällig auf https://github.com/hj91/Using-XMPP-to-post-content-on-blog-sms-facebook gestoßen. Ähnlich wie bei status.net läuft ein bot, der einfach alles was man ihm so mitteilt via WordPress (xml-rpc) veröffentlicht. Das Skript ist einigermaßen übersichtlich und lässt sich eigentlich gut anpassen. Ein paar Dinge fehlen leider dabei. So ist es nicht möglich Beiträge mit Tags zu versehen. URLs werden nicht automatisch zu Links umgewandelt. Man kann zwar „<a href=http://heise.de>heise.de</a>“ posten, was dann auch als Link angezeigt wird, aber das ist natürlich zu aufwändig. Mit ejabberd im Hintergrund läuft das ganze sehr reibungslos und ohne Unterbrechung. Ach…aussehen tut es dann so: notizen.exdc.net. Na ja was soll man da auch groß erwarten!?

Voraussetzung ist bei beiden Lösungen, dass sie komplett selbst gehostet werden können, ohne externe Abhängigkeiten. Sollte ich bei dem Skript weiter kommen, schreibe ich nochmal was dazu.

Updates:
Wählt man P2 als Theme bei WordPress  funktioniert die Konvertierung zu clickable links.
Nach einiger Zeit verliert der Bot die connection zum ejabberd Server, das wird wohl die fehlende keepalive Funktion sein.

Update 2: eingestellt da status.net 1.1.1 nun gut mit xmpp läuft, siehe hier

btsync…ein paar Wochen später

Nun setze ich btsync schon seit einigen Wochen ein und muss sagen, dass ich sehr zufrieden damit bin. Mit der ersten öffentlichen Version gab es immer mal wieder CRC Fehler bei den Dateien, seit der neuen Version (1.0.134) ist dies aber nicht mehr aufgetaucht. Der Raspberry Pi ist dafür eine ideale Plattform, auch wenn die Geschwindigkeit beim syncen nicht besonders hoch ist. Ich nutze als Sync Device einfach einen USB Stick, wodurch nicht ständig eine externe HD laufen muss.  Bisher eine der besten und einfachsten Lösungen um Daten automatisch zu syncen ohne auf fremdgehostete tools zurückgreifen zu müssen. Ja, rsync ist auch gut hat aber hat bei mir ein ganz anderes Einsatzszenario.

Kurztipp: Piwik Standortbestimmung via Apache Modul

Will man bei Piwik (1.11.1) die Standortbestimmung über das Apache Modul nutzen sind unter Debian folgende Schritte nötig:

apt-get install libapache2-mod-geoip
/etc/init.d/apache2 restart

In der /etc/apache2/mods-enabled/geoip.conf noch den Pfad zum GeoIPDBFile anpassen, bei mir schaut die Datei dann so aus:

<IfModule mod_geoip.c>
  GeoIPEnable On
#  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
  GeoIPDBFile /var/www/piwik/misc/GeoIPCity.dat
  GeoIPScanProxyHeaders On
</IfModule>

Danach sollte Piwik diverse Städte in der Besucherübersicht anzeigen. Funktioniert auch mit eingeschalteter Anonymisierung der Besucherip.

Notiz: Pacemaker resource disable migration

$ crm ra info pengine
...
is-managed-default (boolean, [true]):
    Should the cluster start/stop resources as required

maintenance-mode (boolean, [false]):
    Should the cluster monitor resources and start/stop them as required

Ein kleiner Unterschied, aber nur ein kleiner.
Damit setzen wir den Cluster in den Maintenance Mode:

$ crm configure property maintenance-mode=true

Link:
http://oss.clusterlabs.org/pipermail/pacemaker/2011-March/009429.html

Kurztipp: Openelec RPI hohe CPU Last

Bei mir läuft noch zusätzlich tvheadend, daher ist die Last eh noch ein bisschen höher. Ein bisschen Abhilfe gegen die hohe Load hat folgende Einstellung gebracht:
/storage/.xbmc/userdata/advancedsettings.xml

<advancedsettings>
<network>
<cachemembuffersize>5282880</cachemembuffersize>
</network>
<fanartheight>560</fanartheight>
<thumbsize>256</thumbsize>
<gui>
<algorithmdirtyregions>3</algorithmdirtyregions>
<nofliptimeout>0</nofliptimeout>
</gui>
<lookandfeel>
<enablerssfeeds>false</enablerssfeeds>
</lookandfeel>
<bginfoloadermaxthreads>2</bginfoloadermaxthreads>
</advancedsettings>

Das mit den RSS feeds sollte bekannt sein und muss eigentlich nicht extra mit in die Datei. Bringt jetzt nicht die Welt, aber bei mir ist die Last deutlich gesunken. Raspbmc läuft mit merklich weniger Last auf dem 2ten RPI. Auf das „Systeminfo“ von XBMC sollte man nicht viel geben, weil das allein schon die Last enorm nach oben treibt ;-).

Link:

http://archlinuxarm.org/forum/viewtopic.php?f=31&t=3004&start=70

Kurztipp: btsync auf dem Raspberry Pi mit Raspbmc

Wer bei btsync auf dem Raspberry mit Raspbmc folgende Ausgabe bekommt

$ ./btsync
bash: ./btsync: No such file or directory

sollte einfach mal folgenden Symlink erzeugen

$ ln -s /lib/arm-linux-gnueabihf/ld-linux.so.3 /lib/ld-linux.so.3

danach sollte alles funktionieren.

./btsync --dump-sample-config > sync.conf

nicht vergessen und sync.conf anpassen vor dem Start.

Links:

http://forum.bittorrent.com/topic/17264-sync-on-ubuntu-touch-arm-device/
http://forum.bittorrent.com/topic/8746-i-can-not-execute-syncapp-arm-on-my-nas-based-on-sl3516-cpu/#entry28830

 

 

vmmemctl unter Ubuntu

Mit den Vmware-tools und Ubuntu 12.04 kann es unter ungeklärten Umständen ein Problem geben. Das vmmemctl Modul wird nicht richtig installiert bzw. kompiliert. Beim Kompilieren der Vmware-tools  nach einem Kernel Update erscheint die Meldung:

The module vmmemctl has already been installed on this system by another installer or package and will not be modified by this installer. Use the flag –clobber-kernel-modules=vmmemctl to override.

Das führt dazu das der Kernel Thread vmmemctl nicht läuft,  weil das Modul vmmemctl fehlt. Das Modul dient dazu nicht mehr benötigten Speicher wieder freizugeben um ihn anderen VMs zur Verfügung zu stellen. Zum testen einfach mal auf der VM

$ ps aux|grep vmmemctl

eingeben. Abhilfe schafft ein

vmware-config-tools.pl –clobber-kernel-modules=vmmemctl,vsock,vmxnet3,vmci,pvscsi

Die anderen Module mit rein zunehmen schadet nicht. Die tauchten bei mir auch als Meldung beim kompilieren auf. Danach sollte  der Prozess angezeigt werden.

$ ps aux|grep vmmemctl
root     30933  0.0  0.0      0     0 ?        S    13:57   0:00 [vmmemctl]

Hat man eine größere ESX Struktur kann ein Fehlen des Moduls durchaus einen spürbaren Einfluss auf die benötigte Hardware haben ;-).

Mehr Informationen dazu  findet man z. B. unter http://yuridejager.wordpress.com/2012/02/27/enable-the-vmware-balloon-driver-vmmemctl-to-prevent-swapping-in-an-imported-linux-vm/

p.s. bei den open-vm-tools gibt es kein vmmemctl Modul.

Probleme nach libvirt Update

Sollte man bei KVM  mit Portweiterleitung für VMs (z.B.  iptables -t nat -A PREROUTING -p tcp -d 123.123.123.123 –dport 1234 -j DNAT –to-destination 192.168.99.99:22) arbeiten und folgende Debian Updates eingespielt haben:

[UPGRADE] libvirt-bin 0.8.3-5+squeeze2 -> 0.8.3-5+squeeze5
[UPGRADE] libvirt0 0.8.3-5+squeeze2 -> 0.8.3-5+squeeze5
[UPGRADE] python-libvirt 0.8.3-5+squeeze2 -> 0.8.3-5+squeeze5

Nach dem Einspielen aber bemerkt haben man , dass die Portweiterleitung nicht mehr funktioniert und man auch durch erneutes Eintragen der iptables/routing oder was auch immer für Regeln keinen Erfolgt erzielt, dann könnte tatsächlich ein Reboot des Hosts helfen.

längerer Kurztipp: Schutz gegen einfache DOS Attacken mit mod_evasive

Ein alter Hut, ich kannte es bis heute nicht. Mit mod_evasive kann man einfache DOS Angriffe blocken. Getestet mit dem guten, alten Squeeze.

$ apt-get install libapache2-mod-evasive
$ a2enmod mod-evasive
$ zless /usr/share/doc/libapache2-mod-evasive/README.gz
$ mkdir /var/log/mod_evasive
$ chown www-data /var/log/mod_evasive
$ ln -s /usr/bin/mail /bin/mail

$ joe /etc/apache2/mods-available/mod-evasive.conf

<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir /var/log/mod_evasive
DOSEmailNotify thisis@waste.land
DOSWhitelist 127.0.0.1
</ifmodule>

$ ln -s /etc/apache2/mods-available/mod-evasive.conf /etc/apache2/mods-enabled/mod-evasive.conf
$ /etc/init.d/apache2 reload

Zum testen einfach mal irgendeine Seite aufrufen und ein paar mal schnell F5 drücken bis man ein 403 Forbidden erhält. Dann im logdir schauen und eigentlich sollte man auch eine mail bekommen. Im syslog sollte ein Eintrag der Art
Mar 14 11:36:15 webserver  mod_evasive[15723]: Blacklisting address 123.123.123.123: possible DoS attack
aufauchen.
Mit DOSSystemCommand kann man noch einen Befehl definieren, der ausgeführt werden soll wenn eine IP geblockt wird, also z.B. iptables Regel zum sperren der IP („sudo /sbin/iptables -A INPUT -s %s -j REJECT„) oder was auch immer.
Die Meinungen zum Einsatz von mod_evasive gehen etwas auseinander, daher sollte man es erst mal  unter Beobachtung laufen lassen und am besten vorher mal ein bisschen googlen.
Zusammen mit HAproxy oder Nginx als Reverseproxy funktioniert mod_evasive nicht. Da kann man sich  mal das Nginx Modul HttpLimitReq anschauen. mod_evasive blacklisted zwar die IPs, mehr aber leider nicht.

Links:

http://www.linux-magazin.de/Ausgaben/2005/12/Friede-im-Indianerland

http://pc-freak.net/blog/secure-apache-against-basic-denial-of-service-attacks-with-mod_evasive-on-debian/

http://spielwiese.la-evento.com/xelasblog/archives/56-Apache-DOS-Attacken-erschweren-mit-mod_evasive.html

Bugfix Release für Galera

Es gibt ein Galera Update. Primär ein Bugfix Release. Ein neues Feature klingt aber recht viel versprechend:

„Plus new experimental feature: weighted quorum (lp:1010225). Weight can be an integer in the range 0-255. Nodes with zero weight don’t participate in quorum calculation. By default all nodes have weight 1.“

http://www.codership.com/content/mysql-wsrep-5529-2373-and-galera-2324-released

Updaten lief ohne Probleme.

ioioio makes the server slow

Arbeitet man mit Virtualisierung (ESX, KVM & Co) sollte man auf den VMs immer den iowait im Auge haben. Egal was die Hostmaschinen an schönen  Daten ausgeben, hat die VM einen zu hohen iowait gibt es früher oder später Probleme. Ich nutze dafür den check_cpu_stats  Check von Steve Bosek für Nagios. Der Check liefert  noch einige Daten mehr. Als Ergebnis bekommt man in etwa Folgendes:

$ /usr/lib/nagios/plugins/check_cpu_stats.sh -w 20 -c 40
CPU STATISTICS OK : user=0.50% system=1.01% iowait=3.27% idle=95.21% nice=0.00% steal=0.00% | CpuUser=0.50;CpuSystem=1.01;CpuIoWait=3.27;CpuIdle=95.21;CpuNice=0.00;CpuSteal=0.00;20;40

Bei Debian&Co sollte sysstat installiert sein. Mit den Zahlen lassen sich  schöne Grafiken bei Centreon erzeugen:

loadwait

Hinweise auf bessere Checks sind natürlich willkommen.

 

Centreon mit Custom Views

Ich hatte das zwar schon vor einiger Zeit  im monitoring-portal geschrieben, aber totzdem auch nochmal hier.

Ab Centreon 2.4.0 kann man sich nun „Custom Views“ mit Widgets für den Startbildschirm zusammenstellen.

Eine Dokumentation gibt es unter
http://documentation.centreon.com/docs/centreon/en/latest/extending/widgets/index.html
Dort steht auch wie man eigene Widgets schreibt.

Die Widgest gibt es unter
http://www.centreon.com/Content-Download/centreon-widgets
Dort liegen schon neuere Versionen. Ich habe noch die Widgets von http://forge.centreon.com/projects/centreon-widgets/files installiert. Werde die neuen Versionen gleich mal installieren und berichten falls es größere Unterschiede gibt.

Wie aufwendig so ein Widget zu schreiben ist kann ich nicht abschätzen. Auf jeden Fall ein nettes Feature was sicherlich noch ausgebaut wird. Super wäre es natürlich wenn man ein Widget für nagvis Karte hätte.

Custom Views:

screenshot15

Diese Widgets gibt es bisher bei Centreon:

screenshot16

 

Update 1: Nutzt man nicht den Centreon Broker sondern ndo, werden beim service-monitoring widget (1.1.0) alle services  4mal Angezeigt. Das der Centreon Broker dies Problem behebt habe ich nur im Centreon Forum gelesen aber noch nicht ausprobiert.

Kurztipp: Raspbmc und ssh über WAN

Will man von außerhalb des lokalen Netzwerks auf den Raspberry Pi zugreifen, muss man die lokale Firewall von raspbmc etwas anpassen. Zu finden sind die Einstellungen unter /etc/network/if-up.d/secure-rmc

$ tail -n 7  /etc/network/if-up.d/secure-rmc
logger -t iptables "Configuring ip tables for interface $IFACE"
if [ "$IFACE" != "lo" ]; then
NETMASK=$(get_subnet $IFACE)
iptables -A INPUT -s $NETMASK -i $IFACE -j ACCEPT
iptables -A INPUT -i $IFACE -j DROP
fi

Das kann man dann nach eigenen Wünschen anpassen. Also z.B. ein

$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT 

vor der DROP Regel. Warum droppen eigentlich immer alle Leute!? Ich finde ein REJECT ist viel schicker und sinniger als so ein dämliches DROP ;-).

Am besten vorher mal ein

$ iptables -I INPUT -p tcp --dport 22 -j ACCEPT

eingeben um zu testen ob Portforwarding vom Router usw. überhaupt richtig eingetragen ist und funktioniert. Und nun das wichtigste:
ÄNDERT das Default Passwort

Natürlich kann man die Regeln dementsprechend anpassen und nur bestimmten IPs Zugriff erlauben, iptables ist bekannterweise ein weites Feld.

p.s. raspbmc gefällt mir um einiges besser als openelec

update: Nun kann man auch die Firewall direkt via raspbmc addon im xbmc deaktivieren.