Nano Hash - криптовалюты, майнинг, программирование

Кластер Mongodb с формированием облака aws и автоматическим масштабированием

Я исследовал создание собственного кластера mongodb в AWS. Шаблон Aws mongodb предоставляет некоторые хорошие отправные точки. Однако он не распространяется на автоматическое масштабирование или отказ узла. Например, если у меня есть 1 первичный и 2 вторичных узла. И основной отключается, и срабатывает автоматическое масштабирование. Как мне добавить только что запущенный экземпляр mongodb в набор реплик?

Если вы посмотрите на шаблон, он использует сценарий init.sh, чтобы проверить, является ли запускаемый узел первичным узлом, и ожидает, пока все остальные узлы будут существовать, и создает набор реплик с их IP-адресами на первичном. Когда набор реплик настроен изначально, все узлы уже существуют.

Не только это, но и мое приложение node использует мангуста. Часть соединения с базой данных позволяет указать несколько узлов. Как мне отслеживать, что в настоящее время работает (я думаю, я мог бы использовать DynamoDB, но не уверен).

Что обычно происходит, если экземпляр выходит из строя? Люди обычно вручную перенастраивают кластеры, если это происходит?

Есть предположения? Спасибо.


Ответы:


1

Это очень хороший вопрос, и я сам недавно прошел через это очень болезненное путешествие. Я пишу здесь довольно обширный ответ в надежде, что некоторые из этих мыслей о запуске кластера MongoDB через CloudFormation будут полезны другим.

Я предполагаю, что вы создаете производственный кластер MongoDB следующим образом: -

  • 3 конфигурационных сервера (здесь могут работать экземпляры Micro / Smalls)
  • По крайней мере, 1 осколок, состоящий, например, из 2 (первичный и вторичный) экземпляра сегментов (минимальный или большой) с большими дисками, настроенными для дисков данных / журналов / журналов.
  • арбитр машина для голосования (микро наверное ОК).

т.е. https://docs.mongodb.org/manual/core/sharded-cluster-architectures-production/

Как и вы, я сначала попробовал шаблон AWS MongoDB CloudFormation, который вы разместили по ссылке (https://s3.amazonaws.com/quickstart-reference/mongodb/latest/templates/MongoDB-VPC.template), но, честно говоря, это было слишком, слишком сложно, т.е. это 9300 строк long и настраивает несколько серверов (т. е. шарды реплик, конфиги, арбитры и т. д.). Запуск шаблона CloudFormation занял много времени, и он продолжал давать сбои (например, через 15 минут), что означало, что все серверы снова отключились, и мне пришлось попробовать снова, что действительно расстраивало / отнимало много времени.

Решение, к которому я пришел в итоге (которым я очень доволен), заключалось в создании отдельных шаблонов для каждого типа сервера MongoDB в кластере, например.

  1. MongoDbConfigServer.template (шаблон для создания серверов конфигурации - запустите его 3 раза)
  2. MongoDbShardedReplicaServer.template (шаблон для создания реплики - запускается 2 раза для каждого шарда)
  3. MongoDbArbiterServer.template (шаблон для создания арбитра - запускается один раз для каждого шарда)

ПРИМЕЧАНИЕ: шаблоны доступны по адресу https://github.com/adoreboard/aws-cloudformation-templates

Идея состоит в том, чтобы активировать каждый сервер в кластере индивидуально, то есть 3 сервера конфигурации, 2 сервера сегментированных реплик (для 1 сегмента) и арбитра. Затем вы можете добавить пользовательские параметры в каждый из шаблонов, например. параметры для сервера реплики могут включать: -

  • InstanceType e.g. t2.micro
  • ReplicaSetName например s1r (реплика осколка 1)
  • ReplicaSetNumber например 2 (используется с ReplicaSetName для создания имени, например, имя становится s1r2)
  • VpcId например vpc-e4ad2b25 (очевидно, не настоящий VPC!)
  • SubnetId например subnet-2d39a157 (очевидно, не настоящая подсеть!)
  • GroupId (имя существующего идентификатора группы MongoDB)
  • Route53 (логическое для добавления записи во внутренний DNS - лучшие практики)
  • Route53HostedZone (если логическое значение истинно, то идентификатор внутреннего DNS, использующего Route53)

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

    "Route53HostedZone": {
        "Description": "Route 53 hosted zone for updating internal DNS (Only applicable if the parameter [ UpdateRoute53 ] = \"true\"",
        "Type": "AWS::Route53::HostedZone::Id",
        "Default": "YA3VWJWIX3FDC"
    },

Это упрощает запуск шаблона CloudFormation, поскольку большую часть времени мы можем полагаться на значения по умолчанию и настраивать только пару вещей в зависимости от экземпляра сервера, который мы создаем (или заменяем).

Помимо параметров, каждый из трех упомянутых ранее шаблонов имеет раздел "Resources", в котором создается экземпляр. Мы также можем делать интересные вещи в разделе "AWS::CloudFormation::Init". например

"Resources": {

    "MongoDbConfigServer": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "AWS::CloudFormation::Init": {
                "configSets" : {
                    "Install" : [ "Metric-Uploading-Config", "Install-MongoDB", "Update-Route53" ]
                },

"configSets" в предыдущем примере показывает, что создание сервера MongoDB - это не просто вопрос создания экземпляра AWS и установки на нем MongoDB, но также мы можем (а) установить метрики диска / памяти CloudWatch (б) обновить Route53 DNS и т. Д. идея в том, что вы хотите максимально автоматизировать такие вещи, как DNS / мониторинг и т. д.

IMO, создание шаблона и, следовательно, стека для каждого сервера имеет очень приятное преимущество, заключающееся в возможности очень быстро заменить сервер через веб-консоль CloudFormation. Кроме того, поскольку у нас есть server-per-template, легко постепенно наращивать кластер MongoDB.

Мой последний совет по созданию шаблонов - скопировать то, что работает для вас, из других шаблонов GitHub MongoDB CloudFormation, например. Я использовал следующее, чтобы создать серверы-реплики для использования RAID10 (вместо значительно более дорогих дисков IOPS, выделенных AWS).

https://github.com/CaptainCodeman/mongo-aws-vpc/blob/master/src/templates/mongo-master.template

В своем вопросе вы упомянули автоматическое масштабирование - я бы предпочел добавить осколок / заменить сломанный экземпляр вручную (автоматическое масштабирование имеет смысл с веб-контейнерами, например, Tomcat / Apache, но кластер MongoDB действительно должен медленно расти с течением времени). Однако мониторинг очень важен, особенно размеры дисков на серверах сегментов, чтобы предупреждать вас, когда диски заполняются (поэтому вы можете добавить новый сегмент для удаления данных). Мониторинг можно довольно легко осуществить с помощью метрик / сигналов тревоги AWS CloudWatch или с помощью службы MMS MongoDB.

Если узел выходит из строя, например, одна из реплик в сегменте, вы можете просто убить сервер, воссоздать его с помощью шаблона CloudFormation, и диски будут синхронизироваться автоматически. Это мой нормальный процесс, если экземпляр выходит из строя и, как правило, не требуется повторная конфигурация. В прошлом я потратил слишком много времени, пытаясь починить серверы - иногда удачно, а иногда нет. Моя стратегия резервного копирования теперь заключается в запуске mongodump важных коллекций базы данных один раз в день через crontab, zip up и загрузку в AWS S3. Это означает, что если произойдет ядерный вариант (полное повреждение базы данных), мы сможем воссоздать всю базу данных и mongorestore за час или два.

Однако, если вы создаете новый осколок (потому что вам не хватает места), конфигурация необходима. Например, если вы добавляете новый Shard 3, вы должны создать 2 узла реплики (например, первичный с именем => mongo-s3r1 / вторичный с именем => mongo-s3r2) и 1 арбитра (например, с именем mongo-s3r-arb), тогда вы должны подключиться через оболочку MongoDB к mongos (маршрутизатор MongoDB) и выполнить эту команду: -

sh.addShard("s3r/mongo-s3r1.internal.mycompany.com:27017,mongo-s3r2.internal.mycompany.com:27017")

ПРИМЕЧАНИЕ. - в этой команде предполагается, что вы используете частный DNS через Route53 (наилучшая практика). Вы можете просто использовать частные IP-адреса двух реплик в команде addShard, но в прошлом я очень сильно пострадал от этого (например, несколько месяцев назад все экземпляры AWS были перезапущены, и для всех них были созданы новые частные IP-адреса. Кластер MongoDB занял у меня 2 дня, так как мне пришлось перенастроить все вручную - тогда как изменение IP-адресов в Route53 занимает несколько секунд ... ;-)

Вы можете возразить, что мы также должны добавить команду addShard в другой шаблон CloudFormation, но IMO это добавляет ненужной сложности, потому что он должен знать о сервере, на котором есть маршрутизатор MongoDB (mongos), и подключаться к нему для выполнения команды addShard. Поэтому я просто запускаю это после создания экземпляров в новом сегменте MongoDB.

В любом случае, это мои довольно бессвязные мысли по этому поводу. Главное, что когда у вас есть шаблоны, ваша жизнь станет намного проще и, безусловно, стоит затраченных усилий! Удачи! :-)

08.01.2016
  • Спасибо за очень подробное объяснение, в какой-то момент я обязательно попробую. В итоге я остановился на размещенном решении, потому что решение этой проблемы непросто и может занять много времени, но у вас есть несколько очень хороших советов, к которым я хотел бы вернуться. Должен признать, конфиг, предоставляемый aws, очень сложен. 11.01.2016
  • У размещенного решения есть преимущества и недостатки (простота использования, более быстрое развертывание) по сравнению с размещением его самостоятельно (мощность, контроль, потенциально более низкая совокупная стоимость владения и т. Д.). Я сделал и то, и другое, и оба подходят для разных сценариев. Шаблоны CloudFormation сложны и требуют большого обучения (и AWS Dev-Ops в целом), но оно того стоит! Основные преимущества использования шаблонов CloudFormation для запуска серверов, установки и настройки программного обеспечения включают (а) повторяемость (б) инфраструктуру как код, то есть возможность проверки кода (в) надежность и т. Д. 11.01.2016
  • У меня возникли те же проблемы, когда я пытался использовать шаблон, предоставленный AWS MongoDB Quickstart ... это заняло много времени и провалилось с небольшой обратной связью или без нее. Мне нравится ваш подход, @bobmarksie предлагает больше контроля. Есть ли где-нибудь доступ к упомянутым шаблонам? (MongoDbConfigServer.template, MongoDbShardedReplicaServer.template и MongoDbArbiterServer.template) 28.01.2016
  • Привет, @monsieurBelbo! Я загрузил шаблоны сюда - github.com/adoreboard/aws-cloudformation-templates. ПРИМЕЧАНИЕ: нет шаблонов для создания (1) VPC, (2) групп безопасности, (3) частной зоны Route53 и (4) роли IAM для мониторинга. Если они еще не существуют, вы можете создать их вручную или с помощью дополнительных шаблонов CloudFormation. В противном случае вы можете просто настроить шаблоны в соответствии со своим вариантом использования. Я мог бы сделать подробную статью в блоге о создании кластера MongoDB таким образом, когда у меня будет свободная минута! Если у вас есть какие-либо советы по улучшению, я буду рад их услышать! Удачи. 31.01.2016
  • @bobmarksie, это круто! Я целый день искал решение этого. И я решил сдаться, потому что думал, что if I use AWS auto-scaling I never scale a MongoDB server or a cluster. Thereby auto-scaling is not an effective way to scale technical infrastructure -which has a database server. И теперь ваше решение передо мной! С другой стороны, я стараюсь создать безопасную инфраструктуру AWS для своего приложения (как можно дешевле). Я считаю, что ваше решение не подходит для стартапа, у которого недостаточно инвестиций. Также пока нет данных. Что ты об этом думаешь? 03.10.2016
  • @efkan - зависит от того, сколько денег у стартапа :-) Одна машина MongoDB может быть совершенно подходящей для многих стартапов. Это только тогда, когда система должна быть полностью надежной, когда вам нужна производственная система (т.е. минимум 2 реплики, + 1 арбитр + 3 сервера конфигурации). Такая установка не дает единой точки отказа. Однако вы можете сделать это позже, то есть когда у вас будет больше денег, и расходы на раздражение клиента нарушенным взаимодействием могут стоить больше, чем затраты на сервер AWS. 03.10.2016
  • Спасибо @bobmarksie. Похоже, AWS AutoScaling для меня слишком рано :) Также я использую балансировщик нагрузки обратного прокси Nginx поверх моей инфраструктуры. Управлять этим тоже может быть сложно. 03.10.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..