nginx-mysql-hsock-module icon indicating copy to clipboard operation
nginx-mysql-hsock-module copied to clipboard

NGINX async module for accessing MySQL via Handlersocket protocol


NGINX MySQL Handlersocket module

Provides MySQL InnoDB access via Handlersocket protocol

Implemented as non-blocking upstream module

(c) 2011 Roman Arutyunyan, [email protected]

Build:

Add this when configuring NGNIX:

./configure --add-module=$PATH_TO_MODULE

Usage:

Suppose you have an InnoDB table in database "mydbname" named "mytable" with 4 fields (of any type):

  • "key" (this is primary key field as the name says :) )
  • "field1"
  • "field2"
  • "field3"

These are settings you should add to nginx.conf file to work with the table directly from NGINX.

first create upstreams (read & write) with keepalive enabled

upstream hsock_rsrv { server 127.0.0.1:9998; keepalive 1024; }

upstream hsock_wsrv { server 127.0.0.1:9999; keepalive 1024; }

then create operation locations within server block.

4 operations are supported: select, update, insert, delete

Note there should be different upstreams for each of them

(the module performs index initialization based on particular

location data)

location ~ /select.* {

hsock_pass   hsock_rsrv;
hsock_db     mydbname;
hsock_table  mytable;

# Yes, you should copy variables like this
# if you need to use arg_, http_ etc variables.
# They are not accessed directly so far.

set $key $arg_key; 

hsock_select field1 field2 field3;
hsock_key    $key;

}

location ~ /insert.* {

hsock_pass   hsock_wsrv;
hsock_db     mydbname;
hsock_table  mytable;

set $key $arg_key;
set $field1 $arg_field1;
set $field2 $arg_field2;
set $field3 $arg_field3;

hsock_insert key $key
	field1 $field1
	field2 $field2
	field3 $field3;

}

location ~ /update.* {

hsock_pass   hsock_wsrv;
hsock_db     mydbname;
hsock_table  mytable;

set $key $arg_key;
set $field1 $arg_field1;
set $field2 $arg_field2;
set $field3 $arg_field3;

hsock_update
	field1 $field1
	field2 $field2
	field3 $field3;

hsock_key $key;

}

location ~ /delete.* {

hsock_pass   hsock_wsrv;
hsock_db     mydbname;
hsock_table  mytable;

set $key $arg_key;

hsock_delete;
hsock_key $key;

}

Data is returned line-by-line 1 line - errorcode (0=OK, >0=error) 2 line - number of data lines 3 ... - data lines; data fields are returned on a field-per-line basis. Multiple rows are returned the same way as a single row.