Количество реплик следует выбирать с учетом таблицы ниже:
Кол-во реплик | Кол-во необходимых голосов для выбора нового Primary | Кол-во реплик, которые можно потерять с сохранением работоспособности |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
8 | 5 | 3 |
9 | 5 | 4 |
10 | 6 | 4 |
11 | 6 | 5 |
12 | 7 | 5 |
13 | 7 | 6 |
По-умолчанию голосовать могут только 7 реплик, поэтому добавление большего их количество не требуется.
Максимальное количество реплик в наборе - 50.
Схема работы с 3 репликами:
I.
Подготовка реплик
Примечание 1
На Ubuntu 22.04 устанавливается без костылей только MongoDB 6.0.4+, поэтому рекомендуется выбрать Ubuntu 20.04
Примечание 2
Для использования MongoDB 5.0+ в ВМ под управление Proxmox требуется указать тип процессора host (вместо kvm64), так как начиная с этой версии требуются AVX инструкции
1. Устанавливаем MongoDB на сервера, которые будут выполнять роль реплик:
MongoDB 6.0:
sudo apt update sudo apt -y install gnupg echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list curl -sSL https://www.mongodb.org/static/pgp/server-6.0.asc -o mongoserver.asc gpg --no-default-keyring --keyring ./mongo_key_temp.gpg --import ./mongoserver.asc gpg --no-default-keyring --keyring ./mongo_key_temp.gpg --export > ./mongoserver_key.gpg sudo mv mongoserver_key.gpg /etc/apt/trusted.gpg.d/ sudo apt update sudo apt install mongodb-org
MongoDB 5.0:
sudo apt update sudo apt -y install wget curl gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release curl -fsSL https://www.mongodb.org/static/pgp/server-5.0.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb.gpg echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list sudo apt update sudo apt -y install mongodb-org
MongoDB 4.4 (работает без AVX):
sudo apt update sudo apt-get install gnupg curl -fsSL https://pgp.mongodb.com/server-4.4.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-4.4.gpg --dearmor echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list sudo apt-get update sudo apt-get install -y mongodb-org
2. Включаем сервис MongoDB:
sudo systemctl enable mongod
3. В файле /etc/mongod.conf
необходимо:
- Изменить строку с
bindIp: 127.0.0.1
наbindIp: 0.0.0.0
- Добавить строки:
replication: replSetName: iotRepl
4. Запускаем сервис MongoDB:
sudo systemctl start mongod
Если будет производиться переход с уже существующей БД, то настройка реплик завершена, дальнейшие действия описаны в пункте IIb
.
Если установка платформы будет производиться с нуля, то требуется инициировать набор реплик заранее:
5. Подключаемся к любой из реплик при помощи mongosh:
mongosh mongodb://[ip любой из реплик]:[port mongodb любой из реплик]
6. Инициируем набор реплик командой (в данном примере реплик всего 3):
rs.initiate( { _id: "iotRepl", version: 1, members: [ { _id: 0, host : "[ip первой реплики]:[port mongodb первой реплики]" }, { _id: 1, host : "[ip второй реплики]:[port mongodb второй реплики]" }, { _id: 2, host : "[ip третьей реплики]:[port mongodb третьей реплики]" } ] } )
7. Периодически вводя команду rs.status() дождаться пока одна реплика перейдет в статус PRIMARY, а все остальные - в SECONDARY (смотреть поле stateStr
)
IIa.
Установка платформы с нуля (для версий 1.29 и ниже)
Шаги аналогичны обычным до пункта "7. Запуск и установка (только от root)", однако после этого необходимо изменить параметры БД в файле [путь до ansible-iot]
/vars/default.yml
:
Включить внешнюю MongoDB:
external: enable: true
Указать адреса всех реплик в поле
addr
:addr: "[ip первой реплики]:[port mongodb первой реплики],[ip второй реплики]:[port mongodb второй реплики],[ip третьей реплики]"
Внимание
Порт последней реплики в поле
addr
не указывается!Указать порт последней реплики в поле
port
:port: [port mongodb третьей реплики]
Далее необходимо в файле [путь до ansible-iot]/templates/iot/default-for-docker.yml.j2
в разделе iot-core
заменить:
host: "{{ mongodb_addr }}"
на
host: "{{ mongodb_addr }}:{{ mongodb_port }}/{{ coreInternal.core.db.name }}?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority&appName="
И в файле [путь до ansible-iot]/templates/iot/docker-compose/base_config.yml.j2
для сервиса broker
в environments
заменить:
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}
на
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}/?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority
После этого можно продолжать обычный процесс установки ядра, оно должно автоматически начать работать с набором реплик MongoDB.
IIb.
Переход с уже существующей БД (для версий 1.29 и ниже)
Перед выполнением последующих шагов рекомендуется сделать бекап.
1. Переходим в папку установки ядра (обычно это /storage/iot
)
2. Необходимо в файле docker-compose.yml
:
В
volumes
сервисаdb
добавить строку:- "${INSTALL_DIR}/mongodb/repl_entrypoint.sh:/entrypoint.sh"
Если порт MongoDB не был экспортирован ранее, то необходимо добавить
ports
в сервисdb
:ports: - 27017:27017
3. По пути mongodb/repl_entrypoint.sh
кладем скрипт:
4. Делаем скрипт исполняемым:
chmod +x /storage/iot/mongodb/repl_entrypoint.sh
5. Выполняем команду для пересоздания контейнера с MongoDB в виде реплики:
docker compose up -d db
Внимание
Платформа будет недоступна во время пересоздания контейнера (примерно до 15 секунд)
6. Подключаемся при помощи mongosh
к оригинальной БД:
mongosh mongodb://[ip оригинальной БД]:[port mongo оригинальной БД]
7. Изменяем адрес оригинальной БД в наборе реплик с локального ([container hash]:27017) на внешний:
cfg = rs.conf() cfg.members[0].host = "[ip оригинальной БД]:[port mongo оригинальной БД]" rs.reconfig(cfg)
Примечание
Остальные реплики должны иметь доступ к оригинальной БД по этому адресу
8. Добавляем остальные реплики:
rs.add( { host: "[ip первой реплики]:[port mongodb первой реплики]" } ) rs.add( { host: "[ip второй реплики]:[port mongodb второй реплики]" } ) rs.add( { host: "[ip третьей реплики]:[port mongodb третьей реплики]" } )
9. Периодически вводя команду rs.status() дождаться пока одна реплика перейдет в статус PRIMARY, а все остальные - в SECONDARY (смотреть поле stateStr
)
10. Необходимо изменить параметры БД в файле [путь до ansible-iot]
/vars/default.yml
:
Включить внешнюю MongoDB:
external: enable: true
Указать адреса всех реплик в поле
addr
:addr: "[ip первой реплики]:[port mongodb первой реплики],[ip второй реплики]:[port mongodb второй реплики],[ip третьей реплики]"
Внимание
Порт последней реплики в поле
addr
не указывается!Указать порт последней реплики в поле
port
:port: [port mongodb третьей реплики]
11. Необходимо в файле [путь до ansible-iot]/templates/iot/default-for-docker.yml.j2
в разделе iot-core
заменить:
host: "{{ mongodb_addr }}"
на
host: "{{ mongodb_addr }}:{{ mongodb_port }}/{{ coreInternal.core.db.name }}?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority&appName="
12. Необходимо в файле [путь до ansible-iot]/templates/iot/docker-compose/base_config.yml.j2
для сервиса broker
в environments
заменить:
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}
на
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}/?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority
13. Останавливаем платформу при помощи:
ansible-playbook [путь до ansible-iot]/stop_iot.yml
14. Подключаемся при помощи mongosh
к новой PRIMARY реплике и удаляем оригинальную БД из набора реплик при помощи команды:
rs.remove("[ip оригинальной БД]:[port mongo оригинальной БД]")
15. Запускаем платформу при помощи:
ansible-playbook [путь до ansible-iot]/install_iot.yml
III.
Настройка бэкапа реплики
1. По пути /etc/cron.daily/iot-backupdb
кладем скрипт:
2. Делаем скрипт исполняемым:
sudo chmod +x /etc/cron.daily/iot-backupdb
3. По пути /mongo_backup_env
кладем параметры бэкапа:
4. Создаем папку для бэкапов:
sudo mkdir /var/backups/mongobackups
IV. Сбор информации
1. Подключаемся при помощи mongosh
к любой из реплик для проверки статуса:
rs.printSecondaryReplicationInfo()
2. Подключаемся при помощи mongosh
к любой из реплик для проверки статуса PRIMARY:
db.runCommand("ismaster")
V. Обновление с репликами
1. Необходимо изменить параметры БД в файле [путь до ansible-iot]
/vars/default.yml
:
Включить внешнюю MongoDB:
external: enable: true
Указать адреса всех реплик в поле
addr
:addr: "[ip первой реплики]:[port mongodb первой реплики],[ip второй реплики]:[port mongodb второй реплики],[ip третьей реплики]"
Внимание
Порт последней реплики в поле
addr
не указывается!Указать порт последней реплики в поле
port
:port: [port mongodb третьей реплики]
Далее необходимо в файле [путь до ansible-iot]/templates/iot/default-for-docker.yml.j2
в разделе iot-core
заменить:
host: "{{ mongodb_addr }}"
на
host: "{{ mongodb_addr }}:{{ mongodb_port }}/{{ coreInternal.core.db.name }}?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority&appName="
И в файле [путь до ansible-iot]/templates/iot/docker-compose/base_config.yml.j2
для сервиса broker
в environments
заменить:
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}
на
- SPRING_DATA_MONGODB_URI=mongodb://${MONGODB_ADDR}:${MONGODB_PORT}/?socketTimeoutMS=20000&replicaSet=iotRepl&w=majority
После этого можно продолжать обычный процесс обновления ядра, оно будет использовать набор реплик MongoDB с существующими данными.