- 最后登录
- 2017-5-4
- 在线时间
- 81 小时
- 威望
- 999
- 金钱
- 2391
- 注册时间
- 2013-9-11
- 阅读权限
- 150
- 帖子
- 1124
- 精华
- 5
- 积分
- 999
- UID
- 1220
|
1#
发表于 2013-11-17 16:48:48
|
查看: 2960 |
回复: 0
TimesTen的Active-standby配置中如何安全重启Active节点主机
TimesTen的Active-Standby pair是TimesTen中的HA配置,但是和Oracle的Physical/Logical Standby又有区别。其同步方法和Logical Standby类似,是应用Active主机的transaction log.
但是Standby主机是只读的。
重启Standby主机没有问题,日志会堆积在Active端,等standby重启后会自动接续。
但是很多客户发现重启Active主机,经常会导致Active-Standby pair丢失。即使用户先将Standby转换成Active,再重启原来的Active主机(转换后的standby)也不行。
这将总是需要重建原来的Active主机(转换后的standby)上的数据库,在数据量巨大时,这个过程将非常缓慢。
经过反复实验和考证,我们现在可以确认问题出在哪里:
1)Active主机在重启前,并未将所有的transaction都同步到Standby,如果一旦Active和Standby角色互换,会造成Standby上存在Active上并不存在的transaction,产生TT16227错误:
TT16227: Standby store has replicated transactions not present on the active. Local CTN=1377070661.7568, Backup CTN=1376558513.698865, Received CTN=1377070661.7564.
2)用户只是用了./ttdaemonadmin -stopserver -force来尝试中止所有应用连接。
需要指出的是TimesTen有两种连接,一种是C/S,一种是直连。
C/S是指应用程序和TimesTen不在同一台主机上的连接方式。对于同一台主机上的程序,可以使用直连。
而./ttdaemonadmin -stopserver只会停止C/S连接。
同一台主机上,仍可以通过ttisql登录数据库。
3)如果停止所有应用,并确认Active-standby两侧的transaction同步后,可以做任意重启操作。如果要使用force或者杀进程停止transaction的话,一定要确认回滚完毕并且两侧确认同步后,再重启。可以用dsmap工具来实现确认动作。
下面给出了详细的重启Active主机的确认步骤:
1)停止Server来中断已有的并阻止未来的client/Server连接.
./ttdaemonadmin -stopserver -force
2)杀用户进程,主要是杀Direct link连接:
Command> host ttXactAdmin -connections
2013-08-26 14:32:44.696
/home/oracle/TimesTen/tt1121/info/HHCBEDATA
TimesTen Release 11.2.1.9.8
ID PID Context Name Program State TransID UID
1 32654 0x082723b8 hhcbedata ttIsqlCmd Run 1.88 TTADMIN <==========ttIsqlCmd连接需要kill
2 32663 0x0a1ff1b0 REPHOLD timestenrepd Run SYS
3 32663 0x0a24fda0 FAILOVER timestenrepd Run SYS
4 32663 0x92c00468 REPLISTENER timestenrepd Run SYS
5 32663 0x0a2a0990 XLA_PARENT timestenrepd Run SYS
6 32663 0x0a17ca18 LOGFORCE timestenrepd Run SYS
7 32663 0x0a3117e8 TRANSMITTER timestenrepd Run SYS
8 32663 0x0a3623d8 RECEIVER timestenrepd Run SYS
9 437 0x09cfaba0 hhcbedata ttIsqlCmd Run ORACLE <=========这是你的当前连接
2032 32564 0x0830e340 Manager timestensubd Run SYS
2033 32564 0x08360e98 Rollback timestensubd Run SYS
2034 32564 0x0842f538 Flusher timestensubd Run SYS
2035 32564 0x084a05a0 Monitor timestensubd Run SYS
2036 32564 0x084f13a0 Deadlock Detector timestensubd Run SYS
2037 32564 0x085421a0 Checkpoint timestensubd Run SYS
2038 32564 0x08592fa0 Aging timestensubd Run SYS
2039 32564 0x085e3da0 Log Marker timestensubd Run SYS
2040 32564 0x08634ba0 AsyncMV timestensubd Run SYS
2041 32564 0x086859a0 HistGC timestensubd Run SYS
3)等待并确认Active-standby两侧的transaction同步:
Command> call ttRepSubscriberWait(null, null, null, null, -1);
TIMEOUT: 00
Command> vertical 1;
Command> select * from ttrep.reppeers;
COMMIT_TIMESTAMP: 1377498342
COMMIT_SEQNUM: 352 <==============352
-bash-3.2$ cd ../support
-bash-3.2$ ./dsmap -shmid 4161544 -hdr| grep -i ctn <===========4161544 是通过ttstatus命令获得的shared memory ID
latch = 9 (SbCTNWrapLatch)
latch = 10 (SbRepCTNLatch)
replBackupCTN = <0.0>
locCTN = <1377498342.352>
appliedCTN = <1377498342.352> <==============352
lastLocalAwtCTN = <0.0>
lastGlobalAwtCTN = <0.0>
<======需要等到COMMIT_TIMESTAMP.COMMIT_SEQNUM=dsmap命令结果中的locCTN,并且等于appliedCTN
4)在standby上执行角色转换,(如果应用不需要在这段时间内切换到Standby上,也可以不执行):
call ttrepstateset('ACTIVE');
call ttrepstateget;
5)在以前的Active上执行以下命令然后:
./ttAdmin -repStop HHCBEDATA
./ttadmin -ramunload "dsn=HHCBEDATA"
./ttDaemonAdmin -stop
<====现在可以安全重启Active主机了
|
|