Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务

Posted u012804784

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务相关的知识,希望对你有一定的参考价值。

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

本文主要介绍 Windows 环境下搭建 PostgreSQL 的主从逻辑复制,关于 PostgreSQl 的相关运维文章,网络上大多都是 Linux 环境下的操作,鲜有在 Windows 环境下配置的教程,所以本文采用 Windows 环境作为演示系统来进行 PostgreSQL 高可用数据库服务的搭建。

关于 Windows 系统 PostgreSQL 的安装方法可以直接看之前的博客 https://blog.csdn.net/berkerdong/p/16645493.html

在Windows 环境运行 PostgreSQL 在连接数的配置需要注意以下这个知识点:

由于PostgreSQL所依赖的一些库依赖于user32.dll,后者从内存中一块称为桌面堆(Desktop Heap)的区域中分配内存。桌面堆被分配给了每一个登录的会话,在 Windows 10 以上的操作系统通常一个非交互的会话将会分配给768KB。每个交互登录会话将会分配给20MB的桌面堆,每个postgres进程典型的桌面堆消耗是3.2KB。

  • 当作为Windows服务运行时,因为每个非交互会话将会分配768KBMB的桌面堆,所以大约可以支撑 200-220个连接。
  • 当在命令行方式运行时,因为每个交互登录会话将会分配20MB的桌面堆,所以大约可以支撑 5000-6000个连接。

以上说的值是操作系统默认的值,这个堆分配大小可以通过调整注册表来进行修改,但是此操作需要非常小心,一旦指定的值过大,系统将无法启动,所以不推荐去手动修改这个值。如果想要了解更多这个知识点可以看 微软官方的这个说明:
https://learn.microsoft.com/zh-CN/troubleshoot/windows/win32/user32-kernel32-not-initialize

结合上面的知识点,所以我们在Windows环境下配置 PostgreSQL 的最大连接数时,如果采用 Windows 服务模式运行则配置最大连接数为200比较好,如果需要200个以上的并发连接,则最好采用控制台形式启动运行PostgreSQL,同时结合计算机的可以内存去综合考虑一般100个连接数会消耗 1G内存,所以假设我们电脑内存为8G,考虑到系统本身运行需要2G内存,所以这是 PostgreSQL 的最大连接数配置为500 左右即可。

PostgreSQL控制台运行,启动和停止命令如下:

启动 pg_ctl.exe -D “D:\\Software\\PostgreSQL\\data” start
停止 pg_ctl.exe -D “D:\\Software\\PostgreSQL\\data” stop

-D 的参数 “D:\\Software\\PostgreSQL\\data” 是 PostgreSQL 的数据实例位置


今天我们采用逻辑同步复制来实现主从数据库的配置,首选在主数据库上调整 postgresql.conf 配置文件启用逻辑复制功能
wal_level = logical

配置调整之后需要重新启动主数据库实例。

然后在主数据库对我们需要配置的数据库执行逻辑发布
CREATE PUBLICATION p FOR ALL TABLES WITH (publish = 'insert, update, delete, truncate', publish_via_partition_root = false);
其中 p 为这个发布设置的名称,也可以自定义为其它。

然后在从数据库实例上选择我们要用来订阅主实例的数据库,然后执行创建逻辑订阅

CREATE SUBSCRIPTION s
    CONNECTION 'host=127.0.0.1 port=5432 user=postgres dbname=xxxxx connect\\_timeout=10 password=xxxxxx'
    PUBLICATION p
    WITH (connect = true, enabled = true, copy_data = true, create_slot = true, synchronous_commit = 'remote\\_apply');

其中 s 为这个订阅设置的名称 ‘host=127.0.0.1 port=5432 user=postgres dbname=xxxxx connect_timeout=10 password=xxxxxx’ 为主库的连接信息

这样我们就完成本地 localhost 的 PostgreSQL 实例中 csapp 数据库和 远程服务器上 caspp 数据库的主从配置。

这里要注意的一点是 PostgreSQL 的 逻辑订阅并不会同步DDL操作 ,所以对于数据库的建表等操作是不会进行主从同步的,我们需要手动维护 主从实例数据库上的表结构使其保持一致。
当在主和从数据库都创建完成表之后需要在从库上执行以下刷新订阅的 SQL,每次主库新增或者删除了表,从库都需要执行这个操作。

ALTER SUBSCRIPTION s
    REFRESH PUBLICATION WITH (copy_data = true);

然后我们在主库的数据库表中进行数据操作,所有的操作就会被同步到 从库的数据表中。

下面介绍如果想要删除发布设置和订阅设置的操作
在主库执行
SELECT * FROM pg_publication 可以查询当前主库的所有发布信息

DROP PUBLICATION p 删除名字为 p 的发布信息

在从库执行:
SELECT * FROM pg_subscription 可以查询当前从库的所有订阅信息

DROP SUBSCRIPTION s 删除名字为 s 的订阅信息

至此 Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .NET 基础框架项目,项目地址如下
https://github.com/berkerdong/NetEngine.git
https://gitee.com/berkerdong/NetEngine.git

通过hibernate访问postgreSQL的搭建过程

  1. 环境:win7,Intellij IDEA
  2. postgreSQL的安装:
    1. 安装包下载:https://www.postgresql.org/download/ 去官网下载postgresql-9.1.3-1-windows.exe(46M)
    2. 傻瓜式安装,跟着安装引导走,一路next,用户名默认为 postgres,密码*****,端口默认5432
    3. 启动服务,打开services.msc,如果postgre没有启动则手动启动
  3. postgreSQL客户的工具的安装:目前有多种客户工具,我用的是navicat for postgreSQL,去官网下载https://www.navicat.com/download/navicat-for-postgresql
    1. 解压压缩包,点击navicat.ext启动
    2. 双击连接->填写用户名,密码,端口,连接名,创建连接
    3. 右键点击连接名称,创建数据库
    4. 创建模式,(postgre的数据结构多了一层模式的结构,数据库>模式>表>字段),数据库创建时有默认的模式为public,右键数据库名,创建模式myschema
    5. 创建表,右键表,创建表,填写字段(user_id,username,password);
  4. 搭建hibernate环境:
    1. 用Intellij 新建javaWeb项目
    2. 引入jar包:
      1.   hibernate jar包 在pom.xml写依赖:
        <!--hibernate--> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency>   <groupId>org.hibernate</groupId>   <artifactId>hibernate-core</artifactId>   <version>5.1.2.Final</version> </dependency>
      2. postgreSQL jdbc jar包引入   在pom.xml中写依赖:
        <dependency>   <groupId>postgresql</groupId>   <artifactId>postgresql</artifactId>   <version>9.1-901-1.jdbc4</version> </dependency>
    3. 配置hibernate配置文件,项目由maven管理,在resources目录下加入hibernate.cfg.xml文件,该配置文件主要记录了数据库的有户名,ip,密码,端口,所用jdbc驱动等信息内容如下:
      <?xml version=‘1.0‘ encoding=‘utf-8‘?>
      <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "src/resource/schema/hibernate-configuration-3.0.dtd">
      
      <hibernate-configuration>
      
          <session-factory>
              <!-- Database connection settings -->
              <!-- Database connection settings -->
              <property name="connection.driver_class">
                  org.postgresql.Driver
              </property>
              <property name="connection.url">
                  jdbc:postgresql://10.21.132.19:5432/test
              </property>
              <property name="connection.username">postgres</property>
              <property name="connection.password">88075998</property>
      
      
              <!-- JDBC connection pool (use the built-in) -->
              <property name="connection.pool_size">1</property>
      
              <!-- SQL dialect -->
              <property name="dialect">
                  org.hibernate.dialect.PostgreSQLDialect
              </property>
      
              <!-- Enable Hibernate‘s automatic session context management -->
              <property name="current_session_context_class">thread</property>
      
              <!-- Disable the second-level cache  
              <property name="cache.provider_class">
                  org.hibernate.cache.internal.NoCacheProvider
              </property>-->
      
              <!-- Echo all executed SQL to stdout -->
              <property name="show_sql">false</property>
      
              <!-- Drop and re-create the database schema on startup -->
              <!-- <property name="hbm2ddl.auto">update</property> -->
      
              <!-- <mapping resource="com/hik/gss/sys/domain/User.hbm.xml" />-->
              
              <mapping class="model.User"></mapping>
          </session-factory>
      
      </hibernate-configuration>

       

  5. hibernate的查询语句,hibernate的操作有两种1.xml文件配置2.注解,这里用的是注解法,图个方便.
    1. 实体类的定义,如下:
      package model;
      
      import org.hibernate.annotations.GenericGenerator;
      
      import javax.persistence.*;
      
      @Entity
      @Table(name="public.user")
      public class User {
          private Integer userId;
          private String userName;
          private String passWord;
      
          @Id
          @GeneratedValue(generator="increment")
          @GenericGenerator(name="increment", strategy = "increment")
          @Column(name = "user_id")
          public Integer getUserId() {
              return userId;
          }
      
          public void setUserId(Integer userId) {
              this.userId = userId;
          }
      
          @Column(name = "username")
          public String getUserName() {
              return userName;
          }
      
          public void setUserName(String userName) {
              this.userName = userName;
          }
      
          @Column(name = "password")
          public String getPassWord() {
              return passWord;
          }
      
          public void setPassWord(String passWord) {
              this.passWord = passWord;
          }
      
      
      
      
      }


      注解说明:@Entity实体类标注,    @Table标注表名,注意表名前面要写模式名(public),被坑过.   @Id 表示主键   @Column列名  

    2. 查询数据库代码Demo:
              final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                      .configure()                 .build();
               SessionFactory sessionFactory = null;
              try {
                  sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
              } catch (Exception e) {
                  // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory
                  // so destroy it manually.
                  StandardServiceRegistryBuilder.destroy( registry );
              }
      
              Session session = sessionFactory.openSession();
              session.beginTransaction();
              List result = session.createQuery( "from model.User" ).list();
              for ( User user : (List<User>) result ) {
                  System.out.println( "User (" + user.getUserName() + ") : " + user.getPassWord() );
                  if (this.passWord.equals(user.getPassWord()) && this.userName.equals(user.getUserName())) {
                      return "SUCCESS";
                  }
              }
              session.getTransaction().commit();
              session.close();


      总结一下查询的步骤:

      1. 注册
      2. 创建会话工厂
      3. 会话工厂生产会话
      4. 创建查询语句
      5. 会话执行查询语句
      6. 获取结果

 

  

 



以上是关于Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务的主要内容,如果未能解决你的问题,请参考以下文章

PG集群(PostgreSql环境)搭建

PostgreSQL 12 流复制环境搭建

FinClip小程序+Rust:环境搭建

Odoo环境搭建之问题readme

环境搭建Postgresql入门,基础命令

快速搭建springboot+mybatis+postgresql开发环境