DataStore 是指TimesTen中的表、索引等放在内存段中的一个集合,类似与Oracle中库的概念。一个TimesTen Data Manager可以管理多个DataStore。DataStore由放在相应ODBC配置文件中的一个DSN(Data Source Name)所定义,该DSN由一个名字和相关的属性组成,如下:
[dsa]
Driver=/home/tt1/TimesTen/tt70/lib/libtten.so
DataStore=/home/tt1/TimesTen/tt70/info/dsa
DatabaseCharacterSet=ZHS16GBK
PermSize=50
TempSize=10
上面是名为test的 DataStore的定义,ODBC配置文件分为两种:系统级ODBC文件(可通过环境变量SYSODBCINI另行设置)和用户级ODBC配置文件(可通过环境变量ODBCINI另行设置)。系统级的ODBC可以被任何用户所引用,而用户级的只能被该用户所引用。系统级的ODBC文件在Windows平台下可以通过控制面板 à ODBC数据源管理 à 系统DSN 定义;而UNIX平台下,则一般是通过定义文件 $INSTALL_DIR/sys.odbc.ini完成。
当用户连接一个DataStore的时候,TimesTen会按照下面的顺序查找配置文件:
1. 环境变量ODBCINI所指向的 .odbc.ini文件
2. 运行TimesTen的用户主目录下的 .odbc.ini 文件
3. 环境变量SYSODBCINI所指向的 sys.odbc.ini文件
4. /var/TimesTen/sys.odbc.ini
5. $INSTALL_DIR /info/sys.odbc.ini(非root用户才会执行该步)
一般情况下,建议使用非root用户安装,原因是便于管理而且对系统的安全没有影响。此时,ODBC配置文件缺省位于 $INSTALL_DIR /info/sys.odbc.ini ,$INSTALL_DIR为TimesTen的安装目录。
在上面的 test 定义里面,有两个重要的属性:
Driver=/home/tt1/TimesTen/tt70/lib/libtten.so
DataStore=/home/tt1/TimesTen/tt70/info/dsa
Driver比较好理解,是指操作该数据源所需要的驱动。而DataStore指的是放置Checkpoint文件的磁盘地址。TimesTen虽然运行的时候将所有的数据都预先装载在内存中,但不是说它就不需要任何磁盘文件,它也有自己的数据文件、日志文件等。这个数据文件叫checkpoint 文件,是TimesTen内存中数据在磁盘上的一个镜像,相当于Oracle数据库中的数据文件DBF。TimesTen会在一定条件下自动做Check point ,此时,它会将内存中的脏数据和磁盘上的数据文件做增量同步。当首次登陆到该DSN,或者TimesTen异常中止/失败时,TimesTen需要这些读取这些文件做恢复。
下面是DataStore dsa 在磁盘上的相应文件:
[tt1@west-mountain info]$ pwd
[tt1@west-mountain info]$ ls -al|grep dsa
-rw-rw-rw- 1 tt1 tta 11446924 Jun 17 21:28 dsa.ds0
-rw-rw-rw- 1 tt1 tta 11446924 Jun 17 21:22 dsa.ds1
-rw-rw-rw- 1 tt1 tta 557056 Jun 17 21:28 dsa.log0
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res0
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res1
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res2
针对dsa这个DataStore,磁盘上对应由两个checkpoint 文件,dsa.ds0,dsa.ds1;一个日志文件,dsa.log0;以及三个保留文件(reservation) dsa.res0,dsa.res1,dsa.res2。在ODBC的配置文件中,我们只是定义了dsa的 DataStore属性:
DataStore=/home/tt1/TimesTen/tt70/info/dsa
这个属性看起来只是定义了一个目录路径,TimesTen是如何根据该属性创建一系列文件且命名的呢?针对Checkpoint文件,TimesTen会以DataStore属性的最后一节为文件名,创建相应的Checkpoint文件。所以我们看到了在目录 /home/tt7/TimesTen/tt70/info 下有两个分别命名为dsa.ds0 ,dsa.ds1 的文件。TimesTen每次做Checkpoint的时候,会轮换着写这两个文件,每次都写较旧的那个。所以在某些时间段内,这两个文件不是完全一致的。每次做Checkpoint的时候,TimesTen先在这两个文件之间做一个同步,然后把最新的更新,写到旧的Checkpoint文件中。为什么不同时写入两个文件呢?原因是如果同时往两个文件写入,而写入过程发生异常,会导致两个文件同时被损坏,带来灾难性的后果。
那么TimesTen如何创建日志文件(dsa.log0)和保留文件(dsa.res0~3)呢?可以在ODBC配置文件里面,通过属性 LogDir 来定义日志文件。因为日志文件会和保留文件始终位于同一个目录下,所以LogDir也间接地定义了保留文件。当没有显式设置LogDir时,日志文件将和Checkpoint文件位于同一目录下,且以DataStore属性中定义的目录的最后一节为文件名,且后缀中按数字序列递增命名,例如dsa.log0,dsa.log1,dsa.log2。。。等。当具体定义了LogDir后,日志文件将位于该目录下,且以该属性值所指向的目录的最后一节为文件名,例如:
LogDir=/home/tt1/TimesTen/tt70/testcache
此时,TimesTen将在目录 /home/tt1/TimesTen/tt70/testcache 下创建名为testcache的日志和保留文件。
[tt1@west-mountain testcache]$ pwd
/home/tt1/TimesTen/tt70/testcache
[tt1@west-mountain testcache]$ ls -al
total 25016
drwxr-xr-x 2 tt1 tta 4096 Dec 28 10:50 .
drwxr-xr-x 13 tt1 tta 4096 Dec 28 10:53 ..
-rw-rw-rw- 1 tt1 tta 376832 Dec 28 14:12 testcache.log0
-rw-rw-rw- 1 tt1 tta 67108864 Dec 28 10:50 testcache.res0
-rw-rw-rw- 1 tt1 tta 67108864 Dec 28 10:50 testcache.res1
-rw-rw-rw- 1 tt1 tta 67108864 Dec 28 10:50 testcache.res2
强烈建议将日志文件和Checkpoint文件分开放在不同磁盘上,且处于不同的磁盘控制器下,以尽量减少磁盘IO的影响。可能的话,正式的生产系统中,这两个目录一般都配置在已经条带化之后的磁盘阵列上不同的逻辑盘中。
下面讲讲保留文件(dsa.res0,dsa.res1,dsa.ds2)
[tt1@west-mountain info]$ ls -al|grep dsa
-rw-rw-rw- 1 tt1 tta 11446924 Jun 17 21:28 dsa.ds0
-rw-rw-rw- 1 tt1 tta 11446924 Jun 17 21:22 dsa.ds1
-rw-rw-rw- 1 tt1 tta 557056 Jun 17 21:28 dsa.log0
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res0
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res1
-rw-rw-rw- 1 tt1 tta 67108864 Jun 17 21:12 dsa.res2
保留文件始终和日志文件位于同一目录下,它的大小由属性LogFileSize定义。缺省的LogFileSize是64M,所以缺省的保留文件就是67108864字节。
当由于某些原因导致文件系统没有空余的磁盘空间时,如果没有保留文件,TimesTen将无法运行下去,因为事务的提交不可避免地导致日志文件的增长,但此时已没有任何可用于增长的磁盘空间,从而导致TimesTen处于静止(Quiescent)状态,在此状态下,只允许读操作而不允许写操作。保留文件是作为溢出缓冲空间使用的,它们被预先创建,当磁盘空间都被用光时,TimesTen会利用这些保留文件作为一个缓冲,从而完成最终的一些事务,避免TimesTen进入静止状态。而创建三个保留文件的原因是因为在绝大多数情况下,三个保留文件被证明是最优的选择。当然,不管如何,磁盘空间被用光的情况都应该尽量地避免。
文章 (RSS)