Oracle 23ai True Cache简介和安装部署

2024年 5月 15日 100.6k 0

随着数字环境的不断发展,数据量呈指数级增长,业务逻辑变得更加复杂,但是提供实时响应已成为势在必行。延迟已成为新的中断,因此调整其应用程序架构以满足不断增长的用户群激增的需求至关重要。在追求卓越性能的过程中,缓存成为一种常见的解决方案,特别是读多写少的业务类型。缓存通过将经常访问的数据存储在临时位置/缓存中,有效地减少了对数据库的依赖,从而大大加快了数据检索速度和效率。

什么是True Cache?

现代应用程序通常需要在连接数量和可缓存的数据量方面具有巨大的可扩展性。一种流行的方法是将缓存放在数据库的前面,这些缓存依赖于这样一个事实,即应用程序通常不需要查看最新数据。例如,当有人浏览航班预订系统时,系统可以显示一秒钟前的航班数据。当有人预订航班时,系统会显示最新数据。

Oracle 23ai True Cache简介和安装部署-1

Oracle True Cache 仅使用其缓冲区缓存中的数据来满足查询需求。与 Oracle Active Data Guard 一样,True Cache 是主数据库的全功能只读复制,但是它没有数据文件存在磁盘上。

Oracle 23ai True Cache简介和安装部署-2

概括地说,它的工作原理如下:

  • 应用程序通过 Oracle JDBC driver 设置一个属性即可自动地将查询定向到 True Cache。

  • True Cache 实例通过使用它所缓存的数据来满足查询。

  • 当发生缓存未命中时,True Cache 实例会从主数据库实例中获取块。

  • 当True Cache实例首次启动时,除了在缓存未命中期间获取块外,它还会以大块的形式获取相关的块以进行预热。

  • 缓存数据块后,它会通过主数据库的重做应用自动更新,这类似于在 Oracle Data Guard 配置中执行实时重做应用的方式。

  • 对True Cache实例的每个查询始终返回和主库一致的数据。

True Cache的安装和部署

下表是简单的安装环境介绍:

操作系统是Oracle Linux 8.8,6G内存,数据库版本都是23ai  23.4.0.24.05。

主机名

IP地址

角色

实例名称

dbserver234

192.168.56.234

主库(归档模式)

db23ai

db23ai

192.168.56.123

True Cache

db23ai_tc

1、先需要把主库的密码文件copy到True Cache节点的相同目录下面

    [oracle@dbserver234 dbs]$ scp orapwdb23ai 192.168.56.123:$ORACLE_HOME/dbs/orapwdb23ai_tc

    2、True Cache实例使用的参数文件内容

      [oracle@db23ai dbs]$ cat initdb23ai_tc.ora
      true_cache=true
      db_name=db23ai
      db_unique_name=db23ai_tc
      db_files=200
      sga_target=2G
      fal_server=primarydb
      fal_client=tcdb
      instance_name=db23ai_tc
      db_create_file_dest=/u01/app/oracle/oradata/DB23AI
      local_listener=listener_tc
      remote_listener=listener_primary
      参数文件中的primarydb, tcdb, listener_tc, listener_primary对应tnsnames.ora的条目
      primarydb =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.234)(PORT = 1521))
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db23ai)
      )
      )
      tcdb =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.123)(PORT = 1521))
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db23ai_tc)
      )
      )
      listener_primary =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.234)(PORT=1521))
      )
      listener_tc =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.123)(PORT=1521))
      )

      3、创建True Cache实例

      Oracle 23ai True Cache简介和安装部署-3

      执行create true cache命令后,会创建一个TRUE CACHE类型的实例,并且自动开启实时同步模式,另外这个命令还会在True Cache实例自动创建如下文件:

      Oracle 23ai True Cache简介和安装部署-4

      分别是默认临时表空的temp文件,备库在线日志文件,备库控制文件。

      4、创建只读和读写应用使用的相关service

      下面命令在主库的aipdb1中执行:

      Oracle 23ai True Cache简介和安装部署-5

      分别创建了2个Service,连接主库使用的sales和True Cache使用的c_sales。

      5、分别启动这两个Service

      要注意需要分别在主库和True Cache的 aipdb1中启动这两个service。

      在True Cache实例启动c_sales服务:

      Oracle 23ai True Cache简介和安装部署-6

      在Primary实例启动sales服务:

      Oracle 23ai True Cache简介和安装部署-7

      6、使用程序测试

      应用程序通过以下方法之一决定是查询True Cache实例还是主数据库实例中的数据:

      • 维护与 True Cache 配置的各种实例的多个物理连接,并在查询或更新数据之前切换连接。

      • 仅维护与在主数据库实例上运行的数据库应用程序服务的一个逻辑连接,并让驱动程序处理与相应主实例和True Cache 实例的基础物理连接。此方法只能通过使用 JDBC Thin 驱动程序来实现。开发人员可以手动将应用程序代码的某些部分的逻辑连接标记为只读。如果为数据库应用程序服务配置了 True Cache 实例,那么 Oracle JDBC 驱动程序会自动将查询从应用程序代码的只读部分定向到其中一个 True Cache 实例。

      可以看到方法1可能需要不断切换连接串,比较麻烦。方法二使用同一个连接串,通过对JDBC连接属性的conn1.setReadOnly(true)属性来控制连接到True Cache实例。

      我们这里使用java程序test1.java来模拟第二种方法来测试。

      主库的listener.ora添加如下内容:

        [oracle@dbserver234 admin]$ cat listener.ora
        # listener.ora Network Configuration File:
        REGISTRATION_INVITED_NODES_LISTENER=(192.168.56.123,192.168.56.234)

        确保主库的listener能同时监听sales和c_sales这两个service,如下图所示:

        Oracle 23ai True Cache简介和安装部署-8

        Oracle 23ai True Cache简介和安装部署-9

        可以看到当连接的isReadonly属性是false时候,数据库连接指向PRIMARY数据库,可以进行写操作,当isReadonly属性是true时候连接自动指向True Cache实例,同一个连接能连接到PRIMARY实例或者True Cache实例,简化了开发。

        7、True cache 实例DML重定向能力测试

        True Cache支持对应用透明,即在不需要修改代码,只修改数据库连接串的情况下直接使用True Cache,而不考虑相关的SQL语句是否是DML语句,或者是否在执行包含DML的存储过程。这需要在session级或者system级开启参数ADG_REDIRECT_DML,系统将自动将DML类语句重定向到主库。注意,DML重定向可能会因为额外的网络开销而带来一定的性能损耗。

        Oracle 23ai True Cache简介和安装部署-10

        可以看到True Cache实例也能进行少量写操作,并且数据能实时同步。

        8、True cache 支持对临时表的各种操作

        Oracle 23ai True Cache简介和安装部署-11

        在True Cache执行上图的操作,无需预先激活 ADG_REDIRECT_DML,对开发非常友好。

        Oracle True Cache 具有以下优势:

        • 提高应用程序性能:True Cache 通过卸载查询和减少对主数据库的请求数,在不重写应用程序的情况下增强了可扩展性和应用程序响应时间。

        • 自动维护:True Cache 可在多个实例中自动维护缓存数据,从而减少手动工作量并提高工作效率。

        • 简化开发:开发人员可以通过维护与主数据库实例的单个逻辑连接而受益,在主实例和 True Cache 实例之间无缝转换,而无需手动指定实例名称,从而提高应用程序的透明度和效率。

        • 改进服务级别协议 SLA:True Cache 通过集成瘦客户端和数据库来简化应用架构,无需额外的中间层产品。这种协同作用可以提高SLA并减少潜在错误,从而确保更流畅、更高效的用户体验。

        • 实现成本节约:借助True Cache,您可以将缓存卸载到经济高效的商用硬件,从而减少数据库负载并降低与更昂贵硬件相关的潜在费用,从而节省成本。

        总之,Oracle True Cache 为现代数据环境提供了全面的解决方案。True Cache 充分利用了 Oracle 数据库的全部潜力,包括索引、并行查询和压缩等高级功能;支持各种数据类型,包括关系、对象、文档(JSON/XML)、键值、文本、图和空间;并支持各种数据格式(行/列)。它消除了管理单独缓存层和处理失效的复杂性。Oracle True Cache 能够在从电子商务到游戏,从财务运营到物联网管理等一系列用例中优化延迟、个性化体验、简化运营和提高性能,从而重塑数据加速和交付,使企业能够满足当今数字领域不断增长的需求。

        部分内容来源:

        https://blogs.oracle.com/database/post/introducing-oracle-true-cache

        测试程序test1.java代码参考:

          import java.sql.*;
          import java.io.*;
          import java.util.*;
          import java.util.logging.FileHandler;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import oracle.jdbc.driver.OracleLog;
          import oracle.jdbc.pool.OracleDataSource;
          class TrueCache {
          static String url_primary = "jdbc:oracle:thin:@192.168.56.234:1521/SALES";
          static String user = "sh";
          static String password = "sh";
          public static void main(String args[]) {
          try {
          TrueCache t = new TrueCache();
          if(args != null && args.length >0 ) {
          url_primary = args[0];
          user = args[1];
          password = args[2];
          }
          t.test1();
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
          public void test1() throws SQLException {
          show("Basic test to connect to primary and True Cache");
          try {
          show("Get Connection from True Cache instance using primary db and properties");
          OracleDataSource ods1 = new OracleDataSource();
          show("URL = " + url_primary);
          ods1.setURL(url_primary);
          ods1.setUser(user);
          ods1.setPassword(password);
          ods1.setConnectionProperty("oracle.jdbc.useTrueCacheDriverConnection", "true");
          Connection conn1 = ods1.getConnection();
          show("isReadonly " + conn1.isReadOnly());
          verifyConnection(conn1); // This is connected to Primary
          conn1.setReadOnly(true);
          show("isReadonly " + conn1.isReadOnly());
          verifyConnection(conn1); // This is connected to True Cache
          conn1.close();
          } catch (SQLException sqex) {
          show("test1 -- failed" + sqex.getMessage()+":"+sqex.getCause());
          sqex.printStackTrace();
          }
          show("The end");
          }
          public void verifyConnection(Connection conn) {
          try {
          Statement statement = conn.createStatement();
          ResultSet rs = statement.executeQuery("SELECT database_role from v$database");
          ResultSetMetaData rsmd = rs.getMetaData();
          int columnsNumber = rsmd.getColumnCount();
          rs.next();
          show("Database role : " + rs.getString(1));
          rs.close();
          ResultSet resultSet = statement.executeQuery("SELECT SYS_CONTEXT('userenv', 'instance_name') as instance_name"
          + ", SYS_CONTEXT('userenv', 'server_host')" + " as server_host" + ", SYS_CONTEXT('userenv', 'service_name')"
          + " as service_name" + ", SYS_CONTEXT('USERENV','db_unique_name')" + " as db_unique_name" + " from sys.dual");
          resultSet.next();
          show("instance_name : " + resultSet.getString("instance_name"));
          show("server_host : " + resultSet.getString("server_host"));
          show("service_name : " + resultSet.getString("service_name"));
          show("db_unique_name : " + resultSet.getString("db_unique_name"));
          resultSet.close();
          statement.close();
          } catch (SQLException sqex) {
          show("verifyConnection failed " + sqex.getMessage());
          }
          }
          public void show(String msg) {
          System.out.println(msg);
          }
          }

          编辑:赵靖宇Oracle 23ai True Cache简介和安装部署-12

          相关文章

          Oracle如何使用授予和撤销权限的语法和示例
          Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
          下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
          社区版oceanbase安装
          Oracle 导出CSV工具-sqluldr2
          ETL数据集成丨快速将MySQL数据迁移至Doris数据库

          发布评论