Это старая версия документа!
Разворачиваем три сервера ubuntu последней версии, назначаем статические ip (для трёх серверов понадобиться 4 штуки).
Далее каждый отдельный сервер (из этих трёх) мы будем называть нода, а три сервера работающие вместе в унисон - кластер.
Для удобства папку /var/lib/mysql делаем отдельным диском, чтобы всегда наглядно знать сколько занимают базы данных и сколько осталось, командой:
df -h | grep --color=never 'mysql\|Filesystem'
Пусть мы развернули три сервера:
mdb01 192.168.7.32 mdb02 192.168.7.33 mdb03 192.168.7.34
Общим ip будет:
mdbc01 192.168.7.35
на каждом начальная инициализация:
dpkg-reconfigure tzdata && dpkg-reconfigure locales apt update && apt upgrade -y rm -Rf /var/lib/mysql/lost+found
На случай полной деградации сети в hosts прописываем все три сервера:
cat >> /etc/hosts << 'EOT' 192.168.7.32 mdb01.mosigra.su mdb01 192.168.7.33 mdb02.mosigra.su mdb02 192.168.7.34 mdb03.mosigra.su mdb03 EOT
проверяем, перезагружаем:
cat /etc/hosts reboot
добавление репозитория, установка curl, mariadb, мне нравится ещё устанавливать tree, но это по желанию
apt install -y curl curl -LSsO https://r.mariadb.com/downloads/mariadb_repo_setup chmod u+x ./mariadb_repo_setup ./mariadb_repo_setup apt install -y mariadb-server mariadb-client mariadb-common tree
проверяем версию MariaDB:
mariadb --version
в файле /etc/mysql/mariadb.conf.d/50-server.cnf включим Планировщик событий, это пригодится для партиционирования (секционирования) Базы данных для Zabbix
event_scheduler = ON
на всех серверах:
cat >> /etc/mysql/mariadb.conf.d/60-galera.cnf << 'EOT' wsrep_on = ON wsrep_provider = /usr/lib/galera/libgalera_smm.so wsrep_cluster_name = "MariaDB Galera Cluster 01" wsrep_cluster_address = "gcomm://mdb01,mdb02,mdb03" binlog_format = row default_storage_engine = InnoDB innodb_autoinc_lock_mode = 2 innodb_force_primary_key = 1 innodb_doublewrite = 1 # Allow server to accept connections on all interfaces. bind-address = 0.0.0.0 port = 13306 # Optional settings wsrep_slave_threads = 2 innodb_flush_log_at_trx_commit = 0 wsrep_node_name = mdb01 wsrep_node_address = "192.168.7.32" # By default, MariaDB error logs are sent to journald, which can be hard to digest sometimes. # The following line will save error messages to a plain file. log_error = /var/log/mysql/error.log EOT
Обратите внимание, параметры: wsrep_node_name и wsrep_node_address для каждого сервера должны быть свои
Останавливаем MariaDB:
systemctl stop mariadb systemctl status mariadb
Только на первой ноде:
galera_new_cluster
На всех запускаем MariaDB и проверяем:
systemctl start mariadb systemctl status mariadb ss -anoltup
мы должны увидеть вместо стандартного mysql порта 1306 - наш 13306
Далее только на первой ноде, создаём супер администратора steller и пользователя для haproxy (чтобы он мог оценивать на сколько MariaDB жива):
sudo mysql CREATE USER 'steller'@'%' IDENTIFIED BY 'very_secret_password'; CREATE USER 'haproxy'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'steller'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; QUIT;
не забудьте поменять пароль very_secret_password на ещё более секретный
проверяем:
echo "SELECT @@hostname;" | mariadb -h mdb03 -u steller -N -P 13306 -pvery_secret_password
попробовать залогиниться на все сервера, попробовать на каждом создать базу данных и увидеть что она появляется на всех остальных
https://kifarunix.com/configure-highly-available-haproxy-with-keepalived-on-ubuntu/
apt install haproxy
файл /etc/haproxy/haproxy.cfg должен выглядеть примерно так:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
# stats dashboard
listen stats
bind :8080
mode http
acl localhost src 192.168.7.32 127.0.0.1
stats enable if localhost
stats realm Haproxy\ Statistics
stats uri /
stats refresh 10s
listen galera_cluster
bind *:3306
balance source
mode tcp
option mysql-check user haproxy
option tcplog
server mdb01 mdb01:13306 check weight 1
server mdb02 mdb02:13306 check weight 1
server mdb03 mdb03:13306 check weight 1
от ноды к ноде будет меняться только этот кусок:
acl localhost src 192.168.7.32 127.0.0.1