1. 创建全局的AWT Cache Group
Cahe Grid是11g中一个中的一个亮点,故名思义,它是在Cache Connect这一层架构了一个集群,即底层是同一个Oracle数据库(而且必须有),在此之上是一个TimesTen组成的Cache集群,每个TimesTen缓存部分的Oracle数据,但数据也可以在TimesTen之间流动,同时最终的数据都可以同步到底层的Oracle数据库。所以理想的状况下,每个TimesTen的数据对本地应用来说是完整的,不需要和其它节点或者Oracle交互,但不是很频繁的数据流动也是支持,但个人觉得最好这种操作不要太多,否则肯定影响性能。另外,每行记录在整个Cache Grid最多有且仅有一份,如果数据从A节点流动到B节点,则A节点上的该行数据就没了,只在B节点上有。为什么说最多有且仅有一份呢,因为可能这行记录在所有的TimesTen上都没有,只存在于Oracle上,那么第一次访问的时候,会自动从Oracle加载到相应的TimesTen节点上。
//下面的实验接着Cache Group的实验来进行,下面这一步还是在原来的机子上操作的,即RAC1上。用全局的AWT来组成一个Cache Grid,即在多个节点上都有Cache Group,它们逻辑上是同一个数据库,可以保证数据和事务的一致性。
//创建的时候必须把replication agent停掉
ttisql "dsn=tt_workshop;uid=cacheuser;pwd=timesten;oraclepwd=oracle"
Command> call ttrepstop;
Command> create dynamic asynchronous writethrough global cache group g_awt from
oratt.dept(
deptno number(2) primary key,
dname varchar2(14) ,
loc varchar2(13)
),
oratt.emp(
empno number(4) primary key,
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
foreign key (deptno) references oratt.dept(deptno));
Command> call ttrepstart;
//在操作Global AWT之前必须和一个Cache Grid关联,参数具体说明可以参考reference一书,第一个参数1的位置只有在这个节点上存在着active-standby pair的模式,且是standby节点加入到Cache Grid的时候才是2,其它情况下都是1。端口5001则是任意空闲的相互之间可以通讯的任何端口都可以。
Command> call ttGridAttach(1,’tt_workshop’,'rac1′,5001);
Command> exit;
//通过oratt用户的查询去动态加载所需的数据
ttisql "dsn=tt_workshop;uid=oratt;pwd=timesten;oraclepwd=oracle"
Command> select * from oratt.emp;
0 rows found.
Command> select * from oratt.dept;
0 rows found.
< 7900, james, clerk, 7698, 1981-12-03 00:00:00, 950, <NULL>, 30 >
1 row found.
//7900对应的deptno为30,所有deptno=30的记录都被加载
Command> select * from oratt.emp;
< 7499, allen, salesman, 7698, 1981-02-20 00:00:00, 1600, 300, 30 >
< 7521, ward, salesman, 7698, 1981-02-22 00:00:00, 1250, 500, 30 >
< 7654, martin, salesman, 7698, 1981-09-28 00:00:00, 1250, 1400, 30 >
< 7698, blake, manager, 7839, 1981-05-01 00:00:00, 2850, <NULL>, 30 >
< 7844, turner, salesman, 7698, 1981-09-08 00:00:00, 1500, 0, 30 >
< 7900, james, clerk, 7698, 1981-12-03 00:00:00, 950, <NULL>, 30 >
6 rows found.
Command>
2. Global AWT的动态扩展
按照Cache Grid的架构,当业务增长的时候,需要再配置一台服务器分担业务压力,这时候就涉及到Cache Grid的动态扩展了,即在原来节点上运行的系统不停止的情况下,动态地把一个新的节点加入到已有的集群中去。我们上面实验的机子hostname为RAC1,上面装了TimesTen和Oracle。下面我们在新的机子RAC2上再部署一个TimesTen,并且配置好之后加入到原来的mygrid集群中去。下面所有的操作都是在RAC2上进行的。
a) 安装TimesTen
在RAC2安装TimesTen之前,是否需要安装Oracle数据库软件或者Oracle数据库软件的客户端呢?答案是不需要的,但后面TimesTen又确实需要和RAC1上的Oracle同步,那它怎么去访问的呢?在TimesTen 11g的版本中,安装介质里面含有一个Oracle instant client,即简化的客户端软件。在上面创建AWT 以及ReadOnly的例子中,我们配置的tnsnames.ora是在$ORACLE_HOME/network/admin目录下,但RAC2压根就没有$ORACLE_HOME这一说,怎么办呢?可以通过设置TNS_ADMIN来指定tnsnames.ora在哪儿,这个设置可以在安装TimesTen的过程中,通过
Please enter a value for TNS_ADMIN (s=skip)? [ ]
/home/timesten/TimesTen/tt1121/network/admin
虽然这个路径安装到这一步提示的时候还没有,但如果你知道TimesTen的路径结构,可以先设置。当然不确定的话,可以先skip掉,安装后之后通过ttmodinstall来修改。
b) 配置DSN
在RAC2上配置好DSN
[tt_workshop]
Driver=/home/timesten/TimesTen/tt1121/lib/libtten.so
DataStore=/home/timesten/datastore/tt_workshop
DatabaseCharacterSet=ZHS16GBK
PermSize=100
TempSize=32
CkptFrequency=120
CkptLogVolume=0
PLSQL=1
OracleNetServiceName=devdb1
c) 设置好环境变量
在.bash_profile 中,加入如下行,我还是设置了一个环境变量叫ORACLE_HOME,虽然它跟传统意义上的ORACLE_HOME目录下的东西很不一样,但因为sqlplus工具在这个目录下,所以就这样设置了。
export ORACLE_SID=devdb1
export ORACLE_HOME=/home/timesten/TimesTen/tt1121/ttoracle_home/instantclient_11_1
export TT_HOME=/home/timesten/TimesTen/tt1121
export LD_LIBRARY_PATH=$ORACLE_HOME:$TT_HOME/lib
export TNS_ADMIN=/home/timesten/TimesTen/tt1121/network/admin
PATH=$ORACLE_HOME:$TT_HOME/bin:$PATH:$HOME/bin
d) 创建TimesTen用户
//创建和前面实验中同样的用户
[timesten@rac2 oraclescripts]$ ttisql tt_workshop
Command> create user cacheuser identified by timesten;
Command> grant create session,cache_manager,create any table to cacheuser;
Command> create user oratt identified by timesten;
Command> grant create session to oratt;
Command> exit
e) 创建同一个结群下的另一个Global AWT
//用cacheuser用户登录创建global AWT
[timesten@rac2]$ttisql "dsn=tt_workshop;uid=cacheuser;pwd=timesten;oraclepwd=oracle"
//设置Cache Group管理用户信息并创建Cache Grid
Command> call ttcacheuidpwdset(’cacheuser’,'oracle’);
//不需要再次call ttgridcreate(’mygrid’);
Command> call ttgridnameset(’mygrid’);
Command> call ttCacheStart;
Command> create dynamic asynchronous writethrough global cache group g_awt from
oratt.dept(
deptno number(2) primary key,
dname varchar2(14) ,
loc varchar2(13)
),
oratt.emp(
empno number(4) primary key,
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2),
foreign key (deptno) references oratt.dept(deptno));
Command> call ttrepstart;
Command> call ttGridAttach(1,’tt_workshop’,'rac2′,5001);
Command> exit;
//通过oratt用户去操作数据
ttisql "dsn=tt_workshop;uid=oratt;pwd=timesten;oraclepwd=oracle"
Command> select * from oratt.emp where empno=7900;
< 7900, james, clerk, 7698, 1981-12-03 00:00:00, 950, <NULL>, 30 >
1 row found.
Command> select * from oratt.emp ;
< 7499, allen, salesman, 7698, 1981-02-20 00:00:00, 1600, 300, 30 >
< 7521, ward, salesman, 7698, 1981-02-22 00:00:00, 1250, 500, 30 >
< 7654, martin, salesman, 7698, 1981-09-28 00:00:00, 1250, 1400, 30 >
< 7698, blake, manager, 7839, 1981-05-01 00:00:00, 2850, <NULL>, 30 >
< 7844, turner, salesman, 7698, 1981-09-08 00:00:00, 1500, 0, 30 >
< 7900, james, clerk, 7698, 1981-12-03 00:00:00, 950, <NULL>, 30 >
6 rows found.
Command>
此时再通过select * from oratt.emp ;去检查rac1节点上的数据,发现没了。即两个节点已经组成了一个Cache Grid,且第二个节点是动态加入进去的,在第二个节点加入的过程中,第一个节点的业务不受影响。回过头去看看,在RAC1节点上既有本地的Cache Group,也有组成Cache Grid的全局Cache Group,如果是本地的则数据不能流动,只是属于本地。所以可以根据具体的需求去创建不同的Cache Group,它们之间可以共存。
文章 (RSS)