Репликацията се прилага широко в системите за бази данни за осигуряване на висока наличност на данни чрез създаване на излишък. По същество това е стратегия за правене на копие на едни и същи данни в различни работещи сървъри, които може да са на различни машини, така че в случай на повреда на главния сървър, да може да се създаде друг, който да продължи с обслужването.
Наборът реплики е група от екземпляри на MongoDB, които поддържат същия набор от данни. Те са в основата на внедряването на производството. Репликацията е изгодна от факта, че данните винаги са достъпни от различен сървър само в случай, че основната сървърна система се повреди. Освен това, той подобрява пропускателната способност за четене, като позволява на клиента да изпраща заявка за четене до различни сървъри и да получава отговор от най-близкия.
Наборът реплики представлява няколко възли, носещи данни, които могат да бъдат хоствани в различни машини и арбитър възел. Един от тези възли, носещи данни, е обозначен като основен, докато другите са вторични възли. Първичният възел получава всички операции на запис и след това репликира данните на другите възли, след като операцията на запис е завършена и промените се записват в oplog.
Арбитърът е допълнителен екземпляр, който не поддържа набор от данни, но осигурява кворум в набор от реплики, като отговаря на сърдечен ритъм и изборни заявки от други членове на набора от реплики. По този начин те намаляват разходите за поддържане на набор от реплики, а не на напълно функционален член на набор от реплики с набор от данни.
Автоматично отказване
Първичният възел може да се повреди поради някои причини, като прекъсване на захранването или прекъсване на връзката с мрежата, поради което не може да комуникира с другите членове. Ако комуникацията е прекъсната за повече от конфигурирания период за избор TimeoutMillis, един от вторичните призовава за избор, за да се номинира като нов първичен. Ако изборът е завършен и успешен, клъстерът продължава с нормалната си работа. През този период не могат да се извършват никакви операции по запис. Въпреки това, заявките за четене могат да бъдат конфигурирани да вървят нормално на вторичните, докато основният е офлайн.
За оптимален процес на репликация, средното време преди клъстерът да избере нов първичен максимум трябва да бъде 12 секунди с настройките за конфигурация на репликация по подразбиране. Това може да бъде повлияно от фактори като мрежово забавяне, което може да удължи времето, следователно трябва да се вземе предвид архитектурата на клъстера, за да се гарантира, че това време не е зададено твърде високо.
Стойността за selectionTimeoutMillis може да бъде намалена от 10000 по подразбиране (10 секунди), следователно първичният може да бъде открит много първи по време на много бързо. Това обаче може да назначава често избори дори за незначителни фактори като временно забавяне на мрежата, въпреки че първичният възел е здрав. Това ще доведе до проблеми като връщане назад за операции по запис.
Ansible за набори реплики
Както споменахме, наборът от реплика може да има членове от различни хост машини, което прави по-сложно поддържането на клъстера. Нуждаем се от една платформа, от която този комплект копия може да се поддържа с лекота. Ansible е един от инструментите, който предоставя по-добър преглед за конфигуриране и управление на набор от реплики. Ако сте нов в ansible, моля, направете кратко обобщение от тази статия, за да разберете основите, като например създаването на книга за игри.
Конфигурационни параметри
- arbiter_at_index: това определя позицията на арбитъра в списъка с членове на набора от реплика. Запомнянето на арбитъра няма никакви данни като другите членове и не може да се използва като основен възел. Достъпно е само за създаване на кворум по време на изборите. Например, ако имате четен брой членове, добре е да добавите арбитър, така че ако гласовете са равни, той добавя 1, за да направи печеливш член. Стойността, която трябва да бъде присвоена, трябва да е цяло число.
- chaining_allowed: Това приема булева стойност и дефинира дали другите вторични членове трябва да се репликират от другите вторични членове, ако веригата _allowed =true. В противен случай, ако веригата _allowed =false, другите вторични членове могат да се репликират само от първичните. Стойността по подразбиране е true.
- election_timeout_secs: по подразбиране стойността е 10000 (приема целочислена стойност). Това е времето в милисекунди за откриване кога основният възел не е достъпен или по-скоро не комуникира с другите членове, следователно задейства избор. Задайте това на средна стойност от 12 секунди. Ако е зададен твърде високо, ще отнеме много време, преди да се открие първичният провал и следователно повече време за провеждане на избори. Тъй като това засяга операцията на запис, може да загубите много данни през този период. От друга страна, ако е зададен твърде ниско, ще има често задействане на избори, дори когато случаят не е толкова сериозен и първичните все още са достъпни. В резултат на това ще имате толкова много връщания назад за операции по запис, които в даден момент могат да доведат до лош интегритет на данните или непоследователност.
- heartbeat_timeout_secs: Наборите реплики трябва да комуникират помежду си преди избори, като изпращат сигнал, наречен сърдечен ритъм. След това членовете трябва да отговорят на това сигнализиране в рамките на определен период, който по подразбиране е настроен на 10 секунди. Heartbeat_timeout_secs е броят секунди, през които членовете на набора от реплики чакат успешен сърдечен удар един от друг и ако даден член не отговори, той се маркира като недостъпен. Това обаче е приложимо само за протокол версия 0. Следователно стойността за това е цяло число.
- host_login_host: Това е хостът, който съхранява базата данни за вход. По подразбиране за MongoDB е localhost.
- login_database: по подразбиране е администраторът и е мястото, където се съхраняват идентификационните данни за вход. (приема стойност на низ)
- login_user: потребителското име, с което трябва да се извърши удостоверяването. (приема стойност на низ)
- парола_за вход: паролата за удостоверяване на потребителя. (приема стойност на низ)
- вход_порт: Това е портът MongoDB, в който хостът да влезе. (приема целочислена стойност)
- членове: дефинира списък с членове на набор от реплика. Това е низ, разделен със запетая или yaml списък, т.е. mongodb0:27017,mongodb2:27018,mongodb3:27019... Ако няма номер на порт, тогава се приема 27017.
- protocol_version: приема цяло число, което дефинира версията на процеса на репликация. Или 0, или 1
- набор_реплика: това е низова стойност, която дефинира името на набора от реплика.
- ssl: булева стойност, която определя дали да се използва SSL връзка при свързване към базата данни или не.
- ssl_certs_reqs: това указва дали се изисква сертификат от другата страна на връзката и дали ще е необходимо да го потвърдите, ако е предоставен. Изборите за това са CERT_NONE, CERT_OPTIONAL и CERT_REQUIRED. По подразбиране е CERT_REQUIRED.
- потвърдете: приема булева стойност, която определя дали да се направи някаква основна проверка на предоставената конфигурация на набора от реплика. Стойността по подразбиране е true.
Създаване на набор от реплики на MongoDB с помощта на Ansible
Ето един прост пример за задачи за настройка на набор от реплика в ansible. Нека наречем този файл tasks.yaml
# Create a replicaset called 'replica0' with the 3 provided members
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_user: admin
login_password: root
replica_set: replica0
arbiter_at_index:2
election_timeout_secs:12000
members:
- mongodb1:27017
- mongodb2:27018
- mongodb3:27019
when: groups.mongod.index(inventory_hostname) == 0
# Create two single-node replicasets on the localhost for testing
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_port: 3001
login_user: admin
login_password: root
login_database: admin
replica_set: replica0
members: localhost:3000
validate: yes
- name: Ensure replicaset replica1 exists
mongodb_replicaset:
login_host: localhost
login_port: 3002
login_user: admin
login_password: secret
login_database: root
replica_set: replica1
members: localhost:3001
validate: yes
В нашата тетрадка можем да наречем задачите като
---
- hosts: ansible-test
remote_user: root
become: yes
Tasks:
- include: tasks.yml
Ако стартирате това във вашия playbook, ansible-playbook -i inventory.txt -c ssh mongodbcreateReplcaSet.yaml, ще ви бъде представен отговор дали наборът от реплика е създаден или не. Ако ключът mongodb_replicaset бъде върнат със стойност за успех и описание на създадения набор от реплика, тогава можете да започнете.
Заключение
В MongoDB обикновено е досадно да конфигурирате набор от реплики за екземплярите на mongod, които могат да бъдат хоствани от различни машини. Въпреки това, Ansible предоставя проста платформа за извършване на същото, като просто дефинира няколко параметъра, както беше обсъдено по-горе. Репликацията е един от процесите, който гарантира непрекъсната работа на приложението, следователно трябва да бъде добре конфигуриран чрез задаване на множество членове в производствения свят. Арбитър се използва за създаване на кворум по време на изборния процес, следователно трябва да бъде включен в конфигурационния файл, като се дефинира неговата позиция.