为 Data Guard 优化 Oracle Net
为了实现高网络吞吐量,特别是对于高延迟、高带宽的网络,TCP 发送和接收套接字缓冲区大小的最小推荐设置是主要和网络链路之间的带宽延迟积 (BDP)。
备用系统。
BDP 是网络带宽和延迟的产物。
测试表明,随着套接字缓冲区设置的增加,吞吐量增加到 BDP 的三倍。
套接字缓冲区大小是使用 Oracle Net 参数 RECV_BUF_SIZE 和 SEND_BUF_SIZE 设置的。
例如,如果带宽为每秒 622 Mbit/s 且延迟为 30 毫秒,我们将计算 RECV_BUF_SIZE 和 SEND_BUF_SIZE 参数的最小大小,如下所示:622,000,000/8 x 0.030 = 2,332,500 字节。
然后,将 BDP 乘以 2,332,500 x 3,总计为 6,997,500。
将发送和接收缓冲区大小设置为我们计算的值或者 10 MB (10485760),以较大者为准。
Oracle Net 将数据缓冲到所谓的会话数据单元 (SDU) 中,默认大小为 8192 字节。
当这些数据单元已满、已刷新或者被客户端读取时,这些数据单元将被发送到网络层。
通常,Data Guard 以比 8192 字节大得多的块发送重做,因此此默认值是不够的,因为我们最终可能不得不向 Oracle Net Services 发送更多块(切碎数据)。
将其增加到 64 KB。
要抢占 TCP 协议堆栈中缓冲区刷新的延迟,请通过在主系统和备用系统上的 sqlnet.ora 文件中将 TCP.NODELAY 设置为 YES 来禁用 TCP Nagle 算法。
由于主机操作系统的限制或者内存限制,SEND_BUF_SIZE 和 RECV_BUF_SIZE 参数的实际值可能小于指定的值。
这些参数的默认值是特定于操作系统的。
以下是 Linux 操作系统的默认设置:
SEND_BUF_SIZE: 131,072 bytes (128 KB) RECV_BUF_SIZE: 174,700 bytes
在安装 oracle-rdbms-server-12cR1preinstall 软件包时,这些值通常会被修改为更高,但修改后的值仍然低于 Data Guard 最佳实践推荐的值。
接收套接字内存的默认和最大数量可以通过以下方式确定:
# cat /proc/sys/net/core/rmem_default # cat /proc/sys/net/core/rmem_max
发送套接字内存的默认和最大数量可以通过以下方式确定:
# cat /proc/sys/net/core/wmem_default # cat /proc/sys/net/core/wmem_max
使用以下命令调整值:
# echo 'net.core.wmem_max=10485760' >> /etc/sysctl.conf # echo 'net.core.rmem max=10485760' >> /etc/sysctl conf
我们还必须以字节为单位设置最小大小、初始大小和最大大小:
# echo 'net.ipv4.tcp_rmem= 10240 131072 10485760' >> /etc/sysctl.conf # echo 'net.ipv4.tcp_wmem= 10240 131072 10485760' >> /etc/sysctl.conf
使用以下命令重新加载所做的更改:
# sysctl -p
本地命名配置文件
本地命名方法使用存储在客户端和数据库服务器上的基于文本的配置文件将网络服务名称(连接标识符)解析为详细的连接描述符。
操作系统环境变量决定了这些文件的位置。
首先检查 TNS_ADMIN 变量。
它允许将配置文件集中放置(例如,在集群文件系统上并在多台机器之间共享)。
如果未定义 TNS_ADMIN 变量,则使用 ORACLE_HOME 变量来定位配置文件。
由于不同的原因,同一台主机上可能存在多个不同的 ORACLE_HOME 位置。
如果需要,每个文件都可以包含网络配置文件。
例如,对于每个网格基础架构软件数据库软件中间件软件、数据库软件、中间件软件和企业管理器软件产品,可以在每个网格基础架构软件位置的 ORACLE_HOME 位置找到 tnsnames.ora 和 sqlnet.ora 文件. ORACLE_HOME 环境变量的值将一次指向一个 ORACLE_HOME 位置。
listener.ora 配置文件仅用于数据库软件 ORACLE_HOME 位置。
静态侦听器条目:listener.ora
Recovery Manager 和 Data Guard 代理操作需要静态侦听器条目。
SID_LIST_LISTENER = (SID LIST = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = london.example.com) (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1) (SID_NAME = london)) (SID_DESC = (GLOBAL_DBNAME = london_DGMGRL.example.com) (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1) (SID_NAME = london)) )
动态服务注册允许数据库实例的侦听器注册过程 (LREG) 向侦听器标识其可用服务,而无需在 listener.ora 配置文件中输入任何条目。
然后,侦听器充当这些服务的端口映射器。
但是,当数据库实例停止时,侦听器会丢弃与该数据库相关的动态服务的所有信息。
任何与未知服务建立网络会话的尝试通常都会收到错误消息“ORA-12514:侦听器当前不知道连接描述符中请求的服务”。
即使数据库实例未运行,静态注册也允许侦听器知道服务。
这对于尝试远程启动和停止数据库实例的工具和实用程序来说通常很重要。
以下情况需要配置静态服务信息:
- 使用外部过程调用
- 异构服务的使用
- 使用 Oracle Data Guard
- 从 Oracle Enterprise Manager Cloud Control 以外的工具远程启动数据库
要使 DGMGRL 在代理操作过程中重新启动静态实例 要使 DGMGRL 在代理操作过程中重新启动实例,静态服务必须注册到本地侦听器并假定静态服务名称为 db_unique_name_DGMGRL.db_domain。
监听器配置:listener.ora
Oracle 网络配置(在数据库主机上):$ORACLE_HOME/network/admin/listener.ora
以下条目定义了两个侦听端点:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS=(PROTOCOL=TCP)(HOST=host03.example.com) (PORT=1521)(SEND_SDU=10485760) (RECV_SDU = 10485760))) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))) ) ADR_BASE_LISTENER = /u01/app/oracle LISTENER2 = ... ADR_BASE_LISTENER2 = /u01/app/oracle
侦听器配置有一个或者多个侦听协议地址、有关支持的服务的信息以及控制其运行时行为的参数。
侦听器配置存储在名为 listener.ora 的配置文件中。
因为配置参数有默认值,所以可以在没有配置的情况下启动和使用侦听器。
在 Oracle Data Guard 环境中,最佳实践通常表明需要调整会话数据单元 (SDU) 缓冲区以提高网络性能。
这在具有长时间延迟的广域网 (WAN) 上尤其重要。
修改此值将要求使用非默认值创建 listener.ora 文件。
上面示例中的粗体文本表示侦听器的名称。
此名称用于引用侦听器的命令,例如引用侦听器的命令,例如 lsnrctl start LISTENER2 lsnrctl start LISTENER2.
如果默认 如果使用默认名称,则在大多数命令中不需要标识它。
例如,命令 lsnrctl start 将启动一个默认名称为 LISTENER 的侦听器。
一个侦听器可以侦听多个数据库,或者每个数据库可以存在一个侦听器。
在单个 listener.ora 文件中,可以通过复制文件内容并将侦听器名称更改为每次出现的不同值来创建多个侦听器配置。
在幻灯片中,蓝色文本显示了名为 LISTENER2 的第二个侦听器。
每个单独的侦听器都需要一个不同的侦听端点。
这种技术可以允许为同一主机上的每个数据库分别启动和停止侦听器。
本地命名:tnsnames.ora
数据库参数文件(spfileNAME.ora/initNAME.ora)
LOG_ARCHIVE_DEST_2='SERVICE=london ...'
Oracle 网络配置(在数据库主机上):$ORACLE_HOME/network/admin/tnsnames.ora
LONDON = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST=host03.example.com) (PORT=1521)(SEND_BUF_SIZE=10485760) (RECV_BUF_SIZE=10485760)) ) (SDU=65535) (CONNECT_DATA=(SERVICE_NAME=london.example.com)) )
上面显示的是使用本地命名方法用于 Data Guard 环境的示例。
位于数据库参数文件内的 LOG_ARCHIVE_DEST_n 参数与 SERVICE 属性用于定义重做数据将发送到的远程 Oracle 数据库实例。
网络服务名称(在幻灯片中显示的值为 LONDON)将使用本地命名方法解析为连接描述符。
连接描述符提供在其侦听端点上联系侦听器所需的协议和地址信息。
联系侦听器后,将为指定的 SERVICE_NAME 请求网络会话。
不要求网络服务名称 (LONDON) 与 SERVICE_NAME(london.example.com) 具有相同的值或者类似命名的值。
连接时故障转移:规划角色反转
默认情况下为多个地址列表(使用 ADDRESS_LIST)打开连接时故障转移,并且不必指定。
PRMY = (DESCRIPTION = (ADDRESS_LIST = (FAILOVER=on) (ADDRESS=(PROTOCOL=TCP)(HOST=host01.example.com) (PORT=1521)(SEND_BUF_SIZE=10485760) (RECV_BUF_SIZE=10485760)) (ADDRESS=(PROTOCOL=TCP)(HOST=host03.example.com) (PORT=1521)(SEND_BUF_SIZE=10485760) (RECV_BUF_SIZE=10485760)) ) (SDU=65535) (CONNECT_DATA=(SERVICE_NAME=prmy.example.com)) )
故障转移和切换等角色反转操作可以修改当前运行主数据库或者备用数据库的主机。
客户端配置应包括一个连接描述符,该描述符包括可以运行特定服务的所有潜在主机。
这可以通过指定具有多个侦听端点或者地址的 ADDRESS_LIST 来配置。
如果第一个侦听器失败,则连接时故障转移会指示 Oracle Net 故障转移到不同的侦听器。
默认情况下,使用 ADDRESS_LIST 子句会打开连接时故障转移。
没有必要使用 FAILOVER=on 语句,如上例中的粗体文本所示。
在建立应用程序连接时,如果它们碰巧尝试连接到不可用的旧主要主机,则与该主机的连接尝试应连接到不可用的旧主要主机,与该主机的连接尝试应持续不超过 3 秒。
这允许连接尝试快速通过 ADDRESS_LIST,直到找到新的主要主机。
这可以通过将以下条目放入 sqlnet.ora 文件中进行配置:
SQLNET.OUTBOUND_CONNECT_TIMEOUT=3
了解名称解析
命名方法是客户端应用程序在尝试连接到数据库服务时用于将连接标识符解析为连接描述符的解析方法。
可以使用以下方法:
- 本地命名(使用基于文本的静态配置文件)
- 目录命名(使用动态 LDAP 兼容服务器)
- Easy Connect 命名(使用简单的硬编码字符串)
- 外部命名(使用第三方命名服务)
SQL> connect hr@xyz
解析为:
SQL> connect hr@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=host03.example.com)(PORT=1521))(CONNECT_DATA= (SERVICE_NAME=london.example.com)))
客户端应用程序需要一个连接描述符来创建网络会话。
连接描述符包含两个组件:
- 通过协议地址定位侦听器,也称为侦听端点
- 侦听器识别的特定数据库服务名称或者 Oracle 系统标识符
连接描述符可以像幻灯片中的第二个示例一样明确指定,它不需要名称解析。
当代理修改用于重做传输的 LOG_ARCHIVE_DEST_n 参数时,Data Guard 代理使用此技术。
此外,可以指定直接 TCP/IP 地址代替主机名,以避免另外的查找,例如使用域名服务 (DNS)。
但在大多数情况下,用户通过提供连接字符串来发起连接请求,连接字符串可以包括用户名、密码和简化的连接标识符。
这要求使用许多可用的名称解析方法之一将简化的连接标识符解析为适当的详细信息。
每种命名方法都有优点和缺点。
sqlnet.ora 文件指示客户端或者服务器可以使用哪些命名方法。
本类将使用本地命名方法,该方法将网络服务名称及其连接描述文件存储在名为 tnsnames.ora 的本地化配置文件中。
Oracle 网络服务概述
Oracle Net Services 在分布式异构计算环境中提供企业范围的连接解决方案。
它支持从客户端应用程序到 Oracle 数据库服务器的网络会话。
专用服务器进程是一种服务处理程序,侦听器在收到客户端请求时启动。
该幻灯片描述了使用以下步骤建立从客户端到 Oracle 数据库(非共享服务器架构)的连接的过程:
- 侦听器接收客户端连接请求。
- 侦听器启动专用服务器进程。
- 侦听器在重定向消息中提供专用服务器进程的位置。
- 客户端直接连接到专用服务器。
动态服务注册
动态服务注册在数据库初始化文件中配置。
它不需要在 listener.ora 文件中进行任何配置。
如果未指定,SERVICE_NAMES 参数的值默认为全局数据库名称,该名称由初始化参数文件中的 DB_UNIQUE_NAME 和 DB_DOMAIN 参数组成。
如果未明确定义,则 DB_UNIQUE_NAME 参数默认值为 DB_NAME。
INSTANCE_NAME 参数的值默认为 Oracle 系统标识符 (SID)。
所有这些名称都可以明确定义为非默认值。
SERVICE_NAMES 指定一个或者多个客户端可以连接到实例的名称。
实例向侦听器注册其服务名称。
可以指定多个服务名来区分不同的us名来区分同一个数据库的不同用途例如:
SERVICE_NAMES=PROD,DG_PRMY,DG_RW,MAIN_REPORTING
默认情况下,LREG 进程在 TCP/IP 的默认本地地址(端口 1521)上向其本地侦听器注册服务信息。
要使 LREG 进程向不使用 TCP/IP 的本地侦听器(端口 1521)注册服务信息,请配置 LOCAL_LISTENER初始化参数文件中的参数来定位本地监听器。
远程侦听器是驻留在上的侦听器 远程侦听器是驻留在一台计算机上的侦听器,它将连接重定向到另一台计算机上的连接重定向到数据库实例的计算机。
我们可以使用 REMOTE_LISTENER 参数配置注册到远程侦听器。