Согласование топологии когерентности - PullRequest
5 голосов
/ 10 мая 2011

Данные для кэширования:

  • 100 Гб данных
  • Объекты размером 500-5000 байт
  • 1000 объектов обновляются / вставляются в среднем за минуту (пик5000)

Требуется предложение по топологии Coherence при производстве и тестировании (распространяется с резервным копированием)

  • количество серверов
  • узлов на сервер
  • размер кучи на узел

Вопросы

  • Сколько свободной доступной памяти требуется для узла по сравнению с памятью, используемой кэшированными данными (предположим, использование 100% невозможно)
  • Сколько накладных расходов сгенерирует 1-2 дополнительных индекса на элемент кэша?

Мы не знаем, сколько будет выполнено операций чтения, решение будет использоваться клиентами с низким уровнем.Время отклика является критическим (больше, чем согласованность данных) и зависит от каждого варианта использования.Кэш будет обновляться из БД путем опроса с фиксированной частотой и заполнения кеша (поскольку кеш является главным, а не системой, использующей кеш).

Ответы [ 2 ]

7 голосов
/ 19 июля 2011

Практическое правило для определения размера JVM для Coherence заключается в том, что данные составляют 1/3 кучи, предполагая 1 резервное копирование: 1/3 для данных кэша, 1/3 для резервного копирования и 1/3 для индекса и служебных данных.

Самая большая сложность в определении размера состоит в том, что нет хороших способов оценить размеры индекса. Вы должны попробовать с реальными данными и измерить.

Основное правило для JVM JDK 1.6 - запуск с кучами 4 ГБ, поэтому вам потребуется 75 узлов кеш-сервера. Некоторые люди добились успеха с гораздо большими кучами (16 ГБ), поэтому стоит экспериментировать. При больших кучах (например, 16 ГБ) вам не понадобится 1/3 для служебных данных и вы можете хранить более 1/3 для данных. При кучах более 16 ГБ настройка сборщика мусора становится критической.

Для максимальной производительности у вас должно быть 1 ядро ​​на узел.

Количество серверных машин зависит от практических ограничений управляемости, емкости (ядер и памяти) и отказов. Например, даже если у вас есть сервер, который может обрабатывать 32 узла, что произойдет с вашим кластером при сбое компьютера? Кластер будет безопасным для машины (резервные копии не находятся на одной машине), но восстановление будет очень медленным, учитывая огромное количество данных, которые будут перемещены в новые резервные копии. С другой стороны, с 75 машинами сложно управлять.

Я видел, что у Coherence задержка составляла 250 микросекунд (не миллис) для объекта размером 1 КБ, включая скачки в сети и резервное копирование. Таким образом, количество вставок и обновлений, которые вы ищете, должно быть достижимым. Тестируйте со вставкой / обновлением нескольких потоков и убедитесь, что ваш тестовый клиент не является узким местом.

2 голосов
/ 13 июня 2013

Еще несколько «эмпирических правил»:

1) Для высокой доступности три узла - это хороший минимум.

2) В Java 7 вы можете использовать большие кучи (например, 27 ГБ) и сборщик мусора G1.

3) Для 100 ГБ данных, руководствуясь инструкциями Дэвида, вам понадобится всего 300 ГБ кучи. На серверах с 128 ГБ памяти это можно сделать с 3 физическими серверами, на каждом из которых работает 4 JVM с кучей 27 ГБ каждый (всего ~ 324 ГБ).

4) Использование индексной памяти значительно различается в зависимости от типа данных и арности. Лучше всего протестировать с репрезентативным набором данных, как с индексами, так и без них, чтобы увидеть разницу в использовании памяти.

...