libdrizzle lua nginx

Upload: m8r-gss7pa

Post on 05-Apr-2018

242 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/2/2019 Libdrizzle Lua Nginx

    1/140

    Scripting libdrizzle with Lua inside Nginx

  • 8/2/2019 Libdrizzle Lua Nginx

    2/140

    Scripting libdrizzle with Lua

    inside Nginx

    (agentzh)[email protected]

    2012.4

  • 8/2/2019 Libdrizzle Lua Nginx

    3/140

    "MySQL is always the bottleneck !"Really?!"

  • 8/2/2019 Libdrizzle Lua Nginx

    4/140

  • 8/2/2019 Libdrizzle Lua Nginx

    5/140

  • 8/2/2019 Libdrizzle Lua Nginx

    6/140

    Some benchmarks onAmazon EC2 Small instances

  • 8/2/2019 Libdrizzle Lua Nginx

    7/140

  • 8/2/2019 Libdrizzle Lua Nginx

    8/140

    A Slow MySQL Query

    select sleep (1)

  • 8/2/2019 Libdrizzle Lua Nginx

    9/140

    Amazon Linux AMI 2011.09

    nginx 1.0.14

    php-fpm 5.3.10

  • 8/2/2019 Libdrizzle Lua Nginx

    10/140

  • 8/2/2019 Libdrizzle Lua Nginx

    11/140

  • 8/2/2019 Libdrizzle Lua Nginx

    12/140

  • 8/2/2019 Libdrizzle Lua Nginx

    13/140

  • 8/2/2019 Libdrizzle Lua Nginx

    14/140

    A Fast MySQL Query

    with a Small Resultset

    select *

    from world.City order by ID limit 1

  • 8/2/2019 Libdrizzle Lua Nginx

    15/140

  • 8/2/2019 Libdrizzle Lua Nginx

    16/140

  • 8/2/2019 Libdrizzle Lua Nginx

    17/140

    A Fast MySQL Query

    with a Big Resultset (100 KBytes)

    select * from world.City order by ID limit 1000

  • 8/2/2019 Libdrizzle Lua Nginx

    18/140

  • 8/2/2019 Libdrizzle Lua Nginx

    19/140

  • 8/2/2019 Libdrizzle Lua Nginx

    20/140

  • 8/2/2019 Libdrizzle Lua Nginx

    21/140

    We integrated libdrizzle directly into Nginx !

    http://wiki.nginx.org/HttpDrizzleModule

  • 8/2/2019 Libdrizzle Lua Nginx

    22/140

  • 8/2/2019 Libdrizzle Lua Nginx

    23/140

  • 8/2/2019 Libdrizzle Lua Nginx

    24/140

  • 8/2/2019 Libdrizzle Lua Nginx

    25/140

  • 8/2/2019 Libdrizzle Lua Nginx

    26/140

  • 8/2/2019 Libdrizzle Lua Nginx

    27/140

    Let's just mud with nginx.conf ,the Nginx configuration file

  • 8/2/2019 Libdrizzle Lua Nginx

    28/140

    upstream my_mysql_backend {

    drizzle_server 127.0.0.1:3306 dbname= test

    password= some_pass user= monty protocol= mysql ;

    # a connection pool that can cache up to # 200 mysql TCP connections drizzle_keepalive max=200 overflow= reject

    }

  • 8/2/2019 Libdrizzle Lua Nginx

    29/140

    location ~ '^/cat/(.*)' {

    set $name $1 ; set_quote_sql_str $quoted_name $name ; drizzle_query "select * from cats where name= $quoted_name " ;

    drizzle_pass my_mysql_backend;

    rds_json on;}

  • 8/2/2019 Libdrizzle Lua Nginx

    30/140

    $ curl 'http://localhost/cat/Jerry'[{"name":"Jerry","age":1}]

  • 8/2/2019 Libdrizzle Lua Nginx

    31/140

    The dynamic SQL Query for

    This Request

    select *

    from cats where name= 'Jerry'

  • 8/2/2019 Libdrizzle Lua Nginx

    32/140

  • 8/2/2019 Libdrizzle Lua Nginx

    33/140

    The Slow MySQL Query again!

    select sleep (1)

  • 8/2/2019 Libdrizzle Lua Nginx

    34/140

  • 8/2/2019 Libdrizzle Lua Nginx

    35/140

  • 8/2/2019 Libdrizzle Lua Nginx

    36/140

  • 8/2/2019 Libdrizzle Lua Nginx

    37/140

    The Fast MySQL Query

    with a Small Resultset Again!

    select * from world.City order by ID limit 1

  • 8/2/2019 Libdrizzle Lua Nginx

    38/140

  • 8/2/2019 Libdrizzle Lua Nginx

    39/140

  • 8/2/2019 Libdrizzle Lua Nginx

    40/140

    The Fast MySQL Query

    with a Big Resultset (100 KBytes) Again!

    select * from world.City order by ID limit 1000

  • 8/2/2019 Libdrizzle Lua Nginx

    41/140

  • 8/2/2019 Libdrizzle Lua Nginx

    42/140

  • 8/2/2019 Libdrizzle Lua Nginx

    43/140

    We also embedded Lua and LuaJIT directly into Nginx !

    http://wiki.nginx.org/HttpLuaModule

  • 8/2/2019 Libdrizzle Lua Nginx

    44/140

  • 8/2/2019 Libdrizzle Lua Nginx

    45/140

    Use the Lua language to accessthe ngx_drizzle module!

  • 8/2/2019 Libdrizzle Lua Nginx

    46/140

  • 8/2/2019 Libdrizzle Lua Nginx

    47/140

    location = /api { content_by_lua '

    local rds_parser = require "rds.parser"local cjson = require "cjson"

    local resp = ngx.location.capture ("/cat/Jerrylocal data, err = rds_parser.parse(res.body)ngx.print(cjson.encode(data.resultset))

    ';}

  • 8/2/2019 Libdrizzle Lua Nginx

    48/140

    $ curl 'http://localhost/api'[{"name":"Jerry","age":1}]

  • 8/2/2019 Libdrizzle Lua Nginx

    49/140

    The Fast MySQL Query

    with a Small Resultset Revisited!

    select * from world.City order by ID limit 1

  • 8/2/2019 Libdrizzle Lua Nginx

    50/140

  • 8/2/2019 Libdrizzle Lua Nginx

    51/140

  • 8/2/2019 Libdrizzle Lua Nginx

    52/140

    The Fast MySQL Query

    with a Big Resultset (100 KBytes) Again!

    select * from world.City order by ID limit 1000

  • 8/2/2019 Libdrizzle Lua Nginx

    53/140

  • 8/2/2019 Libdrizzle Lua Nginx

    54/140

  • 8/2/2019 Libdrizzle Lua Nginx

    55/140

    I just implemented the Lua cosocket API !

    http://wiki.nginx.org/HttpLuaModule#ngx.socket.tcp

  • 8/2/2019 Libdrizzle Lua Nginx

    56/140

    !! a socket API based on Lua coroutines!! a socket API that is synchronous !! a socket API that is nonblocking

  • 8/2/2019 Libdrizzle Lua Nginx

    57/140

  • 8/2/2019 Libdrizzle Lua Nginx

    58/140

    I wrote the lua-resty-mysql librarybased on the cosocket API.

    http://github.com/agentzh/lua-resty-mysql

  • 8/2/2019 Libdrizzle Lua Nginx

    59/140

    It is a pure Lua MySQL driverwritten from scratch !

    l l l i " l"

  • 8/2/2019 Libdrizzle Lua Nginx

    60/140

    local resty_mysql = require "resty.mysql"

    local mysql = resty_mysql:new()

    local ok, err = mysql:connect{host = "127.0.0.1" ,port = 3306 ,

    database = "world" ,user = "monty" ,password = "some_pass"

    }

  • 8/2/2019 Libdrizzle Lua Nginx

    61/140

    local query = "select * from cats"

    local rows, err, errno, sqlstate = mysql:query(query)

    for i, row in ipairs(rows) do

    -- process the row table end

  • 8/2/2019 Libdrizzle Lua Nginx

    62/140

    -- add the current MySQL connection

    -- into the per-worker connection pool, -- with total capacity of 1024 connections and -- 60 seconds maximal connection idle time

    local ok, err = mysql:set_keepalive( 60000 , 1024

  • 8/2/2019 Libdrizzle Lua Nginx

    63/140

    The Slow MySQL Query Revisited!

    select sleep (1)

  • 8/2/2019 Libdrizzle Lua Nginx

    64/140

  • 8/2/2019 Libdrizzle Lua Nginx

    65/140

  • 8/2/2019 Libdrizzle Lua Nginx

    66/140

  • 8/2/2019 Libdrizzle Lua Nginx

    67/140

    The Fast MySQL Querywith a Small Resultset Revisited!

    select * from world.City order by ID limit 1

  • 8/2/2019 Libdrizzle Lua Nginx

    68/140

  • 8/2/2019 Libdrizzle Lua Nginx

    69/140

  • 8/2/2019 Libdrizzle Lua Nginx

    70/140

    The Fast MySQL Querywith a Big Resultset (100 KBytes) Revisited!

    select * from world.City

    order by ID limit 1000

  • 8/2/2019 Libdrizzle Lua Nginx

    71/140

  • 8/2/2019 Libdrizzle Lua Nginx

    72/140

  • 8/2/2019 Libdrizzle Lua Nginx

    73/140

    How about comparing withthe NodeJS world?

  • 8/2/2019 Libdrizzle Lua Nginx

    74/140

  • 8/2/2019 Libdrizzle Lua Nginx

    75/140

  • 8/2/2019 Libdrizzle Lua Nginx

    76/140

  • 8/2/2019 Libdrizzle Lua Nginx

    77/140

  • 8/2/2019 Libdrizzle Lua Nginx

    78/140

  • 8/2/2019 Libdrizzle Lua Nginx

    79/140

    Caching responses with

    ngx_srcache + ngx_memc http://wiki.nginx.org/HttpSRCacheModule

    http://wiki.nginx.org/HttpMemcModule

  • 8/2/2019 Libdrizzle Lua Nginx

    80/140

    # configure the cache storage location

  • 8/2/2019 Libdrizzle Lua Nginx

    81/140

    g g location /memc {

    internal ; set $memc_key $query_string ;

    set $memc_exptime 300;

    memc_pass 127.0.0.1:11211;}

    location = /api {

  • 8/2/2019 Libdrizzle Lua Nginx

    82/140

    location = /api {

    set $key "$uri?$args" ;

    srcache_fetch GET /memc $key ; srcache_store PUT /memc $key ;

    # drizzle_pass/fastcgi_pass/content_by_lua/...}

  • 8/2/2019 Libdrizzle Lua Nginx

    83/140

  • 8/2/2019 Libdrizzle Lua Nginx

    84/140

  • 8/2/2019 Libdrizzle Lua Nginx

    85/140

  • 8/2/2019 Libdrizzle Lua Nginx

    86/140

    Find the source forall the benchmarks given here:

    http://github.com/agentzh/mysql-driver-benchmark

  • 8/2/2019 Libdrizzle Lua Nginx

    87/140

    Any questions ?

    http://openresty.org

    https://groups.google.com/group/openresty

  • 8/2/2019 Libdrizzle Lua Nginx

    88/140

  • 8/2/2019 Libdrizzle Lua Nginx

    89/140

  • 8/2/2019 Libdrizzle Lua Nginx

    90/140

  • 8/2/2019 Libdrizzle Lua Nginx

    91/140

  • 8/2/2019 Libdrizzle Lua Nginx

    92/140

  • 8/2/2019 Libdrizzle Lua Nginx

    93/140

  • 8/2/2019 Libdrizzle Lua Nginx

    94/140

  • 8/2/2019 Libdrizzle Lua Nginx

    95/140

  • 8/2/2019 Libdrizzle Lua Nginx

    96/140

  • 8/2/2019 Libdrizzle Lua Nginx

    97/140

  • 8/2/2019 Libdrizzle Lua Nginx

    98/140

  • 8/2/2019 Libdrizzle Lua Nginx

    99/140

  • 8/2/2019 Libdrizzle Lua Nginx

    100/140

  • 8/2/2019 Libdrizzle Lua Nginx

    101/140

  • 8/2/2019 Libdrizzle Lua Nginx

    102/140

  • 8/2/2019 Libdrizzle Lua Nginx

    103/140

  • 8/2/2019 Libdrizzle Lua Nginx

    104/140

  • 8/2/2019 Libdrizzle Lua Nginx

    105/140

  • 8/2/2019 Libdrizzle Lua Nginx

    106/140

  • 8/2/2019 Libdrizzle Lua Nginx

    107/140

  • 8/2/2019 Libdrizzle Lua Nginx

    108/140

  • 8/2/2019 Libdrizzle Lua Nginx

    109/140

  • 8/2/2019 Libdrizzle Lua Nginx

    110/140

  • 8/2/2019 Libdrizzle Lua Nginx

    111/140

  • 8/2/2019 Libdrizzle Lua Nginx

    112/140

  • 8/2/2019 Libdrizzle Lua Nginx

    113/140

  • 8/2/2019 Libdrizzle Lua Nginx

    114/140

  • 8/2/2019 Libdrizzle Lua Nginx

    115/140

  • 8/2/2019 Libdrizzle Lua Nginx

    116/140

  • 8/2/2019 Libdrizzle Lua Nginx

    117/140

  • 8/2/2019 Libdrizzle Lua Nginx

    118/140

  • 8/2/2019 Libdrizzle Lua Nginx

    119/140

  • 8/2/2019 Libdrizzle Lua Nginx

    120/140

  • 8/2/2019 Libdrizzle Lua Nginx

    121/140

  • 8/2/2019 Libdrizzle Lua Nginx

    122/140

  • 8/2/2019 Libdrizzle Lua Nginx

    123/140

  • 8/2/2019 Libdrizzle Lua Nginx

    124/140

  • 8/2/2019 Libdrizzle Lua Nginx

    125/140

  • 8/2/2019 Libdrizzle Lua Nginx

    126/140

  • 8/2/2019 Libdrizzle Lua Nginx

    127/140

  • 8/2/2019 Libdrizzle Lua Nginx

    128/140

  • 8/2/2019 Libdrizzle Lua Nginx

    129/140

  • 8/2/2019 Libdrizzle Lua Nginx

    130/140

  • 8/2/2019 Libdrizzle Lua Nginx

    131/140

  • 8/2/2019 Libdrizzle Lua Nginx

    132/140

  • 8/2/2019 Libdrizzle Lua Nginx

    133/140

  • 8/2/2019 Libdrizzle Lua Nginx

    134/140

  • 8/2/2019 Libdrizzle Lua Nginx

    135/140

  • 8/2/2019 Libdrizzle Lua Nginx

    136/140

  • 8/2/2019 Libdrizzle Lua Nginx

    137/140

  • 8/2/2019 Libdrizzle Lua Nginx

    138/140

  • 8/2/2019 Libdrizzle Lua Nginx

    139/140

  • 8/2/2019 Libdrizzle Lua Nginx

    140/140