这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。
对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作。
为了模拟这种环境,我们将通过Docker使用PostgreSQL实例。
动机很简单。 您的Spring应用程序变得越来越流行,并且您希望它处理更多的请求。 那里的大多数应用程序对读操作而不是写操作的需求更高。 因此,我认为您的应用程序属于同一类别。
尽管SQL数据库本身不能水平扩展,但是您可以通过使用只读副本来使用它们。
我们的目标不是在PostgreSQL中进行实际的Read复制
因此,无需配置任何复制
我们将只从两个数据库中复制一些数据
这是我们将用来填充数据库的脚本。
#!/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堆栈。
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
如您所见,我们的配置非常简单。 如果您足够小心的话,您会发现我将数字分配给了读数据库。 这是因为将来我们将向其添加更多副本。
我还所做的是将计算机绑定到不同的本地ip。
如果您在绑定地址时遇到问题,例如127.0.0。*:5432
你应该试试
sudo ifconfig lo0 alias 127.0.0.2 up sudo ifconfig lo0 alias 127.0.0.3 up
如果不成功,则只需更改端口即可。 可能不那么方便,但是还可以。
因此,让我们启动并运行我们的Docker Compose堆栈。
docker-compose -f . /postgresql-stack .yaml up
我们必须能够在两个postgresql实例中查询数据。
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 | 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)
我们已经为下一步做好了准备。 我们已经启动了一些数据库,并且正在运行它们,我们将在它们之上启动一个spring应用程序。 下一个博客着重于实现在我们的主数据库上运行的应用程序。
翻译自: https://www.javacodegeeks.com/2019/10/read-replicas-spring-data-configuring-databases.html