MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Разгръщане и конфигуриране на MongoDB Shards с Ansible

Системите за бази данни работят по-добре, когато има разпределено работно натоварване между редица работещи екземпляри или по-скоро данните са категоризирани по лесен начин. MongoDB използва разделяне, така че данните в дадена база данни да се групират в съответствие с някакъв ключ. Раздробяването подобрява хоризонталното мащабиране, което следователно води до по-добра производителност и повишена надеждност. Като цяло MongoDB предлага хоризонтално и вертикално мащабиране, за разлика от SQL СУБД, например MySQL, която насърчава само вертикално мащабиране.

MongoDB има по-свободен модел на последователност, при който документ в колекция може да има допълнителен ключ, който би отсъствал от други документи в същата колекция.

Разделяне

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

Да кажем, че имаме 120 документа в колекция, тези данни могат да бъдат разделени, така че да имаме 3 набора реплики и всеки да има 40 документа, както е изобразено в настройката на конфигурацията по-долу. Ако двама клиента изпратят заявки, единият за извличане на документ, който е в индекс 35, а другият, чийто индекс е 92, заявката се получава от рутера за заявки (mongos процес), който от своя страна се свързва с конфигурационния възел, който съхранява запис на как диапазоните от парчета се разпределят между парчетата. Когато се намери посочената идентичност на документа, тя се извлича от свързания фрагмент. Например по-горе документът на първия клиент ще бъде извлечен от сегмент A, а за клиент B документът ще бъде извлечен от сегмент C. Като цяло ще има разпределено работно натоварване, което се дефинира като хоризонтално мащабиране.

За дадените фрагменти, ако размерът на колекция в шард надвишава chunk_size, колекцията ще бъде разделена и балансирана между частите автоматично, като се използва дефинирания ключ за сегмент. В настройката за внедряване, за примера по-долу ще ни трябват 3 набора реплики, всеки с основен и някои вторични. Основните възли също действат като сървъри за разделяне.

Минималната препоръчителна конфигурация за производствено внедряване на MongoDB ще бъде поне три сървъра на сегменти, всеки с набор от реплики. За най-добра производителност сървърите mongos се разполагат на отделни сървъри, докато конфигурационните възли са интегрирани с фрагментите.

Разгръщане на MongoDB Shards с Ansible

Конфигурирането на фрагменти и набори от реплики на клъстер поотделно е тромаво начинание, поради което ние решаваме прости инструменти като Ansible, за да постигнем необходимите резултати с много лекота. Playbooks се използват за записване на необходимите конфигурации и задачи, които софтуерът Ansible ще изпълнява.

Систематичният процес на книгата трябва да бъде:

  1. Инсталирайте базови пакети mongo (без сървър, pymongo и интерфейс на командния ред)
  2. Инсталирайте сървъра mongodb. Следвайте това ръководство, за да започнете.
  3. Настройте екземпляри на mongod и съответните набори от реплики.
  4. Конфигурирайте и настройте конфигурационните сървъри
  5. Конфигурирайте и настройте услугата за маршрутизиране на Mongos.
  6. Добавете фрагментите към своя клъстер.

Ръководството от най-високо ниво трябва да изглежда така

- name: install mongo base packages include: mongod.yml
  tags: - mongod

- name: configure config server
  include: configServer.yml
  when: inventory_hostname in groups['mongoc-servers'] 
  tags:
  - cs

- name: configure mongos server
  include: configMongos.yml
  when: inventory_hostname in groups['mongos-server'] tags:
  - mongos

- name: add shards
  include: addShards.yml
  when: inventory_hostname in groups['mongos-servers'] 
  tags:
  - mongos
  - shards

Можем да запазим файла по-горе като mongodbCluster.yml.

Severalnines Станете DBA на MongoDB – Пренасяне на MongoDB в Производството Научете какво трябва да знаете, за да внедрите, наблюдавате, управлявате и мащабирате MongoDB Изтеглете безплатно

Един прост файл mongodb.yml ще изглежда така:

---
- hosts: ansible-test
  remote_user: root
  become: yes
  tasks:
  - name: Import the public key used by the package management system
    apt_key: keyserver=hkp://keyserver.ubuntu.com:80 id=7F0CEB10 state=present
  - name: Add MongoDB repository
    apt_repository: repo='deb <a class="vglnk" href="https://downloads-distro.mongodb.org/repo/ubuntu-upstart" rel="nofollow"><span>http</span><span>://</span><span>downloads</span><span>-</span><span>distro</span><span>.</span><span>mongodb</span><span>.</span><span>org</span><span>/</span><span>repo</span><span>/</span><span>ubuntu</span><span>-</span><span>upstart</span></a> dist 10gen' state=present
  - name: install mongodb
    apt: pkg=mongodb-org state=latest update_cache=yes
    notify:
    - start mongodb
  handlers:
    - name: start mongodb
      service: name=mongod state=started

Към общите параметри, необходими при внедряването на набор от реплика, имаме нужда от още тези две, за да добавим парчетата.

  • фрагмент: по подразбиране е null, Това е низ за връзка с шард, който трябва да бъде във формат /host:port. Например replica0/siteurl1.com:27017
  • състояние: по подразбиране стойността е налице, което диктува, че фрагментът трябва да присъства, в противен случай може да се зададе да отсъства.

След като разположите набор от реплика, както е обяснено в този блог, можете да продължите с добавянето на фрагментите.

# add a replicaset shard named replica0 with a member running on port 27017 on mongodb0.example.net
- mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/mongodb1.example.net:27017"
    state: present

# add a standalone mongod shard running on port 27018 of mongodb2.example.net
- mongodb_shard:
    login_user: admin
    login_password: root
    shard: "mongodb2.example.net:27018"
    state: present

# Single node shard running on localhost
- name: Ensure shard replica0 exists
  mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/localhost:3001"
    state: present

# Single node shard running on localhost
- name: Ensure shard replica0 exists
  mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/localhost:3002"
    state: present

След като настроим всички тези конфигурации, стартираме книгата с играта с командата

ansible-playbook -i hosts mongodbCluster.yml

След като книгата завърши, можем да влезем в някой от сървърите на mongos и да издадем командата sh.status(). Ако изходът е нещо като по-долу, фрагментите са разгърнати. Освен това можете да видите ключа mongodb_shard, ако е оценен успех.

mongos> sh.status()
    --- Sharding Status --- 
      sharding version: { "_id" : 1, "version" : 3 }
      shards:
        {  "_id" : "shardA",  "host" : "locahhost1/web2:2017,locahhost3:2017" }
        {  "_id" : "shardB",  "host" : "locahhost3/web2:2018,locahhost3:2019" }
{  "_id" : "shardC",  "host" : "locahhost3/web2:2019,locahhost3:2019" }

    databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

За да премахнете фрагмент, наречен replica0

- mongodb_shard:
    login_user: admin
    login_password: root
    shard: replica0
    state: absent

Заключение

Ansible изигра основна роля за улесняването на процеса на внедряване, тъй като трябва само да дефинираме задачите, които трябва да бъдат изпълнени. Представете си например, ако имате 40 членове на набора от реплики и трябва да добавите парчета към всеки. Ако вървите по нормалния път, това ще ви отнеме години и е предразположено към много човешки грешки. С ansible просто дефинирате тези задачи в прост файл, наречен playbook и ansible ще се погрижи за задачите, когато файлът се изпълни.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да премахнете елемент от двойно вложен масив в документ на MongoDB.

  2. Грешка при свързване с Mongodb вътре в контейнера за докер

  3. Запитване за документ и всички негови поддокументи, които съответстват на условие в mongodb (с помощта на spring)

  4. MongoDB:Рамка за агрегиране:Вземете документ с последна дата за идентификатор на групиране

  5. 9 функции на ClusterControl, които няма да намерите в други инструменти за управление на бази данни