В тази публикация в блога ще разгледаме как да разположим настройка за репликация на MariaDB в многооблачна среда. Да предположим, че основното ни приложение се намира в AWS, най-добрата идея е да настроите AWS като основен център за данни, хостващ главната програма на MariaDB. Подчинението на MariaDB ще се хоства на GCP, а ClusterControl се намира в частната облачна инфраструктура на компанията в офиса. Всички те са свързани чрез прост и сигурен VPN тунел WireGuard в IP обхвата 192.168.50.0/24. ClusterControl ще използва този VPN интерфейс за извършване на внедряване, управление и наблюдение на всички възли на базата данни от разстояние.
Ето нашите хостове:
- Уеб услуга на Amazon (AWS):
- Хост:MariaDB master
- Обществен IP:54.151.183.93
- Частен IP адрес:10.15.3.170/24 (VPC)
- VPN IP:192.168.50.101
- ОС:Ubuntu 18.04.4 LTS (Bionic)
- Спецификация:t2.medium (2 vCPU, 4 GB памет)
- Google Cloud Platform (GCP):
- Хост:MariaDB slave
- Обществен IP:35.247.147.95
- Частен IP адрес:10.148.0.9/32
- VPN IP:192.168.50.102
- ОС:Ubuntu 18.04.4 LTS (Bionic)
- Спецификация:n1-standard-1 (1 vCPU, 3,75 GB памет)
- VMware Private Cloud (Office):
- Хост:ClusterControl
- Обществен IP:3.25.96.229
- Частен IP:192.168.55.138/24
- VPN IP:192.168.50.100
- ОС:Ubuntu 18.04.4 LTS (Bionic)
- Спецификация:Частен облак VMWare (2 CPU, 2 GB RAM)
Нашата окончателна архитектура ще изглежда така:
Преобразуването на хоста под /etc/hosts на всички възли е:
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
Настройването на съпоставяне на хост ще опрости управлението ни за разрешаване на имена между хостове, където ще използваме името на хоста вместо IP адреса, когато конфигурираме партньори на Wireguard.
Инсталиране на WireGuard за VPN
Тъй като всички сървъри са на три различни места, които са свързани само чрез публична мрежа, ще настроим VPN тунелиране между всички възли, използвайки Wireguard. Ще добавим нов мрежов интерфейс на всеки възел за тази комуникация със следната вътрешна IP конфигурация:
- 192.168.50.100 - ClusterControl (частен облак на Office)
- 192.168.50.101 - MariaDB master (AWS)
- 192.168.50.102 - MariaDB slave (GCP)
Инсталирайте Wireguard, както е показано на тази страница и на трите възела:
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard
За Ubuntu хостове просто приемете стойността по подразбиране, ако бъдете подканени по време на инсталацията на wireguard. Имайте предвид, че е много важно да надстроите операционната система до най-новата версия, за да работи wireguard.
Рестартирайте хоста, за да заредите модула на ядрото Wireguard:
$ reboot
След като се появи, конфигурирайте нашето съпоставяне на хост в /etc/hosts на всички възли към нещо подобно:
$ cat /etc/hosts
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
127.0.0.1 localhost
Настройване на Wireguard
** Всички стъпки в този раздел трябва да се изпълняват на всички възли, освен ако не е посочено друго.
1) На всички възли като root потребител генерирайте частен ключ и задайте защитено разрешение
$ umask 077
$ wg genkey > /root/private
2) След това добавете нов интерфейс, наречен wg0:
$ ip link add wg0 type wireguard
3) Добавете съответния IP адрес към интерфейса wg0:
За хост "cc":
$ ip addr add 192.168.50.100/32 dev wg0
За хост "aws1":
$ ip addr add 192.168.50.101/32 dev wg0
За хост "gcp2":
$ ip addr add 192.168.50.102/32 dev wg0
4) Направете порта за слушане на 55555 и задайте генерирания частен ключ към интерфейса на Wireguard:
$ wg set wg0 listen-port 55555 private-key /root/private
5) Изведете мрежовия интерфейс:
$ ip link set wg0 up
6) След като интерфейсът е готов, проверете с командата "wg":
(cc1)$ wg
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
(aws1) $ wg
interface: wg0
public key: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
private key: (hidden)
listening port: 55555
(gcp2) $wg
interface: wg0
public key: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
private key: (hidden)
listening port: 55555
Сега сме готови да ги свържем всички.
Свързване на хостове чрез Wireguard интерфейс
Сега ще добавим всички възли като партньори и ще им позволим да комуникират помежду си. Командата изисква 4 важни параметъра:
- връстник :Публичен ключ за целевия хост.
- разрешени-ips :IP адрес на хоста, с който е разрешено да комуникира.
- крайна точка :Хостът и Wireguard и портът за слушане (тук конфигурираме всички възли да използват порт 55555).
- persistent-keepalive :Тъй като NAT и защитните стени с поддържане на състоянието следят "връзките", ако партньор зад NAT или защитна стена желае да получава входящи пакети, той трябва да поддържа валидно NAT/защитната стена, като периодично изпраща пакети за поддържане на активност. Стойността по подразбиране е 0 (забранено).
Следователно на хост cc трябва да добавим „aws1“ и „gcp2“:
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
На хост "aws1" трябва да добавим cc и gcp2:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint cc:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
На хост "gcp2" трябва да добавим cc и aws1:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
От всеки хост, опитайте се да пингувате един друг и се уверете, че получавате някои отговори:
(cc)$ ping 192.168.50.101 # aws1
(cc)$ ping 192.168.50.102 # gcp2
(aws1)$ ping 192.168.50.101 # cc
(aws1)$ ping 192.168.50.102 # gcp2
(gcp2)$ ping 192.168.50.100 # cc
(gcp2)$ ping 192.168.50.101 # aws1
Проверете изхода "wg", за да проверите текущото състояние. Ето изхода от точката на изглед на хост cc:
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
peer: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
endpoint: 35.247.147.95:55555
allowed ips: 192.168.50.102/32
latest handshake: 34 seconds ago
transfer: 4.70 KiB received, 6.62 KiB sent
persistent keepalive: every 25 seconds
peer: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
endpoint: 54.151.183.93:55555
allowed ips: 192.168.50.101/32
latest handshake: 34 seconds ago
transfer: 3.12 KiB received, 9.05 KiB sent
persistent keepalive: every 25 seconds
Цялото състояние изглежда добре. Можем да видим крайните точки, състоянието на ръкостискане и състоянието на честотната лента между възлите. Време е да направите тази конфигурация постоянна в конфигурационен файл, така че да може лесно да бъде заредена от WireGuard. Ще го съхраним във файл, намиращ се в /etc/wireguard/wg0.conf. Първо, създайте файла:
$ touch /etc/wireguard/wg0.conf
След това експортирайте конфигурацията по време на изпълнение за интерфейс wg0 и я запазете в wg0.conf с помощта на командата "wg-quick":
$ wg-quick save wg0
Проверете съдържанието на конфигурационния файл (пример за хост "cc"):
(cc)$ cat /etc/wireguard/wg0.conf
[Interface]
Address = 192.168.50.100/24
ListenPort = 55555
PrivateKey = UHIkdA0ExCEpCOL/iD0AFaACE/9NdHYig6CyKb3i1Xo=
[Peer]
PublicKey = ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
AllowedIPs = 192.168.50.101/32
Endpoint = 54.151.183.93:55555
PersistentKeepalive = 25
[Peer]
PublicKey = M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
AllowedIPs = 192.168.50.102/32
Endpoint = 35.247.147.95:55555
PersistentKeepalive = 25
Командата wg-quick предоставя някои страхотни преки пътища за управление и конфигуриране на интерфейсите на WireGuard. Използвайте този инструмент, за да преместите мрежовия интерфейс нагоре или надолу:
(cc)$ wg-quick down wg0
[#] ip link delete dev wg0
(cc)$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.50.100/24 dev wg0
[#] ip link set mtu 8921 up dev wg0
Накрая инструктираме systemd да зареди този интерфейс точно по време на стартиране:
$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
В този момент нашата VPN конфигурация е завършена и вече можем да започнем внедряването.
Разгръщане на MariaDB репликация
След като всеки възел в архитектурата може да общува помежду си, е време да продължим с последната стъпка за внедряване на нашата MariaDB репликация с помощта на ClusterControl.
Инсталирайте ClusterControl на cc:
(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc
Следвайте инструкциите, докато инсталацията завърши. След това трябва да настроим SSH без парола от хоста на ClusterControl към двата възела на MariaDB. Първо, генерирайте SSH ключ за потребителски root:
(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts
Копирайте съдържанието на публичния ключ в /root/.ssh/id_rsa.pub в възлите на MariaDB под /root/.ssh/authorized_keys. Това предполага, че root е разрешен към SSH към хоста. В противен случай конфигурирайте SSH демона, за да разрешите това съответно. Проверете дали SSH без парола е настроен правилно. На възел ClusterControl изпълнете отдалечена SSH команда и се уверете, че ще получите правилен отговор без подкана за парола:
(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2
Вече можем да внедрим нашата репликация на MariaDB. Отворете уеб браузър и отидете на потребителския интерфейс на ClusterControl на http://public_ip_of_CC/clustercontrol, създайте потребителски вход за супер администратор. Отидете на Разгръщане -> MySQL репликация и посочете следното:
След това изберете "MariaDB" като доставчик с версия 10.4. Посочете и паролата за root на MariaDB. Под секцията „Дефиниране на топология“ посочете IP адреса на Wireguard (wg0) на възлите MariaDB, подобно на следната екранна снимка:
Щракнете върху Разгръщане и изчакайте, докато разполагането завърши. След като сте готови, трябва да видите следното:
Нашата настройка за репликация на MariaDB вече работи на три различни места (офис, AWS и GCP), свързани със защитен VPN тунел между възли.