Статьи

Чтение реплик и Spring Data. Часть 1. Настройка баз данных

Это серия постов в блоге о нашем стремлении повысить производительность нашего приложения за счет использования реплик чтения.

Для этого проекта наша цель состоит в том, чтобы настроить наше весеннее приложение данных и использовать репозитории чтения для записей и репозитории на основе реплик чтения для чтения.

Чтобы смоделировать эту среду, мы будем использовать экземпляры PostgreSQL через Docker.

Мотивы просты. Ваше приложение Spring становится все более популярным, и вы хотите, чтобы оно обрабатывало больше запросов. Большинство приложений там имеют более высокий спрос на операции чтения, чем на операции записи. Таким образом, я предполагаю, что ваше приложение относится к той же категории.
Хотя базы данных SQL сами по себе не масштабируются по горизонтали, вы можете работать с ними, используя реплики чтения.

Наша цель — не создавать реальную репликацию чтения в PostgreSQL.

поэтому вместо настройки любой репликации

мы просто скопируем некоторые данные из обеих баз данных

Это сценарий, который мы будем использовать для заполнения баз данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
set -e
 
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    create schema spring_data_jpa_example;
 
    create table spring_data_jpa_example.employee(
        id  SERIAL PRIMARY KEY,
        firstname   TEXT    NOT NULL,
        lastname    TEXT    NOT NULL,
        email       TEXT    not null,
        age         INT     NOT NULL,
        salary         real,
        unique(email)
    );
 
    insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary)
    values ('John','Doe 1','john1@doe.com',18,1234.23);
    insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary)
    values ('John','Doe 2','john2@doe.com',19,2234.23);
    insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary)
    values ('John','Doe 3','john3@doe.com',20,3234.23);
    insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary)
    values ('John','Doe 4','john4@doe.com',21,4234.23);
    insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary)
    values ('John','Doe 5','john5@doe.com',22,5234.23);
EOSQL

Поскольку мы будем использовать Docker и Docker Compose, сценарий выше будет использоваться для инициализации базы данных. Теперь приступим к созданию стека Docker Compose.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3.5'
 
services:
  write-db:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: db-user
      POSTGRES_PASSWORD: your-password
      POSTGRES_DB: postgres
    networks:
      - postgresql-network
    ports:
      - "127.0.0.2:5432:5432"
    volumes:
      - $PWD/init-db-script.sh:/docker-entrypoint-initdb.d/init-db-script.sh
  read-db-1:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: db-user
      POSTGRES_PASSWORD: your-password
      POSTGRES_DB: postgres
    networks:
      - postgresql-network
    ports:
      - "127.0.0.3:5432:5432"
    volumes:
      - $PWD/init-db-script.sh:/docker-entrypoint-initdb.d/init-db-script.sh
networks:
  postgresql-network:
    name: postgresql-network

Как видите, наша конфигурация довольно проста. Если вы будете достаточно осторожны, вы увидите, что я дал номер один для чтения БД. Это потому, что в будущем мы добавим к нему больше реплик.

Я также привязал машины к различным локальным ips.

Если у вас есть проблемы с привязкой адресов, например 127.0.0. *: 5432
Тебе стоит попробовать

1
2
sudo ifconfig lo0 alias 127.0.0.2 up
sudo ifconfig lo0 alias 127.0.0.3 up

Если у вас ничего не получится, просто поменяйте порты и все заработает. Это может быть не так удобно, но все равно хорошо.

Итак, давайте запустим наш стек Docker Compose.

1
docker-compose -f ./postgresql-stack.yaml up

Мы должны иметь возможность запрашивать данные в обоих экземплярах postgresql.

01
02
03
04
05
06
07
08
09
10
11
docker exec -it deploy_read-db-1_1 /bin/bash
root@07c502968cb3:/# psql -v --username "$POSTGRES_USER" --dbname "$POSTGRES_DB"
db-user=# select*from spring_data_jpa_example.employee;
 id | firstname | lastname |     email     | age | salary
----+-----------+----------+---------------+-----+---------
  1 | John      | Doe 1    | john1@doe.com |  18 | 1234.23
  2 | John      | Doe 2    | john2@doe.com |  19 | 2234.23
  3 | John      | Doe 3    | john3@doe.com |  20 | 3234.23
  4 | John      | Doe 4    | john4@doe.com |  21 | 4234.23
  5 | John      | Doe 5    | john5@doe.com |  22 | 5234.23
(5 rows)

Мы в значительной степени настроены на наш следующий шаг. У нас есть несколько запущенных баз данных, и мы собираемся ускорить запуск весеннего приложения на них. Следующий блог посвящен реализации приложения, работающего на нашей основной базе данных.

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: чтение реплик и Spring Data. Часть 1. Настройка баз данных.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.