WebClusters, Redis

2,290 views

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,290
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide
  • dlaczego go nie potrzebujesz dzisiaj, ale jeśli masz szczęście - możesz potrzebować go jutro\nnie chce was zniechecic - raczej pokazac dlaczego jest to trudne\n
  • dziękuję za zaproszenie, 100% ruby, okolice Javy, Freeport Metrics, pozostałe 100% obj-c\njestem praktykiem, nie teoretykiem - nie jestem z wykształcenia informatykiem w prezentacji będzie dużo skrótów, uproszczeń i założeń a priori - bo to zbyt szeroki temat na niecałe pół godziny, a ja nie jestem aż tak mądry ;-)\n
  • \n
  • redis to nosql\nplotki o śmierci SQL-a są mocno przesadzone\nbo i skala problemów wymagających nosqla jest ograniczone\n
  • bo może działać jak klucz wartość, optymalizuje wartości, jest szybki i milusi\n\n
  • bo wartością może być także jedna ze struktur, które istnieją w Redisie\nnie tylko proste łańcuchy tekstowe\n
  • \n
  • \n
  • to nie będzie łatwa prezentacja - redis, mimo, że to jeden system to ze względe na liczne gałęzie i eksperymentalne funkcje\nwymaga czasu na jego poznanie i dostosowanie\nten ekran jest już dawno nieaktualny - prezentację zacząłem przygotowywać miesiąc temu\n
  • A system rozwija się ciągle. to jest wiadomość z wczorajszego poranka\nwarto śledzić jego rozwój\n
  • \n
  • \n
  • \n
  • w redisie możemy też trzymać (jako stringi) integery. i wykonywać na nich operacje\n
  • można też modyfikować wartości łańcuchów tekstowych\n
  • sorted by insertion order\nlisty z blokowaniem wartości, rpoplpush\nbodaj najpopularniejsze zastosowanie redisa w sferze usług - kolejki wiadomości\n
  • \n
  • \n
  • zbiór, możliwe ciekawe operacje UNION, INTERSECTION\n
  • można mieć zastrzeżenia co do wydajności\n
  • \n
  • sortowane zbiory\nrzecz, która wykorzystaliśmy w Blipie\n
  • \n
  • \n
  • \n
  • protokół Redisa zwraca podstawowe wartości\nzakłada obsługę tego po stronie klienta\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • snapshot - tworzony jest fork, redis zapisuje stan swojej bazy do pliku binarnego\naof - zapisuje każdą komendę do pliku - 100% pewności odzyskania danych, bardzo długi proces ładowania\naof - możliwy jest rewrite\n
  • dla snapshotu\nna żądanie - komendy SAVE lub BGSAVE\nokresowa - jeśli w określonym przedziale czasu doszło do zmian w X kluczy\n
  • po co replikacja? - zabezpieczenie przed padem\nskalowanie ciężkich operacji - SORT\nreplikacja nie blokuje mastera - replikacja blokuje slave’a\n
  • master może mieć wiele slave’ów\nslave może być masterem dla kolejnego zestawu slave’ów\nprzykładowo - mamy zestaw master / slave-slave / slave-slave - zapisujemy dane tylko na ostatnim etapie\n
  • \n
  • bez pipeliningu - czekamy na odpowiedź na każde żądanie\nwkładamy dane - odpowiedź, wkładamy - odpowiedź\n
  • ale prędzej czy później to może być za mało - wydajność będzie spadać\n
  • bez pipeliningu - czekamy na odpowiedź na każde żądanie\nwkładamy dane - odpowiedź, wkładamy - odpowiedź\n
  • \n
  • minimalne wymaganie redisa - wszystkie klucze zawsze muszą być w pamięci\nale całą resztę można trzymać w pamięci wirtualnej\nwarto się zastanowić czy lepiej nie skorzystać z hashy\nale jeśłi nie zależy nam na wydajności - można ustawić zerową pamięć dla wartości\n
  • \n
  • \n
  • poszczególny węzły w klastrze rozmawiają ze sobą protokołem binarnym\nnormalnie redis korzysta z protokołu tekstowego - tutaj zostało to zoptymalizowane\n
  • klaster redisa jest dzielony na 4096 slotów na hashe\nw momencie tworzenia klastra należy sloty do poszczególnych instancji\n
  • tutaj dla ułatwienia - podzielimy sobie na 6 slotów, które zostaną rozłożone na 3 węzłach\n
  • klastrowanie - dummy client\n
  • klastrowanie - sprytny klient\n
  • automatyczne zarządzanie klastrem\nnarzędzie pomagające w tworzeniu klastra\nsprawdzenie zgodności klastra\ndodawanie nowych elementów do klastra\n
  • jak się to ma do memcached?\nzależy od zastosowania.\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • każdy z testów to 100000 operacji\n
  • \n
  • każdy z testów to 100000 operacji\n
  • \n
  • Resque is a Redis-backed Ruby library for creating background jobs, placing those jobs on multiple queues, and processing them later.\nJedno z pierwszych narzędzie powstałych dzięki Redisowi.\nUżywane w GitHubie\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • bill gates twierdzi, że powiedział wiele głupich rzeczy\nale tego nie,\nfragmentacja która jest rozwiązywana za pomocą różnych malloców\n
  • redis bardzo dobrze optymalizuje liczby - nie trzyma ich w pamięci jako stringi\n
  • w zależności od potrzeb - lepiej skompilować Redisa w 32bitowej architekturze\n
  • monitoruj, naucz się\nto nowa zabawka, zwykle działa - problemem nie jest stabilność, bo ta jest wyśmienita.\n
  • \n
  • skrypty lua\n
  • funkcjonalność eksperymentalna\n
  • język skryptowy pierwotnie zaprojektowany dla rozszerzenia funkcjonalności różnych aplikacji, jednak często używany jako samodzielny język.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • WebClusters, Redis

    1. 1. serwer struktur danych w praktyce
    2. 2. CZEŚĆ!jestem filip.
    3. 3. PLAN co to jest redis? typy danych zabójcze cechyredis a memcached redis w praktyce tips & tricks
    4. 4. NOSQL
    5. 5. REDIS TO...zaawansowany system klucz-wartość
    6. 6. REDIS TO...serwer struktur danych
    7. 7. @ANTIREZ @pnoordhuis
    8. 8. YYY...
    9. 9. STRUKTURY DANYCH
    10. 10. STRING
    11. 11. STRINGredis> SET my:key "value"redis> GET my:key"value"
    12. 12. STRINGredis> SET my:incr "10"redis> INCR my:incrredis> GET my:incr"11"
    13. 13. STRINGredis> SET hello:world "Web"redis> APPEND hello:world "Clusters"redis> GET hello:world"WebClusters"redis> GETRANGE hello:world 0 2"Web"
    14. 14. LIST
    15. 15. LISTredis> LPUSH list aredis> LPUSH list bredis> RPUSH list credis> LRANGE list 0 21) "b"2) "a"3) "c
    16. 16. LISTredis> LPUSH list aredis> LPUSH list bredis> RPUSH list credis> RPOPLPUSH list other:list"a"redis> LRANGE list 0 31) "c"2) "b"redis> LRANGE other:list 0 31) "a"
    17. 17. SET
    18. 18. SETredis> SADD post:1:tag "ruby"redis> SADD post:1:tag "rails"redis> SADD post:1:tag "redis"redis> SADD post:2:tag "redis"redis> SADD post:2:tag "resque"redis> SINTER post:1:tag post:2:tag1) "redis"
    19. 19. SETredis> SADD post:1:tag "ruby"redis> SADD post:1:tag "rails"redis> SADD post:1:tag "redis"redis> SADD post:2:tag "redis"redis> SADD post:2:tag "resque"redis> SUNIONSTORE tag post:1:tag post:2:tagredis> SMEMBERS tag1) "rails"2) "redis"3) "resque"4) "ruby"
    20. 20. ZSET
    21. 21. ZSETredis> ZADD zset 1 3redis> ZADD zset 2 2redis> ZADD zset 3 1redis> ZRANGE zset 0 -11) "3"2) "2"3) "1"
    22. 22. HASH
    23. 23. HASHredis> HMSET hash string:1 Hellostring:2 WebClustersredis> HGETALL hash1) "string:1"2) "Hello"3) "string:2"4) "WebClusters"
    24. 24. HASHredis> HSET hash string:1 Byeredis> HSET hash string:3 2011redis> HGETALL hash1) "string:1"2) "Bye"3) "string:2"4) "WebClusters"5) "string:3"6) "2011"
    25. 25. RTFM
    26. 26. ZABÓJCZE CECHY
    27. 27. TRANSAKCJE
    28. 28. TRANSAKCJEredis> SET account:1 30redis> SET account:2 45redis> MULTIredis> INCRBY account:1 15QUEUEDredis> DECRBY account:2 15QUEUEDredis> EXEC1) (integer) 452) (integer) 30
    29. 29. PERSYSTENCJA
    30. 30. PERSYSTENCJA snapshot append-only file
    31. 31. PERSYSTENCJA na żądanie okresowa
    32. 32. REPLIKACJA
    33. 33. REPLIKACJA
    34. 34. PIPELINING
    35. 35. PIPELINING
    36. 36. http://www.flickr.com/photos/chadelliott2012/5659144073/
    37. 37. PIPELINING
    38. 38. PAMIĘĆ WIRTUALNA
    39. 39. PAMIĘĆ WIRTUALNA
    40. 40. KLASTROWANIE
    41. 41. http://www.flickr.com/photos/15708236@N07/2754478731/
    42. 42. http://www.flickr.com/photos/dan4th/301092024/
    43. 43. 4096 #
    44. 44. KLASTROWANIE
    45. 45. KLASTROWANIEredis> #1 GET foo-MOVED 3 192.168.1.1:6391redis> #2 GET foo"bar"
    46. 46. KLASTROWANIEredis> #1 CLUSTER HINTS* magic *redis> #2 GET foo"bar"
    47. 47. REDIS-TRIB
    48. 48. MEMCACHED?
    49. 49. X 100 000
    50. 50. SETmemcached redis6.926125 s 8.470477 s
    51. 51. PIPELINE SETmemcached redis6.926125 s 0.916335 s
    52. 52. GETmemcached redis6.904938 s 7.572058 s
    53. 53. PIPELINE GETmemcached redis6.904938 s 0.651953 s
    54. 54. MGETmemcached redis1.010348 s 0.185136 s
    55. 55. RAMmemcached redis 436 KB 1.1 MB
    56. 56. RAMk 17 - 22 bajtyv 19 - 24 bajty
    57. 57. STRINGmemcached redis 14 MB 13.9 MB
    58. 58. INTEGERmemcached redis 11 MB 10.7 MB
    59. 59. HASH"an-average-key-1" => "1""an-average-key" => "1": "1"
    60. 60. HASHmemcached redis 11 MB 9 MB
    61. 61. PRAKTYKA
    62. 62. RESQUE
    63. 63. RESTMQ
    64. 64. TWITTER
    65. 65. WHO’S ONLINE?
    66. 66. STATYSTYKI
    67. 67. WYSZUKIWANIE
    68. 68. SOCIAL GRAPH
    69. 69. TIPS & TRICKS
    70. 70. 640K ought to beenough for anybody
    71. 71. 3 != “3”
    72. 72. 32 > 64 W BITACH
    73. 73. http://www.flickr.com/photos/memestate/45986749/
    74. 74. ONE MORE THING
    75. 75. http://www.flickr.com/photos/15708236@N07/2754478731/
    76. 76. -- hello.lua-- the first program in every languageio.write("Hello world, from ",_VERSION,"!n")
    77. 77. redis = Redis.newscript = <<LUA local value = tonumber(redis.call(get,KEYS[1])) if value == nil then return {err = "Value atkey is not integer"} end if value > tonumber(ARGV[1]) then value = value - 1 redis.call(set, KEYS[1], value) end return valueLUAredis.set :x, 45.times { puts(redis.eval(script, 1, :x, 0)) }
    78. 78. ~/Code/webclusters-redis master $ ./run lua.rb32100
    79. 79. https://github.com/filiptepper/webclusters-redis
    80. 80. O CZYM ZAPOMNIAŁEM?

    ×