Поиск по сайту:

Как создать разделенный кластер в MongoDB с помощью Ubuntu 12.04 VPS


Статус: устарело

В этой статье рассматривается версия Ubuntu, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением Ubuntu 12.04, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию Ubuntu:

  • Обновите Ubuntu до версии 14.04.
  • Обновление Ubuntu 14.04 до Ubuntu 16.04
  • Перенесите данные сервера в поддерживаемую версию.

Причина:

Смотрите вместо этого:

Введение

MongoDB — это система базы данных документов NoSQL, которая хорошо масштабируется по горизонтали и реализует хранение данных с помощью системы «ключ-значение». Популярный выбор для веб-приложений и веб-сайтов, MongoDB легко реализовать и получить к нему программный доступ.

MongoDB обеспечивает масштабирование с помощью метода, известного как «шардинг». Шардинг — это процесс записи данных на разные серверы для распределения нагрузки чтения и записи и требований к хранению данных.

В предыдущем уроке мы рассмотрели, как установить MongoDB на Ubuntu 12.04 VPS. Мы будем использовать это как отправную точку, чтобы поговорить о том, как реализовать сегментирование на нескольких различных узлах.

Топология разделения MongoDB

Разделение реализовано с помощью трех отдельных компонентов. Каждая часть выполняет определенную функцию:

  • Сервер конфигурации. Каждая реализация сегментирования рабочей среды должна содержать ровно три сервера конфигурации. Это необходимо для обеспечения избыточности и высокой доступности. Серверы конфигурации используются для хранения метаданных, которые связывают запрошенные данные с сегментом, который их содержит. Он организует данные таким образом, чтобы информацию можно было извлекать надежно и последовательно.
  • Маршрутизаторы запросов. Маршрутизаторы запросов — это машины, к которым фактически подключается ваше приложение. Эти машины отвечают за связь с серверами конфигурации, чтобы выяснить, где хранятся запрошенные данные. Затем он получает доступ и возвращает данные из соответствующих осколков. Каждый маршрутизатор запросов выполняет команду «mongos».
  • Shard Servers: Shards отвечают за фактические операции хранения данных. В производственных средах один сегмент обычно состоит из набора реплик, а не из одной машины. Это делается для того, чтобы данные по-прежнему были доступны в случае отключения основного сервера сегмента. Реализация наборов репликации выходит за рамки этого руководства, поэтому мы настроим наши сегменты как отдельные машины, а не как наборы реплик. Вы можете легко изменить это, если хотите настроить наборы реплик для своей собственной конфигурации.

Начальная настройка

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

  • 3 сервера конфигурации (требуется в производственных средах)
  • 2 маршрутизатора запросов (необходим минимум 1)
  • 4 сервера Shard (необходимо минимум 2)

Это означает, что вам потребуется девять инстансов VPS, чтобы следовать точно. На самом деле некоторые из этих функций могут перекрываться (например, вы можете запустить маршрутизатор запросов на том же VPS, который вы используете в качестве сервера конфигурации), и вам нужен только один маршрутизатор запросов и как минимум 2 сервера сегментов.

Мы превысим этот минимум, чтобы продемонстрировать добавление нескольких компонентов каждого типа. Мы также будем рассматривать все эти компоненты как отдельные машины для ясности и простоты.

Настройте исходное базовое изображение

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

Когда вы закончите это руководство для своего первого сервера, выключите экземпляр с помощью этой команды:

sudo shutdown -h now

Теперь мы собираемся сделать снимок этого настроенного дроплета и использовать его для запуска других наших экземпляров VPS. Хотя можно сделать моментальный снимок работающей системы, отключение питания гарантирует, что файловая система находится в согласованном состоянии. Снимки стоят 0,05 доллара США за гигабайт в месяц в зависимости от объема используемого пространства в файловой системе, поэтому, вероятно, лучше всего удалить моментальный снимок, когда вы закончите.

В панели управления DigitalOcean выберите дроплет. Перейдите на вкладку «Снимки». Введите имя снимка и нажмите «Сделать снимок»:

Ваш снимок будет сделан, а исходный сервер будет перезагружен.

Развернуть инстансы VPS на основе моментального снимка

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

На панели управления нажмите кнопку «Создать». Введите имя, описывающее цель, которую будет иметь ваша капля в конфигурации шардинга:

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

В разделе «Выбор изображения» щелкните вкладку «Мои изображения» и выберите только что созданный моментальный снимок MongoDB.

Добавьте любые необходимые SSH-ключи и выберите нужные параметры. Нажмите «Создать каплю», чтобы запустить новый экземпляр VPS.

Повторите этот шаг для каждого из компонентов сегментирования. Помните, что для точного выполнения этого руководства (необязательного, но демонстративного) вам понадобятся 3 сервера конфигурации, 2 сервера запросов и 4 сервера сегментов.

Настройте записи субдоменов DNS для каждого компонента (необязательно)

Документация MongoDB рекомендует обращаться ко всем вашим компонентам по DNS-разрешимому имени, а не по конкретному IP-адресу. Это важно, поскольку позволяет менять серверы или повторно развертывать определенные компоненты без необходимости перезапуска каждого связанного с ним сервера.

Для простоты использования я рекомендую вам дать каждому серверу собственный субдомен в домене, который вы хотите использовать. Вы можете использовать это руководство, чтобы узнать, как настроить поддомены DNS с помощью панели управления DigitalOcean.

Для целей этого руководства мы будем называть компоненты доступными в этих поддоменах:

  • Серверы конфигурации
    • config0.example.com
    • config1.example.com
    • config2.example.com

    Маршрутизаторы запросов

    • query0.example.com
    • query1.example.com

    Сегментные серверы

    • shard0.example.com
    • shard1.example.com
    • shard2.example.com
    • shard3.example.com

    Если вы не настроили поддомены, вы все равно можете продолжить, но ваша конфигурация не будет такой надежной. Если вы хотите пойти по этому пути, просто замените спецификации поддомена на IP-адрес вашего дроплета.

    Инициализировать серверы конфигурации

    Первыми компонентами, которые необходимо настроить, являются серверы конфигурации. Они должны быть подключены к сети и работать, прежде чем можно будет настроить маршрутизаторы запросов или сегменты.

    Войдите на свой первый сервер конфигурации как root.

    Первое, что нам нужно сделать, это создать каталог данных, в котором сервер конфигурации будет хранить метаданные, связывающие местоположение и контент:

    mkdir /mongo-metadata
    

    Теперь нам просто нужно запустить сервер конфигурации с соответствующими параметрами. Служба, предоставляющая сервер конфигурации, называется mongod. Номер порта по умолчанию для этого компонента — 27019.

    Мы можем запустить сервер конфигурации с помощью следующей команды:

    mongod --configsvr --dbpath /mongo-metadata --port 27019
    

    Сервер начнет выводить информацию и начнет прослушивать подключения от других компонентов.

    Точно повторите этот процесс на двух других серверах конфигурации. Номер порта должен быть одинаковым на всех трех серверах.

    Настройка экземпляров маршрутизатора запросов

    На этом этапе все три сервера конфигурации должны быть запущены и прослушивать соединения. Прежде чем продолжить, они должны быть в рабочем состоянии.

    Войдите в свой первый маршрутизатор запросов как root.

    Первое, что нам нужно сделать, это остановить процесс mongodb в этом экземпляре, если он уже запущен. Маршрутизаторы запросов используют блокировки данных, конфликтующие с основным процессом MongoDB:

    service mongodb stop
    

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

    Служба запроса маршрутизатора называется mongos. Номер порта по умолчанию для этого процесса — 27017 (но номер порта в конфигурации относится к номеру порта сервера конфигурации, который по умолчанию равен 27019).

    Конечным результатом является то, что служба маршрутизатора запросов запускается с такой строкой:

    <пред>

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

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

    Добавить осколки в кластер

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

    Войдите на один из ваших осколочных серверов как root.

    Как мы упоминали в начале, в этом руководстве мы будем использовать только сегменты отдельных компьютеров вместо наборов реплик. Это сделано для краткости и простоты демонстрации. В рабочих средах настоятельно рекомендуется использовать набор реплик, чтобы обеспечить целостность и доступность данных. Чтобы настроить наборы реплик в MongoDB, следуйте этому руководству.

    Чтобы на самом деле добавить осколки в кластер, нам нужно пройти через маршрутизаторы запросов, которые теперь настроены на то, чтобы действовать как наш интерфейс с кластером. Мы можем сделать это, подключившись к любому маршрутизатору запросов следующим образом:

    <пред>

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

    Чтобы добавить наш первый осколок, введите:

    <пред>

    Затем вы можете добавить оставшиеся капли осколков в этом же интерфейсе. Вам не нужно заходить на каждый шард-сервер по отдельности.

    <пред>

    Если вы настраиваете рабочий кластер с наборами репликации, вам нужно вместо этого указать имя набора репликации и член набора репликации, чтобы установить каждый набор как отдельный сегмент. Синтаксис будет выглядеть примерно так:

    <пред>

    Как включить сегментирование для коллекции баз данных

    MongoDB организует информацию в базы данных. Внутри каждой базы данных данные дополнительно разбиваются на «коллекции». Коллекция похожа на таблицу в традиционных моделях реляционных баз данных.

    В этом разделе мы снова будем работать с запрашивающими маршрутизаторами. Если вы все еще не подключены к маршрутизатору запросов, вы можете снова получить к нему доступ, используя ту же команду mongo, которую вы использовали в предыдущем разделе:

    <пред>

    Включить сегментирование на уровне базы данных

    Сначала мы включим шардинг на уровне базы данных. Для этого мы создадим тестовую базу данных с именем (соответственно) test_db.

    Чтобы создать эту базу данных, нам просто нужно перейти на нее. Она будет отмечена как наша текущая база данных и создана динамически, когда мы впервые введем в нее данные:

    use test_db
    

    Мы можем проверить, используем ли мы в настоящее время только что созданную базу данных, набрав:

    db
    
    test_db
    

    Мы можем увидеть все доступные базы данных, набрав:

    show dbs
    

    Вы можете заметить, что база данных, которую мы только что создали, не отображается. Это потому, что он не содержит данных, поэтому он еще не совсем реален.

    Мы можем включить сегментирование в этой базе данных, выполнив эту команду:

    sh.enableSharding("test_db")
    

    Опять же, если мы введем команду show dbs, мы не увидим нашу новую базу данных. Однако, если мы переключимся на базу данных config, которая генерируется автоматически, и выполним команду find(), будет возвращена наша новая база данных:

    use config
    db.databases.find()
    
    { "_id" : "admin", "partitioned" : false, "primary" : "config" }
    { "_id" : "test_db", "partitioned" : true, "primary" : "shard0003" }
    

    Ваша база данных будет отображаться с помощью команды show dbs, когда MongoDB добавит некоторые данные в новую базу данных.

    Включить разделение на уровне коллекций

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

    На этом этапе нам нужно определиться со стратегией шардинга. Разделение работает путем организации данных в различные категории на основе определенного поля, обозначенного как ключ в документах, которые он хранит. Он помещает все документы с совпадающим ключом сегмента в один и тот же сегмент.

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

    Лучшим выбором для ключа сегмента будет то, что гарантированно будет распределено более равномерно. Например, в большой компании поле дня рождения (месяц и день), вероятно, будет распределено довольно равномерно.

    В тех случаях, когда вы не уверены в том, как что-то будет распределяться, или нет подходящего поля, вы можете создать «хешированный» ключ сегмента на основе существующего поля. Это то, что мы будем делать для наших данных.

    Мы можем создать коллекцию с именем test_collection и хешировать ее поле \_id. Убедитесь, что мы используем нашу базу данных test_db, а затем введите команду:

    use test_db
    db.test_collection.ensureIndex( { _id : "hashed" } )
    

    Затем мы можем разделить коллекцию, выполнив эту команду:

    sh.shardCollection("test_db.test_collection", { "_id": "hashed" } )
    

    Это разобьёт коллекцию на все доступные осколки.

    Вставьте тестовые данные в коллекцию

    Мы можем увидеть наш шардинг в действии, используя цикл для создания некоторых объектов. Этот цикл взят непосредственно с веб-сайта MongoDB для создания тестовых данных.

    Мы можем вставлять данные в коллекцию, используя простой цикл, подобный этому:

    use test_db
    for (var i = 1; i <= 500; i++) db.test_collection.insert( { x : i } )
    

    Это создаст 500 простых документов (только поле идентификатора и поле «x», содержащее число) и распределит их по разным сегментам. Вы можете увидеть результаты, набрав:

    db.test_collection.find()
    
    { "_id" : ObjectId("529d082c488a806798cc30d3"), "x" : 6 }
    { "_id" : ObjectId("529d082c488a806798cc30d0"), "x" : 3 }
    { "_id" : ObjectId("529d082c488a806798cc30d2"), "x" : 5 }
    { "_id" : ObjectId("529d082c488a806798cc30ce"), "x" : 1 }
    { "_id" : ObjectId("529d082c488a806798cc30d6"), "x" : 9 }
    { "_id" : ObjectId("529d082c488a806798cc30d1"), "x" : 4 }
    { "_id" : ObjectId("529d082c488a806798cc30d8"), "x" : 11 }
    . . .
    

    Чтобы получить больше значений, введите:

    it
    
    { "_id" : ObjectId("529d082c488a806798cc30cf"), "x" : 2 }
    { "_id" : ObjectId("529d082c488a806798cc30dd"), "x" : 16 }
    { "_id" : ObjectId("529d082c488a806798cc30d4"), "x" : 7 }
    { "_id" : ObjectId("529d082c488a806798cc30da"), "x" : 13 }
    { "_id" : ObjectId("529d082c488a806798cc30d5"), "x" : 8 }
    { "_id" : ObjectId("529d082c488a806798cc30de"), "x" : 17 }
    { "_id" : ObjectId("529d082c488a806798cc30db"), "x" : 14 }
    { "_id" : ObjectId("529d082c488a806798cc30e1"), "x" : 20 }
    . . .
    

    Чтобы получить информацию о конкретных осколках, вы можете ввести:

    sh.status()
    
    --- Sharding Status --- 
      sharding version: {
        "_id" : 1,
        "version" : 3,
        "minCompatibleVersion" : 3,
        "currentVersion" : 4,
        "clusterId" : ObjectId("529cae0691365bef9308cd75")
    }
      shards:
        {  "_id" : "shard0000",  "host" : "162.243.243.156:27017" }
        {  "_id" : "shard0001",  "host" : "162.243.243.155:27017" }
    . . .
    

    Это предоставит информацию о чанках, которые MongoDB распределила между осколками.

    Заключение

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

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

    Джастин Эллингвуд