A PECL extension for using the HandlerSocket NoSQL MySQL plugin
PHP C++ C
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.

README.md

HandlerSocket extension for PHP

Introduction

This is the HandlerSocket PECL PHP extension. It provides an interface for accessing the HandlerSocket from PHP.

This repository is a mirror from the google code project php-handlersocket.

Documentation

There's not much documentation about HandlerSocket.

  1. There are some slides from the slides from the MySQL plugin author.

  2. A blog post from the database infrastructure architecht at DeNA, the largest japanese social gaming platform.

  3. One more blog post about installing HandlerSocket on RedHat based systems and having it up and running.

  4. Using this PHP extension detailed on another blog post.

Just the facts

HandlerSocket overrides all the CPU usage related with SQL parsing. Instead it speaks a text protocoldirectly to InnoDB to Create/Read/Update/Delete (CRUD) data. It can combine several operations on the server side.

Supported SQL commands:

SELECT, UPDATE, INSERT, DELETE

Supported SQL operators:

IN, WHERE, ORDER BY, LIMIT, FROM, =, >=, <=, >, <

For it to work the tables being accessed must have and index or/and a primary key since what HandlerSocket performs is either a primary key lookup or an index scan.

Debian, Percona Server and MariaDB support

The HandlerSocket MySQL plugin is included in Debian and comes also included in MariaDB 5.3 and Percona Server 5.1.52-12.3.

Configuring the MySQL server

HandlerSocket configuration

You must enable HandlerSocket in your instance of mysqld. Add the following in /etc/mysql/my.cnf:

## Number of reader threads. The recommended value is the number
## of logical CPUs. 
handlersocket_threads = 16

You can get this number with cat /proc/cpuinfo | grep 'processor' | wc -l.

## Number of writer threads
## Recommended value is 1.
handlersocket_thread_wr = 1

## Listening ports for reader requests.
handlersocket_port = 9998
## Listening port for writer requests.
handlersocket_port_wr = 9999

InnoDB Configuration

Since HandlerSocket talks directly to InnoDB the engine runtime parameters needs to be tweaked in order to extract the maximum possible performance of HandlerSocket as well to maintain data integrity when doing writes.

Performance Settings

## Set this as large as possible.
innodb_buffer_pool_size

## As large as possible.
innodb_log_file_size 
innodb_log_files_in_group

## No concurrent threads. Handler socket uses a single thread with
## an event approach using epoll().
innodb_thread_concurrency = 0

## HandlerSocket can handle up to 65000 concurrent
## connections. This needs to be supported at the OS level.
open_files_limit = 65535

Check your current maximum number of simultaneosuly open file descriptors value with ulimit.

## Enable adaptive hash index.
innodb_adaptive_hash_index = 1

Data Integrity Settings

HandlerSocket has no transaction support

## Flush the transaction log after each transaction.
innodb_flush_log_at_trx_commit = 1    

## Guarantees that at most we lost a transaction. This has
## performance penalties. We're asking for MySQL to flush to disk
## every transaction log instance after being done. This enables
## us to recover almost all data upon a crash.
sync_binlog = 1

## Enable two phase commit. First prepare then commit in XA
## transactions, i.e., 
innodb_support_xa = 1

More information regarding InnoDB tunning can be found here.

An explanation of innodb_support_xa.

TODO

  1. Expand the documentation with more examples.

  2. Debianize the extension and provide a package at debian.perusio.net.