Отказоустойчивый и легкомаштабируемый вебсервер коротких ссылок.
Написан на python3, в качестве системы управления конфигурации используется ansible(Требование задания)
Для хранения ключей используется БД Percona XtraDB Cluster. Для балансировки трафика - haproxy
[webservers]
host1 inner_ip=192.168.0.101
host2 inner_ip=192.168.0.102
host3 inner_ip=192.168.0.103
[proxys]
proxy1 inner_ip=192.168.0.201 external_ip=192.168.1.201
proxy2 inner_ip=192.168.0.202 external_ip=192.168.1.202
[dbs]
db1 inner_ip=192.168.0.11
db2 inner_ip=192.168.0.12
db3 inner_ip=192.168.0.13
Общие переменные для всех ролей настраиваются в файле group_vars/all
short_server_host: short.kudago.com - доменное имя вебсервера
short_server_ip: "{{ inner_ip }}" - ip адрес, на котором висит сервис
short_server_port: 4443 - порт, на котором висит сервис
mysql_first_node: db2 - имя мастер сервера в кластере
mysql_port: 3306 - порт, который слушает mysql
mysql_shorturl_user: shorturl - логин
mysql_shorturl_password: sh0rtpass - пароль
mysql_shorturl_db: shorturl - имя базы коротких ссылок
mysql_shorturl_table: urls - имя таблицы
Остальные в файле defaults/main.yml для каждой роли:
proxy_stats_login: kudago - логин для статистики haproxy
proxy_stats_password: adminadmin - пароль для статистики haproxy
proxy_check_time: 1s - частота проверки доступности сервиса
proxy_count_fall: 1 - количество ошибок, после которых сервер считается недоступным
proxy_count_rise: 2 - количество проверек, прежде чем сервер считается доступным
mysql_root_password: r00tpassw0rd - пароль для пользователя root
mysql_datadir: /var/lib/mysql - путь к директории mysql
mysql_sst_user: sstshort - логин для авторизации кластера
mysql_sst_password: shortshort - пароль для авторизации кластера
mysql_memory_ratio: 0.8 - максимальное количество памяти доступная mysql(1 - 100%)
short_script_user: webshort - пользователь из под которого работает сервис
short_script_name: shorturl - имя init.d скрипта
short_script_path: /usr/local/sbin/webserver-shorturl.py - путь к скрипту
short_server_ip: "{{ inner_ip }}" - ip адрес на котором слушает вебсервер
short_debug: True - включаем дебаг
short_hash_len: 6 - длина короткой ссылки(при 6 выдает 56800235583 уникальных ссылок)
short_hash_alphabet: "Es8hFJD7oLR2QjpNdlBm3qcZtWUzaM19SubOIv4XHix5KfV0PwrCynge6TGYkA" - перемешанный алфавит
-
Обновляем inventory hosts, добавив сервер в одну из групп(webservers/proxys/dbs)
-
Если вебсервер: запускаем плейбук ansible-playbook playbook.yml -l HOST, где HOST - имя нового сервера
Если БД: раскатываем роль dbs, чтобы обновить конфигурацию всех мастер-баз
- Обновляем конфиги проксей, чтобы они увидели новый сервер ansible-playbook playbook.yml -l proxys -t configuration
-
Обновляем inventory hosts, убрав сервер из группы
-
Обновляем конфиги проксей ansible-playbook playbook.yml -l proxys -t configuration
Достаточно запустить ansible-playbook playbook.yml -l ROLE -t configuration, где ROLE - имя роли
-
Балансировка haproxy через keepalived. Локально потестировать не удалось, поднимать виртуаки лень
-
В текущей схеме идет двойной трифик через прокси(http/mysql). В идеале нужен отдельный haproxy для mysql
-
Добавить кластер редиса, который будет хранить топовые обращения