2.0.Виртуализируем базы данных в NixOS

—

от автора

Всем привет. Предлагаю сделать передышку и отойти от нашего хранилища бэкапов (Первая часть и вторая часть ) и рассмотреть еще возможности испытуемой ОС. Сегодня как видно из названия мы начнем «готовку» виртуальных машин c помощью nix‑build.

А динамические данные как например данные в БД — мы будем заливать ручками(это полезно).

Что у нас в меню:

  • Qemu

  • Postgresql

  • Mysql

  • открытые датасеты

Для начала немного теории:

1. PostgreSQL — это мощная объектно‑реляционная система баз данных с открытым исходным кодом, активная разработка которой ведется более 35 лет и заслужила прочную репутацию благодаря надежности, функциональной устойчивости и производительности. (https://www.postgresql.org/)

2.0. MySQL — свободная реляционная система управления базами данных (СУБД). Под словом «свободная» подразумевается ее бесплатность, под «реляционная» — работа с базами данных, основанных на двумерных таблицах. Система выпущена в 1995 году, её разработка активно продолжается. ( https://dev.mysql.com/ )

2.1 MariaDB Server — одна из самых популярных реляционных баз данных с открытым исходным кодом. Он создан первоначальными разработчиками MySQL и гарантированно останется открытым исходным кодом. Он является частью большинства облачных предложений и используется по умолчанию в большинстве дистрибутивов Linux.

Он основан на ценностях производительности, стабильности и открытости, и Фонд MariaDB гарантирует, что вклад будет принят на технических основаниях. Недавние новые функции включают в себя расширенную кластеризацию с помощью Galera Cluster 4, функции совместимости с базой данных Oracle и таблицами временных данных, позволяющие запрашивать данные в том виде, в каком они были в любой момент в прошлом.

( https://mariadb.org/ )

3. Датасет представляет собой набор данных, которые используются в различных видах анализа и машинного обучения. Причем успешность последнего напрямую зависит от объема исходной информации: чем ее больше, тем качественней будет развиваться ИИ.

В данном примере мы будем скачивать их с ресурсов,которые предосталяют доступ к наборам данных без регистрации и авторизации для народного wget.

1) https://www.northlincs.gov.uk

2) https://www.fdic.gov/

Перейдем к практике.

Проверим, что все в репозиториях есть и каких версий (необьязательно,но интересно, возможно пригодится):

Ищем нужные пакеты с помощью nix-shell --packages и несколько раз нажимаем на tab, чтобы лишний раз их не ставить, а просто узнать, есть ли он.

PostgreSQL
# nix-shell --packages postgre postgresql               postgresql_11_jit        postgresql_12            postgresql12Packages     postgresql13JitPackages  postgresql_14_jit        postgresql_15            postgresql15Packages     postgresql_jdbc          postgresqlPackages postgresql_10            postgresql11JitPackages  postgresql_12_jit        postgresql_13            postgresql13Packages     postgresql14JitPackages  postgresql_15_jit        postgresql_9_6           postgresql_jit           postgresqlTestHook postgresql_11            postgresql11Packages     postgresql12JitPackages  postgresql_13_jit        postgresql_14            postgresql14Packages     postgresql15JitPackages  postgresql96             postgresqlJitPackages    postgrey

MariaDB
# nix-shell -p mariadb mariadb                  mariadb_1011             mariadb_105              mariadb_108              mariadb-client           mariadb-connector-c_3_1  mariadb-embedded mariadb_1010             mariadb_104              mariadb_106              mariadb_109              mariadb-connector-c      mariadb-connector-c_3_2  mariadb-galera

Для проверки можно воспользоваться командой (также для тестирования,или когда пакет нужен только единожды):

nix-shell --packages
Example:
# nix-shell --packages manticoresearch можно запустить команду мантикоры: #searchd --version Manticore 5.0.3 1e84bbd46@221013 dev Copyright (c) 2001-2016, Andrew Aksyonoff Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com) Copyright (c) 2017-2022, Manticore Software LTD (https://manticoresearch.com) можно также в данном режиме написать тестовый конфиг и его отладить,посмотреть на работу мантикоры. и выходим из шелла командой: # exit

Пропишем в нашем системном конфигурационном файле нужные нам строки.

Для запуска Qemu хочет X11 и графическую оболочку:

Честно скоммунизженное с личного хоста: # Enable the X11 windowing system. services.xserver.enable = true; services.xserver.displayManager.sddm.enable = true; services.xserver.desktopManager.xfce.enable = true; Настраиваем ресурсы которые гипервизор может отдать под ВМ virtualisation.vmVariant = {   # following configuration is added only when building VM with build-vm   virtualisation = {     memorySize =  2048; # Use 2048MiB memory.     cores = 2;            }; }; 

Перезапускаемся и должен нас приветствовать дисплейный менеджер.

Сделаем виртуальную копию дистрибутива на котором сидим(оно нам пригодится):

nixos-rebuild build-vm

Делаем 3 разных конфига для виртуальных машин и заполняем виртуалки данными.

Конфиг виртуальной машины 1 с (postgresql)
let   pkgs = import <nixpkgs> { };   # This module defines the system that we want   PostgresModule = { ... }: {      services.postgresql = {         enable= true ;         enableTCPIP = true;         authentication = pkgs.lib.mkOverride 10 ''         #type database  DBuser  auth-method                 local all       all     trust                 host  all      all     127.0.0.1/32   trust                 host  all      all     0.0.0.0/0     trust                 '';         initialScript = pkgs.writeText "backend-initScript" ''                 CREATE ROLE murzik WITH LOGIN PASSWORD 'murzik' CREATEDB;                 CREATE DATABASE OpenData;                 GRANT ALL PRIVILEGES ON DATABASE OpenData TO Murzik;                 '';         };   };  debugVm = { modulesPath, ... }: {     imports = [       # The qemu-vm NixOS module gives us the `vm` attribute that we will later       # use, and other VM-related settings       "${modulesPath}/virtualisation/qemu-vm.nix"     ];         virtualisation.forwardPorts = [       { from = "host"; host.port = 2220; guest.port = 22; }       { from = "host"; host.port = 5432; guest.port = 5432; }     ];      # Root user without password and enabled SSH for playing around     networking.firewall.enable = false;     services.openssh.enable = true;     services.openssh.permitRootLogin = "yes";     users.extraUsers.root.password = "";   };    nixosEvaluation = pkgs.nixos [     debugVm     PostgresModule   ]; in  nixosEvaluation.config.system.build.vm

соберем командой:

nix-build postgresvm.nix
запустим командой через в самой виртуалке вручную через GUI Terminal :  ./result/bin/run-nixos-vm

проверим что Postgresql работает:

#  ssh -p 2220 root@localhost "systemctl status postgresql.service" (root@localhost) Password: ● postgresql.service - PostgreSQL Server      Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: enabled)      Active: active (running) since Tue 2023-09-12 12:09:27 UTC; 22min ago     Process: 682 ExecStartPre=/nix/store/hnlancn6bifxr75bf5j9zj9firgbpkp7-unit-script-postgresql-pre-start/bin/postgresql-pre-start (code=exited, status=0/SUCCESS)     Process: 762 ExecStartPost=/nix/store/lachsy0bx9yy51md02mw3gl81gzk8yh8-unit-script-postgresql-post-start/bin/postgresql-post-start (code=exited, status=0/SUCCESS)    Main PID: 704 (postgres)          IP: 52.1K in, 52.1K out          IO: 996.0K read, 700.0K written       Tasks: 7 (limit: 1150)      Memory: 18.9M         CPU: 5.878s      CGroup: /system.slice/postgresql.service              ├─704 /nix/store/dsgziywn8ghg6g9xn7wr9q5cszjbpqng-postgresql-14.9/bin/postgres              ├─754 "postgres: checkpointer "              ├─755 "postgres: background writer "              ├─756 "postgres: walwriter "              ├─758 "postgres: autovacuum launcher "              ├─759 "postgres: stats collector "              └─760 "postgres: logical replication launcher "  Sep 12 12:09:19 nixos postgres[704]: [704] LOG:  listening on IPv4 address "0.0.0.0", port 5432 Sep 12 12:09:19 nixos postgres[704]: [704] LOG:  listening on IPv6 address "::", port 5432 Sep 12 12:09:19 nixos postgres[704]: [704] LOG:  listening on Unix socket "/run/postgresql/.s.PGSQL.5432" Sep 12 12:09:20 nixos postgres[731]: [731] LOG:  database system was interrupted; last known up at 2023-09-12 12:04:19 GMT Sep 12 12:09:23 nixos postgres[731]: [731] LOG:  database system was not properly shut down; automatic recovery in progress Sep 12 12:09:23 nixos postgres[731]: [731] LOG:  redo starts at 0/1700098 Sep 12 12:09:23 nixos postgres[731]: [731] LOG:  invalid record length at 0/17000D0: wanted 24, got 0 Sep 12 12:09:23 nixos postgres[731]: [731] LOG:  redo done at 0/1700098 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s Sep 12 12:09:24 nixos postgres[704]: [704] LOG:  database system is ready to accept connections Sep 12 12:09:27 nixos systemd[1]: Started PostgreSQL Server.

Теперь в консоли заходим в папку где у постгри есть доступ и загрузим туда csv файл:

 ssh -p 2220 root@localhost "cd /var/lib/postgresql/ && wget https://www.northlincs.gov.uk/wp-content/uploads/2018/10/on_street_parking_points.csv && chown postgres:postgres ./on_street_parking_points.csv"

Идем дальше уже и будем импортировать данные в нашу бд и проверим, что все ок.

[root@nixserver1:/home/vasya/vm/mysql]# ssh -p 2220 root@localhost (root@localhost) Password: Last login: Tue Sep 12 17:22:34 2023 from 10.0.2.2  [root@nixos:~]# su postgres  [postgres@nixos:/root]$ psql psql (14.9) Type "help" for help.  postgres=# \c opendata You are now connected to database "opendata" as user "postgres". opendata=# \dt Did not find any relations. opendata=# CREATE TABLE parking_points ( id  SERIAL ,type VARCHAR(100),restrictn VARCHAR(1000),spaces VARCHAR(100),street VARCHAR(100),town VARCHAR(100),easting VARCHAR(100),northing VARCHAR(100),longitude VARCHAR(100),latitude VARCHAR(100),PRIMARY KEY(id)); CREATE TABLE opendata=# COPY parking_points (id,type,restrictn,spaces,street,town,easting,northing,longitude,latitude) FROM '/var/lib/postgresql/on_street_parking_points.csv' DELIMITER ',' CSV HEADER; COPY 195 opendata=# select * from parking_points;  id  | type               | restrictn                                                              | spaces |        street                 |   town             | easting | northing | longitude | latitude -----+--------------------+------------------------------------------------------------------------+--------+-------------------------------+--------------------+---------+----------+-----------+-----------    1 | Parking            | Parking 2 Hours No Return 2 Hours Mon-Sat 8am-6pm                      | 7      | HIGH STREET                   | EPWORTH            | 478143  | 403888   | -0.821104 | 53.525592    2 | Disabled Parking   | Disabled Badge Holders Only 3 Hours No Return 2 Hours Mon-Sat 8am-6pm  | 1      | HIGH STREET                   | EPWORTH            | 478174  | 403879   | -0.820632 | 53.525505    3 | Parking            | Parking 2 Hours No Return 2 Hours Mon-Sat 8am-6pm                      | 7      | HIGH STREET                   | EPWORTH            | 478289  | 403824   | -0.818916 | 53.524996    4 | Disabled Parking   | Disabled Badge Holders Only 3 Hours No Return 2 Hours Mon-Sat 8am-6pm  | 1      | MARKET PLACE                  | EPWORTH            | 478338  | 403802   | -0.818187 | 53.524794 ...  192 | Disabled Parking   | Disabled Parking 3 hour no return 2 hour Mon-Sat 9am - 6pm             | 3      | CARLTON STREET                | SCUNTHORPE         | 489907  | 411466   | -0.643132 | 53.592072  193 | Parking            | Parking 1 Hour No Return 2 Hour Mon-Sat 9am-5pm Except Permit Holders  | 30     | LINDLEY STREET                | SCUNTHORPE         | 489486  | 408753   | -0.650268 | 53.567765 (195 rows)
Конфиг виртуальной машины 2 с MariaDB
let   pkgs = import <nixpkgs> { };    MysqlModule = { ... }: {         services.mysql = {         enable= true ;         package = pkgs.mariadb;         initialDatabases =[             { name = "enterprice"; }         ];         initialScript = pkgs.writeText "mariadb-init.sql" ''         CREATE USER 'databarsik'@'localhost' IDENTIFIED BY 'databarsik';         GRANT ALL PRIVILEGES ON *.* TO 'databarsik'@'localhost' WITH GRANT OPTION;         FLUSH PRIVILEGES;         USE enterprice;         CREATE TABLE enterprice(           Bank_Name TEXT(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           City TEXT(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           State TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           Cert TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           Acquiring_Institution TEXT(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           Closing_Date VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,           Fund VARCHAR(500) NOT NULL,           PRIMARY KEY(Fund));         '';         };   };   debugVm = { modulesPath, ... }: {     imports = [        "${modulesPath}/virtualisation/qemu-vm.nix"     ];      virtualisation.forwardPorts = [       { from = "host"; host.port = 2225; guest.port = 22; }       { from = "host"; host.port = 3306; guest.port = 3306; }     ];   };        networking.firewall.enable = false;     services.openssh.enable = true;      services.openssh.settings.PermitRootLogin = "yes";     users.extraUsers.root.password = "vasya";   nixosEvaluation = pkgs.nixos [     debugVm     MysqlModule   ]; in  nixosEvaluation.config.system.build.vm

соберем командой:

nix-build MysqlVM.nix
запустим командой:  ./result/bin/run-nixos-vm

Настройка Mysql

Зайдем в папку где есть доступ у Mysql и загрузим туда csv файл:

 ssh -p 2221 root@localhost "cd /var/lib/mysql/ && wget https://www.fdic.gov/bank/individual/failed/banklist.csv"

Убираем название столбцов:

 ssh -p 2221 root@localhost "sed '1d' /var/lib/mysql/banklist.csv"

Потом заходим на саму виртуальную машину:

ssh -p 2221 root@localhost

В сам Mysql, смотрим какие базы нам доступны загружаем наш csv и проверяем данные:

#mysql Welcome to the MariaDB monitor.  Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 10.6.15-MariaDB MariaDB Server  Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  MariaDB [(none)]> show databases; +--------------------+ | Database           | +--------------------+ | enterprice         | | information_schema | | mysql              | | performance_schema | | sys                | | test               | +--------------------+ 6 rows in set (0.032 sec)  MariaDB [(none)]> use enterprice; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed ######Качаем датасет: MariaDB [enterprice]> LOAD DATA INFILE '/var/lib/mysql/banklist.csv' INTO TABLE enterprice CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"'  LINES TERMINATED BY '\n' IGNORE 1 ROWS; Query OK, 567 rows affected (0.221 sec) Records: 567  Deleted: 0  Skipped: 0  Warnings: 0 MariaDB [enterprice]> show tables; +----------------------+ | Tables_in_enterprice | +----------------------+ | enterprice           | +----------------------+ 1 row in set (0.005 sec) MariaDB [enterprice]> describe enterprice; +-----------------------+--------------+------+-----+---------+-------+ | Field                 | Type         | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------+-------+ | Bank_Name             | text         | NO   |     | NULL    |       | | City                  | text         | NO   |     | NULL    |       | | State                 | text         | NO   |     | NULL    |       | | Cert                  | text         | NO   |     | NULL    |       | | Acquiring_Institution | text         | NO   |     | NULL    |       | | Closing_Date          | varchar(500) | NO   |     | NULL    |       | | Fund                  | varchar(500) | NO   | PRI | NULL    |       | +-----------------------+--------------+------+-----+---------+-------+ 7 rows in set (0.016 sec) MariaDB [enterprice]> select * from enterprice; +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+ | Bank_Name                                                                                  | City               | State | Cert  | Acquiring_Institution                                             | Closing_Date | Fund   | +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+  |Metropolitan Savings Bank                                                                  | Pittsburgh         | PA    | 35353 | Allegheny Valley Bank of Pittsburgh                               | 2-Feb-07     | 10000  |NetBank                                                                                    | Alpharetta         | GA    | 32575 | ING DIRECT                                                        | 28-Sep-07    | 10001  |Miami Valley Bank                                                                          | Lakeview           | OH    | 16848 | The Citizens Banking Company                                      | 4-Oct-07     | 10002  |Douglass National Bank                                                                     | Kansas City        | MO    | 24660 | Liberty Bank and Trust Company                                    | 25-Jan-08    | 10003  |Hume Bank                                                                                  | Hume               | MO    | 1971  | Security Bank                                                     | 7-Mar-08     | 10004  |ANB Financial, NA                                                                          | Bentonville        | AR    | 33901 | Pulaski Bank and Trust Company                                    | 9-May-08     | 10005  |First Integrity Bank, NA                                                                   | Staples            | MN    | 12736 | First International Bank and Trust                                | 30-May-08    | 10006  |IndyMac Bank                                                                               | Pasadena           | CA    | 29730 | OneWest Bank, FSB                                                 | 11-Jul-08    | 10007 ... +--------------------------------------------------------------------------------------------+--------------------+-------+-------+-------------------------------------------------------------------+--------------+--------+ 567 rows in set (0.022 sec) MariaDB [enterprice]> exit; Bye
Когда ночью не до сна…

На данный момент это все, дальше будем разбираться с контейнерами и полнотекстовым поиском, контейнерами и немного зайдем в программирование.


ссылка на оригинал статьи https://habr.com/ru/articles/760720/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *