HA & LB

来源:互联网 发布:网络类的基础知识 编辑:程序博客网 时间:2024/04/27 14:18

1.高可用性(HA)
可用性=MTTF/(MTTF+MTTR)
MTTF:平均故障间隔时间
MTTR:平均修复时间

2.Failover(故障转移)
-Client-Side Connect Time Failover:这种Failover方式只在发起连接时才去感知节点故障
-TAF(Transparent Application Failover):连接建立后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到

其他健康实例上。
-体验Clinet-Side Failover和TAF
第一步:启动集群中每个服务器的数据连接监听
第二步:编辑客户端tnsnames.ora,使用Clinet-Side Connect time Failover的TNS配置
DEVDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    )
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
 (SERVER = DEDICATED)
      (SERVICE_NAME = DEVDB)
 )
    )
  )
使用TAF配置TNS
DEVDB_TAF =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    )
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
 (SERVER = DEDICATED)
      (SERVICE_NAME = DEVDB)
 (FAILOVER_MODE =(TYPE=session)(METHOD = basic)(METRIES = 100)(DELAY = 5))
    )
  )

第三步:在窗口一使用Client-Side Failover TNS连接数据库
窗口一>sqlplus test/password@devdb

在窗口二使用TAF TNS配置连接数据
窗口二>sqlplus test2/password@devdb_taf

第四步:连接成功后,在两个窗口中查看用户连接到的实例
窗口一>
SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
devdb1

查看用户连接TAF配置
SQL> select username,failover_type,failover_method from v$session where username
 in ('TEST');

USERNAME
------------------------------------------------------------
FAILOVER_TYPE              FAILOVER_METHOD
-------------------------- --------------------
TEST
NONE                       NONE

窗口二>
SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
devdb1

查看用户连接TAF配置

SQL> select username,failover_type,failover_method from v$session where username
 in ('TEST2');

USERNAME
------------------------------------------------------------
FAILOVER_TYPE              FAILOVER_METHOD
-------------------------- --------------------
TEST2
SESSION                    BASIC

第五步:查看服务端杀掉两个连接对应的Server Process

SQL> select pid,spid from v$process where addr in (select paddr from v$session w
here username in ('TEST','TEST2'));

       PID SPID
---------- ------------------------
        34 27256
        37 27756

使用ps -ef命令查看进程
oracle   27256     1  0 21:43 ?        00:00:00 oracledevdb1 (LOCAL=NO)
oracle   27756     1  0 21:43 ?        00:00:00 oracledevdb1 (LOCAL=NO)

使用kill命令查看进程
rac1-> kill -9 27256
rac1-> kill -9 27756

第六步:在两个窗口,执行SQL语句,两个连接都抛出相同的错误
窗口一显示>
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束

窗口二显示>
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束

第七步:稍等几秒后,再次执行语句,两个窗口的结果不同
窗口一>
SQL> select instance_name from v$instance;
ERROR:
ORA-03114: 未连接到 ORALCE
窗口二>
SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
devdb1

使用TAF的窗口,用户查询正常执行,说明用户连接已经被Failover,因为模拟过程不是重启动实例或节点,而只是杀掉Server Process,所以用户

并没有迁移到新的实例,仍是连接到原实例。

-HA的第三种方式:Server-Side TAF
从配置参数角度看,Server-Side TAF和TAF相比多一个Instance Role的概念,所谓实例角色,就是当有多个Instance参与一个Service时,可能配

置优先使用哪一个Instance为用户提供服务,用户共有两种选角色:
--PREFERRED:道选实例
--AVAILABLE:后备实例
-使用srvctl命令配置Service
第一:创建service
rac1-> srvctl add service -d devdb -s testservice -r "devdb1" -a "devdb2" -P "BASIC"
第二:查看配置
rac1-> srvctl config service -d devdb -s testservice -a
testservice PREF: devdb1 AVAIL: devdb2 TAF: BASIC
第三:是否自动运行service
srvctl enable/disable service -d devdb -s testservice -i devdb1
第四:启动service
rac1-> srvctl start service -d devdb -s testservice -i devdb1
第五:停止service
rac1-> srvctl stop service -d devdb -s testservice -i devdb1 -c -q -f
-f选项可以强制关闭service
第六:查看service状态
rac1-> srvctl status service -d devdb -s testservice -f -v
Service testservice is running on instance(s) devdb1
第七:删除service
rac1-> srvctl remove service -d devdb -s testservice -i devdb1 -f

-创建一个名为OLTP的service
第一步:查看系统现有的service
SQL> show parameter service

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
service_names        string  devdb, wxxrdb

第二步:使用srvctl命令创建OLTP服务
rac1-> srvctl add service -d devdb -s test -r devdb1 -a devdb2 -P basic
第三步:确认服务创建成功
rac1-> crs_stat -t -v
第四步:配置这个服务自动启动
rac1-> srvctl enable service -d devdb -s oltp
PRKP-1018 : Service oltp already enabled.
第五步:启动这个服务
rac1-> srvctl start service -d devdb -s oltp
第六步:使用dbms_service.modify_service包,修改Service的TAF配置
SQL> begin 
  2  dbms_service.modify_service(
  3  service_name=>'oltp',
  4  failover_method=>dbms_service.failover_method_basic,
  5  failover_type=>dbms_service.failover_type_select,
  6  failover_retries=>180,
  7  failover_delay=>5);
  8  end;
  9  /

PL/SQL procedure successfully completed.
第七步:确认修改已经生效
select name,failover_method,failover_type,goal,clb_goal from dba_services

1 SYS$BACKGROUND   NONE SHORT
2 SYS$USERS   NONE SHORT
3 devdbXDB    LONG
4 devdb    LONG
5 CRM    LONG
6 wxxrdb    LONG
7 testservice    LONG
8 oltp BASIC SELECT  LONG
第八步:使用srvctl命令查看配置
rac1-> srvctl config service -d devdb -s oltp -a
oltp PREF: devdb1 AVAIL: devdb2 TAF: basic

第九步:测试Service-Sides TAF,使用Easy Connect Naming Methods方式直接连接
C:/Documents and Settings/guhui>sqlplus test/password@rac1-vip/oltp

第十步:执行查询,确认连接至哪一个实例

SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
devdb1

第十一步:在实例1上,杀掉这个会话对应的Server Process
SQL> select pid,spid from v$process where addr in (select paddr from v$session w
here username='TEST');

       PID SPID
---------- ------------------------
        33 14337
rac1-> kill -9 14337 //杀掉这个进程

第十二步:在会话中执行语句
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束

SQL> select instance_name from v$instance
  2  ;

INSTANCE_NAME
--------------------------------
devdb1

第十三步:测试完毕,清理环境,删除Service
srvctl stop service -d devdb -s oltp 先停止服务
srvctl disable service -d devdb -s oltp
删除服务
rac1-> srvctl remove service -d devdb -s oltp
oltp PREF: devdb1 AVAIL: devdb2
Service oltp is disabled.
Remove service oltp from the database devdb? (y/[n]) y
OCR中的内容被删除了,但是数据字典里还有该Service的内容,继续清除数据字典里的内容
select name,failover_method,failover_type,goal,clb_goal from dba_services where name ='oltp'
删除数据字典内容
SQL> begin
  2  dbms_service.DELETE_SERVICE(service_name=>'oltp');
  3  end;
  4  /

PL/SQL 过程已成功完成。

再次确认数据字典
select name,failover_method,failover_type,goal,clb_goal from dba_services where name ='oltp'//未查询到数据,说明已经被删除