Espero poder passar para vocês o quanto é simples a configuração de um TAC no Tibero. Alguns "experts" no Brasil já conseguiram finalizar esta tarefa em aproximadamente 10 a 15 minutos. É claro que toda a preparação de infraestrutura já havia sido feita anteriormente. Mesmo assim, a tarefa de criação do TAC é muito simples, permitindo estas finalizações bem rápidas para quem é expert no assunto.
Para configurar um ambiente de alta disponibilidade, muitas informações são necessárias previamente. Planejamento é fundamental, portanto, elaboramos um mapa de uma situação hipotética para ajudar a configurar o ambiente de forma apropriada. Esta prática é recomendada, pois as variáveis ficam claras no momento de atribuir os valores corretos nos processos de configuração do ambiente.
Para este exercício, algumas etapas anteriores são necessárias, como a criação de VMs com Linux e todo o setup delas. Não é o foco deste tutorial informar como criar este ambiente de infraestrutura. Se alguém tiver alguma dúvida neste sentido, ou qualquer outra dúvida, por favor utilize os comentários deste post.
[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tas1=
((INSTANCE=(HOST=100.100.100.10)
(PORT=9620)
(DB_NAME=tas)
)
)
- Criar e iniciar o Disk Space do TAS:
[tibero@tac1-training config]$ tbboot nomount
[tibero@tac1-training config]$ tbsql sys/tibero@tas1
SQL>
CREATE DISKSPACE ds0 NORMAL REDUNDANCY
FAILGROUP fg1 DISK
'/db/tibero/devs/disk101' NAME disk101
FAILGROUP fg2 DISK
'/db/tibero/devs/disk201' NAME disk201
ATTRIBUTE 'AU_SIZE'='4M';
- Instalação e configuração do TAC:
- VM1:
[tibero@tac1-training config]$ cd $TB_HOME
[tibero@tac1-training tibero6]$ vi tas1.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tas1; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
- Adicionar os recursos do TAC:
[tibero@tac1-training tibero6]$ tbcm -b
[tibero@tac1-training tibero6]$ tbcm -s
- Adicionar o recurso de rede privada:
[tibero@tac1-training tibero6]$ cmrctl add network --nettype private --ipaddr 100.100.100.10 --portno 18629 --name net1
- Adicionar o recurso de rede pública:
[tibero@tac1-training tibero6]$ cmrctl add network --nettype public --ifname enp0s3 --name pub1
- Adicionar o recurso de cluster:
[tibero@tac1-training tibero6]$ cmrctl add cluster --incnet net1 --pubnet pub1 --cfile "+/db/tibero/devs/disk*" --name cls1
[tibero@tac1-training tibero6]$ cmrctl start cluster --name cls1
- Adicionar o recurso de serviço do TAS:
[tibero@tac1-training tibero6]$ cmrctl add service --name tas --type as --cname cls1
- Adicionar o recurso do TAS:
[tibero@tac1-training tibero6]$ cmrctl add as --name tas1 --svcname tas --dbhome $CM_HOME --envfile /home/tibero/tibero6/tas1.profile
- Iniciar a instância do TAS:
[tibero@tac1-training tibero6]$ cmrctl start as --name tas1
- Conectar na instância em execução e adicionar a THREAD para o start up do TAS no node 2:
[tibero@tac1-training tibero6]$ tbsql sys/tibero@tas1
SQL>
ALTER DISKSPACE ds0 ADD THREAD 1;
- Adicionar o recurso de serviço do TAC:
cmrctl add service --name tac --cname cls1
- Criar um arquivo de profile requerido pelo CM para o node 1:
[tibero@tac1-training tibero6]$ vi tac1.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tac1; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
- Criar o arquivo de parâmetros de inicialização do Tibero para o TAC1:
[tibero@tac1-training tibero6]$ vi config/tac1.tip
DB_NAME=tac
LISTENER_PORT=8629
CONTROL_FILES="+DS0/tac/c1.ctl"
DB_CREATE_FILE_DEST="+DS0/tac"
LOG_ARCHIVE_DEST="+DS0/tac/archive"
MAX_SESSION_COUNT=20
TOTAL_SHM_SIZE=1G
MEMORY_TARGET=2G
USE_ACTIVE_STORAGE=Y
AS_PORT=9620
LOCAL_CLUSTER_ADDR=100.100.100.10
CM_PORT=48629
LOCAL_CLUSTER_PORT=21000
CLUSTER_DATABASE=Y
THREAD=0
UNDO_TABLESPACE=UNDO0
- Adicionar o recurso de Database:
[tibero@tac1-training tibero6]$ cmrctl add db --name tac1 --svcname tac --dbhome $CM_HOME --envfile /home/tibero/tibero6/tac1.profile
- Iniciar a instância do Database em NOMOUNT mode:
[tibero@tac1-training tibero6]$ cmrctl start db --name tac1 --option "-t nomount"
- Configurar os parâmetros de conexão do client:
[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac1=
((INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac)
)
)
- Criar o Database:
[tibero@tac1-training tibero6]$ tbsql sys/tibero@tac1
SQL>
CREATE DATABASE "tac"
USER sys IDENTIFIED BY tibero
MAXINSTANCES 8
MAXDATAFILES 256
CHARACTER SET WE8MSWIN1252
LOGFILE
GROUP 0 '+DS0/tac/log001.log' SIZE 100M,
GROUP 1 '+DS0/tac/log011.log' SIZE 100M,
GROUP 2 '+DS0/tac/log021.log' SIZE 100M
MAXLOGFILES 255
MAXLOGMEMBERS 8
NOARCHIVELOG
DATAFILE '+DS0/tac/system001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '+DS0/tac/temp001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE
UNDO TABLESPACE UNDO0 DATAFILE '+DS0/tac/undo001.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
- Iniciar a instância do Database em NORMAL mode:
[tibero@tac1-training tibero6]$ cmrctl start db --name tac1
- Criar o UNDO TABLESPACE para o segundo node do TAC:
[tibero@tac1-training tibero6]$ tbsql sys/tibero@tac1
SQL>
CREATE UNDO TABLESPACE UNDO1 DATAFILE '+DS0/tac/undo002.dtf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 500M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
- Adicionar os REDO LOGS para o segundo node do TAC:
SQL>
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 3 '+DS0/tac/log031.log' size 100M;
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 '+DS0/tac/log041.log' size 100M;
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 '+DS0/tac/log051.log' size 100M;
- Adicionar a THREAD pública para o segundo node do TAC:
SQL>
ALTER DATABASE ENABLE PUBLIC THREAD 1;
- Criar o dicionário de dados do sistema:
[tibero@tac1-training tibero6]$ . ./tac1.profile
[tibero@tac1-training tibero6]$ sh $TB_HOME/scripts/system.sh -p1 tibero -p2 syscat -a1 Y -a2 Y -a3 Y -a4 Y
- Instalação e configuração do TAS:
- VM2:
- Configurar as variáveis de ambiente:
[root@tac2-training ~]# su - tibero
[tibero@tac2-training ~]$ vi .bash_profile
##############################################################
# TIBERO TAS:
##############################################################
export TB_HOME=/home/tibero/tibero6
export TB_SID=tas2
export CM_SID=cm2
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[tibero@tac1-training ~]$ source .bash_profile
- Instalar o Tibero:
[tibero@tac2-training ~]$ tar -xzvf /home/install/tibero6-bin-FS06-linux64-142998-opt-20170420182339.tar.gz
[tibero@tac2-training ~]$ cp /home/install/tac2-training.tibero.license.xml tibero6/license/license.xml
- Configurar o arquivo de parâmetros de inicialização do Tibero:
[tibero@tac2-training ~]$ cd tibero6/config/
[tibero@tac2-training config]$ sh gen_tip.sh
[tibero@tac2-training config]$ vi tas2.tip
DB_NAME=tas
LISTENER_PORT=9620
MAX_SESSION_COUNT=20
MEMORY_TARGET=2G
TOTAL_SHM_SIZE=1G
INSTANCE_TYPE=AS
AS_DISKSTRING="/db/tibero/devs/disk*"
CLUSTER_DATABASE=Y
LOCAL_CLUSTER_ADDR=100.100.100.20
LOCAL_CLUSTER_PORT=20000
CM_PORT=48629
THREAD=1
[tibero@tac2-training config]$ vi cm2.tip
CM_NAME=cm2
CM_UI_PORT=48629
CM_RESOURCE_FILE="/home/tibero/tibero6/config/cm2.rsc"
CM_HEARTBEAT_EXPIRE=60
CM_WATCHDOG_EXPIRE=55
- Configurar os parâmetros de conexão do client:
[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tas2=
((INSTANCE=(HOST=100.100.100.20)
(PORT=9620)
(DB_NAME=tas)
)
)
- Instalação e configuração do TAC:
[tibero@tac2-training config]$ cd $TB_HOME
[tibero@tac2-training tibero6]$ vi tas2.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tas2; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
- Adicionar os recursos do TAC:
[tibero@tac2-training tibero6]$ tbcm -b
[tibero@tac2-training tibero6]$ tbcm -s
- Adicionar o recurso de rede privada:
[tibero@tac2-training tibero6]$ cmrctl add network --nettype private --ipaddr 100.100.100.20 --portno 18629 --name net1
- Adicionar o recurso de rede pública:
[tibero@tac2-training tibero6]$ cmrctl add network --nettype public --ifname enp0s3 --name pub1
- Adicionar o recurso de cluster:
[tibero@tac2-training tibero6]$ cmrctl add cluster --incnet net1 --pubnet pub1 --cfile "+/db/tibero/devs/disk*" --name cls1
[tibero@tac2-training tibero6]$ cmrctl start cluster --name cls1
- Adicionar o recurso do TAS:
[tibero@tac2-training tibero6]$ cmrctl add as --name tas2 --svcname tas --dbhome $CM_HOME --envfile /home/tibero/tibero6/tas2.profile
- Iniciar a instância do TAS:
[tibero@tac2-training tibero6]$ cmrctl start as --name tas2
- Criar um arquivo de profile requerido pelo CM para o node 2:
[tibero@tac2-training tibero6]$ vi tac2.profile
PATH="${PATH}:/home/tibero/tibero6/bin"; export PATH
PATH="${PATH}:/home/tibero/tibero6/client/bin"; export PATH
TB_HOME=/home/tibero/tibero6; export TB_HOME
TB_SID=tac2; export TB_SID
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/client/lib"; export LD_LIBRARY_PATH
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/home/tibero/tibero6/lib"; export LD_LIBRARY_PATH
- Criar o arquivo de parâmetros de inicialização do Tibero para o TAC2:
[tibero@tac2-training tibero6]$ vi config/tac2.tip
DB_NAME=tac
LISTENER_PORT=8629
CONTROL_FILES="+DS0/tac/c1.ctl"
DB_CREATE_FILE_DEST="+DS0/tac"
LOG_ARCHIVE_DEST="+DS0/tac/archive"
MAX_SESSION_COUNT=20
TOTAL_SHM_SIZE=1G
MEMORY_TARGET=2G
USE_ACTIVE_STORAGE=Y
AS_PORT=9620
LOCAL_CLUSTER_ADDR=100.100.100.20
CM_PORT=48629
LOCAL_CLUSTER_PORT=21000
CLUSTER_DATABASE=Y
THREAD=1
UNDO_TABLESPACE=UNDO1
#SERVER_SIDE_LOAD_BALANCE=LONG
- Adicionar o recurso de Database:
[tibero@tac2-training tibero6]$ cmrctl add db --name tac2 --svcname tac --dbhome $CM_HOME --envfile /home/tibero/tibero6/tac2.profile
- Iniciar a instância do Database:
[tibero@tac2-training tibero6]$ cmrctl start db --name tac2
- Configurar os parâmetros de conexão do client:
[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac2=
((INSTANCE=(HOST=100.100.100.20)
(PORT=8629)
(DB_NAME=tac)
)
)
⇨ Exercícios de loadbalance e failover "SEM VIP":
- Configurar os parâmetros de conexão do client:
- VM1:
[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
tac=
((INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.20)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
- VM2:
[tibero@tac2-training ~]$ vi tibero6/client/config/tbdsn.tbr
tac=
((INSTANCE=(HOST=100.100.100.20)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.10)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
- Teste #001: Com as duas VMs no ar, criar usuário, tabela e inserir dados para testar o HA:
- VM1:
[tibero@tac1-training ~]$ tbsql sys/tibero@tac
SQL>
create user TESTE identified by tibero;
grant dba to teste;
conn teste/tibero@tac
create table T1(id number);
insert into T1 values (12345);
- VM2:
[tibero@tac2-training ~]$ tbsql sys/tibero@tac
SQL>
select * from T1;
- VM1:
SQL>
commit;
- VM2:
SQL>
select * from T1;
ID
----------
12345
- Teste #002: Com as duas VMs no ar, conectar/desconectar algumas vezes para verificar o loadbalance:
- VM1:
[tibero@tac1-training ~]$ tbsql sys/tibero@tac
SQL>
col INSTANCE_NAME format a10
col HOST_NAME format a20
select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
INSTANCE_N HOST_NAME THREAD#
---------- -------------------- ----------
tac1 tac1-training 0
[tibero@tac1-training ~]$ tbsql sys/tibero@tac
SQL>
col INSTANCE_NAME format a10
col HOST_NAME format a20
select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
INSTANCE_N HOST_NAME THREAD#
---------- -------------------- ----------
tac2 tac2-training 1
- Teste #003: Com as duas VMs no ar, simular a queda de um nó, para verificar o failover:
- VM1:
[tibero@tac1-training ~]$ tbsql sys/tibero@tac
SQL>
col INSTANCE_NAME format a10
col HOST_NAME format a20
select INSTANCE_NAME, HOST_NAME, THREAD# from v$instance;
INSTANCE_N HOST_NAME THREAD#
---------- -------------------- ----------
tac2 tac2-training 1
- VM2:
- Verificado que a conexão foi para a VM2, derrube este nó:
[tibero@tac2-training ~]$ cmrctl stop db --name tac2 --option immediate
- VM1:
- Execute o comando novamente, duas vezes, para verificar o failover:
SQL> /
TBR-2139: Connection to server was interrupted but the fail-over successfully reconnected.
SQL> /
INSTANCE_N HOST_NAME THREAD#
---------- -------------------- ----------
tac1 tac1-training 0
⇨ VIP:
To add VIP, "tbcm" must be started using the ROOT privileges, and the "pubnet" attribute must be set for the service specified in "svcname".
- Stop all nodes:
- VM1:
[tibero@tac606tac1 tibero6]$ cmrctl stop service --name tac
[tibero@tac606tac1 tibero6]$ cmrctl stop service --name tas
[tibero@tac606tac1 tibero6]$ tbcm -d
- VM2:
[tibero@tac606tac2 tibero6]$ tbcm -d
- Configure o VIP:
- VM1:
- Configurar os parâmetros de conexão do client:
[tibero@tac1-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
vip=
((INSTANCE=(HOST=100.100.100.11)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.21)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
- Log in as ROOT:
[tibero@tac1-training ~]$ su - root
- Configure as variáveis de ambiente:
[root@tac1-training ~]# vi .bash_profile
####################################################################
# TIBERO CM:
####################################################################
export TB_HOME=/home/tibero/tibero6
export CM_SID=cm1
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[root@tac1-training ~]# source .bash_profile
- Inicie o CM como ROOT:
[root@tac1-training ~]# tbcm -b
CM Guard daemon started up.
import resources from '/home/tibero/tibero6/config/cm1.rsc'...
TBCM 6.1.1 (Build 139624)
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero cluster manager started up.
Local node name is (cm1:48629).
- Voltar para o contexto de normal user e verificar o status do CM, note que a informação "ROOT ON" é exibida na linha: "CM MODE":
[root@tac1-training ~]# exit
[tibero@tac1-training ~]$ tbcm -s
CM information
===========================================================
CM NAME : cm1
CM UI PORT : 48629
RESOURCE FILE PATH : /home/tibero/tibero6/config/cm1.rsc
CM MODE : GUARD ON, FENCE OFF, ROOT ON
LOG LEVEL : 2
CM BLOCK SIZE : 512
===========================================================
- Verificar o status do CLUSTER, note que a informação "(ROOT)" é exibida na linha: "Status" e que a letra "R" aparece na coluna "Mst":
[tibero@tac1-training ~]$ cmrctl show cluster --name cls1
Cluster Resource Info
===============================================================
Cluster name : cls1
Status : UP (ROOT)
Master node : (1) cm1
Last NID : 1
Local node : (1) cm1
Storage type : Active Storage
AS Diskstring : /dev/sd*
No. of cls files : 3
(1) +0
(2) +1
(3) +2
===============================================================
| NODE LIST |
|-------------------------------------------------------------|
| NID Name IP/PORT Status Schd Mst FHB NHB |
| --- -------- -------------------- ------ ---- --- ---- ---- |
| 1 cm1 100.100.100.10/18629 UP Y R M [ LOCAL ] |
===============================================================
| CLUSTER RESOURCE STATUS |
|-------------------------------------------------------------|
| NAME TYPE STATUS NODE MISC. |
| ---------------- -------- -------- -------- --------------- |
| SERVICE: tas |
| tas1 AS DOWN cm1 |
| SERVICE: tac |
| tac1 DB DOWN cm1 |
===============================================================
- Inicie o serviço do TAS:
[tibero@tac1-training ~]$ cmrctl start service --name tas
- Inicie o serviço do TAC:
[tibero@tac1-training ~]$ cmrctl start service --name tac
- Adicione o recurso VIP para o node 1 do TAC:
[tibero@tac1-training ~]$ cmrctl add vip --name vip1 --node cm1 --svcname tac --ipaddr 172.30.248.241/255.255.255.0
Resource add success! (vip, vip1)
- VM2:
- Configurar os parâmetros de conexão do client:
[tibero@tac2-training config]$ vi $TB_HOME/client/config/tbdsn.tbr
vip=
((INSTANCE=(HOST=100.100.100.11)
(PORT=8629)
(DB_NAME=tac))
(INSTANCE=(HOST=100.100.100.21)
(PORT=8629)
(DB_NAME=tac))
(LOAD_BALANCE=Y)
(USE_FAILOVER=Y)
)
- Log in as ROOT:
[tibero@tac2-training ~]$ su - root
- Configure as variáveis de ambiente:
[root@tac2-training ~]# vi .bash_profile
##################################################################### TIBERO CM:
####################################################################
export TB_HOME=/home/tibero/tibero6
export CM_SID=cm2
export CM_HOME=/home/tibero/tibero6
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin
[root@tac2-training ~]# source .bash_profile
- Inicie o CM como ROOT:
[root@tac2-training ~]# tbcm -b
CM Guard daemon started up.
import resources from '/home/tibero/tibero6/config/cm1.rsc'...
TBCM 6.1.1 (Build 139624)
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero cluster manager started up.
Local node name is (cm1:48629).
[root@tac2-training ~]# exit
- Voltar para o contexto de normal user e iniciar o recurso do TAS da VM2:
[tibero@tac2-training ~]$ cmrctl start as --name tas2
- Iniciar o recurso do TAC da VM2:
[tibero@tac2-training ~]$ cmrctl start db --name tac2
[tibero@tac2-training ~]$ cmrctl add vip --name vip2 --node cm2 --svcname tac --ipaddr 192.168.15.146/255.255.255.0
- VM1:
- Verifique o status do TAC na VM1 e na VM2 usando apenas a VM1 para isso:
[tibero@tac1-training ~]$ cmrctl show ; cmrctl show --remote cm2@cls1
⇨ Exercícios de loadbalance e failover "COM VIP":
- Refazer os testes #001, #002 e #003 anteriores.