0% found this document useful (0 votes)
28 views31 pages

NoSQL Solutions for MySQL Performance

HandlerSocket and similar technologies - NoSQL for MySQL A short overview about NoSQL technologies used in combination with MySQL.

Uploaded by

Oli Sennhauser
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views31 pages

NoSQL Solutions for MySQL Performance

HandlerSocket and similar technologies - NoSQL for MySQL A short overview about NoSQL technologies used in combination with MySQL.

Uploaded by

Oli Sennhauser
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

HandlerSocket and similar Technologies -

NoSQL for MySQL

FOSDEM, Brussels
5./6. February 2011

Oli Sennhauser
Senior MySQL Consultant at FromDual

[Link]@[Link]

[Link] 1
Contents

NoSQL for MySQL



NoSQL Trends

SQL Overhead

HandlerSocket

NDB-API

BLOB Streaming Engine

Handler Interface

Graph Storage Engine

[Link] 2
About FromDual
● We provide neutral and vendor independent:
● Consulting (on-site and remote)
● Remote-DBA / MySQL Operation Services
● Support
● Training (DBA, Performance Tuning, Scale-Out, High
Availability, MySQL Cluster)
● We are consulting partner of the Open Database
Alliance ([Link])
● Oracle Silver Partner (OPN)

[Link]
[Link] 3
Trends
NoSQL

MySQL

[Link] 4
What is the problem?

Storage Engine part

SQL overhead

● SQL overhead is up to 70-80% for simple queries (~ 1 ms)!


● with NO SQL → we could be up to 5 times faster
● SQL is made for complex queries
● NoSQL typically solves simple queries

[Link] 5
Where does this overhead come
from?
Application / Client

Thread Connection mysqld


Cache Manager Parser
Optimizer
User Au-
thentication
Access Control
Command Table Open
Logging
Dispatcher Cache (.frm, fh)
Table Manager
Query Query Cache Table Definition
Cache Module Cache (tbl def.)

Handler Interface

MyISAM InnoDB Memory NDB PBXT Aria XtraDB Federated-X ...

[Link] 6
What can we do about?
● HandlerSocket (2010)
● NDB-API (1997!)
● PrimeBase Streaming Engine (2008)
● Handler Interface (2001/2011)
● OQGRAPH SE (2009)

[Link] 7
HandlerSocket
● October 20, 2010, Yoshinori Matsunobu:
Using MySQL as a NoSQL - A story for ex-
ceeding 750,000 qps on a commodity server

[Link] 8
SELECT

# SELECT * FROM [Link] where id = 42;

use Net::HandlerSocket;

my $args = { host => 'master', port => 9998 };
my $hs = new Net::HandlerSocket($args);

my $res = $hs­>open_index(0, 'test', 'test', 'PRIMARY', 'id,data,ts');

$res = $hs­>execute_single(0, '=', [ '42' ], 1, 0);
shift(@$res);
for (my $row = 0; $row < 1; ++$row) {
  print "$id\t$data\t$ts\n";
}

$hs­>close();

[Link] 9
Infos
● Compile yourself (easy!)
● 7.5 times more throughput?!?
● Works with 5.5.8 and MariaDB
● Faster than mem-
cached!?!
● In Percona-Server
12.3

[Link] 10
Features / functionality
● Different query patterns (see also handler interface later)
● Lots of concurrent connections
● Highly performant (200 – 700%)
● No duplicate cache (MySQL and memcached)
● No data inconsistency (MySQL and memcache)
● Crash-safe
● SQL access as well (for complex queries like reporting)
● No need to modify/rebuild MySQL ?!?
● Theoretically works for other storage engines as well (I did not
test it).

[Link] 11
NDB-API
● 1997, Mikael Ronström: The NDB Cluster – A
parallel data server for telecommunications
applications
● November 25, 2008, Jonas Oreland: 950'000
reads per second on 1 datanode

[Link] 12
MySQL Cluster
Application Application Application Application Application
NDB-API NDB-API
Load balancer

SQL Node 1 SQL Node 2 SQL Node 3


...
Mgm Node 1

Mgm Node 2
Data Node 1 Data Node 2

Sw.
Sw.

Data Node 3 Data Node 4

[Link] 13
INSERT

// INSERT INTO cars VALUES (reg_no, brand, color);

const NdbDictionary::Dictionary* myDict= myNdb­>getDictionary();
const NdbDictionary::Table *myTable= myDict­>getTable("cars");

NdbTransaction* myTrans = myNdb­>startTransaction();
NdbOperation* myNdbOperation = myTrans­>getNdbOperation(myTable);

myNdbOperation­>insertTuple();
myNdbOperation­>equal("REG_NO", reg_no);
myNdbOperation­>setValue("BRAND", brand);
myNdbOperation­>setValue("COLOR", color);

int check = myTrans­>execute(NdbTransaction::Commit);

myTrans­>close();

[Link] 14
SELECT
// SELECT * FROM cars;

const NdbDictionary::Dictionary* myDict= myNdb­>getDictionary();
const NdbDictionary::Table *myTable= myDict­>getTable("cars");

myTrans = myNdb­>startTransaction();
myScanOp = myTrans­>getNdbScanOperation(myTable);   
myScanOp­>readTuples(NdbOperation::LM_CommittedRead)

myRecAttr[0] = myScanOp­>getValue("REG_NO");
myRecAttr[1] = myScanOp­>getValue("BRAND");
myRecAttr[2] = myScanOp­>getValue("COLOR");

myTrans­>execute(NdbTransaction::NoCommit);

while ((check = myScanOp­>nextResult(true)) == 0) {
    
  std::cout << myRecAttr[0]­>u_32_value() << "\t";
  std::cout << myRecAttr[1]­>aRef() << "\t";
  std::cout << myRecAttr[2]­>aRef() << std::endl;
}
myNdb­>closeTransaction(myTrans);

[Link] 15
Benchmarks and numbers
● ./flexAsynch -ndbrecord -temp -con 4 -t 16
-p 312 -l 3 -a 2 -r 2
● From the MySQL Cluster test suite
(src/storage/ndb/test/ndbapi)
● 16 number of concurrent threads (-t) ● 4 concurrent connections (-con)
312 number of parallel operation per thread

● 2 number of records (-r ?)
● 3 iterations (-l)
● 1 32-bit word per attribute
● 2 attributes per table (8 bytes) (-a)
● 1 ndbmtd (1 NoOfRepl.)

insert average: 506506/s min: 497508/s max: 522613/s stddev: 2%
update average: 503664/s min: 495533/s max: 507833/s stddev: 1%
delete average: 494225/s min: 474705/s max: 518272/s stddev: 3%
read   average: 980386/s min: 942242/s max: 1028006/s stddev: 2%

[Link] 16
Learnings
● Observations
● CPU's not maxed out. "Somewhere" is potential !?!
● When you overdo: CPU is maxed out and performance

drops to 14%!
● The fakes:
● Look at the parameters!
● All other setups: I got worse throughput

● IP instead of localhost: 89% throughput

● Learnings:
● Do not trust benchmarks you did not fake yourself!

[Link] 17
BLOB Streaming Project
● April 2008, Paul McCullagh: Introduction to
the BLOB Streaming Project
● March 5 2010, Barry Leslie: Upload 1000+
BLOB's per second!

[Link] 18
BLOB's local and in the cloud

[Link] 19
Advantages of BLOB's in the
database
● old: RDBMS are not fast in storing BLOB's
→ do NOT store BLOB's in the databases
● new: With NoSQL technologies it becomes much
better!
● With PBSE: atomic transactions → No “dangling”
references.
● BLOB's in the normal database Backup !?!
● BLOB's can be replicated
● BLOB's in the DB will scale better. Most file systems
perform poorly when the number of files exceeds 2
million ?
[Link] 20
The Handler Interface
● October 2001, MySQL manual: A new
HANDLER interface to MyISAM tables
● December 27, 2010, Stephane Varoqui:
Using MySQL as a NoSQL: a story for
exceeding 450'000 qps with MariaDB
● January 10, 2011, Stephane Varoqui: 20% to
50% improvement in MariaDB 5.3 Handler
Interface using prepared statement

[Link] 21
Skipping overhead with Handler
Interface
Application / Client

Thread Connection mysqld


Cache Manager Parser
Optimizer
User Au-
thentication
Access Control
Command Table Open
Logging
Dispatcher Cache (.frm, fh)
Table Manager
Query Query Cache Table Definition
Cache Module Cache (tbl def.)

Handler Interface

MyISAM InnoDB Memory NDB PBXT Aria XtraDB Federated-X ...

[Link] 22
HANDLER Example
# MySQL
# SELECT * FROM family;
HANDLER tbl OPEN
HANDLER family OPEN;
HANDLER tbl READ idx (..., ..., …)
HANDLER family
  WHERE ... LIMIT ...
   READ `PRIMARY` = (id)
  WHERE id = 1;
HANDLER tbl READ idx FIRST
HANDLER family CLOSE;
  WHERE ... LIMIT ...
HANDLER tbl READ idx NEXT
  WHERE ... LIMIT ...
# With MariaDB 5.3
HANDLER tbl READ idx PREV
  WHERE ... LIMIT ...
HANDLER family OPEN;
HANDLER tbl READ idx LAST
PREPARE stmt
  WHERE ... LIMIT ...
   FROM 'HANDLER family
            READ `PRIMARY` = (id)
HANDLER tbl READ FIRST
           WHERE id = ?';
  WHERE ... LIMIT ...
set @id=1;
HANDLER tbl READ NEXT
EXECUTE stmt USING @id;
  WHERE ... LIMIT ...
DEALLOCATE PREPARE stmt;
HANDLER family CLOSE;
HANDLER tbl CLOSE
Use persistent connections!!!

[Link] 23
Characteristics of the Handler
Interface
● HANDLER is faster than SELECT:
● Less parsing involved
● No optimizer overhead
● Less query-checking overhead
● The table does not have to be locked between two handler
requests
● No consistent look of the data (dirty reads are permitted)
● Some optimizations possible that SELECT does not allow
● Traverse the database in a manner that is difficult (or even
impossible) to accomplish with SELECT

[Link] 24
A Graph Storage Engine
● May 5, 2009, Arjen Lentz: OQGRAPH
Computation Engine for MySQL, MariaDB &
Drizzle

● It's included in MariaDB 5.1 ff.


● And available for MySQL 5.0 ff.
[Link] 25
How does it feel?
● It is similar to MEMORY SE (persistency, locking, trx)
● We talk in: Node
● Node/Item/vertex and
● Edge/connection/link
● Edges have a direction
Edge
● We can do networks and hierarchies
● (family relations, friends of friends, fastest way from a to b)
● To talk to the OQGRAPH SE we use the latches (which
algorithm to use)
● It is a computational engine not a storage engine!

[Link] 26
Simple example: My family
SELECT [Link] AS parent, [Link] AS child
INSERT INTO family VALUES   FROM relation AS r
  (1, 'Grand­grand­ma')   JOIN family f1 ON [Link] = [Link]
, (2, 'Grand­ma')   JOIN family f2 ON [Link] = [Link];
, (3, 'Grand­uncle')
, (4, 'Grand­aunt') +­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
, (5, 'Grand­pa') | parent         | child       |
, (6, 'Mother') +­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
, (7, 'Uncle 1') | Grand­grand­ma | Grand­ma    |
, (8, 'Uncle 2') | Grand­grand­ma | Grand­uncle |
, (9, 'Father') | Grand­grand­ma | Grand­aunt  |
, (10, 'Me') | Grand­ma       | Mother      |
, (11, 'Sister'); | Grand­ma       | Uncle 1     |
| Grand­ma       | Uncle 2     |
INSERT INTO relation (origid, destid) | Grand­pa       | Mother      |
VALUES | Grand­pa       | Uncle 1     |
  (1, 2), (1, 3), (1, 4) | Grand­pa       | Uncle 2     |
, (2, 6), (2, 7), (2, 8) | Mother         | Me          |
, (5, 6), (5, 7), (5, 8) | Mother         | Sister      |
, (6, 10), (6, 11) | Father         | Me          |
, (9, 10), (9, 11); | Father         | Sister      |
+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+

[Link] 27
Network queries

SELECT [Link], [Link], [Link]
  FROM relation AS r
SELECT GROUP_CONCAT([Link] SEPARATOR ' ­> ')   JOIN family AS f ON ([Link] = [Link])
       AS path
       AS path  WHERE [Link] = 2
  FROM relation AS r
  FROM relation AS r
   AND [Link] = 10;
  JOIN family AS f ON ([Link] = [Link])
  JOIN family AS f ON ([Link] = [Link])
 WHERE latch = 1
   AND origid = 1
   AND origid = 1
   AND destid = 10
   AND destid = 10 +­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­­­+
ORDER BY seq; | weight | seq  | name           |
+­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­­­+
|      3 |    6 | Grand­grand­ma |
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ |      2 |    5 | Grand­pa       |
| path                                       | |      2 |    4 | Grand­ma       |
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ |      1 |    3 | Father         |
| Grand­grand­ma ­> Grand­ma ­> Mother ­> Me | |      1 |    2 | Mother         |
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+
|      0 |    1 | Me             |
+­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­­­+
latch = 1: Find shortest path (Dijkstra)
latch = 1: Find shortest path (Dijkstra)
latch = 2: Find originating nodes
           (Breadth­first search)

[Link] 28
Resume
● SQL is good for complex queries
● NoSQL is typically for simple queries
● Be careful with performance numbers!
● Architecture / coding becomes more
complex
● You can gain better performance

● But it is interesting like hell!


[Link] 29
Literature
● Using MySQL as a NoSQL - A story for exceeding 750,000 qps on a commodity server:
[Link]
● 950k reads per second on 1 datanode: [Link]
[Link]
● Scalable BLOB Streaming Infrastructure for MySQL and Drizzle:
[Link]
● HandlerSocket: Why did our version not take off?
[Link]
● Using MySQL as a NoSQL: a story for exceeding 450000 qps with MariaDB:
[Link]
● HANDLER Syntax: [Link]
● GRAPH Computation Engine – Documentation: [Link]

[Link] 30
Q&A

Questions ?

Discussion?

We have some slots free to provide


you personal consulting services...

[Link] 31

You might also like