BigData mit Hypertable

Ich beschäftige mich beruflich gerade mit Big Data und deren Verarbeitung. Ich habe nur ein Problem, dass ich keine gute Hardware dafür habe, oder gar ein ganzes Rechenzentrum, wie Fratzenbuch oder google. Bei der Suche nach einem Lösungsansatz für mein Problem bin ich auf Hypertable gestoßen.

Wenn es um BigData geht, wird oft HBase genannt. In keinen kleinen Prototypen, war HBase in einer VM gefühlt viel langsamer als Hypertable. Deswegen habe ich mich weiter mit Hypertable und nicht mit HBase beschäftigt.

Hypertable ist eine verteilte Datenbank, welche vom Prinzip her spaltenorientiert ist. Dieses Prinzip kann mit Hilfe der Access Groups aufweichen. Man sollte auf keinen Fall versuchen aus Hypertable eine zeilenorientierte Datenbank zu machen.

Die aktuelle Zielarchitektur sieht wie folgt aus: Auf 12 Rechnern läuft HDFS von Hadoop. Auf 11 von diesen Rechnern läuft eine RangeServer für Hypertable. Dieser ist auf 2 GB RAM Verbrauch limitiert, weiterhin habe ich einen Hypertable Master. In meiner Testdatenbank habe ich 15,3 Millarden Datensätze. Auf dieser Datenmenge dauert ein random-Zugriff im Durchschnitt 200ms, wobei die worstcase Zeit einige Sekunden beträgt. Ich bin zumindest begeistert, dass ich derartig große Datenmengen auf schlechter Commodity Hardware handeln kann. Ich bin mir sicher, dass ich mit der zur Verfügung stehenden Hardware noch mehr haus holen kann.

Heiraten und deutsche Bürokratie

Ich möchte im nächsten Jahr heiraten und habe mich deswegen schon einmal informiert, was ich alles machen muss. Das ich beim Standesamt meine Geburtsurkunde vorlegen muss war mir schon klar. Aber so einfach ist das ganze nicht. Ich bin in der misslichen Lage, dass ich nicht in der Stadt heiraten möchte, in der ich geboren bin und außerdem habe ich eine DDR-Geburtsurkunde. Diese wird vom Standesamt nicht anerkannt. Wenn man trotzdem heiraten möchte, dann benötigt man einen Auszug aus dem Geburtsregister. Dieses Stück Papier entspricht im großen und ganzen einer beglaubigten Kopie meiner Geburtsurkunde. Nun meine Frage: Was soll dieser Schei? ?? Ich muss für eine Abschrift Geld bezahlen, von der ich das Original habe… Meine Verlobte ist in der Stadt in der wir heiraten möchten geborgen. In diesem Fall reicht die Geburtsurkunde. Ich finde so etwas äußerst frech, aber was hat man für Alternativen?

Letzte Rettung von MySQL

Ich hatte heute wieder Spaß mit MySQL. Die InnoDB Tabelle einer Datenbank hat sich erfolgreich selbst zerstört. Das hat sich dahingehend geäußert, dass sich MySQL immer wieder neu gestartet hat. MySQL war leider nicht in der Lage die betroffene Tabelle selbst wieder her zu stellen.

Mit Hilfe von innodb_force_recovery kann man MySQL dazu bringen, dass es Tabellen wieder her stellt. Diese Option schreibt man einfach in die my.cnf. Er kann die Werte von 1 bis 6 annehmen. Je höher der Wert ist, desto höher ist die Wahrscheinlichkeit, dass die Tabelle wieder hergestellt werden kann. Aber Achtung: Je größer der Wert ist, desto mehr Daten kann MySQL beim Wiederherstellen zerstören. Es ist deswegen ratsam den Wert inkrementell zu erhöhen, dieses Vorgehen dauert evtl. länger, aber man geht nicht in Gefahr unnötig Daten zu verlieren.

Briefvorlage mit LaTeX

Ich bin vor kurzem umgezogen und bin inzwischen Besitzer eines Festnetztelefon. Aus diesem Grund wollte ich in meiner \LaTeX-Vorlage für meine Briefe beide Nummern stehen haben. Die KOMA-Skript Pakte können von Haus aus, nur eine Telefonnummer, deswegen habe ich meine Vorlage, welche ich von meet-unix habe, wie folgt angepasst.

\ProvidesFile{letter_options.lco}[letter-class-option file]
 
% symbols: (cell)phone, email
\RequirePackage{marvosym} 
% for gray color in header
\RequirePackage{color}
\RequirePackage[utf8]{inputenc}
 
\KOMAoptions{
foldmarks=true,
foldmarks=BlmTP,
%fromurl=true,
fromemail=true,
fromphone=true,
fromalign=right,
fromrule=aftername,
fromemail=true,
footsepline=off
}
 
% define gray for header
\definecolor{firstnamecolor}{rgb}{0.65,0.65,0.65}
\definecolor{familynamecolor}{rgb}{0.45,0.45,0.45}
 
\setkomavar{fromname}{\color{firstnamecolor}Michael\color{familynamecolor}Rennecke}
\setkomafont{fromname}{\fontsize{38}{40}\sffamily\mdseries\upshape}
 
\setkomafont{fromrule}{\color{firstnamecolor}}
\@setplength{fromrulethickness}{0.25ex}
 
\setkomafont{addressee}{\small}
\setkomavar{fromaddress}{Solarisgasse 2\\12345 Tuxhausen}
 
\newkomavar[\Mobilefone]{frommobilephone} 
\setkomavar{frommobilephone}{(01\,60)~1\,23\,45\,67}
\setkomavar{fromphone}[\Telefon]{(03\,45)~12\,34\,56\,78}
 
\setkomavar{fromemail}[\Letter]{michael\_rennecke@gmx.net}
%\setkomavar{fromurl}[]{http://0rpheus.net}
 
\firsthead{
  \noindent
  \parbox[b]{\useplength{firstheadwidth}}{
    \noindent%
    \raggedleft%
    {\usekomafont{fromname}\usekomavar{fromname}}\\
    \rule{\useplength{firstheadwidth}}{1pt}\\
    \usekomavar{fromaddress}\\
    \Telefon\enskip\usekomavar{fromphone}\\
    \Mobilefone\enskip\usekomavar{frommobilephone}\\
    \Letter\enskip\usekomavar{fromemail}
  }
}
 
\setkomafont{fromaddress}{\small\rmfamily\mdseries\slshape}
\setkomavar{backaddress}{Michael Rennecke, Große Schlossgasse 2, 06108 Halle (Saale)}
 
\setkomavar{signature}{Michael Rennecke}
% signature same indention level as rest
\renewcommand*{\raggedsignature}{\raggedright}
% space for signature
\@setplength{sigbeforevskip}{1.7cm}
 
\endinput

So sieht nun ein Beipieldokument aus:

\documentclass[letter_options,parskip=half+,version=last,fontsize=11pt,DIV=11,BCOR=10mm, DIN]{scrlttr2}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}
\usepackage{amssymb}
\usepackage{lmodern}
 
% overall sans serif font
\renewcommand{\familydefault}{\sfdefault}
 
\setkomavar{subject}{Was machst Du}
\setkomavar{place}{Halle (Saale)}
 
\begin{document}
\begin{letter}{Karl Mustermann\\ Straße 4\\ 06019 Halle (Saale)}
 
 
\opening{Sehr geehrte Damen und Herren,}
  blabla
 
  \closing{Mit freundlichem Gruß}
\end{letter}
 
\end{document}

Ich hoffe ich konnte allen helfen, die ein ähnliches Problem haben. Ich bin für Anmerkungen dankbar, die meine Vorlage noch verbessern ;-) Wie das aussieht kann man hier sehen

noSQL Datenbanken

Ich arbeite inzwischen bei Unister als Junior Systemarchitekt. Zu meinen ersten Aufgaben hat gezählt eine Architektur für eine eine Datenbank zu schaffen, welche mit sehr hohen Schreibaufkommen zurecht kommt. Als Datenbank haben wir mongoDB benutzt. Dabei handelt es sich um eine noSQL-Datenbank. Diese Dazenbanken haben kein festes Datenbankschema.

Die ersten Ergebnisse waren sehr erschütternd. Die Schreibperformence war einfach zu gering. Da man bei mongoDB nichts konfigurieren kann (Im Vergleich zu klassischen Datenbanken, wie MySQL oder PostgreSQL) war ich erst einmal ratlos. Das ganze konnte mit Clustern nicht verbessert werden. Eine genaue Untersuchung der Applikation hat ergeben, dass die Daten synchron und damit blockierend geschrieben wurden. Nachdem die Inserts nicht blockierend und in Batches umgesetzt wurden konnte schon ein Performancesprung festgestellt werden. Das konnte weiter verbessert werden, als wir die einzufügenden Daten in der Applikation nach dem Index vorsortiert eingefügt haben. Die Ursache liegt darin, das die Datenbank den Batch schneller abarbeiten kann und weniger Operationen auf dem Index nötig sind.

Zum Schluss möchte ich noch ein paar Worte zum Clustern von mongoDB verlieren. Es wird alles mitgebracht um schnell einen Cluster aufzusetzten. Ich habe es es leider geschafft, durch den Absturz von einem Knoten, den gesamten Cluster zu zerstören. Also sollte man bei Wichtigen Daten für Redundanz im Cluster sorgen. Es gibt auch viele Mittel in mongoDB um diese Redundanz zu erreichen.

verschlüsselte Volumes bequem mounten

Ich habe mein home verschlüsselt. Dieses wird automatisch, beim anmelden gemountet. Da ich in mein home noch ein paar andere verschlüsselte Dateisysteme einhänge funktionieren die Standard-Mittel, wie /etc/crypttab nicht. Dabei ergibt sich das folgende Problem: Die Volumes werden beim booten eingehangen und zu diesen Zeitpunkt existiert mein home noch nicht.

Da ich faul bin möchte ich auch möglichst wenig Passwörter eingeben, weiterhin soll meine Freundin auch den Rechner anmachen können und nicht an meinen Passwort scheitern. Deswegen wird nur mein home via Passwort entschlüsselt, für die anderen Dateisysteme kommen key-files zum Einsatz. Diese liegen in meinen verschlüsselten home.

Da ich mir selbst nicht vertraue, möchte ich den sudo-Mechanismus oder suid-Bits nicht benutzten. Deswegen habe ich mir die beiden Skripte cryptdisks_start und cryptdisks_stop genauer angesehen. In einen ersten Schritt habe ich mir eine /etc/user_crypttab erzeugt.

root@walhalla ~ # cat /etc/user_crypttab
# definition             volume                        key                                   options      mountpoint                mountoptions
data--group-video_crypt  /dev/mapper/data--group-video /home/rennecke/key-files/video-key    luks         /home/rennecke/Videos     noatime

Die ersten vier Parameter entsprechen denen, der crypttab, mountpoint und mountoptions sind entsprechen den gleichnamigen Optionen von mount.

Mein user_cryptdisks_start-Skript sieht wie folgt aus:

#!/bin/sh
 
# user_cryptdisks_start - wrapper around cryptsetup which parses
# /etc/user_crypttab, just like mount parses /etc/fstab.
 
# Initial code stolen from cryptdisks_start by Jon Dowland <jon@alcopop.org>
# Copyright (C) 2011 by Michael Rennecke <michael_rennecke@gmx.net>
# License: GNU General Public License, v2 or any later
# (http://www.gnu.org/copyleft/gpl.html)
 
CRYPTTAB="/etc/user_crypttab"
 
set -e
 
if [ $# -lt 1 ]; then
	echo "usage: $0 <name>" >&2
	echo >&2
	echo "reads $CRYPTTAB and starts the mapping corresponding to <name>" >&2
	exit 1
fi
 
. /lib/cryptsetup/cryptdisks.functions
 
INITSTATE="manual"
DEFAULT_LOUD="yes"
 
if [ -x "/usr/bin/id" ] && [ "$(/usr/bin/id -u)"  != "0" ]; then
	log_warning_msg "$0 needs root privileges"
	exit 1
fi
 
log_action_begin_msg "Starting crypto disk"
mount_fs
 
 
count=0
tablen="$(egrep -vc "^[[:space:]]*(#|$)" "$CRYPTTAB")"
egrep -v "^[[:space:]]*(#|$)" "$CRYPTTAB" | while read dst src key opts mnt mopts; do
	count=$(( $count + 1 ))
	echo ""
	if [ "$1" = "$dst" ]; then
		ret=0
		handle_crypttab_line_start "$dst" "$src" "$key" "$opts" <&3 || ret=$?
		echo ""
		fsck -pv /dev/mapper/$dst
		echo ""
		mount -o $mopts /dev/mapper/$dst $mnt
	elif [ $count -ge $tablen ]; then
		ret=1
		device_msg "$1" "failed, not found in user_crypttab"
	else
		continue
	fi
	umount_fs
	log_action_end_msg $ret
	exit $ret
done 3<&1

Zum Schluss noch mein user_cryptdisks_stop-Skript:

#!/bin/sh
 
# user_cryptdisks_stop - wrapper around cryptsetup which parses
# /etc/user_crypttab, just like mount parses /etc/fstab.
 
# Initial code stolen from cryptdisks_stop by Jonas Meurer <jonas@freesources.org>
# Copyright (C) 2011 by Michael Rennecke <michael_rennecke@gmx.net>
# License: GNU General Public License, v2 or any later
# (http://www.gnu.org/copyleft/gpl.html)
 
CRYPTTAB=/etc/user_crypttab
 
set -e
 
if [ $# -lt 1 ]; then
	echo "usage: $0 <name>" >&2
	echo >&2
	echo "reads $CRYPTTAB and stops the mapping corresponding to <name>" >&2
	exit 1
fi
 
. /lib/cryptsetup/cryptdisks.functions
 
INITSTATE="manual"
DEFAULT_LOUD="yes"
 
if [ -x "/usr/bin/id" ] && [ "$(/usr/bin/id -u)"  != "0" ]; then
	log_warning_msg "$0 needs root privileges"
	exit 1
fi
 
log_action_begin_msg "Stopping crypto disk"
echo ""
 
count=0
tablen="$(egrep -vc "^[[:space:]]*(#|$)" "$CRYPTTAB")"
egrep -v "^[[:space:]]*(#|$)" "$CRYPTTAB" | while read dst src key opts mnt mopts; do
	count=$(( $count + 1 ))
	if [ "$1" = "$dst" ]; then
		umount $mnt
 
		ret=0
		handle_crypttab_line_stop "$dst" "$src" "$key" "$opts" <&3 || ret=$?
	elif [ $count -ge $tablen ]; then
		ret=1
		device_msg "$1" "failed, not found in user_crypttab"
	else
		continue
	fi
	log_action_end_msg $ret
	exit $ret
done 3<&

Die beiden Skripte kann nun root ausführen, um Dateisysteme einzuhängen. Bei jeden einhängen wird geschaut, ob ein fsck nötig ist. Mein Dank gilt meet-unix, er hat stand mit mit Rat zu Seite, da ich noch etwas Solaris-geschädigt bin. Anmerkungen, bitte als Kommentar hinterlassen.

verschlüsseltes home automatisch mounten

Ich bin inzwischen auf Debian umgestiegen. Mein home sollte natürlich verschlüsselt sein. Wenn man zum verschlüssel dm-crypt/LUKS nutzt und die Dateisysteme in der /etc/crypttab einbindet, muss man beim booten das Passwort eingeben (Ich setzte voraus, dass man via Passwort verschlüsselt und nicht mit einem Keyfile). Es ist viel interessanter, wenn das home beim anmelden automatisch gemountet wird. Das geht, wenn man pam_mount benutzt. Im folgenden beschreibe ich wie man ein verschlüsseltes home anlegt, welches automatisch gemountet wird.

Vorbereitung: Anlegen eines Volume (ich nutze lvm)

cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 /dev/data-group/home_rennecke
cryptsetup luksOpen /dev/data-group/home_rennecke data--group--home_rennecke_crypt
mkfs.ext4 /dev/mapper/data--group--home_rennecke_crypt
cryptsetup luksClose /dev/mapper/data--group--home_rennecke_crypt

Damit das home automatisch gemountet wird muss man in der /etc/security/pam_mount.conf.xml das folgende einfügen:

<!-- Volume definitions -->
<volume user="rennecke" fstype="crypt" path="/dev/mapper/data--group-home--rennecke" mountpoint="/home/rennecke" options="fsck,noatime" />

Das Passwort vom verschlüsselten home und das Passwort vom login müssen gleich sein! Wenn man sich nun einloggt, dann wird das home automatisch eingehangen.

Hinweis:
Das pam_mount-Modul arbeitet nicht ganz transparent! mount zeigt nicht die wirklichen mount-Punkte an. Diese werden aber mit cat /proc/mount angezeigt.

Junior System Architekt

So wie es aussieht, habe ich demnächst ein Job als Junior System Architekt. Ich freue mich schon auf meinen ersten Arbeitstag, leider werde ich nicht mit Solaris arbeiten, wenigsten Linux und nicht Windows. Demnächst ließt man sicher hier mehr ;-)

Bilder mit css nicht vergrößern

Ich habe in meinen Blog inzwischen auch Bilder und ich nutze die NextGEN Gallery. Aus Platzgründen verkleinere ich die Bilder. Die Bilder, welche im Hochformat sind sehen einfach grausam aus, da sie stark vergrößert werden. Durch den folgenden Hack im css werden die Bilder nicht mehr vergrößert. Dazu muss man die Datei nextgen-gallery/css/nggallery.css wie folgt ändern:

.ngg-imagebrowser img {
    border: 1px solid #A9A9A9;
    display: block !important;
    margin: 10px auto;
    max-width: 100%;
    padding: 5px;
}

Achtung: Die Änderung geht bei einen automatischen Update des Plugins verloren!

Richtfest einer Mensa in Halle

Heute fand um 16:30 Uhr das feierliche Richtfest des Mensa-Neubau am von-Seckendorff-Platz. Die Festrede haben der Vorsitzenden des Verwaltungsrates Herr Prof. Lilie, der Finanzminister Herr Bullerjahn, die Kultusministerin Frau Prof. Wolff und der Rektor der Martin-Luther-Universität Halle-Wittenberg Herr Prof. Sträter gehalten. Im Anschluss haben der Stadtrat Herr Tobias Kogge sowie der Architekt Herr Prof. Schulz ihr Grußworte überbracht.

Zum Schluss kommen noch ein paar Impressionen vom Richtfest.

kurz vor dem Richtfest

Bild 1 von 19