Пример выпускного проекта курса «Администратор Linux»
Предлагаем вашему вниманию проектную работу выпускника апрельской группы «Администратор Linux».
Особенности реализации
Студент подготовил подробный отчёт о своей работе. Смотрим и комментируем.
Выполнение: 1 — Схема:
2 — Два балансировщика с общим IP (VRRP/failover): - keepalived (реализует VRRP и следит за состоянием сервисов HAProxy/Galera Arbitrator) - HAProxy (проксирование трафика на nginx в web1/web2). Пользователи подключаются к сайту через HAProxy по единому виртуальному IP-адресу.
3 — Web-серверы: - nginx, - php-fpm, - filebeat, - GlusterFS (синхронизация файлов сайта и сессий php), - ProxySQL-Cluster.
4 — Три сервера БД: - Percona XtraDB Cluster (Master-Master); - filebeat.
5 — Один сервер для логирования и бэкапов: - elasticsearch, - kibana, - ftp.
Примечания
Если тестирование будет не в vagrant, то host-файл должен иметь структуру по предоставленному образцу.
При этом нужно обязательно поменять:
- vars: xtradb_bind_interface: eth1 - vars: interface: eth1 virtual_ipaddress: 10.0.5.81
Тестирование в vagrant нужно проводить такой командой (если запускать как обычно, то gluster не соберётся):
vagrant up --no-provision ansible-playbook provisioning/playbook.yml
На всех узлах активирован selinux enforsing targeted. Работе кластера он не препятствует (добавлены правила и модули). Однако, есть ряд багов, которые не позволяют указывать контекст для файловых систем, смонтированных через FUSE. Support SELinux extended attributes on Gluster Volumes
На узлах настроены разные зоны в firewalld: - порты на узлах Percona XtraDB Cluster доступны только друг для друга и для proxysql; - интерфейс администрирования proxysql доступен только другим узлам proxysql; - порты, необходимые для работы glusterfs открыты только для других узлов glusterfs; - порт http на web-узлах доступен только для узлов-балансировщиков.
Используется Percona XtraDB Cluster с синхронной Master-Master репликацией (Galera): - при корректном отключении до 2-х узлов (systemctl stop mysql) оставшийся узел останется в синхронизированном состоянии и продолжит обслуживать клиентов; - при аварийном завершении одного узла (pkill -9 mysql) оставшиеся два узла будут в синхронизированном состоянии и продолжат обслуживать клиентов; - при аварийном завершении двух узлов, оставшийся будет в non-primary state и не будет обслуживать клиентов. При восстановлении работы упавших узлов синхронизация произойдёт автоматически.
ProxySQL-Cluster обеспечивает прозрачное (для веб-приложения) разделение чтения/записи на разные узлы кластера. Для предотвращения deadlocks запись в один момент времени идёт только на один узел. В случае его падения запись автоматически переходит на следующий узел. [Please note that proxysql_galera_checker will be deprecated in 2.0, with native support for Galera]
proxysql_galera_checker.sh SUMMARY
Mon Nov 5 11:32:12 MSK 2018 ###### proxysql_galera_checker.sh SUMMARY ###### Mon Nov 5 11:32:12 MSK 2018 Hostgroup writers 1 Mon Nov 5 11:32:12 MSK 2018 Hostgroup readers 2 Mon Nov 5 11:32:12 MSK 2018 Number of writers 1 Mon Nov 5 11:32:12 MSK 2018 Writers are readers 1 Mon Nov 5 11:32:12 MSK 2018 log file /var/lib/proxysql/proxysql_galera_checker.log Mon Nov 5 11:32:12 MSK 2018 ###### HANDLE WRITER NODES ###### Mon Nov 5 11:32:12 MSK 2018 --> Checking WRITE server 1:10.0.5.31:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:12 MSK 2018 server 1:10.0.5.31:3306 is already ONLINE: 1 of 1 write nodes Mon Nov 5 11:32:12 MSK 2018 --> Checking WRITE server 1:10.0.5.32:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:12 MSK 2018 Changing server 1:10.0.5.32:3306 to status OFFLINE_SOFT. Reason: max write nodes reached (1) Mon Nov 5 11:32:13 MSK 2018 --> Checking WRITE server 1:10.0.5.33:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:13 MSK 2018 Changing server 1:10.0.5.33:3306 to status OFFLINE_SOFT. Reason: max write nodes reached (1) Mon Nov 5 11:32:13 MSK 2018 ###### HANDLE READER NODES ###### Mon Nov 5 11:32:13 MSK 2018 --> Checking READ server 2:10.0.5.32:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:13 MSK 2018 server 2:10.0.5.32:3306 is already ONLINE Mon Nov 5 11:32:13 MSK 2018 --> Checking READ server 2:10.0.5.33:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:13 MSK 2018 server 2:10.0.5.33:3306 is already ONLINE Mon Nov 5 11:32:13 MSK 2018 --> Checking READ server 2:10.0.5.31:3306, current status ONLINE, wsrep_local_state 4 Mon Nov 5 11:32:13 MSK 2018 server 2:10.0.5.31:3306 is already ONLINE
Создано 3 узла Glusterfs для избежания split-brain. При падении двух узлов, оставшийся не будет обслуживать клиентов.
Развёртывается чистый дистрибутив wordpress. После запуска кластера по адресу виртуального IP попадёте на стадию установки пароля и логина администратора wordpress. Проверены: загрузка файлов в медиабиблиотеку, создание новых записей, установка плагинов.
Wordpress:
Сессии синхронизируются через gluster, так как в memcache нет репликации, а redis требует минимум 6 узлов (3 master, 3 slave).
Бэкап производится скриптом на Python. БД через xtrabackup. Сайт через упаковку в архив. Бэкапы заливаются на сервер бэкапов по крону.
Опция
gluster volume info
[root@web2 vagrant]# gluster volume info Volume Name: php Type: Replicate Volume ID: 5e95467e-ed46-41c5-b44b-8657e01bcf05 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 3 = 3 Transport-type: tcp Bricks: Brick1: 10.0.5.21:/srv/gluster/php Brick2: 10.0.5.22:/srv/gluster/php Brick3: 10.0.5.23:/srv/gluster/php Options Reconfigured: performance.cache-size: 256MB network.ping-timeout: 5 transport.address-family: inet nfs.disable: on performance.client-io-threads: off Volume Name: wordpress Type: Replicate Volume ID: cc270d1d-504d-4d4f-8a10-c22bb116d92e Status: Started Snapshot Count: 0 Number of Bricks: 1 x 3 = 3 Transport-type: tcp Bricks: Brick1: 10.0.5.21:/srv/gluster/wordpress Brick2: 10.0.5.22:/srv/gluster/wordpress Brick3: 10.0.5.23:/srv/gluster/wordpress Options Reconfigured: performance.cache-size: 256MB network.ping-timeout: 5 transport.address-family: inet nfs.disable: on performance.client-io-threads: off
gluster volume status
gluster volume status Status of volume: php Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick 10.0.5.21:/srv/gluster/php 49153 0 Y 5777 Brick 10.0.5.22:/srv/gluster/php 49153 0 Y 7533 Brick 10.0.5.23:/srv/gluster/php 49153 0 Y 6016 Self-heal Daemon on localhost N/A N/A Y 7556 Self-heal Daemon on 10.0.5.23 N/A N/A Y 6039 Self-heal Daemon on 10.0.5.21 N/A N/A Y 5800 Task Status of Volume php ------------------------------------------------------------------------------ There are no active volume tasks Status of volume: wordpress Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick 10.0.5.21:/srv/gluster/wordpress 49152 0 Y 5701 Brick 10.0.5.22:/srv/gluster/wordpress 49152 0 Y 7457 Brick 10.0.5.23:/srv/gluster/wordpress 49152 0 Y 5612 Self-heal Daemon on localhost N/A N/A Y 7556 Self-heal Daemon on 10.0.5.23 N/A N/A Y 6039 Self-heal Daemon on 10.0.5.21 N/A N/A Y 5800 Task Status of Volume wordpress ------------------------------------------------------------------------------ There are no active volume tasks
gluster peer status
[root@web2 vagrant]# gluster peer status Number of Peers: 2 Hostname: 10.0.5.23 Uuid: c898bc81-1f9f-4941-a608-7d45ab22c91f State: Peer in Cluster (Connected) Hostname: 10.0.5.21 Uuid: 4ebe85e0-6f14-4f7d-8fd6-9f4314a0fee2 State: Peer in Cluster (Connected)
show status like 'wsrep%'
mysql> show status like 'wsrep%'; +----------------------------------+----------------------------------------------------------+ | Variable_name | Value | +----------------------------------+----------------------------------------------------------+ | wsrep_local_state_uuid | bca419cf-dea0-11e8-9614-472050e4d128 | | wsrep_protocol_version | 9 | | wsrep_last_applied | 11 | | wsrep_last_committed | 11 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 7 | | wsrep_received_bytes | 590 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 1 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.000000 | | wsrep_local_cached_downto | 0 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_interval | [ 173, 173 ] | | wsrep_flow_control_interval_low | 173 | | wsrep_flow_control_interval_high | 173 | | wsrep_flow_control_status | OFF | | wsrep_cert_deps_distance | 0.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 0 | | wsrep_cert_bucket_count | 22 | | wsrep_gcache_pool_size | 1592 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_open_transactions | 0 | | wsrep_open_connections | 0 | | wsrep_ist_receive_status | | | wsrep_ist_receive_seqno_start | 0 | | wsrep_ist_receive_seqno_current | 0 | | wsrep_ist_receive_seqno_end | 0 | | wsrep_incoming_addresses | 192.168.0.133:3306,192.168.0.132:3306,192.168.0.131:3306 | | wsrep_cluster_weight | 3 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0.000538706/0.00661727/0.0185985/0.00706663/4 | | wsrep_evs_state | OPERATIONAL | | wsrep_gcomm_uuid | 9f48f6a4-dea3-11e8-b931-9bf966e6d3e6 | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | bca419cf-dea0-11e8-9614-472050e4d128 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 1 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy <[email protected]> | | wsrep_provider_version | 3.31(rf216443) | | wsrep_ready | ON | +----------------------------------+----------------------------------------------------------+ 71 rows in set (0.19 sec)
Kiabana и elastic закрыты через basic http auth. Логин/Пароль от kibana по умолчанию — otus/test.
Kiabana
Подробности реализации проекта смотрите в репозитории.