Systemy baz danych działają lepiej, gdy obciążenie jest rozproszone na kilka uruchomionych instancji lub gdy dane są łatwo kategoryzowane. MongoDB wykorzystuje sharding w taki sposób, że dane w danej bazie danych są pogrupowane według jakiegoś klucza. Sharding zwiększa skalowanie poziome, co w konsekwencji skutkuje lepszą wydajnością i zwiększoną niezawodnością. Ogólnie rzecz biorąc, MongoDB oferuje skalowanie poziome i pionowe w przeciwieństwie do SQL DBMS, na przykład MySQL, który promuje tylko skalowanie pionowe.
MongoDB ma luźniejszy model spójności, w którym dokument w kolekcji może mieć dodatkowy klucz, którego nie ma w innych dokumentach w tej samej kolekcji.
Sharding
Sharding to w zasadzie partycjonowanie danych na oddzielne porcje, a następnie definiowanie zakresu porcji na różne serwery fragmentów. Do grupowania danych używany jest klucz fragmentu, który często jest polem obecnym we wszystkich dokumentach w bazie danych, które mają zostać podzielone. Sharding współdziała z replikacją, aby przyspieszyć przepustowość odczytu, zapewniając rozproszone obciążenie między wieloma serwerami, a nie w zależności od jednego serwera. Poza tym replikacja zapewnia dostępność kopii zapisanych danych.
Załóżmy, że mamy w kolekcji 120 dokumentów, dane te można podzielić tak, że mamy 3 zestawy replik, a każdy ma 40 dokumentów, jak pokazano w konfiguracji poniżej. Jeśli dwóch klientów wysyła żądania, jeden o pobranie dokumentu z indeksu 35, a drugi o indeksie 92, żądanie jest odbierane przez router zapytań (proces Mongos), który z kolei kontaktuje się z węzłem konfiguracyjnym, który prowadzi rejestr jak zakresy kawałków są rozdzielone między odłamki. Po znalezieniu określonej tożsamości dokumentu jest ona pobierana z powiązanego fragmentu. Na przykład powyżej dokument pierwszego klienta zostanie pobrany z fragmentu A, a dla klienta B dokument zostanie pobrany z fragmentu C. Ogólnie rzecz biorąc, będzie rozproszone obciążenie, które jest definiowane jako skalowanie poziome.
W przypadku danych fragmentów, jeśli rozmiar kolekcji w shard przekracza chunk_size, kolekcja zostanie podzielona i zrównoważona między fragmentami automatycznie przy użyciu zdefiniowanego klucza fragmentu. W konfiguracji wdrożenia, w poniższym przykładzie będziemy potrzebować 3 zestawów replik, każdy z podstawowym i kilkoma dodatkowymi. Węzły podstawowe działają również jako serwery shardingu.
Minimalna zalecana konfiguracja dla wdrożenia produkcyjnego MongoDB to co najmniej trzy serwery fragmentów, każdy z zestawem replik. Aby uzyskać najlepszą wydajność, serwery Mongos są wdrażane na oddzielnych serwerach, podczas gdy węzły konfiguracyjne są zintegrowane z odłamkami.
Wdrażanie fragmentów MongoDB za pomocą Ansible
Konfigurowanie fragmentów i zestawów replik klastra osobno jest uciążliwym przedsięwzięciem, dlatego przechodzimy na proste narzędzia, takie jak Ansible, aby osiągnąć wymagane wyniki z dużą łatwością. Poradniki służą do zapisywania wymaganych konfiguracji i zadań, które oprogramowanie Ansible będzie wykonywać.
Systematyczny proces tworzenia podręcznika powinien wyglądać następująco:
- Zainstaluj podstawowe pakiety mongo (bez serwera, pymongo i interfejs wiersza poleceń)
- Zainstaluj serwer mongodb. Postępuj zgodnie z tym przewodnikiem, aby rozpocząć.
- Ustaw instancje mongod i tam zestawy replik korespondencyjnych.
- Skonfiguruj i skonfiguruj serwery konfiguracyjne
- Skonfiguruj i skonfiguruj usługę routingu Mongos.
- Dodaj fragmenty do swojego klastra.
Poradnik najwyższego poziomu powinien wyglądać tak
- 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
Możemy zapisać powyższy plik jako mongodbCluster.yml.
Kilkadziesiąt — Zostań administratorem baz danych MongoDB — wprowadzenie MongoDB do produkcjiDowiedz się, co trzeba wiedzieć, aby wdrażać, monitorować, zarządzać i skalować MongoDB. Pobierz za darmoProsty plik mongodb.yml będzie wyglądał następująco:
---
- 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
Do ogólnych parametrów wymaganych do wdrożenia zestawu replik potrzebujemy tych dwóch dodatkowych, aby dodać odłamki.
- odłamek: domyślnie ma wartość null, Jest to ciąg połączenia fragmentu, który powinien mieć format
/host:port. Na przykład replika0/siteurl1.com:27017 - stan: domyślnie wartość jest obecna, co oznacza, że fragment powinien być obecny, w przeciwnym razie można go ustawić jako nieobecny.
Po wdrożeniu zestawu replik, jak wyjaśniono na tym blogu, możesz przystąpić do dodawania odłamków.
# 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
Po skonfigurowaniu wszystkich tych konfiguracji uruchamiamy playbook za pomocą polecenia
ansible-playbook -i hosts mongodbCluster.yml
Po ukończeniu playbooka możemy zalogować się do dowolnego serwera mongos i wydać polecenie sh.status(). Jeśli dane wyjściowe są podobne do poniższych, fragmenty zostały wdrożone. Poza tym możesz zobaczyć klucz mongodb_shard, jeśli był ceniony za sukces.
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" }
Aby usunąć fragment o nazwie replika0
- mongodb_shard:
login_user: admin
login_password: root
shard: replica0
state: absent
Wniosek
Ansible odegrał ważną rolę w ułatwieniu procesu wdrażania, ponieważ musimy tylko zdefiniować zadania, które należy wykonać. Wyobraź sobie na przykład, że masz 40 członków zestawu replik i do każdego musisz dodać odłamki. Pójście normalną drogą zajmie ci wieki i jest podatne na wiele ludzkich błędów. W przypadku ansible wystarczy zdefiniować te zadania w prostym pliku o nazwie playbook, a ansible zajmie się zadaniami, gdy plik zostanie uruchomiony.