Apache Cassandra: drei Fallstricke beim Zugriff mit THRIFT und PHP

geschrieben von Steffen Müller am 09.06.2010 in Kategorie Web Entwicklung | Noch keine Kommentare

In einem sehr attraktiven Projekt haben wir zur Zeit Gelegenheit, mit der Apache Cassandra Datenbank zu arbeiten. Apache Cassandra ist eine NoSQL Datenbank, die für bestimmte Einsatzgebiete bestechende Vorteile bietet.

In diesem Artikel stellen wir drei Fallstricke vor, die uns bei der Integration von Apache Cassandra mit PHP über das THRIFT Interface begegnet sind.

1. Fallstrick: unregelmäßige Exceptions à la "TSocket: timed out reading x bytes from y"

Sie erhalten in unregelmäßigen Abständen, vor allem beim Lesen größerer Datenmengen, Exceptions dieser Form? Dann prüfen Sie den Initialisierungscode Ihrer Cassandra Verbindung mit THRIFT und ersetzen Sie "TBufferedTransport" durch "TFramedTransport". Der Wechsel der Übertragungsart verhindert diese Exceptions.

Wichtig: auch der Cassandra Server muss auf Framed Transport umgestellt werden. Dazu bearbeiten Sie Ihre storage-conf.xml, suchen nach "<ThriftFramedTransport>" und ersetzen das dort angegebene "false" durch "true", so dass Sie folgende Zeile erhalten:

<ThriftFramedTransport>true</ThriftFramedTransport>

Cassandra muss danach natürlich neu gestartet werden. Beachten Sie, dass Sie für die cassandra-cli Anwendung von nun an den Parameter --framed übergeben müssen, damit diese auch das Framed Transport Protocol verwendet.

2. Fallstrick: immer noch die unregelmäßigen Exceptions "timed out reading"

Wenn das Problem damit noch nicht behoben ist, kann ein Problem in der TSocket.php des THRIFT Interface die Ursache des Problems sein. Hier wird an einer Stelle nicht sauber zwischen Timeouts in der Verbindung und blockierten Verbindungen unterschieden, was durch eine Race Condition gelegentlich zu Exceptions führen kann. Also hacken Sie in der Datei TSocket.php des THRIFT Interface herum:

  1. Suchen Sie nach Zeile Nummer 213. Sie sollte lauten: if ($buf === FALSE || $buf === '') {
  2. Ersetzen Sie die Zeile durch if ($buf === false) {
  3. Suchen Sie nach Zeile Nummer 224. Sie sollte lauten: if ($md['timed_out']) {
  4. Ersetzen Sie die Zeile durch if ($md['timed_out'] === true && $md['blocked'] === false) {

Diese beiden Problemlösungen erledigten bei uns das Problem der "TSocket: timed out reading x bytes from y" Exceptions.

3. Fallstrick: Exceptions beim Schreiben großer Datenmengen über das Binary Accelerated Protocol

In unseren Tests mit Apache Cassandra 0.6 verhinderte ein Bug im Apache Modul für das Binary Accelerated Protocol, dass darüber große Datenmengen geschrieben werden. Immer wieder brach der Schreibprozess ab. Ein Wechsel auf das normale Binary Protocol, also nicht "Accelerated", löste das Problem.

Ausblick: mehr über Apache Cassandra

In der nächsten Zeit werde ich noch weitere Artikel zu unseren Erfahrungen mit Apache Cassandra schreiben. Als kurzes Zwischenfazit kann ich aber sagen, dass Cassandra uns voll überzeugen konnte - was sowohl Performance als auch Einfachheit der Bedienung, Installation und Pflege betrifft.

Gleichzeitig muss man aber auch festhalten: Cassandra und NoSQL im Allgemeinen ist kein Ersatz für relationale Datenbanken, sondern eine Ergänzung - beide Systeme haben Stärken und Schwächen. Die Kunst ist die Kombination der beiden Welten, um die Stärken beider Seiten zu erhalten und die Schwächen zu umschiffen.

Wie sind Ihre Erfahrungen mit Apache Cassandra? Planen Sie den Einsatz oder haben Sie es bereits erfolgreich eingesetzt?

Empfehlen Sie den Artikel weiter!

Kommentare als RSS Feed abonnieren Kommentare

Zu diesem Artikel gibt es noch keine Kommentare.
Seien Sie der erste, der diesen Artikel kommentiert!

Schreiben Sie einen Kommentar:

Gravatar

Wenn Sie sich nicht über Facebook Connect anmelden, verwenden wir als Profilbild den Gravatar Ihrer E-Mail Adresse. Klicken Sie hier, um mehr über Gravatare zu erfahren.

Avatar