资讯专栏INFORMATION COLUMN

Oracle最佳连接方式之service最佳实践及测试(下)

IT那活儿 / 1847人阅读
Oracle最佳连接方式之service最佳实践及测试(下)

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


文章前言

本章内容包含测试六个场景:

  • 主库节点1宕库
  • 主库节点1宕机
  • 备库节点1宕库
  • 备库节点1宕机
  • 主备switch over
  • 主备failover

需要回顾早前发布的文章,可点击文章标题跳转原文查看:

oracle最佳连接方式之service简介及创建(上)

oracle最佳连接方式之service维护(中)

service测试相关脚本

2.1 先主库建测试表及测试用户

  • 创建读测试表
create user dbauser identified by oracle account unlock;
grant dba to dbauser;
create table dbauser.test_read(id number);
insert into dbauser.test_read values(1);
insert into dbauser.test_read values(2);
insert into dbauser.test_read values(3);
commit;
  • 创建写测试表
create table dbauser.test_write(id number);
  • 循环写测试脚本
#!/bin/bash
#Autor:Wangergui
#Description:test write
i=0
while true;do
sqlplus dbauser/oracle@PRI_EMREP1<insert into dbauser.test_write values ($i);
commit;
exec dbms_lock.sleep(5);
quit
EOF
sleep 2 && i=$(($i+1))
done

2.2 连接测试脚本

  • 监控读
#!/bin/bash
#Autor:Wangergui
#Description:test read
i=0
while true;do
sqlplus -S dbauser/oracle@PRI_EMREP1 <select * from dbauser.test;
exec dbms_lock.sleep(5);
quit
EOF
sleep 1 && i=$(($i+1))
done
  • 监控写
#!/bin/bash
#Autor:Wangergui
#Description:Monitor write
i=0
while true;do
sqlplus dbauser/oracle@PRI_EMREP1 <select * from dbauser.test_write;
exec dbms_lock.sleep(5);
quit
EOF
sleep 2 && i=$(($i+1))
done

2.3 主备库tnsnames.ora 配置

说明:

  • 192.168.8.110为主库的SCAN IP
  • 192.168.8.111为备库的SCAN IP

# Primary Node1

PRI_EMREP1 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = EMREP_R_S1)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)

# Primary Node2
PRI_EMREP2 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = EMREP_R_S2)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)

# Standby Node1
STD_EMREP1 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = EMREP_RD_S1)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)

# Standy Node2
STD_EMREP2 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = EMREP_RD_S2)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)

2.4 session监控脚本

#!/bin/bash
#Autor:Wangergui
#Description: Montor service_name
while true;do sqlplus -S / as sysdba <alter session set nls_date_format=YYYY-MM-DD HH24:MI:SS;
set linesize 500 pagesize 100 echo off feedback off trims on newpage none;
set lines 400 pages 1000
col username for a15;
col machine for a25;
col program for a45;
col service_name for a20;
select inst_id,
sid,
username,
machine,
program,
service_name,
status,
logon_time
from gv$session where username=DBAUSER;
quit;
EOF
echo && sleep 1
done



测试场景

场景一:主库节点1宕库

1)测试过程说明

  • session 1运行连接测试service.sh脚本;

  • session 2 运行session监控session.sh 脚本;

  • session 3关闭节点1数据库shutdown immediate;

  • 监控service会不会漂移。

结论:service会漂移到节点2上,数据库启动之后service不会自动回切至节点1,需要手动relocate;客户端无需更改任何配置。
注意:如果使用srvctl stop instance关闭数据库service不会漂移,需要加-f选项。
srvctl stop instance –d  –n  –f -failover
示例:
srvctl stop instance –d  -n  -f -failover
2)场景一测试如下
测试主机:备库两个节点
VIP :10.30.69.18 && 10.30.69.19
SCAN: 192.168.8.111
  • 节点1 session1 运行循环查询脚本,连接串为STD_ORCL1(优先连接备库的节点1)。
    预期效果:正常shutdown,节点1的service可以漂移到节点2上面,营业无需修改配置。
    测试结果:达到预期效果。
#!/bin/bash
#Autor:Wangergui
#Description:test read
i=0
while true;do
sqlplus -S wangergui/oracle@STD_ORCL1 <select * from wangergui.test_read;
exec dbms_lock.sleep(5);
quit
EOF
sleep 1 && i=$(($i+1))
done
  • 节点2 运行session监控脚本如下:
while true;do sqlplus -S / as sysdba <alter session set nls_date_format=YYYY-MM-DD HH24:MI:SS;
set linesize 500 pagesize 100 echo off feedback off trims on newpage none;
set lines 400 pages 1000
col username for a15;
col machine for a25;
col program for a45;
col service_name for a20;
select inst_id,
sid,
username,
machine,
program,
service_name,
status,
logon_time
from gv$session where username=WANGERGUI;
quit;
EOF
echo && sleep 1
done
说明:此时通过STD_ORCL1连接的session全部在节点1上面。
  • 节点1 session 2执行shutdown immediate关闭数据库。

shutdown immedaite;
  • 会话监控如下:

session已经动态的漂移到了节点2上面。
  • 节点1 session 3 执行启动数据库。
    startup;
  • session 监控还是在节点2上面。
节点1启库后service还是在节点2上面,没有漂回节点1,此时需要手动relocate到节点1。
srvctl relocate service -db DGORCL -service ORCL_rd_s1 -oldinst orcl2 -newinst orcl1
  • session 监控已经飘回节点1。

场景二:主库节点1宕机

1)测试场景说明

  • 节点2 session 1运行连接测试service.sh脚本;
  • 节点2 session 2 运行session监控session.sh 脚本;
  • 节点1 session 1关闭节点1主机,执行重启reboot;
  • 监控service会不会漂移。
结论:service会漂移到节点2上,数据库启动之后service不会自动回切至节点1需要手动relocate。
2)节点2  session1运行循环查询脚本
#!/bin/bash
#Autor:Wangergui
#Description:test read
i=0
while true;do
sqlplus -S wangergui/oracle@STD_ORCL1 <select * from wangergui.test_read;
exec dbms_lock.sleep(5);
quit
EOF
sleep 1 && i=$(($i+1))
done
3)节点2  session2 运行session监控脚本
while true;do sqlplus -S / as sysdba <alter session set nls_date_format=YYYY-MM-DD HH24:MI:SS;
set linesize 500 pagesize 100 echo off feedback off trims on newpage none;
set lines 400 pages 1000
col username for a15;
col machine for a25;
col program for a45;
col service_name for a20;
select inst_id,
sid,
username,
machine,
program,
service_name,
status,
logon_time
from gv$session where username=WANGERGUI;
quit;
EOF
echo && sleep 1
done

场景三:备库节点1宕库

  • 同场景一。

场景四:备库节点1宕机

  • 同场景二。

场景五:主备switch over

  • 主备切换之后,主备要启动相应的service,应用无需更改配置。

场景六:主备failover

  • 主备切换之后,主备要启动相应的service,应用无需更改配置。

最佳实践配置

4.1 MAA架构最佳配置

# Primary Node1 优先连接主库节点1

PRI_ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521)) #备库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_R_S1)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)
# Primary Node2 优先连接主库节点2
PRI_ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521)) #备库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_R_S2)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)
# Standby Node1 优先连接备库节点1
STD_ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521)) #备库SCAN IP
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_RD_S1)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)
# Standy Node2 优先连接主库节点2
STD_ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.111)(PORT = 1521)) #备库SCAN IP
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_RD_S2)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)

4.2 RAC最佳配置(无ADG)

# Primary Node1 优先连接主库节点1
PRI_ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_R_S1)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)
# Primary Node2 优先连接主库节点2
PRI_ORCL2 =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = off)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.110)(PORT = 1521)) #主库SCAN IP
)
(CONNECT_DATA =
(service_name = ORCL_R_S2)
(FAILOVER_MODE =
(type = session)
(method = basic)
(retries = 10)
(delay = 5)
)
)
)


本文作者:王尔贵(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129308.html

相关文章

  • 全球企业走向多元化的最佳实践

    摘要:不幸的是,他不断变化要求严格充满活力的环境不适合许多组织仍然依赖的年历史的广域网。企业在上市时间上的变化很短,这对于推动广域网转型计划的来说是一个很大的禁忌。全球企业转向多云环境的最佳实践:sd-wan如何帮助tweet您拥有多云环境-现在怎么办?无论他们是否开始使用多个云,今天的大型企业最终都会使用多个云供应商。事实上,很难找到一家不使用Microsoft Azure、Amazon AWS...

    番茄西红柿 评论0 收藏0
  • Spring Boot 最流行的 16 条实践解读!

    摘要:来源是最流行的用于开发微服务的框架。以下依次列出了最佳实践,排名不分先后。这非常有助于避免可怕的地狱。推荐使用构造函数注入这一条实践来自的项目负责人。保持业务逻辑免受代码侵入的一种方法是使用构造函数注入。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/R3InYSAIZkHQ40ly9Oztiart2lESCyjCH0JwFRp3oErlYobhibM...

    Ethan815 评论0 收藏0
  • 高性能Java代码的最佳实践

    摘要:高性能代码的最佳实践前言在这篇文章中,我们将讨论几个有助于提升应用程序性能的方法。要获得有关应用程序需求的最好最可靠的方法是对应用程序执行实际的负载测试,并在运行时跟踪性能指标。 showImg(https://segmentfault.com/img/bVbtgk4?w=256&h=254); 高性能Java代码的最佳实践前言 在这篇文章中,我们将讨论几个有助于提升Java应用程序性...

    stackfing 评论0 收藏0
  • 甲骨文通过创新技术扩展开放集成的云平台

    摘要:年月日甲骨文今日发布了最新的集成产品,以帮助企业更便利地运用变革性技术。甲骨文提供下一代用户体验,包括基于个人角色使用所有功能,同时通过预先制作的集成模板加速产品上市时间,为企业创造更多的价值。2017年10月11日 –甲骨文今日发布了最新的集成PaaS产品,以帮助企业更便利地运用变革性技术。除了最新的自治数据管理云服务、大数据分析和人工智能功能之外,甲骨文宣布在其应用程序开发平台、数据集成...

    lordharrd 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<