По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В этой статье посмотрим как можно отправлять электронные письма при помощи Python. Есть и более простые способы это сделать, но мне больше подошел именно следующий вариант. Итак, вот как это выглядит: у вас есть имена и адреса электронной почты некоторой группы контактов. И вы хотите отправить каждому из них письмо, добавив в начале сообщения «Уважаемый [имя]». Для простоты вы можете хранить всю контактную информацию просто в файле, а не в базе данных. Также вы можете сохранить в файл шаблон сообщения, которое вы хотите отправить. Модуль smtplib в Python – это практически все, что вам понадобиться для отправки простых электронных писем без заполнения темы письма или какой-либо еще дополнительной информации. Но, конечно, для настоящих писем вам необходимо заполнить строку темы письма и другую информацию, и, возможно, даже прикрепить изображения или какие-то другие вложения. Вот тут и приходит на помощь пакет email в Python. Имейте в виду, что нельзя отправить сообщение через электронную почту, используя только этот пакет. Вам необходимо совместить email и smtplib. Обязательно ознакомьтесь с подробной официальной документацией для каждого из этих пакетов. Вот четыре основных шага для отправки электронных писем с помощью Python: Настройте SMTP-сервер и войдите в свою учетную запись. Создайте объект сообщения MIMEMultipart и загрузите его с соответствующими заголовками для полей From (От), To (Кому) и Subject (Тема). Добавьте тело сообщения. Отправьте сообщение с помощью объекта SMTP-сервера. А теперь давайте рассмотрим весь процесс. Допустим, что у вас есть файл контактов mycontacts.txt, который выглядит вот так: user@computer ~ $ cat mycontacts.txt john johndoe@example.com katie katie2016@example.com Каждая строка соответствует одному контакту. В каждой строке пишется имя, а за ним следует адрес электронной почты. У меня все сохранено в нижнем регистре. Я оставлю преобразования любых полей или некоторых начальных букв в верхний регистр логике программирования, если это будет необходимо. В Python это все довольно просто. Далее у нас есть файл с шаблоном сообщения message.txt. user@computer ~ $ cat message.txt Dear ${PERSON_NAME}, This is a test message. Have a great weekend! Yours Truly Обратили внимание на ${PERSON_NAME}? Это шаблонная строка в Python. Шаблонные строки можно легко заменить другими строками; в данном примере ${PERSON_NAME} будет заменено настоящим именем человека (вы скоро это увидите). А теперь давайте перейдем к коду Python. Для начала нам необходимо прочитать контакты из файла mycontacts.txt. Мы, кстати, можем обобщить это в отдельную функцию. # Function to read the contacts from a given contact file and return a # list of names and email addresses def get_contacts(filename): names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails Функция get_contacts() в качестве аргумента принимает имя файла. Она откроет этот файл, прочитает каждую строку (то есть каждый контакт), разделит их на имя и адрес электронной почты, а затем добавит их в два отдельных списка. И, наконец, в качестве результата работы функции возвращаются эти два списка. Также нам нужна функция для того, чтобы прочитать шаблон сообщения (такой как message.txt) и вернуть объект типа Template, созданный из его содержимого. from string import Template def read_template(filename): with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) Как и предыдущая функция, в качестве аргумента она принимает имя файла. Для того, чтобы отправить письмо, вам необходимо использовать протокол SMTP (Simple Mail Transfer Protocol – протокол простого обмена электронной почтой). Как уже упоминалось ранее, у Python есть необходимые для этого библиотеки. # import the smtplib module. It should be included in Python by default import smtplib # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD) В приведенном выше фрагменте кода вы импортируете smtplib, а затем создаете экземпляр SMTP, который формирует SMTP-соединение. В качестве параметра он принимает адрес хоста и номер порта, оба эти параметра полностью зависят от настроек SMTP вашего поставщика услуг электронной почты. Например, в случае Outlook строка под номером 4 будет выглядеть вот так: s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587) Для того, чтобы все работало, вам необходимо использовать адрес хоста и номер порта конкретно вашего поставщика услуг электронной почты. MY_ADDRESS и PASSWORD – это две переменные, которые содержат полный адрес электронной почты и пароль от учетной записи, которую вы собираетесь использовать. А теперь самое время получить контактную информацию и шаблон сообщения, используя функции, которые мы определили ранее. names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt') А теперь давайте отправим отдельное письмо каждому из этих контактов. # import necessary packages from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg Для каждого name (имя) и email (адрес электронной почты) (из файла с контактами) вы создаете объект MIMEMultipart, настраиваете заголовки типов содержимого From (от), To (кому), Subject (тема) как словарь ключевых слов, а затем прикрепляете тело сообщения к объекту MIMEMultipart в виде обычного текста. Возможно, вам захочется прочитать документацию, чтобы узнать больше о других типах MIME, с которыми вы также можете поэкспериментировать. Также обратите внимание, что в строке 10 выше я заменяю ${PERSON_NAME} фактическим именем, которое было извлечено из файла с контактами с помощью механизма шаблонизации в Python. В данном конкретном примере я каждый раз удаляю объект MIMEMultipart и создаю его заново при каждой итерации цикла. Как только вы проделаете все это, то сможете отправить сообщение, используя простую удобную функцию send_message() объекта SMTP, который вы создали ранее. А вот и полный код: import smtplib from string import Template from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText MY_ADDRESS = 'my_address@example.comm' PASSWORD = 'mypassword' def get_contacts(filename): """ Return two lists names, emails containing names and email addresses read from a file specified by filename. """ names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails def read_template(filename): """ Returns a Template object comprising the contents of the file specified by filename. """ with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) def main(): names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt') # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD) # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # Prints out the message body for our sake print(message) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg # Terminate the SMTP session and close the connection s.quit() if __name__ == '__main__': main()
img
Итак, вы хотите стать DevOps-инженером? Это впечатляющий, сложный и высокооплачиваемый вариант карьеры, но такая ключевая роль объединяет разработку программного обеспечения и его эксплуатацию. Мы составили дорожную карту DevOps, которая включает в себя все шаги, которые необходимы для того, чтобы занять место эксперта DevOps. Как вы знаете, DevOps – это набор практик и инструментов для интеграции и автоматизации процессов между IT-командами и командами разработчиков программного обеспечения. Поэтому он фокусируется на общении и сотрудничестве между командами, используя лучшие инструменты автоматизации, доступные для повышения эффективности. Следующий акцент делается на объединении тех, кто работает в области разработки программного обеспечения с развертыванием ПО, а также на обеспечении высокого уровня структурной и технической поддержки. Это все означает, что DevOps-инженеры должны знать свое дело, чтобы справиться с этой неподъемной задачей. А что же тогда такое «их дело»? Оказывается, что это не просто их дело, но и дело всех остальных. Конечно, это может звучать, как что-то невероятное, что мало кто может преодолеть. DevOps-инженеры действительно являются экспертами высокого уровня, и стать одним из них также практически невозможно. Вместе с тем, данное руководство поможет вам четко понять, какие шаги необходимо предпринять, прежде чем начать свое путешествие по DevOps. Давайте посмотрим. Зачем вам нужна дорожная карта DevOps? В нашей статье о DevOps рассказывается о том, почему стать DevOps-инженером так сложно, ведь DevOps-команды включают в себя разработчиков и IT-специалистов, работающих рука об руку на протяжении всего жизненного цикла проекта. И поэтому, дорожная карта DevOps предполагает высокие навыки и необходимые шаги, которые помогают повысить скорость и качество разработки и развертывания и предотвратить организационную разрозненность. Иногда команды объединяются, чтобы максимизировать эффективность, при этом инженеры работают на протяжении всего жизненного цикла продукта или приложения. Итак, каковы же эти требования? Вот этот исчерпывающий список для того, чтобы получить эту дорожную карту, которая направит вас на верный путь. Как стать DevOps-инженером за 14 шагов 1. Изучайте языки программирования Первый шаг к тому, чтобы стать DevOps-инженером, - это владение одним или несколькими языками программирования. Конечно, вы не будете интегрировать базы данных или автоматизировать процессы разработки и развертывания, отлаживать базы данных, отлаживать код и исправлять возникающие проблемы, но в результате вы должны внести свой вклад в поддержание конвейера непрерывной интеграции/поставки в рабочем состоянии. Если вы читаете эту статью, то мы можем предположить, что вы владеете хотя бы одним из «больших» языков программирования, таких как Java, JavaScript или Python. Но если все же нет, то мы рекомендуем вам повысить уровень знания до высокого как минимум двух или трех языков программирования из списка ниже: Python Perl Java JavaScript Go Ruby Rust C C++ 2. Научитесь работать с разными ОС DevOps-инженеру необходимо знать, как работают разные операционные системы, а также различия между ними, в основном потому, что вы будете запускать приложения на серверах. В связи с этим, оптимальным решением для такого рода вещей, как правило, является Linux – ее используют большинство компаний и поставщиков серверов. Если вы используете веб-приложение, то оно, вероятнее всего, находится на сервере Linux. Есть и другие операционные системы, которые не помешает знать: Windows Unix Debian SUSE Linux Fedora Ubuntu CentOS RHEL macOS FreeBSD OpenBSD NetBSD 3. Концепция ОС Так вот, операционные системы – это лишь часть дорожной карты DevOps. Также вы должны быть в состоянии углубиться, понимая базовую инфраструктуру ОС, которая позволяет вам запускать приложение. Это называется «концепцией операционной системы», и вы должны быть знакомы с: Управлением запуском Управлением процессом Сокетами Front-end разработкой Потоками и параллелизмом Управлением вводом/выводом Основами POSIX Виртуализацией Файловыми системами Памятью и хранилищем Управлением службами Сетью 4. Сетевая безопасность и протоколы Как DevOps-инженер, вы должны быть всегда спокойны. Сетевая безопасность и протоколы помогут вам обеспечить целостность и безопасность ваших данных. Они определяют процессы и методологии, которые вы будете использовать для защиты вашей сети от попыток несанкционированного доступа. Вот протоколы, о которых вам следует знать: HTTP HTTPS FTP Межсетевые экраны SSH SSL/TTS IPsec и VPN Переадресация портов AT-TLS SNMP Аутентификация OSFP Прокси-доступ 5. Терминалы – ваш новый дом Консоль позволяет разработчикам автоматизировать, создавать сценарии и выполнять системные задачи без использования графического пользовательского интерфейса. В следствие чего, вы должны уметь работать с текстом, создавать bash-сценарии, отслеживать процессы, производительность системы, работать в сети, компилировать приложения из исходника, Vim, Nano, Emacs и Powershell. Мы готовы поспорить, что, если вы уже привыкли, и вам удобно, создавать файлы .cfg в выбранной вами FPS, то здесь вы будете как дома. И вам в любом случае нужно будет это делать. 6.Веб-серверы Когда пользователь запрашивает информацию, сервер выполняет запрос. На веб-сервере может размещаться один или несколько веб-сайтов с использованием одного и того же оборудования и ресурсов. Он взаимодействует с веб-браузером через HTTP/HTTPS. Быть DevOps-инженером означает знать, как контролировать сервер. Вот некоторые распространенные веб-серверы, о который вам стоит узнать: Apache Nginx IIS Tomcat Caddy Istio Envoy Consul Linkerd 7. Инструменты непрерывной интеграции/непрерывной поставки Конвейер непрерывной интеграции/поставки (CI/CD) необходим для разработки программного обеспечения в рамках DevOps. Как было сказано в предыдущей статье, непрерывная интеграция – это методика разработки программного обеспечения, при которой разработчики объединяют все изменения кода, которые они вносят, в единый репозиторий. В то время как, непрерывная поставка реализует изменения кода, которые автоматически создаются, тестируются и подготавливаются в производственному выпуску. Ее можно рассматривать как расширение непрерывной интеграции. Вот некоторые из инструментов, которые вы можете использовать для этой цели: TravisCI GitHub GitLab Bamboo Jenkins TeamCity Azure DevOps 8. Изучите инфраструктуру как код (IaC) Пожалуй, это одно из основных направлений работы DevOps-инженеров. Поэтому неудивительно, что эта тема довольно обширная и разнообразная. Знание таких контейнеров, как Kubernetes и Docker, а также различных инструментов управления конфигурацией имеет жизненно важное значение для вашего собственного развития и успеха проектов, которые вы возглавляете. Вот некоторые DevOps-инструменты, о которых вам следует знать: Docker Containers LXC Ansible Salt Chef Puppet Mesos Kubernetes Docker Swarm Nomad Istio Service Mesh Linkerd Consul Connet Maesh Kuma Terraform 9. Управление приложениями Управление приложениями относится к процессу измерения доступности, возможностей и производительности приложения. Данные, собираемые в процессе, позволяют выявлять и устранять баги и ошибки до того, как у пользователей возникнут проблемы. Обычно используется такое программное обеспечение, как: AppDynamic Instana New Relic Jaeger OpenTracing 10. Управление инфраструктурой Эта часть дорожной карты DevOps влечет за собой процесс получения как можно большего количества данных о вашей инфраструктуре с целью принятия обоснованных оперативных решений. В этой связи, используются данные, генерируемые помимо прочего приложениями, серверами и сетевыми устройствами, с целью отслеживание таких показателей, как мощность оборудования, пропускная способность сети и время работоспособности. В свою очередь, эта информация помогает повысить эффективность и устранять ошибки, показывая, какие области требуют большего внимания. Вот некоторые хорошие инструменты для управления инфраструктурой: Grafana Prometheus Zabbix Nagios Datadog 11. Шаблон облачного проектирования Этот шаблон помогает создавать масштабируемые, надежные и безопасные приложения в облаке. Однако для этого необходимо быть знакомым с одним ли несколькими шаблонами облачного проектирования. На наш взгляд, одними из самыми важными являются следующие: Источники событий Посредник CQRS Агрегирование на шлюзе Консолидация вычислительных ресурсов Внешнее хранилище конфигурации Уровень защиты от повреждений Каналы и фильтры Перенесение в шлюз Маршрутизация шлюза Расширение за счет внешних устройств 12. Управление логами Логи помогают составлять список событий, происходящих в системе, и изучать их детали. Благодаря этому, управление журналами поможет вам, то есть начинающему DevOps-инженеру, улучшить службы и процессы, предотвратить уязвимости и выявить узкие места. Вот некоторые из инструментов, которые вы так или иначе будете использовать: Splunk Elastic stack Graylog Papertrail 13. Поставщики облачных услуг и пакеты услуг Как мы уже поняли, облачные услуги – это то, с чем обязательно нужно быть знакомым DevOps-инженеру. Кроме того, вам необходимо понимать преимущества и особенности каждого поставщика облачных услуг для того, чтобы ваша организация могла сделать верный осознанный выбор. Некоторые из популярных заслуживают того, чтобы их изучили, например: Google Cloud AWS Azure Digital Ocean Linode Alibaba Конечно, стоит отметить, что эти провайдеры редко работают по фиксированной стоимости. Как правило, цены на эти услуги зависят от необходимого количества доменов и памяти и SSL-сертификатов, требуемых ЦП. 14. Другие технологии Это лишь краткий список того, что вам нужно сделать, чтобы получить знания на пути к тому, чтобы стать DevOps-инженером. Таблица кэша Обратный прокси-сервер Прокси-сервер переадресации Межсетевой экран Балансировка нагрузки Сервер кэширования Заключение Дорожная карта DevOps предназначена для того, чтобы направить вас на правильный путь к профессиональным навыкам DevOps. Конечно, это не означает, что он уже устоявшийся и не подлежит изменению. Технологии меняются ежедневно, и вы должны постоянно быть в курсе новых инструментов и решений. Еще один пункт на пути к становлению DevOps-инженером – это обучение и адаптация, и, пожалуй, самое важное – хорошо выполнять свою работу. Если вы следуете этой дорожной карте и у вас уже есть солидная база знаний в области компьютерных наук, то вам потребуется всего каких-то шесть месяцев для того, чтобы сдвинуться с той точки, в которой вы сейчас, и дойти до начала своей карьеры DevOps-инженера. Не забудьте добавить следующие пункты в список того, что нужно выучить: Языки программирования Концепции ОС Терминалы Сеть и безопасность Инструменты CI/CD Веб-сервер Инфраструктура как код Управление приложением Управление инфраструктурой Шаблон облачного проектирования Управление журналом Поставщики облачных услуг и управление службами Другие технологии Часто задаваемые вопросы Чем занимается DevOps-инженер? DevOps-инженер использует инструменты, процессы и методологии, чтобы удовлетворить все потребности в процессе разработки программного обеспечения, разработки оболочки пользовательского интерфейса и кодирования для развертывания, обслуживания и обновлений. Сколько времени нужно, чтобы стать DevOps-инженером? Если у вас уже есть опыт работы с Linux и сетями, и вы следуете дорожной карте DevOps-инженера, то это займет примерно шесть месяцев. Что такое CI/CD в DevOps? Это передовая методология DevOps, которая использует автоматизацию разработки приложений, позволяя увеличить скорость разработки и развертывания приложений. CI/CD относится к непрерывной интеграции, поставке и развертыванию.
img
Первая часть тут Как только изменение в топологии сети было обнаружено, оно должно быть каким-то образом распределено по всем устройствам, участвующим в плоскости управления. Каждый элемент в топологии сети может быть описан как: Канал или граница, включая узлы или достижимые места назначения, прикрепленные к этому каналу. Устройство или узел, включая узлы, каналы и доступные места назначения, подключенные к этому устройству. Этот довольно ограниченный набор терминов может быть помещен в таблицу или базу данных, часто называемую таблицей топологии или базой данных топологии. Таким образом, вопрос о распределении изменений в топологии сети на все устройства, участвующие в плоскости управления, можно описать как процесс распределения изменений в определенных строках в этой таблице или базе данных по всей сети. Способ, которым информация распространяется по сети, конечно, зависит от конструкции протокола, но обычно используются три вида распространения: поэтапное (hop-by-hop) распространение, лавинное (flooded) распространение и централизованное (centralized) хранилище некоторого вида. Лавинное (flooded) распространение. При лавинной рассылке каждое устройство, участвующее в плоскости управления, получает и сохраняет копию каждой части информации о топологии сети и доступных местах назначения. Хотя существует несколько способов синхронизации базы данных или таблицы, в плоскостях управления обычно используется только один: репликация на уровне записи. Рисунок 6 иллюстрирует это. На рисунке 6 каждое устройство будет рассылать известную ему информацию ближайшим соседям, которые затем повторно рассылают информацию своим ближайшим соседу. Например, A знает две специфические вещи о топологии сети: как достичь 2001: db8: 3e8: 100 :: / 64 и как достичь B. A передает эту информацию в B, который, в свою очередь, передает эту информацию в C. Каждое устройство в сети в конечном итоге получает копию всей доступной топологической информации; A, B и C имеют синхронизированные базы данных топологии (или таблицы). На рисунке 6 связь C с D показана как элемент в базе данных. Не все плоскости управления будут включать эту информацию. Вместо этого C может просто включать подключение к диапазону адресов 2001: db8: 3e8: 102 :: / 64 (или подсети), который содержит адрес D. Примечание. В более крупных сетях невозможно уместить все описание подключений устройства в один пакет размером с MTU, и для обеспечения актуальности информации о подключении необходимо регулярно задерживать время ожидания и повторно загружать данные. Интересная проблема возникает в механизмах распространения Flooding рассылки, которые могут вызывать временные петли маршрутизации, называемые microloops. Рисунок 7 демонстрирует эту ситуацию. На рисунке 7, предположим, что канал [E, D] не работает. Рассмотрим следующую цепочку событий, включая примерное время для каждого события: Старт: A использует E, чтобы добраться до D; C использует D, чтобы добраться до E. 100 мс: E и D обнаруживают сбой связи. 500 мс: E и D рассылают информацию об изменении топологии на C и A. 750 мс: C и A получают обновленную информацию о топологии. 1000 мс: E и D пересчитывают свои лучшие пути; E выбирает A как лучший путь для достижения D, D выбирает C как лучший путь для достижения E. 1,250 мс: лавинная рассылка A и C информации об изменении топологии на B. 1400 мс: A и C пересчитывают свои лучшие пути; A выбирает B для достижения D, C выбирает B для достижения E. 1500 мс: B получает обновленную информацию о топологии. 2,000 мс: B пересчитывает свои лучшие пути; он выбирает C, чтобы достичь D, и A, чтобы достичь E. Хотя время и порядок могут незначительно отличаться в каждой конкретной сети, порядок обнаружения, объявления и повторных вычислений почти всегда будет следовать аналогичной схеме. В этом примере между этапами 5 и 7 образуется микропетля; в течение 400 мс, A использует E для достижения D, а E использует A для достижения D. Любой трафик, входящий в кольцо в A или D в течение времени между пересчетом E лучшего пути к D и пересчетом A лучшего пути к D будет петлей. Одним из решений этой проблемы является предварительное вычисление альтернативных вариантов без петель или удаленных альтернатив без петель. Hop by Hop При поэтапном распределении каждое устройство вычисляет локальный лучший путь и отправляет только лучший путь своим соседям. Рисунок 8 демонстрирует это. На рисунке 8 каждое устройство объявляет информацию о том, что может достигнуть каждого из своих соседей. D, например, объявляет о достижимости для E, а B объявляет о доступности для C, D и E для A. Интересно рассмотреть, что происходит, когда A объявляет о своей доступности для E через канал на вершине сети. Как только E получит эту информацию, у него будет два пути к B, например: один через D и один через A. Таким же образом у A будет два пути к B: один напрямую к B, а другой через E. Любой из алгоритмов кратчайшего пути, рассмотренные в предыдущих статьях, могут определить, какой из этих путей использовать, но возможно ли формирование микропетель с помощью лавинного механизма распределения? Рассмотрим: E выбирает путь через A, чтобы добраться до B. Канал [A, B] не работает. A обнаруживает этот сбой и переключается на путь через E. Затем A объявляет этот новый путь к E. E получает информацию об измененной топологии и вычисляет новый лучший путь через D. В промежутке между шагами 3 и 5 А будет указывать на Е как на свой лучший путь к В, в то время как Е будет указывать на А как на свой лучший путь к В—микропетля. Большинство распределительных систем hop-by-hop решают эту проблему с помощью split horizon или poison reverse. Определены они следующим образом: Правило split horizon гласит: устройство не должно объявлять о доступности к пункту назначения, который он использует для достижения пункта назначения. Правило poison reverse гласит: устройство должно объявлять пункты назначения по отношению к соседнему устройству, которое оно использует, чтобы достичь пункта назначения с бесконечной метрикой. Если разделение горизонта (split horizon) реализованный на рисунке 8, E не будет объявлять о достижимости для B, поскольку он использует путь через A для достижения B. В качестве альтернативы E может отравить путь к B через A, что приведет к тому, что A не будет иметь пути через E к B. Централизованное Хранилище. В централизованной системе каждое сетевое устройство сообщает информацию об изменениях топологии и достижимости контроллеру или, скорее, некоторому набору автономных служб и устройств, действующих в качестве контроллера. В то время как централизация часто вызывает идею единого устройства (или виртуального устройства), которому передается вся информация и который передает правильную информацию для пересылки всем устройствам обработки пакетов в сети, это чрезмерное упрощение того, что на самом деле означает централизованная плоскость управления. Рисунок 9 демонстрирует это. На рисунке 9, когда канл между D и F не работает: D и F сообщают об изменении топологии контроллеру Y. Y пересылает эту информацию другому контроллеру X. Y вычисляет лучший путь к каждому месту назначения без канала [D, F] и отправляет его каждому затронутому устройству в сети. Каждое устройство устанавливает эту новую информацию о пересылке в свою локальную таблицу. Конкретный пример шага 3 - Y вычисляет следующий лучший путь к E без канала [D, F] и отправляет его D для установки в его локальной таблице пересылки. Могут ли микропетли образовываться в централизованной плоскости управления? Базы данных в X и Y должны быть синхронизированы, чтобы оба контроллера вычисляли одинаковые пути без петель в сети Синхронизация этих баз данных повлечет за собой те же проблемы и (возможно) использование тех же решений, что и решения, обсуждавшиеся до сих пор в этой статье. Подключенным устройствам потребуется некоторое время, чтобы обнаружить изменение топологии и сообщить об этом контроллеру. Контроллеру потребуется некоторое время, чтобы вычислить новые пути без петель. Контроллеру потребуется некоторое время, чтобы уведомить затронутые устройства о новых путях без петель в сети. Во время временных интервалов, описанных здесь, сеть все еще может образовывать микропетли. Централизованная плоскость управления чаще всего переводится в плоскость управления не запущенными устройствами переадресации трафика. Хотя они могут казаться радикально разными, централизованные плоскости управления на самом деле используют многие из тех же механизмов для распределения топологии и достижимости, а также те же алгоритмы для вычисления безцикловых путей через сеть, что и распределенные плоскости управления. Плоскости сегментирования и управления. Одна интересная идея для уменьшения состояния, переносимого на любое отдельное устройство, независимо от того, используется ли распределенная или централизованная плоскость управления, заключается в сегментировании информации в таблице топологии (или базе данных). Сегментация-это разделение информации в одной таблице на основе некоторого свойства самих данных и хранение каждого полученного фрагмента или фрагмента базы данных на отдельном устройстве. Рисунок 10 демонстрирует это. В сети на рисунке 10 предположим, что оба контроллера, X и Y, имеют информацию о топологии для всех узлов (устройств) и ребер (каналов) в сети. Однако для масштабирования размера сети доступные места назначения были разделены на два контроллера. Существует множество возможных схем сегментирования - все, что может разделить базу данных (или таблицу) на части примерно одинакового размера, будет работать. Часто используется хеш, так как хеши можно быстро изменить на каждом устройстве, где хранится сегмент, чтобы сбалансировать размеры сегментов. В этом случае предположим, что схема сегментирования немного проще: это диапазон IP-адресов. В частности, на рисунке представлены два диапазона IP-адресов: 2001: db8: 3e8: 100 :: / 60, который содержит от 100 :: / 64 до 10f :: / 64; и 2001: db8: 3e8: 110 :: / 60, который содержит от 110 :: / 64 до 11f :: / 64. Каждый из этих диапазонов адресов разделен на один контроллер; X будет содержать информацию о 2001: db8: 3e8: 100 :: / 60, а Y будет содержать информацию о 2001: db8: 3e8: 110 :: / 64. Не имеет значения, где эти доступные пункты назначения подключены к сети. Например, информация о том, что 2001: db8: 3e8: 102 :: / 64 подключен к F, будет храниться в контроллере X, а информация о том, что 2001: db8: 3e8: 110 :: / 64 подключен к A, будет храниться на контроллере Y. Чтобы получить информацию о доступности для 2001: db8: 3e8: 102 :: / 64, Y потребуется получить информацию о том, где этот пункт назначения соединен с X. Это будет менее эффективно с точки зрения вычисления кратчайших путей, но он будет более эффективным с точки зрения хранения информации, необходимой для вычисления кратчайших путей. Фактически, возможно, если информация хранится правильно (а не тривиальным способом, используемым в этом примере), чтобы несколько устройств вычислили разные части кратчайшего пути, а затем обменивались только результирующим деревом друг с другом. Это распределяет не только хранилище, но и обработку. Существует несколько способов, с помощью которых информация о плоскости управления может быть разделена, сохранена и, когда вычисления выполняются через нее, чтобы найти набор путей без петель через сеть. Согласованность, доступность и возможность разделения. Во всех трех системах распределения, обсуждаемых в этой статье, - лавинной, поэтапной и централизованных хранилищ - возникает проблема микропетель. Протоколы, реализующие эти методы, имеют различные системы, такие как разделение горизонта и альтернативы без петель, чтобы обходить эти микропетли, или они позволяют микропетлям появляться, предполагая, что последствия будут небольшими для сети. Существует ли объединяющая теория или модель, которая позволит инженерам понять проблемы, связанные с распределением данных по сети, и различные сопутствующие компромиссы? Есть: теорема CAP. В 2000 году Эрик Брюер, занимаясь как теоретическими, так и практическими исследованиями, постулировал, что распределенная база данных обладает тремя качествами: Согласованностью, Доступностью и устойчивость к разделению (Consistency, Accessibility Partition tolerance-CAP). Между этими тремя качествами всегда есть компромисс, так что вы можете выбрать два из трех в любой структуре системы. Эта гипотеза, позже доказанная математически, теперь известна как теорема CAP. Эти три термина определяются как: Согласованность: Каждый считыватель видит согласованное представление содержимого базы данных. Если какое-то устройство С записывает данные в базу данных за несколько мгновений до того, как два других устройства, А и В, прочитают данные из базы данных, оба считывателя получат одну и ту же информацию. Другими словами, нет никакой задержки между записью базы данных и тем, что оба считывателя, А и В, могут прочитать только что записанную информацию. Доступность: каждый считыватель имеет доступ к базе данных при необходимости (почти в реальном времени). Ответ на чтение может быть отложен, но каждое чтение будет получать ответ. Другими словами, каждый считыватель всегда имеет доступ к базе данных. Не существует времени, в течение которого считыватель получил бы ответ «сейчас вы не можете запросить эту базу данных». Устойчивость к разделению: возможность копирования или разделения базы данных на несколько устройств. Проще изучить теорему CAP в небольшой сети. Для этого используется рисунок 11. Предположим, что A содержит единственную копию базы данных, к которой должны иметь доступ как C, так и D. Предположим, что C записывает некоторую информацию в базу данных, а затем сразу же после, C и D считывают одну и ту же информацию. Единственная обработка, которая должна быть, чтобы убедиться, что C и D получают одну и ту же информацию, - это A. Теперь реплицируйте базу данных, чтобы была копия на E и еще одна копия на F. Теперь предположим, что K записывает в реплику на E, а L читает из реплики на F. Что же будет? F может вернуть текущее значение, даже если это не то же самое значение, что только что записал К. Это означает, что база данных возвращает непоследовательный ответ, поэтому согласованность была принесена в жертву разделению базы данных. Если две базы данных синхронизированы, ответ, конечно, в конечном итоге одинаковым, но потребуется некоторое время, чтобы упаковать изменение (упорядочить данные), передать его в F и интегрировать изменение в локальную копию F. F может заблокировать базу данных или определенную часть базы данных, пока выполняется синхронизация. В этом случае, когда L читает данные, он может получить ответ, что запись заблокирована. В этом случае доступность теряется, но сохраняется согласованность и разбиение базы данных. Если две базы данных объединены, то согласованность и доступность могут быть сохранены за счет разделения. Невозможно решить эту проблему, чтобы все три качества были сохранены, из-за времени, необходимого для синхронизации информации между двумя копиями базы данных. Та же проблема актуальна и для сегментированной базы данных. Как это применимо к плоскости управления? В распределенной плоскости управления база данных, из которой плоскость управления черпает информацию для расчета путей без петель, разделена по всей сети. Кроме того, база данных доступна для чтения локально в любое время для расчета путей без петель. Учитывая разделение и доступность, необходимые для распределенной базы данных, используемой в плоскости управления, следует ожидать, что непротиворечивость пострадает - и это действительно так, что приводит к микропетлям во время конвергенции. Централизованная плоскость управления не «решает» эту проблему. Централизованная плоскость управления, работающая на одном устройстве, всегда будет согласованной, но не всегда будет доступной, а отсутствие разделения будет представлять проблему для устойчивости сети.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59