Proxmox instalacja i konfiguracja MariaDB na Ubuntu 22.04

Opis aplikacji

MariaDB to popularny system zarządzania relacyjnymi bazami danych (RDBMS) typu open source, który jest rozwidleniem MySQL. Został stworzony przez pierwotnych twórców MySQL w odpowiedzi na obawy związane z przejęciem MySQL przez Oracle Corporation. MariaDB zachowuje wysoki stopień kompatybilności z MySQL, dzięki czemu w większości przypadków zastępuje MySQL.

Oto kilka kluczowych funkcji i cech MariaDB:

  • Open Source: MariaDB jest na licencji GNU General Public License (GPL) i jest rozwijany jako projekt open source. Oznacza to, że kod źródłowy jest swobodnie dostępny, co pozwala użytkownikom na jego modyfikację i dystrybucję.
  • Kompatybilność: MariaDB została zaprojektowana tak, aby była wysoce kompatybilna z MySQL. Obsługuje standardową składnię SQL i wiele takich samych funkcji i interfejsów API jak MySQL, dzięki czemu migracja z MySQL do MariaDB jest stosunkowo łatwa lub używanie MariaDB jako zamiennika MySQL.
  • Wydajność: MariaDB ma na celu zapewnienie wysokiej wydajności i skalowalności. Zawiera kilka optymalizacji i funkcji, które mogą zwiększyć szybkość wykonywania zapytań i poprawić ogólną wydajność bazy danych.
  • Zaawansowane funkcje: MariaDB oferuje dodatkowe funkcje poza tym, co jest dostępne w MySQL. Obejmują one obsługę większej liczby silników pamięci masowej, takich jak XtraDB (InnoDB) i Aria, a także nowe silniki pamięci masowej, takie jak MyRocks i Spider. MariaDB zawiera również funkcje, takie jak replikacja równoległa, ulepszona obsługa JSON i rozszerzone zmienne systemowe.
  • Rozwój oparty na społeczności: rozwój MariaDB jest napędzany przez tętniącą życiem i aktywną społeczność. Współtwórcy z całego świata współpracują nad ulepszaniem i ulepszaniem bazy danych, zapewniając jej ciągły rozwój i innowacje.
  • Wsparcie dla przedsiębiorstw: Chociaż MariaDB jest oprogramowaniem typu open source, istnieją firmy, które zapewniają wsparcie komercyjne, konsultacje i dodatkowe usługi dla użytkowników korporacyjnych, którzy wymagają profesjonalnej pomocy przy wdrażaniu MariaDB.

Przydatne adresy związane z aplikacją

Przygotowanie maszyny wirtualnej Proxmox VE do instalacji MariaDB

Do szybkiego przygotowania maszyny z systemem Ubuntu 22.04 wykorzystałem gotowy szablon Proxmox VE przygotowany wg. opisu na stronie https://itadmin.vblog.ovh/proxmox-ve-stworzenie-i-wykorzystanie-szablonu-systemu-ubuntu-22-04/. Klonujemy ten szablon ubuntu-2204-template do nowej maszyny wirtualnej np. vm id = 3040 gdyż planuję aby serwer miał adres ip 192.168.30.40.


Ustawienie stałego adresu ip

sudo nano /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    ethernets:
        eth0:
            dhcp4: false
            dhcp6: false
            addresses: [192.168.30.40/24]
            routes:
            - to: default
              via: 192.168.30.1
            nameservers:
             addresses: [192.168.8.1,8.8.8.8]
sudo netplan apply

Instalacja MariaDB na Ubuntu 22.04

sudo apt -y install mariadb-server

Po instalacji MariaDB dobrze jest wykonać skrypt mysql_secure_installation, który umożliwi włączenie autoryzacji hasłem i pozwoli usunąć zbędne informacje z bazy danych.

sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!

Konfiguracja serwera MariaDB

Zanim będzie można logować się zdalnie nowo utworzonym użytkownikiem i hasłem należy odpowiednio przygotować konfigurację serwera MariaDB.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Należy dodać linię plugin-load-add = auth_socket.so (gdybyśmy nie wykonali mysql_secure_installation i przełączenia autoryzacji z socket na auth) oraz zmienić bind-address.

[mysqld]
plugin-load-add = auth_socket.so
#
# * Basic Settings
#

#user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
#datadir                 = /var/lib/mysql
#tmpdir                  = /tmp

# Broken reverse DNS slows down connections considerably and name resolve is
# safe to skip if there are no "host by domain name" access grants
#skip-name-resolve

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address            = 127.0.0.1
bind-address            = 0.0.0.0
sudo systemctl restart mariadb

Przygotowanie testowej bazy danych MariaDB

Utworzenie bazy danych MariaDB i nadanie uprawnień

W zależności od potrzeb aplikacji i konfiguracji naszej sieci możemy nadać uprawnienia do przykładowej bazy danych o nazwie docker_dba na wiele sposobów.

mysql -u root -p
# tworzymy naszą przykładową bazę danych
CREATE DATABASE docker_dba;

# pierwszy sposób to nadanie globalnych pełnych uprawnień do wszystkich baz użytkownikowi docker_usr (nie zalecane)
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'docker_usr'@'%' IDENTIFIED BY 'Hdbryu3te72,' WITH GRANT OPTION;
FLUSH PRIVILEGES;

# drugi sposób to zawężenie wszystkich uprawnień do konkretnej bazy danych
GRANT ALL PRIVILEGES ON docker_dba.* TO 'docker_usr'@'%' IDENTIFIED BY 'Hdbryu3te72,'; 
FLUSH PRIVILEGES;

# trzeci (zalecany) sposób to wskazanie konkretnych uprawnień do konkretnej bazy danych z wybranej sieci 
# sieć 192.168.30.0/24 to w moim przypadku sieć klastra k8s i crc
GRANT SELECT, INSERT, UPDATE, DELETE ON docker_dba.* TO 'docker_usr'@'localhost' IDENTIFIED BY 'Hdbryu3te72,';
GRANT SELECT, INSERT, UPDATE, DELETE ON docker_dba.* TO 'docker_usr'@'192.168.30.%' IDENTIFIED BY 'Hdbryu3te72,';
FLUSH PRIVILEGES;

# weryfikacja logowania lokalnie i zdalnie (z serwera np. 192.168.30.20 - k8s-ctrl)
# nie powinno się podawać hasła w linii komend ale dla testów można sobie ułatwić logowanie
mysql -u docker_usr -pHdbryu3te72,
mysql -h 192.168.30.40 -u docker_usr -pdbryu3te72,

Teraz należy przygotować strukturę przykładowej bazy danych o nazwie clipboard

USE docker_dba;

DROP TABLE IF EXISTS clipboard;

CREATE TABLE clipboard (
        id INT NOT NULL AUTO_INCREMENT,
        dba_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        app_date TIMESTAMP NULL,
        hostname VARCHAR(60) NULL,
        description VARCHAR(300) NULL,
        rand_number BIGINT(20) NULL,
        operation_status TINYINT NOT NULL,
        PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

Sprawdzamy czy struktura tabeli clipboard została utworzona prawidłowo.

MariaDB [docker_dba]> DESCRIBE clipboard;
+------------------+--------------+------+-----+---------------------+----------------+
| Field            | Type         | Null | Key | Default             | Extra          |
+------------------+--------------+------+-----+---------------------+----------------+
| id               | int(11)      | NO   | PRI | NULL                | auto_increment |
| dba_date         | timestamp    | NO   |     | current_timestamp() |                |
| app_date         | timestamp    | YES  |     | NULL                |                |
| hostname         | varchar(60)  | YES  |     | NULL                |                |
| description      | varchar(300) | YES  |     | NULL                |                |
| rand_number      | bigint(20)   | YES  |     | NULL                |                |
| operation_status | tinyint(4)   | NO   |     | NULL                |                |
+------------------+--------------+------+-----+---------------------+----------------+
7 rows in set (0.001 sec)

Edycja przykładowej bazy danych MariaDB

Wypełniamy tabelę clipboard testowymi danymi używając np. programu DBeaver ze strony https://dbeaver.io/download/

lub bezpośrednio z konsoli innego serwera testując przy okazji uprawnienia do zdalnej modyfikacji bazy danych docker_dba.

mysql -h 192.168.30.40 -u docker_usr -pHdbryu3te72, docker_dba -e "INSERT INTO docker_dba.clipboard (app_date,hostname,description,rand_number,operation_status)   VALUES ('2023-06-26 10:31:10','k8s-ctrl','wpis testowy nr 3',123461274121,0);"

Wyświetlenie zawartości przykładowej bazy danych

Sprawdzamy jakie dane istnieją w bazie danych docker_dba w tabeli clipboard

mysql -h 192.168.30.40 -u docker_usr -pHdbryu3te72, docker_dba -e "SELECT * FROM clipboard;"                                              
+----+---------------------+---------------------+----------+-------------------+--------------+------------------+
| id | dba_date            | app_date            | hostname | description       | rand_number  | operation_status |
+----+---------------------+---------------------+----------+-------------------+--------------+------------------+
|  1 | 2023-06-28 13:57:56 | 2023-06-28 12:30:15 | k8s-ctrl | wpis testowy      |    123456789 |                1 |
|  2 | 2023-06-28 14:02:07 | 2023-06-26 10:31:10 | k8s-ctrl | wpis testowy nr 3 | 123461274121 |                0 |
+----+---------------------+---------------------+----------+-------------------+--------------+------------------+