2011年8月24日水曜日

[高可用] Failover

-- 注意
-- 不要在 Listener 中设置 GLOBAL_DB_NAME,这个功能会禁用 Client Side Connect Time Failover 和 TAF

-- Oracle 10g RAC Failover 3 种

-- Client Side Connect Time Failover
-- 连接时判断节点是否可用
-- 客户端 tnsname 文件中启用 FAILOVER=ON,默认是 ON
RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = racdb)
    )
  )

-- Transparent Application Failover
-- 用户连接到某实例之后,如果实例发生故障,则用户被透明的迁移到健康实例,但为提交事务会回滚
RACDB =
  (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 = racdb)
      (FAILOVER_MODE =
        (TYPE = SESSION) -- session 重新执行查询 -- select 返回剩余记录,抛弃已经返回的结果集
        (METHOD = BASIC) -- basic 感知节点故障时才创建连接 -- preconnect 最初建立时就建立连接
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

-- Service Side TAF
-- TAF 配置在服务器端数据库字典里
-- 必须配置 Service

-- Instance Role -- 当有多个 Instance 参与 Service 时,可以配置优先使用哪个 Instance 提供服务
-- preferred -- 首选
-- available -- 后备

-- 手动创建 Service

-- 查看当前 Service
sys@RACDB> show parameter service
NAME                                 TYPE            VALUE
------------------------------------ --------------- ------------------------------
service_names                        string          racdb

-- 创建 Service
srvctl add service -d dbname -s service1 -r inst1 -a inst2 -P basic

-- 确认创建成功,此时是 offline 状态
crs_stat -t -v

-- 配置服务自启动
[oracle@rac1 ~]$ srvctl enable service -d racdb -s service1

-- 启动 Service
srvctl start service -d dbname -s service1

-- 确认状态
crs_stat -t -v

-- Service 被添加
show parameter service

-- 修改 TAF 配置
begin
dbms_service.modify_service (
service_name => 'service1',
failover_method => dbms_service.failover_method_basic,
failover_type => dbms_service.failover_type_select,
failover_retries => 180,
failover_delay => 5);
end;
/

-- 确认修改生效
select name, failover_method, failover_type, goal, clb_goal from dba_services where name = 'service1';
NAME     FAILOVER_METHOD  FAILOVER_TYPE  GOAL     CLB_G
-------  ---------------- -------------- -------- -------

service1 BASIC            SELECT         LONG

1 row selected.

-- 查看配置
srvctl config service -d dbname -s service1 -a

-- 客户端 tnsname 指定
XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = service1)
    )
  )

0 件のコメント:

コメントを投稿