Как настроить репликацию MongoDB в Ubuntu 18.04 LTS

Как настроить репликацию MongoDB в Ubuntu 18.04 LTS

 

В этом руководстве я покажу, как настроить набор реплик MongoDB на сервере Ubuntu 18.04. MongoDB — это система баз данных NoSQL корпоративного класса с автоматическим масштабированием, высокой доступностью и высокой производительностью. В базе данных NoSQL данные хранятся в структуре документа в формате MongoDB BSON. Операторы SQL не могут использоваться в MongoDB для вставки или извлечения данных.

Что такое репликация / реплика MongoDB?

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

 

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

Node1: 10.10.5.2
Node2: 10.10.5.3
Node3: 10.10.5.4

Шаг 1: Требования к настройке

Прежде чем вы сможете настроить набор реплик, вы должны установить MongoDB в каждой системе, которая будет частью набора реплик. Установите правильные имена хостов для всех серверов. Если у вас есть активный DNS-сервер, добавьте записи A для всех серверов или измените  файл / etc / hosts  . Добавьте их на всех узлах.

$ sudo vim /etc/hosts
10.10.5.2 mongodb-01 
10.10.5.3 mongodb-02 
10.10.5.4 mongodb-03

К вашему сведению:  мои настройки лаборатории основаны на Vagrantfileиспользовании KVM ниже.

# -*- mode: ruby -*-
# vim: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'

# Check required plugins
REQUIRED_PLUGINS_LIBVIRT = %w(vagrant-libvirt)
exit unless REQUIRED_PLUGINS_LIBVIRT.all? do |plugin|
  Vagrant.has_plugin?(plugin) || (
    puts "The #{plugin} plugin is required. Please install it with:"
    puts "$ vagrant plugin install #{plugin}"
    false
  )
end

Vagrant.configure("2") do |config|
  config.vm.define "mongodb-01" do |node|
    node.vm.hostname = "mongodb-01"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder '.', '/vagrant', :disabled => true
    node.vm.network "private_network", ip: "10.10.5.2"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => '10G'
    end
  end
  config.vm.define "mongodb-02" do |node|
    node.vm.hostname = "mongodb-02"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder '.', '/vagrant', :disabled => true
    node.vm.network "private_network", ip: "10.10.5.3"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => '10G'
    end
  end
  config.vm.define "mongodb-03" do |node|
    node.vm.hostname = "mongodb-03"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder '.', '/vagrant', :disabled => true
    node.vm.network "private_network", ip: "10.10.5.4"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => '10G'
    end
  end
end

Затем я побежал, vagrant up чтобы запустить все виртуальные машины

Шаг 2: Установите MongoDB на все узлы Ubuntu 18.04

Если вы еще не установили MongoDB, ознакомьтесь с нашим руководством  по установке Как установить последнюю версию MongoDB на Ubuntu 18.04 / Ubuntu 16.04. Я буду включать руководство по установке здесь для удобства.

Обновление системы:

sudo apt-get update
sudo apt-get upgrade

Импортировать открытый ключ GPG MongoDB:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

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

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

Для моей установки у меня есть 10  ГБ  вторичного хранилища, выделенного для данных MongoDB. Я разделю его и подключу к /data/mongodb.

# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 32G 0 disk |-sda1 8:1 0 487M 0 part /boot |-sda2 8:2 0 1.9G 0 part [SWAP] `-sda3 8:3 0 29.6G 0 part / vda 252:0 0 10G 0 disk

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

parted -s -a optimal -- /dev/vda mklabel gpt
parted -s -a optimal -- /dev/vda mkpart primary 0% 100%
parted -s -- /dev/vda align-check optimal 1

Затем создайте том LVM, это позволит легко расширить раздел

# pvcreate  /dev/vda1
  Physical volume "/dev/vda1" successfully created.

# vgcreate vg11 /dev/vda1
  Volume group "vg11" successfully created

# lvcreate -n data -l 100%FREE vg11
Logical volume "data" created

Создайте ext4файловую систему на созданном логическом томе.

# mkfs.ext4 /dev/mapper/vg11-data
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 2620416 4k blocks and 655360 inodes
Filesystem UUID: b98e07e5-1b04-4282-a9db-fa5b73c74d2f
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Создайте точку монтирования и смонтируйте раздел

echo "/dev/mapper/vg11-data /data ext4 defaults 0 0" >> /etc/fstab
mkdir /data
mount -a

Убедитесь, что монтирование раздела прошло успешно:

# df -hT | grep /data
/dev/mapper/vg11-data ext4      9.8G   37M  9.3G   1% /data

Установить пакеты MongoDB

sudo apt-get update
sudo apt-get install -y openssl libcurl3 mongodb-org

Создать папку для данных MongoDB

mkdir /data/mongodb
chown -R mongodb:mongodb /data/mongodb
chmod -R 775 /data/mongodb

Шаг 3: Настройте набор реплик MongoDB

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

Изменить адрес прослушивания MongoDB с локального IP-адреса на всех узлах

sudo vim /etc/mongod.conf
# node 1
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.2  # Listen to local interface only, comment to listen on all interfaces.

# node 2
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.3  # Listen to local interface only, comment to listen on all interfaces.


# node 3
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.4  # Listen to local interface only, comment to listen on all interfaces.

Настройте путь хранения к тому, который был создан ранее на всех узлах

# Where and how to store data.
storage:
  dbPath: /data/mongodb
  journal:
    enabled: true

Настройка набора реплик MongoDB

Один из узлов MongoDB работает как  PRIMARY, а все остальные узлы будут работать как  SECONDARY. Данные всегда находятся на  PRIMARY узле, а затем наборы данных реплицируются на все остальные  SECONDARYузлы.

Отредактируйте файл конфигурации MongoDB mongod.conf и включите набор реплик на всех узлах

replication:
  replSetName: "replica01"

Откройте порт  27017/tcp на брандмауэре:

sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 27017/tcp

Настройте MongoDB для запуска во время загрузки операционной системы

sudo systemctl enable mongod.service
sudo systemctl restart mongod.service

Проверьте адрес прослушивания сервиса MongoDB:

 

# ss -tunelp | grep -i mongo
tcp   LISTEN  0       128                10.10.5.2:27017          0.0.0.0:*      users:(("mongod",pid=15288,fd=11)) uid:111 ino:46927 sk:4 <->

Инициировать набор реплик MongoDB

Наш MongoDB Node1 ( mongodb-01 ) будет таким,  PRIMARY а два других будут действовать как SECONDARY

Войдите на сервер mongodb-01 и запустите оболочку mongo.

$ mongo 10.10.5.2
MongoDB shell version v4.0.1
connecting to: mongodb://10.10.5.2:27017/test
MongoDB server version: 4.0.1
Welcome to the MongoDB shell.
For interactive help, type "help".
...
>

Инициализируйте реплику, включенную с  node1 помощью следующей команды:

 

> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",                                                           
        "me" : "10.10.5.2:27017",
        "ok" : 1,
        "operationTime" : Timestamp(1534797235, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797235, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),                                                                          
                        "keyId" : NumberLong(0)
                }
        }
}

Убедитесь, что вы получите  1 для  ok государства

Добавить вторичные узлы

replica01:PRIMARY> rs.add("mongodb-02")
{
        "ok" : 1,
        "operationTime" : Timestamp(1534797580, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797580, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

replica01:PRIMARY> rs.add("mongodb-03")
{
        "ok" : 1,
        "operationTime" : Timestamp(1534797614, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797614, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Проверьте состояние набора реплик, используя:

replica01:PRIMARY> rs.status()

Проверьте статус мастера

replica01:PRIMARY> rs.isMaster()

Тестирование репликации MongoDB

Создать тестовую базу данных на  mongodb-01

replica01:PRIMARY> use test_db
switched to db test_db

Добавить некоторые данные

> db.test.save(
{
    "desc": "My Test Database",
    "apps":  ["Test1", "Test2", "Test3", "Test4"],
})

replica01:PRIMARY> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB
replica01:PRIMARY> use test_db
switched to db test_db
replica01:PRIMARY> show collections
test

Вывод

Теперь у вас есть рабочая репликация MongoDB. Вы можете увеличить размер кластера с трех узлов до  пяти  узлов,  семи  узлов или более. Это число рассчитывается по формуле: [ Основные подходящие узлы) / 2 + 1 ], что означает, что для высокой доступности требуется нечетное количество узлов, минимальное число —  три .

Ссылки:

https://docs.mongodb.com/master/replication/
https://docs.mongodb.com/manual/tutorial/deploy-replica-set/