Системите за бази данни работят по-добре, когато има разпределено работно натоварване между редица работещи екземпляри или по-скоро данните са категоризирани по лесен начин. 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 ще изпълнява.
Систематичният процес на книгата трябва да бъде:
- Инсталирайте базови пакети mongo (без сървър, pymongo и интерфейс на командния ред)
- Инсталирайте сървъра mongodb. Следвайте това ръководство, за да започнете.
- Настройте екземпляри на mongod и съответните набори от реплики.
- Конфигурирайте и настройте конфигурационните сървъри
- Конфигурирайте и настройте услугата за маршрутизиране на Mongos.
- Добавете фрагментите към своя клъстер.
Ръководството от най-високо ниво трябва да изглежда така
- 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 ще се погрижи за задачите, когато файлът се изпълни.