TimesTen 应用层数据库缓存学习:17. 全局数据缓存(cache grid)的高可用性

本文主要是介绍TimesTen 应用层数据库缓存学习:17. 全局数据缓存(cache grid)的高可用性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

本文有两个目的:
1. 介绍TimesTen Global Cache Grid的高可用性
2. 给出了一个简单的建立和清理Global Cache Grid的过程,前面已经有一篇文章: TimesTen 应用层数据库缓存学习:13. 全局数据缓存(cache grid),但那个Cache Group太复杂

建立一个简单的Global Cache Grid

首先建立两个TimesTen instance,一个为tt1122, 一个为ttnew。
之所以建立两个实例,是为了停instance方便。现在还没有找到一个方法来停DB。

详细的过程如下:
在tt1122实例上,建立cachedb1的DSN

[cachedb1]
Driver=/home/oracle/TimesTen/tt1122/lib/libtten.so
DataStore=/home/oracle/TimesTen/tt1122/info/DemoDataStore/cachedb1
PermSize=32
TempSize=64
LogFileSize=32
LogBufMB=32
DatabaseCharacterSet=AL32UTF8
OracleNetServiceName=ttorcl

在ttnew实例上,建立cachedb2的DSN

[cachedb2]
Driver=/home/oracle/TimesTen/tt1122/lib/libtten.so
DataStore=/home/oracle/TimesTen/tt1122/info/DemoDataStore/cachedb2
PermSize=32
TempSize=64
LogFileSize=32
LogBufMB=32
DatabaseCharacterSet=AL32UTF8
OracleNetServiceName=ttorcl

建立cachedb1中的schema用户


$ ttisql -v1 cachedb1
Command> set prompt 'cachedb1> '
cachedb1> create user tthr identified by tthr;
User created.
cachedb1> grant admin to tthr;

在cachedb1和cachedb2中设置cacheadm的用户名和口令

$ ttadmin -connstr "dsn=cachedb1;uid=tthr;pwd=tthr;oraclepwd=tthr" -cacheUidPwdSet -cacheUid cacheadm -cachePwd oracle

cachedb1上创建cache grid

$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=tthr;oraclepwd=oracle" 
cachedb1> call ttGridCreate ('samplegrid');
cachedb1> call ttGridInfo;
< SAMPLEGRID, CACHEADM, Linux x86-64, 64-bit, 11, 2, 2 >
cachedb1> call ttGridNameSet ('samplegrid');

启动cachedb1上的cache agent

ttadmin -cacheStart cachedb1

创建Oracle中的Schema:

$ sqlplus tthr/oracle@ttorcl
create table a(id int, name varchar(32), primary key(id));SQL> grant select, insert, delete, update on a to cacheadm;SQL> insert into a values(1, 'beijing');
SQL> insert into a values(2, 'shanghai');
SQL> insert into a values(3, 'guangzhou');

cachedb1上创建Global Dynamic Asynchronous Writethrough Cache Group

CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH GLOBAL CACHE GROUP "G_AWT" FROM"TTHR"."A" ("ID"   NUMBER(38)        NOT NULL,"NAME" VARCHAR2(32 BYTE),PRIMARY KEY("ID"))

cachedb1上启动replication agent:

ttadmin -repStart cachedb1

将cachedb1 attach到cache grid

$ ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=tthr" 
cachedb1> call ttGridNodeStatus;
cachedb1> call ttGridAttach (1,'cachedb1','localhost',9991);
cachedb1> call ttGridNodeStatus;
< SAMPLEGRID, 1, 1, T, localhost, SAMPLEGRID_cachedb1_1, 127.0.0.1, 9991, <NULL>, <NULL>, <NULL>, <NULL>, <NULL> >

确认cachedb1可以访问数据

$  ttisql -v1 -e "set prompt 'cachedb1> '" "dsn=cachedb1;uid=tthr;pwd=tthr;oraclepwd=oracle"
cachedb1> select * from a;
cachedb1> select * from a where id = 1;
< 1, beijing >

建立cachedb2中的schema用户

$ ttisql -v1 -e "set prompt 'cachedb2> '" cachedb2
cachedb2> create user tthr identified by tthr;
User created.
cachedb2> grant admin to tthr;

cachedb2上设置cache admin账户信息,等等…

ttadmin -connstr "dsn=cachedb2;uid=tthr;pwd=tthr;oraclepwd=tthr" -cacheUidPwdSet -cacheUid cacheadm -cachePwd oracle[oracle@timesten-hol ~]$ ttisql -v1 -e "set prompt 'cachedb2> '" "dsn=cachedb2;uid=tthr;pwd=tthr;oraclepwd=oracle"
cachedb2> call ttGridInfo;
< SAMPLEGRID, CACHEADM, Linux x86-64, 64-bit, 11, 2, 2 >
cachedb2> call ttGridNameSet ('samplegrid');
cachedb2> call ttCacheStart();
cachedb2> CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH GLOBAL CACHE GROUP "G_AWT" >  FROM>   "TTHR"."A" (>     "ID"   NUMBER(38)        NOT NULL,>     "NAME" VARCHAR2(32 BYTE),>     PRIMARY KEY("ID")>   );
cachedb2> call ttrepstart();
cachedb2> call ttGridAttach (1,'cachedb2','localhost',9992);
cachedb2> call ttGridNodeStatus;
< SAMPLEGRID, 1, 1, T, localhost, SAMPLEGRID_cachedb1_1, 127.0.0.1, 9991, <NULL>, <NULL>, <NULL>, <NULL>, <NULL> >
< SAMPLEGRID, 2, 1, T, localhost, SAMPLEGRID_cachedb2_2, 127.0.0.1, 9992, <NULL>, <NULL>, <NULL>, <NULL>, <NULL> >cachedb1> autocommit 0
cachedb1> CALL ttOptSetFlag('GlobalProcessing', 1);
cachedb1> select * from a;
< 2, shanghai >
< 1, beijing >cachedb1>  SELECT id, TTGRIDUSERASSIGNEDNAME(), TTGRIDMEMBERID() FROM a; 
< 1, cachedb1, 1 >
< 2, cachedb2, 2 >

Cache Grid中某节点异常时的情况

以上即演示,一切正常,下面来看一下异常的情况。

若某一grid member宕机

[oracle@timesten-hol ~]$ ttdaemonadmin -stop
TimesTen Daemon stopped.
[oracle@timesten-hol ~]$ ttstatus cachedb1
ttStatus: Could not connect to the TimesTen daemon.
If the TimesTen daemon is not running, please start it
by running "ttDaemonAdmin -start".
[oracle@timesten-hol ~]$ [oracle@timesten-hol ~]$ ttisql -v1 -e "set prompt 'cachedb2> '" "dsn=cachedb2;uid=tthr;pwd=tthr;oraclepwd=oracle"
cachedb2> show autocommit;
autocommit = 1 (ON)
cachedb2> select * from a;
< 2, shanghai >
cachedb2> select * from a where id = 1;3333: Time out waiting for a response from member SAMPLEGRID_cachedb2_2 <- 大致一分钟
cachedb2> cachedb2> autocommit 0;
cachedb2>  CALL ttOptSetFlag('GlobalProcessing', 1);
cachedb2> select * from a;
好久都没出来!一直都没出来!!!

结论

  1. Cache Grid中的每个成员,如果是单节点,此架构是没有弹性(Resilience)的。数据不会重新分布,查询操作会超时或者HANG
  2. Cache Grid的每个成员的保护,通常是通过Active Standby Pair来保护的,每一个节点都需要配一个standby,不过这样的架构比较重
  3. Cache Grid(Global Cache Group)适用的场景较少,可扩展性方面是有限制的。
  4. TimesTen 未来会推出12版,应该可以替代掉现在的Cache Grid功能。

这篇关于TimesTen 应用层数据库缓存学习:17. 全局数据缓存(cache grid)的高可用性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677689

相关文章

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们