Статьи

Введення в Riak .: Частина 2. Інтеграція Riak як потужного кеш-сервера для Web-додатків

  1. Серія контенту:
  2. Цей контент є частиною серії: Введення в Riak.
  3. Інші статті даної серії
  4. Інтеграція в Web-сайт
  5. Малюнок 1. Проста інтеграція в Web-сайт
  6. Малюнок 2. Приклад форми для створення ставки
  7. Лістинг 1. Приклад PHP-коду для інтеграції з Riak
  8. Лістинг 2. Витяг елемента з Riak
  9. Безпосередня обробка запитів
  10. Лістинг 3. Приклад використання клієнтської JavaScript-бібліотеки в Riak
  11. Використання Riak для кешування
  12. Лістинг 4. Використання серверної системи Memory
  13. Щось шукаєте?
  14. Лістинг 5. Пошук в сегменті odds ставок на скачки
  15. висновок
  16. Ресурси для скачування

Введення в Riak.

Використання Riak як кеш-сервера для зменшення навантаження на сервери додатків і баз даних

Серія контенту:

Цей контент є частиною # з серії # статей: Введення в Riak.

https://www.ibm.com/developerworks/ru/views/global/libraryview.jsp?series_title_by=Введение+в+riak.

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Введення в Riak.

Слідкуйте за виходом нових статей цієї серії.

Характер доступ до певного типу даних робить їх ідеальним об'єктом для кешування. Наприклад, сайти інтерактивних ставок мають цікаві характеристики навантаження: ставки і набори подій запитуються часто, але оновлюються відносно рідко.

Інші статті даної серії

Перегляньте інші статті серії jsp?search_by=Introducing+Riak> Введення в Riak (EN).

У таких ситуаціях для роботи з великими навантаженнями потрібна добре масштабована система з наступними характеристиками:

  • Система виступає як надійна кеш-пам'ять для зменшення навантаження на сервери додатків і баз даних.
  • За кешуватися елементам можна виконувати пошук, так що їх можна оновлювати і анулювати.
  • Рішення легко інтегрується в існуючий сайт.

Система Riak - це хороший вибір для такого рішення.

Riak є не єдиним кандидатом для реалізації такого рішення; існує багато інших кеш-рішень. Одним з популярних рішень є memcached; проте memcached, на відміну від Riak, не забезпечує реплікацію даних, а це значить, що в разі зупинки сервера, що зберігає конкретний елемент, цей елемент стає недоступним. Redis, ще одне популярне сховище пар ключ / значення, яке можна використовувати в якості кеш-пам'яті, підтримує реплікацію за допомогою конфігурації головний-підлеглий; Riak не має концепції головного (master) вузла, що робить систему відмовостійкої.

Інтеграція в Web-сайт

Будь-яке рішення повинно легко інтегруватися в існуючий Web-сайт. Це дуже важливо, оскільки іноді перенести всі існуючі дані в Riak неможливо (або навіть небажано). Як згадувалося раніше, деякі типи даних ідеально підходять для кешування, зокрема, дані сховища ключ-значення з доступом по первинному ключу. Такий тип даних найбільше підходить для перенесення в Riak.

Як говорилося в першій частині (EN) даної серії статей, є кілька бібліотек на PHP, Ruby і Java ™, які надають програмний інтерфейс, сильно спрощує інтеграцію з Riak. В даному прикладі я продемонструю використання PHP-бібліотеки і покажу, як інтегрувати Riak з існуючим Web-сайтом.

на малюнку 1 показана конфігурація системи для даного прикладу. Я опустив деякі деталі, такі як розподіл навантаження, мережевий екран і т.д. В даному випадку сервери самі по собі є простими інтерфейсними системами з встановленим на них стеком програм LAMP.

Передбачається, що Riak використовується тільки зсередини (недоступна ззовні) і працює в дружньому середовищі, тобто відсутні завдання, пов'язані з безпекою, такі як аутентифікація. Це не таке погане припущення, як може здатися, оскільки Riak все одно не має будь-якої вбудованої авторизації; на практиці функції аутентифікації та інші функції безпеки слід делегувати додатком.

Малюнок 1. Проста інтеграція в Web-сайт

Нижче наведено базовий приклад інтеграції Riak в існуючий Web-сайт. Ми створимо просту форму, яка після відправки буде використовувати PHP-клієнт для збереження об'єкта в Riak, грунтуючись на введених в форму значеннях.

на малюнку 2 наведено приклад простої форми, яку адміністратор може використовувати для створення сторінки введення ставок в системі. Створіть цю форму на HTML і реалізуйте в ній запит POST до PHP-сценарієм, наведеним в лістингу 1 ; в якості відправної точки можна використовувати аналогічну форму з вихідного коду , Що супроводжує дану статтю. Поле key, заповнене в формі, буде використовуватися в якості ключа для збереження об'єкта в області пам'яті.

Малюнок 2. Приклад форми для створення ставки

В лістингу 1 наведено приклад PHP-коду, який демонструє використання бібліотеки PHP-клієнта для інтеграції з Riak. Замініть шлях до бібліотеки PHP-клієнта, зазначений у require_once, на ваш шлях до каталогу установки бібліотеки. В даному випадку я помістив її в той же каталог, в якому знаходиться PHP-сценарій. За замовчуванням всі клієнтські бібліотеки для доступу до Riak використовують порт 8098.

Лістинг 1. Приклад PHP-коду для інтеграції з Riak
<? Php require_once ( './ riak.php'); # Тут можна реалізувати перевірку того, чи має поточний користувач # відповідні повноваження. Делегована в додаток. $ Client = new RiakClient ( '192.168.1.1', 8098); $ Bucket = $ client-> bucket ( 'odds'); $ Bet = $ bucket-> newObject ($ _ POST [ 'key']); $ Data = array ( 'odds' => $ _POST [ 'odds'], 'description' => $ _POST [ 'description']); $ Bet-> setData ($ data); # Зберегти об'єкт в Riak $ bet-> store (); echo "Thanks!&quot;; ?>

Збережіть код в PHP-файл (дайте йому будь-яке ім'я) і завантажте його і форму десь на вашому Web-сайті (наприклад, на http://www.yoursite.com/riak-test.php). Заповніть приклад форми і відправте її. Для перевірки працездатності форми спробуйте витягти елемент безпосередньо з Riak, використовуючи введену при створенні елемента ключ (див. лістинг 2 ).

Лістинг 2. Витяг елемента з Riak
$ Curl -i http: // localhost: 8098 / riak / odds / <key> ... { "odds": "", "description": ""}

У цьому прикладі інтеграції використовувався PHP-клієнт, але підхід аналогічний і для інших мов і прикладних середовищ (наприклад, Java або Ruby on Rails).

Безпосередня обробка запитів

Для інтеграції Riak в наявний Web-сайт крім клієнтських бібліотек можна застосовувати для користувача запити безпосередньо з Riak, використовуючи її в якості простого HTTP-механізму. Для демонстрації такої можливості я створю просте додаток, яке може запитувати сторінки безпосередньо з Riak.

завантажте вихідний код до даної статті. Переконайтеся, що Riak запущена, і виконайте сценарій load.sh. Цей сценарій скопіює все HTML- і JavaScript-файли в сегмент під ім'ям demo. В даному прикладі використовується JavaScript-клієнт.

Для перегляду демонстрації вкажіть в браузері URL-адресу http: // localhost: 8098 / riak / demo / demo.html.

Після введення в форму значень для створення ставки і відправки форми JSON-об'єкт зберігається в Riak. Властивості об'єкта відповідатимуть полях форми. Ви будете направлені на сторінку, яка буде показувати значення щойно створеного об'єкта.

В лістинг 3 показаний вихідний код, який створює об'єкт з введених вами значень. Значення key, odds і description - це значення, введені в форму.

Лістинг 3. Приклад використання клієнтської JavaScript-бібліотеки в Riak
client.bucket ( "odds", function (bucket) {var key = $ ( '# key'). val (); bucket.get_or_new (key, function (status, object) {object.contentType = 'application / json' ; object.body = { 'odds': $ ( '# odds'). val (), 'description': $ ( '# desc'). val ()}; object.store (function (status, object, request ) {if (status == 'ok') {window.location = "http: // localhost: 8098 / riak / odds /" + key;} else {alert ( "Failed to create object.");}}) ;});});

Як говорилося раніше, передбачається, що Riak виконується в надійної середовищі. В цьому випадку відсутній проблема безпеки при додаванні сторінок, які зберігали (витягають) елементи в (з) Riak, однак не варто використовувати цю функціональність в Інтернеті, не маючи будь-якої системи аутентифікації.

Незважаючи на простоту, цей приклад дає уявлення про те, як Riak безпосередньо обробляє запити сторінок. Для вилучення необхідних даних можна було б, наприклад, включити зберігаються в Riak дані безпосередньо в існуючі Web-сторінки або шляхом використання методики JSONP або CORS (cross-origin resource sharing - междоменной використання ресурсів), в якій через політику same domain (однаковий домен) AJAX-запити обмежені тим же сервером, на якому розміщена сторінка, або направляючи запити в Riak через проксі, тобто через ваші сервери.

Використання Riak для кешування

Кешування застосовується для прискорення доступу до даних. Якщо запитані дані містяться в кеші (попадання в кеш), додаток, читаючи значення з кешу, обробляє запит швидше, ніж при читанні з бази даних. Якщо даних немає в кеші (промах кеша), додаток зазвичай має звернутися до бази даних для їх вилучення. У загальному випадку чим більше запитів можна обробити з кешу, тим швидше буде працювати система. Riak має ряд функціональних можливостей, які роблять її хорошим вибором для реалізації системи кешування.

Однією з таких можливостей є його підключається серверна система зберігання (storage back-end); вона визначає, як зберігаються дані. Є кілька варіантів, але я не збираюся розглядати їх усі (посилання на додаткову інформацію наведено в розділі ресурси ). Системою зберігання за умовчанням є Bitcask - Erlang-додаток, що надає програмний інтерфейс для збереження та відновлення, підтримуваних хеш-таблицею, що забезпечує швидкий доступ до них; дані є персистентного.

Можливо, для даної статті більше підходить система Memory. Для зберігання всіх своїх даних Memory використовує таблицю в оперативній пам'яті (по суті, використовуються Erlang-таблиці ets) і, якщо дозволено, змушує Riak поводитися як LRU-кеш з встановленим часом закінчення терміну зберігання. Перевагою сховища в оперативній пам'яті є його значно швидша робота в порівнянні з використанням даних, що витягають з диска. Якщо дані зберігаються в пам'яті (персистентного) і вузол завершує роботу, дані, що зберігаються на ньому, втрачаються. Але оскільки ми використовуємо Riak як кеш, це не проблема - додаток завжди зможе витягти дані з бази даних, як це було б при використанні Riak в якості основного сховища даних. Riak реплицирует дані на кілька вузлів кластера, тому вони все одно будуть доступні.

Система Memory входить в комплект поставки Riak. Для використання Memory відкрийте файл app.config для кожного вузла в кластері, знайдіть властивість storage_backend і змініть його з riak_kv_bitcask_backend на riak_kv_memory_backend. Тепер додайте в кінець файлу код, наведений в лістингу 4 .

Лістинг 4. Використання серверної системи Memory
{Memory_backend, [{max_memory, 4096}, %% 4GB of memory {ttl, 86400} %% Time in seconds]}

Змініть значення на відповідні для вашої конфігурації. Перезапустіть вузли в кластері.

Існує можливість запустити в кластері Riak кілька систем зберігання. Може знадобитись для різних систем зберігання для різних сегментів. Наприклад, можна налаштувати сегмент (назвемо його cache) на використання серверної системи Memory, а для інших сегментів, які повинні зберігати дані, використовувати, скажімо, Bitcask.

Тепер, коли Riak налаштована на роботу в якості кеша, нам необхідний якийсь спосіб звернення до даних в кластері або для відновлення, або, наприклад, для перевірки по будь-якої причини (до закінчення терміну їх дії).

Щось шукаєте?

Як ви вже бачили, для вилучення зберігаються в Riak даних з використанням HTTP-інтерфейсу створюється URL-адресу, що складається з назви сегмента і ключа витягується об'єкта, а потім виконується запит HTTP GET з цього URL. Це абсолютно правильно, якщо відомий ключ! Але іноді нам або не відомий ключ об'єкта, який ми хочемо отримати, або необхідно витягти набір об'єктів, що відповідають певним критерієм. Отже, нам потрібен метод пошуку об'єктів, що зберігаються в кластері.

Ви вже бачили, як запитувати дані шляхом виконання завдання Map / Reduce для документів, що зберігаються в кластері. Час виконання запиту буде в загальному випадку прямо пропорційно кількості документів в кластері; чим більше документів, тим довше виконується запит цих документів. Це не проблема для запитів, нечутливих до часу. Під ними я маю на увазі запити, на які користувач не очікує отримати негайну відповідь. Для задач пошуку нереально кожен раз (динамічно) переглядати всі документи; отримання результатів може тривати хвилини або години!

На щастя Riak вже має рішення цієї проблеми - Riak Search. Система Riak Search надає функціональність, необхідну для пошуку документів, що зберігаються по всьому кластеру. Тема пошуку дуже обширна для докладного розгляду в даній статті, але загальний принцип такий: документи морфологічно розмічаються (Riak Search використовує стандартні аналізатори Lucene) і додаються в інвертований індекс. Потім до цього індексу виконується запит, заснований на пошукових термінах, введених користувачем. Нові документи теж індексуються і додаються в індекс.

За замовчуванням функціональність Riak Search відключена. Перед використанням її необхідно включити. Для кожного вузла в кластері відкрийте файл rel / riakN / etc / app.config, знайдіть властивість riak_search і встановіть його в значення true. Перезапустіть вузли в кластері.

Riak дозволяє вказувати ім'я функції, виконуваної перед або після додавання документа в сегмент, шляхом використання перехоплювачів pre- і post-commit. Наприклад, перед додаванням в кластер документа можна перевірити, чи містить він необхідні поля. Документ для пошуку повинен бути проіндексований. Для цього встановіть перехоплювач pre-commit для сегмента, в якому зберігаються документи. Виконайте команду $ rel / riak / bin / search-cmd install <bucket name>.

Ця команда встановить перехоплювач pre-commit riak_search_kv_hook для сегмента. Тепер при додаванні в цей сегмент документ буде аналізуватися і додаватися в індекс. Аналізатором за замовчуванням є аналізатор прогалин (whitespace); він обробляє символи в маркери на основі прогалин, які потім індексує. Існує кілька різних аналізаторів, крім того ви можете визначити ваш власний.

У багатьох випадках Riak Search знає, як індексувати ваші дані. Наприклад, якщо в сегмент додається JSON-об'єкт, значення кожної властивості буде індексуватися і до нього можна буде звернутися по імені властивості в рядку запиту. Приклад пошуку наведено в лістингу 5 . Для більш складних структур можна визначити свою власну схему, яка вказує Riak Search, як індексувати дані.

Необхідно вміти звертатися до проіндексованим документам. Одним із способів є виконання запиту з оболонки Erlang. Наприклад, запит, наведений в лістингу 5 , Шукає в сегменті odds все ставки на скачки; для цього виконується запит властивості опису збереженого елемента.

Лістинг 5. Пошук в сегменті odds ставок на скачки
$ Rel / riak / bin / riak attach search: search (<< "odds" >>, << "description: horse" >>).

Крім того, Riak Search надає Solr-сумісний HTTP-інтерфейс для пошуку документів. Apache Solr - це популярний корпоративний пошуковий сервер з REST-подібним програмним інтерфейсом. Сумісність інтерфейсу з Solr дозволяє відключити Solr (якщо він використовується) і використовувати можливості Riak Search для виконання операцій пошуку. Наприклад, для пошуку ставок на конкретну подію з використанням інтерфейсу Solr можна виконати команду $ curl "http: localhost: 8098 / solr / odds / select? Start = 0 & q = description: horse".

Налаштувавши пошук, можна шукати елементи в сховище даних, не знаючи їх первинного ключа.

висновок

Інші статті даної серії

Перегляньте інші статті серії jsp?search_by=Introducing+Riak> Введення в Riak (EN).

Здатність Riak масштабувати і надійно реплицировать дані, а також інші можливості (наприклад, пошук), роблять цю систему ідеальним вибором для реалізації кешування сайтів з великим навантаженням. Вона легко інтегрується в існуючий сайт. Завдяки можливості безпосередньо обробляти запити Riak можна використовувати для зменшення навантаження на сервери додатків і баз даних.

Ресурси для скачування

Схожі теми

  • Оригінал статті: Introducing Riak, Part 2: Integrating Riak as a heavy-duty caching server for web applications (EN).
  • Частина 1: HTTP-інтерфейс, незалежний від мови програмування. Збереження та вилучення даних за допомогою HTTP-інтерфейсу Riak (Саймон Бакл (Simon Buckle), developerWorks, березень 2012) - введення в Riak, що охоплює основи збереження та вилучення елементів в Riak за допомогою його HTTP-інтерфейсу (EN).
  • Додаткова інформація про роботу Riak на вікі-сторінці Riak Search .
  • Інформація про пропоновані Riak серверних системах зберігання і про відмінності між ними.
  • Список доступних клієнтських бібліотек для інтеграції Riak.
  • У документі Основи налаштування кластера і створення середовища розробки приведена додаткова інформація з налаштування трехузлового кластера (EN).
  • Google MapReduce : Спрощена обробка даних у великих кластерах.
  • Введення в програмування на Erlang (Мартін Браун (Martin Brown), developerWorks, травень 2011 року) - порівняння функціонального стилю програмування Erlang з іншими парадигмами, такими як імперативне, процедурне і об'єктно-орієнтоване програмування (EN).
  • Документація по системі Dynamo (EN) компанії Amazon, на якій заснована Riak. Настійно рекомендується до прочитання!
  • у статті Як аналізувати log-файли Apache (EN) приведена інформація про те, як використовувати Riak для обробки log-файлів вашого сервера.
  • пояснення алгоритму векторних годин - він простіше, ніж ви думаєте (EN).
  • Гарне пояснення алгоритму векторних годин і більш детальна інформація по link walking на вікі-сайті Riak.
  • Сайт Project Gutenberg - відмінний ресурс, якщо вам потрібен якийсь текст для експериментів.

Підпишіть мене на повідомлення до коментарів

Jsp?
Quot;; ?
Щось шукаєте?
Наприклад, для пошуку ставок на конкретну подію з використанням інтерфейсу Solr можна виконати команду $ curl "http: localhost: 8098 / solr / odds / select?

Новости