INSTALL SONAME 'handlersocket'python
[mysqld]mysql
handlersocket_address = "127.0.0.1"git
handlersocket_port = "9998"github
handlersocket_port_wr = "9999"sql
root@jlive:~#/etc/init.d/mysql restart數據庫
Restarting mysql (via systemctl):
root@jlive:~#netstat -tunlp|grep mysqlsocket
tcp
tcp
tcp6
(jlive)[isfdb]>SHOW PROCESSLIST;
+----+-------------+---------------------+---------------+---------+------+-------------------------------------------+------------------+----------+
| Id | User
+----+-------------+---------------------+---------------+---------+------+-------------------------------------------+------------------+----------+
|
|
|
|
|
|
|
|
|
| 10 | system user | connecting host
| 11 | system user | connecting host
| 12 | system user | connecting host
| 13 | system user | connecting host
| 14 | system user | connecting host
| 15 | system user | connecting host
| 16 | system user | connecting host
| 17 | system user | connecting host
| 21 | zabbix
| 22 | jlive
| 23 | zabbix
| 24 | zabbix
| 25 | zabbix
+----+-------------+---------------------+---------------+---------+------+-------------------------------------------+------------------+----------+
22 rows in set (0.00 sec)
[mysqld]
# HandlerSocket Read Threads:
handlersocket_threads = 16
# HandlerSocket Write Threads:
handlersocket_threads_wr = 1
handlersocket_plain_secret = 'readSocketPassword'
handlersocket_plain_secret_wr = 'writeSocketPassword'
提示:
handlersocket默認狀況下會啓動16個讀線程和1個寫線程,能夠經過上面參數修改線程數,讀寫的最大線程數最大值爲3000,官方推薦寫線程數設爲1,讀線程數爲CPU核數的兩倍
還能夠設置爲讀寫handlersocket設置不一樣的明文密碼
libhsclient
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL
git clone https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL.git
cd HandlerSocket-Plugin-for-MySQL/libhsclient
make
mkdir -p /usr/local/include/handlersocket
install -m 644 *.hpp /usr/local/include/handlersocket
install -m 644 libhsclient.a /usr/local/lib
ln -s /usr/local/include/handlersocket/* /usr/local/include/
HandlerSocket perl client庫
1.安裝perl handlersocket庫
cd HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/
perl Makefile.PL
make -j4 && make install
2.建立示例數據
CREATE DATABASE IF NOT EXISTS test;
USE test;
DROP TABLE IF EXISTS hs_test;
CREATE TABLE hs_test (
);
INSERT INTO hs_test VALUES
3.建立示例perl腳本
#!/usr/bin/perl
use strict;
use warnings;
use Net::HandlerSocket;
my $read_args = { host => 'localhost', port => 9998 };
my $hs = new Net::HandlerSocket($read_args);
my $res = $hs->open_index(0, 'test', 'hs_test', 'PRIMARY', 'id,givenname,surname');
my $pk = 1;
$res = $hs->execute_single(0, '=', [ "$pk" ], 10, 0);
shift(@$res);
while ( $res->[0] ) {
}
root@jlive:~#perl hs_read_test.pl
1 William Hartnell
2 Patrick Troughton
3 John Pertwee
4 Tom Baker
5 Peter Davison
6 Colin Baker
HandlerSocket python client庫
1.安裝python handlersocket庫
https://bitbucket.org/excieve/pyhs
yum -y install mercurial
hg clone http://bitbucket.org/excieve/pyhs
cd pyhs
sed -i '4a ext_errors = (CCompilerError, DistutilsExecError,DistutilsPlatformError)' setup.py
#!/bin/env python
from pyhs import Manager
hs = Manager()
data = hs.get('test', 'hs_test', ['id', 'givenname', 'surname'], '5')
print dict(data)
from pyhs.sockets import ReadSocket
hsr = ReadSocket([('inet', '127.0.0.1', 9998)])
r_id = hsr.get_index_id('test', 'hs_test', ['id', 'givenname', 'surname'])
print hsr.find(r_id, '=', ['5'])
print hsr.find(r_id, '=', ['6'])
print hsr.find(r_id, '>=', ['1'],20)
root@jlive:~#python py_hs_read.py
{'givenname': 'Peter', 'surname': 'Davison', 'id': '5'}
[('5', 'Peter', 'Davison')]
[('6', 'Colin', 'Baker')]
[('1', 'William', 'Hartnell'), ('2', 'Patrick', 'Troughton'), ('3', 'John', 'Pertwee'), ('4', 'Tom', 'Baker'), ('5', 'Peter', 'Davison'), ('6', 'Colin', 'Baker')]
HandlerSocket ruby client庫
1.安裝ruby handlersocket庫
gem install handlersocket
2.建立示例ruby腳本
#!/bin/env ruby
require 'rubygems'
require 'handlersocket'
hs = HandlerSocket.new(:host => '127.0.0.1',:port => '9998')
hs.open_index(0,'test','hs_test','PRIMARY','id,givenname,surname')
p hs.execute_single(0,'=',[1])
p hs.execute_single(0,'>',[1],2,2)
p hs.execute_single(0,'>=',[1],20)
提示:也能夠直接經過交互式的irb來執行上面語句
root@jlive:~#ruby rb_hs_read.rb
[0, [["1", "William", "Hartnell"]]]
[0, [["4", "Tom", "Baker"], ["5", "Peter", "Davison"]]]
[0, [["1", "William", "Hartnell"], ["2", "Patrick", "Troughton"], ["3", "John", "Pertwee"], ["4", "Tom", "Baker"], ["5", "Peter", "Davison"], ["6", "Colin", "Baker"]]]
HandlerSocket Telnet
root@jlive:~#telnet 127.0.0.1 9998
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
P
0 1
0 = 1 1
0 3 1 William Hartnell
0 > 1 2 2
0 3 3 John Pertwee 4 Tom Baker
0 >= 1 1 20
0 3 1 William Hartnell 2 Patrick Troughton 3 John Pertwee 4 Tom Baker 5 Peter Davison 6 Colin Baker
^]
telnet> Connection closed.
注意:分隔符爲Tab
第一行是定義到數據庫的信道鏈接
P
P關鍵字,第二列爲確認信道,這裏設爲0,第三列爲數據庫,第三列爲數據庫中的表,第五列爲search key,第六列爲查詢字段
0 = 1 1
0是信道,第二列爲操做符(>,>=,<,<=,=),第三列是索引,只能<=第一行中定義的search key數量,由於只定義了一個search key因此這裏設爲1,第四列爲查詢第幾字段,1表示id,2表givenname,3表示surname
0 3 1 William Hartnell
0狀態返回碼,0爲成功,第二列爲查詢字段數量,定義鏈接時定義了3個查詢字段,這裏返回3,以後的幾列就是id,givenname,surname的值
0 > 1 2 2
查詢第2字段(givenname)比PRIMARY大的記錄,第五字段限制返回記錄的數量,這裏爲2最多返回2條記錄,沒有第五列則只返回1行記錄