Рубрики
Без рубрики

Учебник Pymongo: тестирование отказа MongoDB в вашем приложении Python

Как подключить реплику Mongodb SSL MongoDB, установленные с самозащитыми сертификатами с использованием Pymongo, а также тестируемое поведение по переключению Mongodb в коде Python: Flategrid Blog. Теги с MongoDB, Python, базой данных, шассию.

Python – это мощный и гибкий язык программирования, используемый миллионами разработчиков по всему миру, чтобы построить свои приложения. Это не удивительно, что разработчики Python обычно используют Хостинг MongoDB , Самая популярная база данных NoSQL Для их развертывания благодаря своей гибкой природе и отсутствию требований к схемам.

Итак, какой лучший способ использовать MongoDB с Python? Пимонго Это распределение Python, содержащее инструменты для работы с MongoDB и рекомендуемым Python MongoDB Водитель. Это довольно зрелый водитель, который поддерживает Большая часть общего Операции с базой данных, и вы можете проверить это Учебное пособие Для введения в водителя Пимонго.

При развертывании в производстве настоятельно рекомендуется установить в Монгодб реплика установить конфигурацию Таким образом, ваши данные географически распределены для высокой доступности. Также рекомендуется включить соединения SSL для шифрования трафика базы данных клиента. Мы часто берут тестирование Переключение Характеристики различных водителей MongoDB, чтобы квалифицировать их для случаев использования производства, или когда наши клиенты просят нас за советом. В этом посте мы покажем вам, как подключиться к установлению реплики Mongodb SSL Mongodb, настроенным с самозаполненными сертификатами, использующими Pymongo, и как Испытайте поведение по переключению Mongodb в вашем коде Отказ

Подключение к MongoDB SSL с использованием самостоятельных сертификатов

Первый шаг состоит в том, чтобы убедиться, что правильные версии Pymongo и его зависимостей установлены. Это руководство Помогает вам сортировать зависимости, а матрица совместимости драйвера можно найти здесь Отказ

mongo_client. Mongoclient Параметры, которые представляют интерес для нас SSL и ss_ca_cert Отказ Для подключения к конечной точке MongoDB с поддержкой SSL использует самозаполненный сертификат, SSL должен быть установлен на Истинный и ss_ca_cert Должен указывать на CA Файл сертификата.

Если вы ScaleGrid Клиент, вы можете Загрузите файл сертификата CA для ваших кластеров Mongodb от Scalegrid Console Как показано здесь:

Итак, соединительный фрагмент выглядел так:

>>> import pymongo
>>> MONGO_URI = 'mongodb://rwuser:@SG-example-0.servers.mongodirector.com:27017,SG-example-1.servers.mongodirector.com:27017,SG-example-2.servers.mongodirector.com:27017/admin?replicaSet=RS-example&ssl=true'
>>> client = pymongo.MongoClient(MONGO_URI, ssl = True, ssl_ca_certs = '')
>>> print("Databases - " + str(client.list_database_names()))
Databases - ['admin', 'local', 'test']
>>> client.close()
>>>

Если вы используя свои собственные самозавенные сертификаты где Имя хоста подтверждение может потерпеть неудачу, вам также придется установить ssl_match_hostname. Параметр на Ложь . Как и водительская документация говорит, что это не рекомендуется, так как он делает соединение восприимчивым к Человек-в-средние атаки Отказ

Тестирование поведения по передоволожению

С развертыванием MongoDB откиды не считаются основными событиями, поскольку они были с традиционными системами управления базами данных. Хотя большинство водителей MongoDB пытаются абстрактным этим событием, разработчики должны понимать и разработать свои приложения для такого поведения, так как приложения должны ожидать ошибки преходящих сетевых сетей и повторить попытку перед перкологическими ошибками.

Вы можете проверить устойчивость ваших приложений, индуцируя отказоустойчивости, пока ваша рабочая нагрузка работает. Самый простой способ индуцировать отказ – это управлять Rs.Stepdown () команда:

RS-example-0:PRIMARY> rs.stepDown()
2019-04-18T19:44:42.257+0530 E QUERY [thread1] Error: error doing query: failed: network error while attempting to run command 'replSetStepDown' on host 'SG-example-1.servers.mongodirector.com:27017' :
DB.prototype.runCommand@src/mongo/shell/db.js:168:1
DB.prototype.adminCommand@src/mongo/shell/db.js:185:1
rs.stepDown@src/mongo/shell/utils.js:1305:12
@(shell):1:1
2019-04-18T19:44:42.261+0530 I NETWORK [thread1] trying reconnect to SG-example-1.servers.mongodirector.com:27017 (X.X.X.X) failed
2019-04-18T19:44:43.267+0530 I NETWORK [thread1] reconnect SG-example-1.servers.mongodirector.com:27017 (X.X.X.X) ok
RS-example-0:SECONDARY>

Одним из способов проверить поведение водителей, является написание простого «вечного» писателя. Это будет простой код, который продолжает запись в базе данных, если не прервана пользователем, и будет распечатать все исключения, которые они сталкиваются, чтобы помочь нам понять поведение драйверов и базы данных. Я также отслеживаю данные, которые он пишет, чтобы убедиться, что в тесте нет неремонтных данных. Вот соответствующая часть тестового кода мы будем использовать для проверки поведения нашего монгодб.

import logging
import traceback
...
import pymongo
...
logger = logging.getLogger("test")

MONGO_URI = 'mongodb://rwuser:@SG-example-0.servers.mongodirector.com:48273,SG-example-1.servers.mongodirector.com:27017,SG-example-2.servers.mongodirector.com:27017/admin?replicaSet=RS-example-0&ssl=true'

try:
    logger.info("Attempting to connect...")
    client = pymongo.MongoClient(MONGO_URI, ssl = True, ssl_ca_certs = 'path-to-cacert.pem')
    db = client['test']
    collection = db['test']
    i = 0
    while True:
        try:
            text = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 3))
            doc = { "idx": i, "date" : datetime.utcnow(), "text" : text}
            i += 1
            id = collection.insert_one(doc).inserted_id
            logger.info("Record inserted - id: " + str(id))
            sleep(3)
        except pymongo.errors.ConnectionFailure as e:
            logger.error("ConnectionFailure seen: " + str(e))
            traceback.print_exc(file = sys.stdout)
            logger.info("Retrying...")

    logger.info("Done...")
except Exception as e:
    logger.error("Exception seen: " + str(e))
    traceback.print_exc(file = sys.stdout)
finally:
    client.close()

Вроде записей, которые это пишет выглядят:

RS-example-0:PRIMARY> db.test.find()
{ "_id" : ObjectId("5cb6d6269ece140f18d05438"), "idx" : 0, "date" : ISODate("2019-04-17T07:30:46.533Z"), "text" : "400" }
{ "_id" : ObjectId("5cb6d6299ece140f18d05439"), "idx" : 1, "date" : ISODate("2019-04-17T07:30:49.755Z"), "text" : "X63" }
{ "_id" : ObjectId("5cb6d62c9ece140f18d0543a"), "idx" : 2, "date" : ISODate("2019-04-17T07:30:52.976Z"), "text" : "5BX" }
{ "_id" : ObjectId("5cb6d6329ece140f18d0543c"), "idx" : 4, "date" : ISODate("2019-04-17T07:30:58.001Z"), "text" : "TGQ" }
{ "_id" : ObjectId("5cb6d63f9ece140f18d0543d"), "idx" : 5, "date" : ISODate("2019-04-17T07:31:11.417Z"), "text" : "ZWA" }
{ "_id" : ObjectId("5cb6d6429ece140f18d0543e"), "idx" : 6, "date" : ISODate("2019-04-17T07:31:14.654Z"), "text" : "WSR" }
..

Обработка исключения ConnectionFailure

Обратите внимание, что мы поймаем ConnectionFailure Исключением для решения всех проблем, связанных с сетью, мы можем столкнуться с отказом от ошибок – мы распечатаем исключение и продолжаем пытаться записать в базу данных. Водительская документация рекомендует тот:

Давайте запустим это и выполните ошибку базы данных, пока он выполняется. Вот что происходит:

04/17/2019 12:49:17 PM INFO Attempting to connect...
04/17/2019 12:49:20 PM INFO Record inserted - id: 5cb6d3789ece145a2408cbc7
04/17/2019 12:49:23 PM INFO Record inserted - id: 5cb6d37b9ece145a2408cbc8
04/17/2019 12:49:27 PM INFO Record inserted - id: 5cb6d37e9ece145a2408cbc9
04/17/2019 12:49:30 PM ERROR PyMongoError seen: connection closed
Traceback (most recent call last):
    id = collection.insert_one(doc).inserted_id
  File "C:\Users\Random\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\collection.py", line 693, in insert_one
    session=session),
...
  File "C:\Users\Random\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\network.py", line 173, in receive_message
    _receive_data_on_socket(sock, 16))
  File "C:\Users\Random\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\network.py", line 238, in _receive_data_on_socket
    raise AutoReconnect("connection closed")
pymongo.errors.AutoReconnect: connection closed
04/17/2019 12:49:30 PM INFO Retrying...
04/17/2019 12:49:42 PM INFO Record inserted - id: 5cb6d3829ece145a2408cbcb
04/17/2019 12:49:45 PM INFO Record inserted - id: 5cb6d3919ece145a2408cbcc
04/17/2019 12:49:49 PM INFO Record inserted - id: 5cb6d3949ece145a2408cbcd
04/17/2019 12:49:52 PM INFO Record inserted - id: 5cb6d3989ece145a2408cbce

Обратите внимание, что водитель занимает около 12 секунд, чтобы понять новую топологию, подключить к новой первичной и продолжать запись. Приподнятое исключением ошибки. AutoReconnect который является подклассом ConnectionFailure.

Вы можете сделать еще несколько бега, чтобы увидеть, какие другие исключения видны. Например, вот еще один след исключения, который я столкнулся с:

    id = collection.insert_one(doc).inserted_id
  File "C:\Users\Random\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\collection.py", line 693, in insert_one
    session=session),
...
  File "C:\Users\Randome\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\network.py", line 150, in command
    parse_write_concern_error=parse_write_concern_error)
  File "C:\Users\Random\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymongo\helpers.py", line 132, in _check_command_response
    raise NotMasterError(errmsg, response)
pymongo.errors.NotMasterError: not master

Это исключение также является дополнительным классом ConnectionFailure.

‘ Параметр RectryWrites

Еще одна область для тестирования поведения по переключению Mongodb будет видеть, как другие варианты параметра влияют на результаты. Один параметр, который соответствует « » RectryWrites ‘:

Давайте посмотрим, как этот параметр работает с отказом. Единственное изменение, сделанное в код, это:

client = pymongo.MongoClient(MONGO_URI, ssl = True, ssl_ca_certs = 'path-to-cacert.pem', retryWrites = True)

Давайте запустим это сейчас, а затем выполните переключение системы базы данных:

04/18/2019 08:49:30 PM INFO Attempting to connect...
04/18/2019 08:49:35 PM INFO Record inserted - id: 5cb895869ece146554010c77
04/18/2019 08:49:38 PM INFO Record inserted - id: 5cb8958a9ece146554010c78
04/18/2019 08:49:41 PM INFO Record inserted - id: 5cb8958d9ece146554010c79
04/18/2019 08:49:44 PM INFO Record inserted - id: 5cb895909ece146554010c7a
04/18/2019 08:49:48 PM INFO Record inserted - id: 5cb895939ece146554010c7b <<< Failover around this time
04/18/2019 08:50:04 PM INFO Record inserted - id: 5cb895979ece146554010c7c
04/18/2019 08:50:07 PM INFO Record inserted - id: 5cb895a79ece146554010c7d
04/18/2019 08:50:10 PM INFO Record inserted - id: 5cb895aa9ece146554010c7e
04/18/2019 08:50:14 PM INFO Record inserted - id: 5cb895ad9ece146554010c7f
...

Обратите внимание, как вставка после отработки проезда занимает около 12 секунд, но успешно проходит через RectryWrites Параметр обеспечивает неудачную запись. Помните, что настройка этого параметра не освобождает вас от обработки исключения ConnectionFailure – вам нужно беспокоиться о чтениях и других операциях, поведение которых не зависит от этого параметра. Это также не полностью решает проблему, даже для поддерживаемых операций – иногда откиды могут занять больше времени для завершения и RectryWrites Один только не будет достаточно.

Настройка значения тайм-аута сети

Rs.Stepdown () Индуцирует довольно быстрое отработку, поскольку основной набор реплики настроен, чтобы стать вторичным, а вторичные данные удерживают выборы для определения нового первичного. В развертывании производства, сетевой нагрузки, раздела и другие такие вопросы задерживают обнаружение недоступности первичного сервера, таким образом, продлевать ваше время отказоустойчивости. Вы также бы часто столкнулись с ошибками Pymongo, как ошибки. Serverselection TimeOuteRror ошибки. NetworkTimeout и т. Д. Во время проблем с сетью и отказом.

Если это происходит очень часто, вы должны посмотреть настроить параметры тайм-аута. Связанные параметры тайм-аута Mongoclient являются сервесочками, соединения, соединение NoteTimeOutms и SocketTimeOutms. Из них выбирая большее значение для сервеса для сервеса, чаще всего помогает при работе с ошибками во время отказов:

Готов к использованию MongoDB в вашем приложении Python? Проверьте наш Начало работы с Python и MongoDB Статья, чтобы увидеть, как вы можете встать и запустить всего за 5 простых шагов. Scalegrid это единственный MongoDB DBAAS Provider Это дает вам полный доступ к вашим экземплярам, чтобы вы могли запустить свой Python Server на том же компьютере, что и ваш сервер MongoDB. Автоматизировать развертывание облаков Mongodb на AWS , Azure или Digitalocean С выделенными серверами, высокой доступностью и аварийным восстановлением, чтобы вы могли сосредоточиться на разработке приложений Python.

Оригинал: “https://dev.to/scalegrid/pymongo-tutorial-testing-mongodb-failover-in-your-python-app-4h3p”