Как стать автором
Обновить

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

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров1.8K

Всем привет. Предлагаю сделать передышку и отойти от нашего хранилища бэкапов (Первая часть и вторая часть ) и рассмотреть еще возможности испытуемой ОС. Сегодня как видно из названия мы начнем «готовку» виртуальных машин 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
Когда ночью не до сна...

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

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Публикации

Истории

Ближайшие события