Haremos la instalación de Oracle RAC 11g, con dos nodos (racnode1 y racnode2), y con un tercer servidor (openfiler) que desempeñará el rol de Network Storage Server.
Aquí un esquema de la infraestructura.
1.- Instalación del Sistema Operativo, Oracle Linux x86_64.
Esta instalación se realiza en los dos nodos del cluster.
Descargamos de https://edelivery.oracle.com la versión de Oracle Enterprise Linux 5.4 que mejor se adapte a nuestro hardware, en nuestro caso hemos hecho la instalación de 64 bits.
2.- Instalación de paquetes del Sistema Operativo en los dos nodos del RAC.
Esta instalación se realiza en los dos nodos del cluster.
Instalamos adicionalmente los siguientes paquetes de software.
yum install binutils.x86_64
yum install elfutils-libelf.x86_64 elfutils-libelf-devel.x86_64 elfutils-libelf-devel-static.x86_64
yum install glibc.x86_64 glibc-devel.x86_64 glibc-common.x86_64 glibc-headers.x86_64
yum install ksh.x86_64
yum install libaio.x86_64 libaio-devel.x86_64
yum install libgcc.x86_64
yum install libstdc++.x86_64 libstdc++-devel.x86_64 compat-libstdc++-33.x86_64
yum install make.x86_64
yum install gcc.x86_64 gcc-c++.x86_64
yum install unixODBC.x86_64 unixODBC-devel.x86_64
yum install sysstat.x86_64
3.- Configuración de red, en los dos nodos del RAC.
Esta configuración se realiza en los dos nodos del cluster..
Se necesitan al menos dos interfaces de red diferentes en cada nodo de Oracle RAC, uno para la red pública y otro para la privada (interconnect).
Es necesario configurar la misma tarjeta de red en todos los nodos para la misma red, es decir, en nuestro caso tenemos la eth0 y la eth1, si en uno de los nodos usamos la eth0 para la red pública, en el otro nodo lo deberemos hacer del mismo modo.
Para la red pública el adaptador debe soportar TCP/IP, para la red privada UDP GigabitEthernet.
En este ejemplo usaremos dos tarjetas de red, pero para sistemas en un entorno de producción necesitaremos otra tarjeta adicional para el tráfico de almacenamiento (Network Storage), en nuestro caso como es un sistema para hacer pruebas usaremos para este propósito la tarjeta eth1 que se usa también para el RAC interconnect.
Servidor | Dns | Ip | Interface |
racnode1 | racnode1 | 10.0.9.210 | eth0 |
racnode1 | racnode1-priv | 10.0.10.210 | eth1 |
racnode1 | racnode1-vip | 10.0.9.220 | eth0 |
racnode2 | racnode2 | 10.0.9.211 | eth0 |
racnode2 | racnode2-priv | 10.0.10.211 | eth1 |
racnode2 | racnode2-vip | 10.0.9.221 | eth0 |
openfiler | openfiler | 10.0.9.212 | eth0 |
openfiler | openfiler-priv | 10.0.10.212 | eth1 |
Configuramos las tarjetas de red con las ips correspondientes en los dos servidores.
Debería quedar algo similar a esto:
[root@racnode1]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:50:56:82:00:2E
inet addr:10.0.9.210 Bcast:10.0.9.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe82:2e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:45496 errors:0 dropped:151 overruns:0 frame:0
TX packets:29385 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25817882 (24.6 MiB) TX bytes:5389896 (5.1 MiB)
eth1 Link encap:Ethernet HWaddr 00:50:56:82:00:34
inet addr:10.0.10.210 Bcast:10.0.10.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe82:34/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:239 errors:0 dropped:152 overruns:0 frame:0
TX packets:49 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16969 (16.5 KiB) TX bytes:5403 (5.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1200 (1.1 KiB) TX bytes:1200 (1.1 KiB)
Modificamos el /etc/hosts de los dos nodos del RAC con la misma información. También configuramos nuestro DNS con la misma información.
[root@racnode1]# vi /etc/hosts
127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.localdomain4 localhost
# Red publica - eth0
10.0.9.210 racnode1
10.0.9.211 racnode2
# Red Privada - eth1
10.0.10.210 racnode1-priv
10.0.10.211 racnode2-priv
# Public Virtual IP (VIP) - eth0:1
10.0.9.220 racnode1-vip
10.0.9.221 racnode2-vip
# SCAN
10.0.9.230 racnode-cluster-scan
# OpenFiler
10.0.9.212 openfiler
10.0.10.212 openfiler-priv
El nombre del host, ranode1 y racnode2 no debe estar puesto nunca en la dirección de Loopback (127.0.0.1), si estos nombres se incluyen en la dirección de Loopback la instalación de RAC fallará con un ORA-00603 o ORA-29702.
El siguiente paso es desactivar los firewalls del sistema operativo, en este caso iptables.
[root@racnode1 Packages]# /etc/init.d/iptables stop
iptables: Guardando las reglas del cortafuegos: [ OK ]
iptables: Poniendo las cadenas de la polÃtica ACCEPT: filt[ OK ]
iptables: Descargando módulos: [ OK ]
Desactivamos iptables para próximos reinicios del servidor.
[root@racnode1 Packages]# chkconfig iptables off
Desactivamos SeLinux.
[root@racnode1 ~]# echo 0 >/selinux/enforce
[root@racnode1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
4.- Configuración de Cluster Time Synchronization Service (CTSS).
Esta configuración se realiza en los dos nodos del cluster.
[root@racnode1 ~]# echo 0 >/selinux/enforce
[root@racnode1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
4.- Configuración de Cluster Time Synchronization Service (CTSS).
Esta configuración se realiza en los dos nodos del cluster.
Para usar el CTSS en el cluster debemos primero desactivar y desinstalar el servicio NTP en los dos nodos del RAC.
service ntpd stop
chkconfig ntpd off
mv /etc/ntp.conf /etc/ntp.conf.orig
Cuando la instalación detecta que el NTP no está activo, instalará y activará automaticamente el CTSS.
Para confimar que el ctssd está activo después de la instalación:
crsctl check ctss
5.- Instalación OpenFiler.
Esta instalación se realiza en el servidor de almacenamiento.
En este paso vamos a hacer la instalación de openfiler en el Network Storage Server, luego configuraremos este servidor como un dispositivo de storage iSCSI.
OpenFiler es una utilidad de almacenamiento en la red que es capaz de proporcionar o servir archivos en base a NAS o blocks en base a SAN. Soporta múltiples sistemas de archivos como CIFS, NFS, HTTP/DAV, FTP... nosotros usaremos iSCSI, implementaremos una SAN para el almacenamiento compartido necesario para el Oracle RAC 11g.
Para mas info sobre openfiler: http://www.openfiler.com
En nuestro caso como es una maquina de 64 bits, bajaremos el software:
openfiler-2.3-x86_64-disc1.iso
Arrancaremos el servidor desde la iso que hemos descargado y realizamos la instalación con los valores por defecto.
En la instalación configuraremos las tarjetas de red con las ips que le pertenecen según el cuadro que hemos puesto al principio del post.
Modificamos el /etc/hosts con la misma información que hemos puesto en uno de los dos nodos del RAC.
OpenFiler es una utilidad de almacenamiento en la red que es capaz de proporcionar o servir archivos en base a NAS o blocks en base a SAN. Soporta múltiples sistemas de archivos como CIFS, NFS, HTTP/DAV, FTP... nosotros usaremos iSCSI, implementaremos una SAN para el almacenamiento compartido necesario para el Oracle RAC 11g.
Para mas info sobre openfiler: http://www.openfiler.com
En nuestro caso como es una maquina de 64 bits, bajaremos el software:
openfiler-2.3-x86_64-disc1.iso
Arrancaremos el servidor desde la iso que hemos descargado y realizamos la instalación con los valores por defecto.
En la instalación configuraremos las tarjetas de red con las ips que le pertenecen según el cuadro que hemos puesto al principio del post.
Modificamos el /etc/hosts con la misma información que hemos puesto en uno de los dos nodos del RAC.
6.- Configuración OpenFiler.
Una vez ya tenemos instalado OpenFiler, es el momento de hacer la configuración de los volúmenes iSCSI.
Entramos en la gestión de OpenFiler, con un navegador web.
Los datos que debemos introducir para hacer login, son:
usuario: openfiler
password: password
La primera pantalla que nos aparece es la de Status, donde se muestra la información del estado actual del servidor Openfiler.
Comenzamos con la configuración de OpenFiler.
Services
En la pestaña services habilitamos y arrancamos el iSCSI target, tal y como aparece en la imagen.
En el Sistema Operativo podemos comprobar que el servicio realmente está arrancado:
[root@openfiler ~]# service iscsi-target status
ietd (pid 2471) is running...
Network Access Configuration
En la pestaña "System", pulsando en el enlace de la parte derecha "Network Setup", entramos en la configuración de red de Openfiler, lo que vamos a configurar ahora es identificar en OpenFiler los dos nodos de RAC que van a tener que acceder a los volúmenes de datos.
Las ips que introducimos son las correspondientes a la red privada.
Volumes
Es el momento de crear los volúmenes que vamos a usar mas tarde.
Nos dirigimos a la pestaña "Volumes", y al enlace de la parte derecha de la pantalla "Block devices". Aquí nos muestra la información de los discos que tenemos en nuestro servidor OpenFiler.
En este ejemplo vamos a crear una única partición en el disco /dev/sdb, ocupando todo el espacio, luego crearemos un Volume Group con esta particion "/dev/sdb1" y de aquí crearemos 3 volumenes lógicos que son los que usaremos para almacenar los datos del RAC.
Creación de la particion
Pinchamos sobre el disco "/dev/sdb" en la columna "Edit disk", elegimos este porque el otro se está usando para el sistema openfiler.
Creamos una partición Primaria, del tipo "Linux Physical Volume" con el total del tamaño disponible en el disco.
Creando el Grupo de Voluménes
Vamos al enlace "Volume Groups", y creamos un nuevo grupo de volúmenes con la partición previamente creada "/dev/sdb1".
Creando Volúmenes
Nos dirigimos a la pestaña "Volumes", y pulsamos sobre el enlace "Add Volume". En la pantalla que nos aparece crearemos 3 volúmenes lógicos iSCSI.
Al final los volúmenes quedan así. Podemos poner la distribución de espacio como creamos conveniente, este es solo un ejemplo de un sistema en pruebas.
iSCSI Targets
Una vez ya tenemos creados los volúmenes lógicos iSCSI, es necesario crear los iSCSI targets, es necesarios crear un iSCSI target por cada volumen iSCSI que hemos creado, así luego podremos darles permisos de acceso a los clientes (racnode1 y racnode2) hacia los iSCSI targets.
Vamos a la pestaña "Volumes", y al enlace "iSCSI Targets".
Veremos que en la pantalla "Add new iSCSI Target" aparece un valor aleatorio para la creación de un nuevo target, nosotros vamos a crearlos con unos nombres significativos, así será mas fácil reconocerlos posteriormente. A continuación como los vamos a nombrar:
volume name | Target IQN |
rac-crs1 | iqn.2006-01.com.openfiler:racvg.rac-crs1 |
rac-data1 | iqn.2006-01.com.openfiler:racvg.rac-data1 |
rac-fra1 | iqn.2006-01.com.openfiler:racvg.rac-fra1 |
En la pantalla que nos aparece a continuación, despues de añadir el iSCSI target, dejamos todos los valores por defecto.
Estas operación debemos completarla para los 3 iSCSI targets que vamos a crear en total.
LUN Mapping
Ahora tenemos que mapear los iSCSI targets que hemos creado en el paso anterior con los volúmenes lógicos que creamos anteriormente.
Vamos a la pestaña "Volumes", enlace "iSCSI Targets", subpestaña "Target Configuration".
En la pantalla "Select iSCSI Target" elegimos uno de los 3 targets que hemos creado y pulsamos sobre "change".
A continuación vamos a la subpestaña "LUN mapping", y asociamos al iSCSI Target su correspondiente volumen lógico.
Volumen lógico rac-crs1
Volumen lógico rac-data1
Volumen lógico rac-fra1
Para finalizar con la asignación de los "iSCSI targets" a los nodos del RAC, falta permitir el acceso desde los clientes a los volúmenes lógicos. Como en la anterior operación deberemos seleccionar uno a uno los iSCSI target desde la pestaña "Target Configuration", pulsando sobre el botón "Change", para después ir a la pestaá "Network ACL" y cambiar los "Access" que están en "Deny" por defecto por "Allow" y pulsar el botón "Update". Esta operación se tiene que hacer por cada uno de los 3 iSCSI Targets.
7.- Configuración volúmenes iSCSI en nodos Oracle RAC.
Ya tenemos el servidor de almacenamiento preparado, ahora es el momento de preparar los nodos del RAC para que puedan acceder a los volúmenes.
Para que el Sistema operativo pueda alcanzar dichos volúmenes necesitaremos tener la aplicación iSCSI initiator en los dos nodos del RAC, este software se conectará automáticamente en el openfiler para acceder a los volúmenes que previamente hemos configurado.
Primero comprobamos si ya lo tenemos instalado.
[root@racnode1 ~]# rpm -qa |grep iscsi-initiator-utils
Si no lo tenemos instalado, lo instalamos.
[root@racnode1 ~]# yum install iscsi-initiator-utils.x86_64 iscsi-initiator-utils-devel.x86_64
Arrancamos los servicios iscsid y lo configuramos para que arranque automáticamente cuando el servidor arranque.
[root@racnode1 ~]# service iscsid start
Turning off network shutdown. Starting iSCSI daemon: [ OK ]
[ OK ]
[root@racnode1 ~]# chkconfig iscsid on
[root@racnode1 ~]# chkconfig iscsi on
Comprobamos el acceso desde los nodos del RAC a los volúmenes. Si en este punto aparece un error "iscsiadm: No portals found", deberemos desactivar las entradas en el openfiler del archivo "/etc/initiators.deny", que seguramente nos estará bloqueando nuestra Ip.
[root@racnode1 ~]# iscsiadm -m discovery -t sendtargets -p openfiler-priv
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-fra1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-fra1
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-data1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-data1
10.0.10.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-crs1
10.0.9.212:3260,1 iqn.2006-01.com.openfiler:racvg.rac-crs1
Ahora tenemos que loguear los dos nodos del RAC contra los volúmenes publicados en el openfiler.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-crs1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-crs1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-crs1, portal: 10.0.10.212,3260] successful.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-data1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-data1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-data1, portal: 10.0.10.212,3260] successful.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-fra1 -p 10.0.10.212 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-fra1, portal: 10.0.10.212,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:racvg.rac-fra1, portal: 10.0.10.212,3260] successful.
Configuramos el Logueo automático para los futuros arranques del servidor.
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-crs1 -p 10.0.10.212 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-fra1 -p 10.0.10.212 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:racvg.rac-data1 -p 10.0.10.212 --op update -n node.startup -v automatic
Creación de dispositivos SCSI lógicos.
Actualmente tenemos los iSCSI targets apuntando a un dispositivo local. Por ejemplo.
[root@racnode1 ~]# cd /dev/disk/by-path/
[root@racnode1 by-path]# ls -ltrh *openfiler*
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-crs1-lun-0 -> ../../sdb
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-data1-lun-0 -> ../../sdc
lrwxrwxrwx. 1 root root 9 jul 10 19:43 ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-fra1-lun-0 -> ../../sdd
Esto no es algo permanente ya que si reiniciamos el servidor cuando el iscsi initiator se loguee en el openfiler no tiene porque asignarnos los discos a las mismas unidades, es decir puede ser que en el siguiente reinicio el iSCSI target ip-10.0.10.212:3260-iscsi-iqn.2006-01.com.openfiler:racvg.rac-data1-lun-0 podría apuntar a sdd en lugar de sdc como lo hace actualmente.
Por ello lo que vamos a hacer es crear un nombre de dispositivo persistente, así si reiniciamos el servidor nos aseguramos de que el dispositivo al que hacemos referencia siempre va a ser el mismo. Esto se encarga de hacerlo udev, necesitamos generar una regla y un script.
*Nota: Este paso no funciona si estamos usando máquinas virtuales.
Primer paso, crear el archivo de reglas. (es una única linea)
[root@racnode1 by-path]# vi /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"
Segundo paso, crear script. Este script obtiene los nombres de las Luns para que puedan ser generados los dispositivos iSCSI por udev.
[root@racnode1 by-path]# mkdir -p /etc/udev/scripts
[root@racnode1 by-path]# vi /etc/udev/scripts/iscsidev.sh
#!/bin/sh
# FILE: /etc/udev/scripts/iscsidev.sh
BUS=${1}
HOST=${BUS%%:*}
[ -e /sys/class/iscsi_host ] || exit 1
file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"
target_name=$(cat ${file})
# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
exit 1
fi
# Check if QNAP drive
check_qnap_target_name=${target_name%%:*}
if [ $check_qnap_target_name = "iqn.2004-04.com.qnap" ]; then
target_name=`echo "${target_name%.*}"`
fi
echo "${target_name##*.}"
[root@racnode1 by-path]# chmod 750 /etc/udev/scripts/iscsidev.sh
Con el udev configurado vamos a reiniciar el servicio iscsi.
[root@racnode1 nodes]# service iscsi stop
[root@racnode1 nodes]# service iscsi stop
[root@racnode1 nodes]# service iscsi start
Creación de particiones.
Creamos particiones primarias usando todo el disco disponible en cada uno de los 3 volúmenes. Lo hacemos por ejemplo desde el racnode1.
[root@racnode1 by-path]# fdisk /dev/iscsi/rac-crs1/part
El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF
Building a new DOS disklabel with disk identifier 0x174b3585.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Orden (m para obtener ayuda): n
Acción de la orden
e Partición extendida
p Partición primaria (1-4)
p
Número de partición (1-4): 1
Primer cilindro (1-1009, valor predeterminado 1): 1
Last cilindro, +cilindros or +size{K,M,G} (1-1009, valor predeterminado 1009):
Se está utilizando el valor predeterminado 1009
Orden (m para obtener ayuda): p
Disco /dev/iscsi/rac-crs1/part: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = cilindros of 4154 * 512 = 2126848 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x174b3585
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/iscsi/rac-crs1/part1 1 1009 2095662 83 Linux
Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!
Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.
En racnode2 comprobamos que vemos las particiones creadas desde el racnode1.
[root@racnode2 by-path]# partprobe
[root@racnode2 by-path]# fdisk -l
8.- Creación de usuarios, grupos y directorios.
Las operaciones que se van a ejecutar a continuación deben hacerse en los dos nodos del RAC.
A continuación los grupos y usuarios que se van a crear.
Grupo SO | Usuarios SO | Privilegios Oracle | Grupo Oracle | Descripción |
oinstall | grid, oracle | Oracle Inventory and Software owner | ||
asmadmin | grid | SYSASM | OSASM | Oracle Automatic Storage Management Group |
asmdba | grid, oracle | SYSDBA for ASM | OSDBA for ASM | ASM Database Administrator Group |
asmoper | grid | SYSOPER for ASM | OSOPER for ASM | ASM Operator Group |
dba | oracle | SYSDBA | OSDBA | Database Administrator |
oper | oracle | SYSOPER | OSOPER | Database Operator |
Empezamos con la creación de grupos y cuentas para Grid.
[root@racnode1 /]# groupadd -g 1000 oinstall
[root@racnode1 /]# groupadd -g 1200 asmadmin
[root@racnode1 /]# groupadd -g 1201 asmdba
[root@racnode1 /]# groupadd -g 1202 asmoper
[root@racnode1 /]# useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper -d /home/grid -s /bin/bash -c "Grid Infrastructure Owner" grid
[root@racnode1 /]# id grid
uid=1100(grid) gid=1000(oinstall) grupos=1000(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper)
[root@racnode1 /]# passwd grid
Cambiando la contraseña del usuario grid.
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: todos los tokens de autenticación se actualizaron exitosamente.
Seguimos con la creación de grupos y cuentas para Oracle Database Software.
[root@racnode1 ~]# groupadd -g 1300 dba
[root@racnode1 ~]# groupadd -g 1301 oper
[root@racnode1 ~]# useradd -m -u 1101 -g oinstall -G dba,oper,asmdba -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
[root@racnode1 ~]# id oracle
uid=1101(oracle) gid=1000(oinstall) grupos=1000(oinstall),1201(asmdba),1300(dba),1301(oper)
[root@racnode1 ~]# passwd oracle
Cambiando la contraseña del usuario oracle.
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: todos los tokens de autenticación se actualizaron exitosamente.
Creación del profile del usuario grid.
Crearemos un profile personalizado para que al iniciar sesión con el usuario grid, nos cargue las variables de entorno que nosotros queramos.
Usaremos distintos ORACLE_SID para los distintos nodos del RAC.
racnode1: ORACLE_SID=+ASM1
racnode2: ORACLE_SID=+ASM2
[root@racnode1 /]# su - grid
[grid@racnode1 ~]$ > .bash_profile
[grid@racnode1 ~]$ vi .bash_profile
# ---------------------------------------------------
# .bash_profile
# ---------------------------------------------------
# OS User: grid
# Application: Oracle Grid Infrastructure
# Version: Oracle 11g release 2
# ---------------------------------------------------
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
alias ls="ls -FA"
# ---------------------------------------------------
# ORACLE_SID
# ---------------------------------------------------
# Specifies the Oracle system identifier (SID)
# for the Automatic Storage Management (ASM)instance
# running on this node.
#
#Each RAC node must have a unique ORACLE_SID.
#
#(i.e. +ASM1, +ASM2,...)
# ---------------------------------------------------
ORACLE_SID=+ASM1; export ORACLE_SID
# ---------------------------------------------------
# JAVA_HOME
# ---------------------------------------------------
# Specifies the directory of the Java SDK and Runtime
# Environment.
# ---------------------------------------------------
JAVA_HOME=/usr/local/java; export JAVA_HOME
# ---------------------------------------------------
# ORACLE_BASE
# ---------------------------------------------------
# Specifies the base of the Oracle directory structure
# for Optimal Flexible Architecture (OFA) compliant
# installations. The Oracle base directory for the
# grid installation owner is the location where
# diagnostic and administrative logs, and other logs
# associated with Oracle ASM and Oracle Clusterware
# are stored.
# ---------------------------------------------------
ORACLE_BASE=/u01/app/grid; export ORACLE_BASE
# ---------------------------------------------------
# ORACLE_HOME
# ---------------------------------------------------
# Specifies the directory containing the Oracle
# Grid Infrastructure software. For grid
# infrastructure for a cluster installations, the Grid
# home must not be placed under one of the Oracle base
# directories, or under Oracle home directories of
# Oracle Database installation owners, or in the home
# directory of an installation owner. During
# installation, ownership of the path to the Grid
# home is changed to root. This change causes
# permission errors for other installations.
# ---------------------------------------------------
ORACLE_HOME=/u01/app/11.2.0/grid; export ORACLE_HOME
# ---------------------------------------------------
# ORACLE_PATH
# ---------------------------------------------------
# Specifies the search path for files used by Oracle
# applications such as SQL*Plus. If the full path to
# the file is not specified, or if the file is not
# in the current directory, the Oracle application
# uses ORACLE_PATH to locate the file.
# This variable is used by SQL*Plus, Forms and Menu.
# ---------------------------------------------------
ORACLE_PATH=/u01/app/oracle/common/oracle/sql; export ORACLE_PATH
# ---------------------------------------------------
# SQLPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# SQL*Plus searches for a login.sql file.
# ---------------------------------------------------
# SQLPATH=/u01/app/common/oracle/sql; export SQLPATH
# ---------------------------------------------------
# ORACLE_TERM
# ---------------------------------------------------
# Defines a terminal definition. If not set, it
# defaults to the value of your TERM environment
# variable. Used by all character mode products.
# ---------------------------------------------------
ORACLE_TERM=xterm; export ORACLE_TERM
# ---------------------------------------------------
# NLS_DATE_FORMAT
# ---------------------------------------------------
# Specifies the default date format to use with the
# TO_CHAR and TO_DATE functions. The default value of
# this parameter is determined by NLS_TERRITORY. The
# value of this parameter can be any valid date
# format mask, and the value must be surrounded by
# double quotation marks. For example:
#
# NLS_DATE_FORMAT = "MM/DD/YYYY"
#
# ---------------------------------------------------
NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"; export NLS_DATE_FORMAT
# ---------------------------------------------------
# TNS_ADMIN
# ---------------------------------------------------
# Specifies the directory containing the Oracle Net
# Services configuration files like listener.ora,
# tnsnames.ora, and sqlnet.ora.
# ---------------------------------------------------
TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN
# ---------------------------------------------------
# ORA_NLS11
# ---------------------------------------------------
# Specifies the directory where the language,
# territory, character set, and linguistic definition
# files are stored.
# ---------------------------------------------------
ORA_NLS11=$ORACLE_HOME/nls/data; export ORA_NLS11
# ---------------------------------------------------
# PATH
# ---------------------------------------------------
# Used by the shell to locate executable programs;
# must include the $ORACLE_HOME/bin directory.
# ---------------------------------------------------
PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
PATH=${PATH}:/u01/app/common/oracle/bin
export PATH
# ---------------------------------------------------
# LD_LIBRARY_PATH
# ---------------------------------------------------
# Specifies the list of directories that the shared
# library loader searches to locate shared object
# libraries at runtime.
# ---------------------------------------------------
LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH
# ---------------------------------------------------
# CLASSPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# contain compiled Java classes.
# ---------------------------------------------------
CLASSPATH=$ORACLE_HOME/JRE
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export CLASSPATH
# ---------------------------------------------------
# THREADS_FLAG
# ---------------------------------------------------
# All the tools in the JDK use green threads as a
# default. To specify that native threads should be
# used, set the THREADS_FLAG environment variable to
# "native". You can revert to the use of green
# threads by setting THREADS_FLAG to the value
# "green".
# ---------------------------------------------------
THREADS_FLAG=native; export THREADS_FLAG
# ---------------------------------------------------
# TEMP, TMP, and TMPDIR
# ---------------------------------------------------
# Specify the default directories for temporary
# files; if set, tools that create temporary files
# create them in one of these directories.
# ---------------------------------------------------
export TEMP=/tmp
export TMPDIR=/tmp
# ---------------------------------------------------
# UMASK
# ---------------------------------------------------
# Set the default file mode creation mask
# (umask) to 022 to ensure that the user performing
# the Oracle software installation creates files
# with 644 permissions.
# ---------------------------------------------------
umask 022
Creación el profile del usuario oracle.
Usaremos distintos ORACLE_SID para los distintos nodos del RAC.
racnode1: ORACLE_SID=RACDB1
racnode2: ORACLE_SID=RACDB2
[root@racnode1 ~]# su - oracle
[oracle@racnode1 ~]$ > .bash_profile
[oracle@racnode1 ~]$ vi .bash_profile
# ---------------------------------------------------
# .bash_profile
# ---------------------------------------------------
# OS User: oracle
# Application: Oracle Database Software Owner
# Version: Oracle 11g release 2
# ---------------------------------------------------
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
alias ls="ls -FA"
# ---------------------------------------------------
# ORACLE_SID
# ---------------------------------------------------
# Specifies the Oracle system identifier (SID) for
# the Oracle instance running on this node.
#
#Each RAC node must have a unique ORACLE_SID.
#
#(i.e. RACDB1, RACDB2,...)
# ---------------------------------------------------
ORACLE_SID=RACDB1; export ORACLE_SID
# ---------------------------------------------------
# ORACLE_UNQNAME
# ---------------------------------------------------
# In previous releases of Oracle Database, you were
# required to set environment variables for
# ORACLE_HOME and ORACLE_SID to start, stop, and
# check the status of Enterprise Manager. With
# Oracle Database 11g release 2 (11.2) and later, you
# need to set the environment variables ORACLE_HOME
# and ORACLE_UNQNAME to use Enterprise Manager.
# Set ORACLE_UNQNAME equal to the database unique
# name.
# ---------------------------------------------------
ORACLE_UNQNAME=RACDB; export ORACLE_UNQNAME
# ---------------------------------------------------
# JAVA_HOME
# ---------------------------------------------------
# Specifies the directory of the Java SDK and Runtime
# Environment.
# ---------------------------------------------------
JAVA_HOME=/usr/local/java; export JAVA_HOME
# ---------------------------------------------------
# ORACLE_BASE
# ---------------------------------------------------
# Specifies the base of the Oracle directory structure
# for Optimal Flexible Architecture (OFA) compliant
# database software installations.
# ---------------------------------------------------
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
# ---------------------------------------------------
# ORACLE_HOME
# ---------------------------------------------------
# Specifies the directory containing the Oracle
# Database software.
# ---------------------------------------------------
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME
# ---------------------------------------------------
# ORACLE_PATH
# ---------------------------------------------------
# Specifies the search path for files used by Oracle
# applications such as SQL*Plus. If the full path to
# the file is not specified, or if the file is not
# in the current directory, the Oracle application
# uses ORACLE_PATH to locate the file.
# This variable is used by SQL*Plus, Forms and Menu.
# ---------------------------------------------------
ORACLE_PATH=/u01/app/common/oracle/sql; export ORACLE_PATH
# ---------------------------------------------------
# SQLPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# SQL*Plus searches for a login.sql file.
# ---------------------------------------------------
# SQLPATH=/u01/app/common/oracle/sql; export SQLPATH
# ---------------------------------------------------
# ORACLE_TERM
# ---------------------------------------------------
# Defines a terminal definition. If not set, it
# defaults to the value of your TERM environment
# variable. Used by all character mode products.
# ---------------------------------------------------
ORACLE_TERM=xterm; export ORACLE_TERM
# ---------------------------------------------------
# NLS_DATE_FORMAT
# ---------------------------------------------------
# Specifies the default date format to use with the
# TO_CHAR and TO_DATE functions. The default value of
# this parameter is determined by NLS_TERRITORY. The
# value of this parameter can be any valid date
# format mask, and the value must be surrounded by
# double quotation marks. For example:
#
# NLS_DATE_FORMAT = "MM/DD/YYYY"
#
# ---------------------------------------------------
NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"; export NLS_DATE_FORMAT
# ---------------------------------------------------
# TNS_ADMIN
# ---------------------------------------------------
# Specifies the directory containing the Oracle Net
# Services configuration files like listener.ora,
# tnsnames.ora, and sqlnet.ora.
# ---------------------------------------------------
TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN
# ---------------------------------------------------
# ORA_NLS11
# ---------------------------------------------------
# Specifies the directory where the language,
# territory, character set, and linguistic definition
# files are stored.
# ---------------------------------------------------
ORA_NLS11=$ORACLE_HOME/nls/data; export ORA_NLS11
# ---------------------------------------------------
# PATH
# ---------------------------------------------------
# Used by the shell to locate executable programs;
# must include the $ORACLE_HOME/bin directory.
# ---------------------------------------------------
PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
PATH=${PATH}:/u01/app/common/oracle/bin
export PATH
# ---------------------------------------------------
# LD_LIBRARY_PATH
# ---------------------------------------------------
# Specifies the list of directories that the shared
# library loader searches to locate shared object
# libraries at runtime.
# ---------------------------------------------------
LD_LIBRARY_PATH=$ORACLE_HOME/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH
# ---------------------------------------------------
# CLASSPATH
# ---------------------------------------------------
# Specifies the directory or list of directories that
# contain compiled Java classes.
# ---------------------------------------------------
CLASSPATH=$ORACLE_HOME/JRE
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export CLASSPATH
# ---------------------------------------------------
# THREADS_FLAG
# ---------------------------------------------------
# All the tools in the JDK use green threads as a
# default. To specify that native threads should be
# used, set the THREADS_FLAG environment variable to
# "native". You can revert to the use of green
# threads by setting THREADS_FLAG to the value
# "green".
# ---------------------------------------------------
THREADS_FLAG=native; export THREADS_FLAG
# ---------------------------------------------------
# TEMP, TMP, and TMPDIR
# ---------------------------------------------------
# Specify the default directories for temporary
# files; if set, tools that create temporary files
# create them in one of these directories.
# ---------------------------------------------------
export TEMP=/tmp
export TMPDIR=/tmp
# ---------------------------------------------------
# UMASK
# ---------------------------------------------------
# Set the default file mode creation mask
# (umask) to 022 to ensure that the user performing
# the Oracle software installation creates files
# with 644 permissions.
# ---------------------------------------------------
umask 022
Creación de directorios.
Para acabar con este apartado, crearemos los directorios necesarios para la instalación del software.
[root@racnode1 ~]# mkdir -p /u01/app/grid
[root@racnode1 ~]# mkdir -p /u01/app/11.2.0/grid
[root@racnode1 ~]# chown -R grid:oinstall /u01
[root@racnode1 ~]# mkdir -p /u01/app/oracle
[root@racnode1 ~]# chown oracle:oinstall /u01/app/oracle
[root@racnode1 ~]# chmod -R 775 /u01
9.- Configuración de límites de recursos para los usuarios.
Estos cambios los realizaremos en los dos nodos del RAC.
Para mejorar el rendimiento en sistemas Linux es necesario hacer algunos cambios en los límites de los usuarios oracle y grid.
Añadimos la configuración de límites para los usuarios oracle y grid.
[root@racnode1 ~]# vi /etc/security/limits.conf
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
Añadimos la siguiente fila si no existe.
[root@racnode1 ~]# vi /etc/pam.d/login
session required pam_limits.so
Añadimos al /etc/profile.
[root@racnode1 ~]# vi /etc/profile
if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
9.- Configuración de Oracle Linux para Oracle Software.
Estos cambios los realizaremos en los dos nodos del RAC.
Memoria.
El mínimo de memoria para soportar Oracle grid infraestructure for cluster y Oracle RAC es 2,5 GB de RAM, además debemos asegurarnos que tenemos la suficiente memoria Swap, Oracle recomienda tener 1,5 veces la RAM para la memoria Swap en sistemas con 2GB de RAM o menos, para sistemas con RAM superior a 2GB será suficiente tener una Swap de igual tamaño que la RAM.
Vamos a hacer las comprobaciones necesarias.
[root@racnode2 by-path]# cat /proc/meminfo|grep MemTotal
MemTotal: 4057412 kB
[root@racnode2 by-path]# cat /proc/meminfo|grep SwapTotal
SwapTotal: 4063228 kB
En nuestro caso está todo correcto.
Parámetros del Kernel.
Oracle recomienda poner los siguientes parámetros, son valores mínimos si nuestro sistema tiene valores superiores no debemos cambiarlos.
Nuestro sistema ya incluye los parámetros kernel.shmall y kernel.shmmax con valores superiores a los mínimos recomendados por oracle, por lo tanto esos los vamos a dejar tal y como están.
[root@racnode1 ~]# vim /etc/sysctl.conf
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048576
fs.aio-max-nr=1048576
Activamos la configuración.
[root@racnode1 ~]# sysctl -p
9.- Configuración de ASMLib
Esta configuración se debe realizar en los dos nodos del RAC.
ASMLib es una libreria que da soporte al ASM software. ASM es el método de almacenamiento que vamos a usar para nuestra BD, almacenaremos los datos (datafiles, redo logs, control files ...), OCR y los voting disks, y la FRA.
No es totalmente necesario el uso de ASMLib, puesto que podríamos usar el "Standard Linux I/O" pero ASMLib se creó para mejorar el rendimiento respecto al Standard Unix I/O Api.
Instalamos el software que previamente hemos descargado de aquí, solo es necesario descargar el oracleasmlib, los otros dos paquetes los instalaremos desde el DVD de instalación.
root@racnode1 /]# cd /media/cdrom/Server
[root@racnode1 Server]# rpm -Uvh oracleasm-support-2.1.3-1.el5.x86_64.rpm
advertencia:oracleasm-support-2.1.3-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando... ########################################### [100%]
1:oracleasm-support ########################################### [100%]
[root@racnode1 Server]# rpm -Uvh oracleasm-2.6.18-164.el5
oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm oracleasm-2.6.18-164.el5xen-2.0.5-1.el5.x86_64.rpm
oracleasm-2.6.18-164.el5debug-2.0.5-1.el5.x86_64.rpm
[root@racnode1 Server]# rpm -Uvh oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm
advertencia:oracleasm-2.6.18-164.el5-2.0.5-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando... ########################################### [100%]
1:oracleasm-2.6.18-164.el########################################### [100%]
[root@racnode1 tmp]# rpm -Uvh /tmp/oracleasmlib-2.0.4-1.el5.x86_64.rpm
advertencia:oracleasmlib-2.0.4-1.el5.x86_64.rpm: CabeceraV3 DSA signature: NOKEY, key ID 1e5e0159
Preparando... ########################################### [100%]
1:oracleasmlib ########################################### [100%]
Configurando ASMLib
Para ver la configuración actual.
[root@racnode1 /]# oracleasm configure
ORACLEASM_ENABLED=false
ORACLEASM_UID=
ORACLEASM_GID=
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""
Para comenzar con la configuración.
[root@racnode1 by-path]# oracleasm configure -i
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: grid
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
Cargamos el módulo del Kernel oracleasm.
[root@racnode1 by-path]# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Mounting ASMlib driver filesystem: /dev/oracleasm
10.- Creando discos ASM para Oracle
Esta configuración solo se debe realizar en uno de los nodos del RAC.
La creación de los discos ASM es necesario hacerla solo en uno de los dos nodos, por ejemplo en el noderac1, en el otro nodo haremos un scandisk para que reconozca los nuevos volúmenes.
Creamos los discos ASM.
[root@racnode1 /]# oracleasm createdisk CRS1 /dev/iscsi/rac-crs1/part1
Writing disk header: done
Instantiating disk: done
[root@racnode1 /]# oracleasm createdisk DATA1 /dev/iscsi/rac-data1/part1
Writing disk header: done
Instantiating disk: done
[root@racnode1 /]# oracleasm createdisk FRA1 /dev/iscsi/rac-fra1/part1
Writing disk header: done
Instantiating disk: done
Escaneamos discos en el segundo nodo.
[root@racnode2]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "DATA1"
Instantiating disk "CRS1"
Instantiating disk "FRA1"
[root@racnode2]# oracleasm listdisks
CRS1
DATA1
FRA1
11.- Tareas Pre-Instalación Oracle Grid Infraestructure
Esta configuración solo se debe realizar en uno de los dos nodos del RAC.
Descargamos el siguiente software desde aquí
Oracle Database 11g Release 2 (11.2.0.1.0) for Linux x86-64
Oracle Grid Infrastructure 11g Release 2 (11.2.0.1.0) for Linux x86-64
Descomprimimos el software de Grid con el usuario grid, y el software de Database con el usuario Oracle.
12.- Tareas Pre-Instalación Oracle Grid Infraestructure
Esta configuración se debe realizar en los dos nodos del RAC.
Es necesario instalar el paquete del sistema operativo cvuqdisk en ambos nodos del RAC. Si no instalamos este paquete la utilidad de verificación del clúster no podrá descubrir los discos compartidos.
Hemos descomprimido el software de grid en la ruta "/home/grid/software".
Instalamos el paquete "cvuqdisk".
[grid@racnode1 software]$ cd grid/rpm
[grid@racnode1 rpm]$ pwd
/home/grid/software/grid/rpm
Copiamos al racnode2 el paquete para instalarlo también.
[grid@racnode1 rpm]$ scp cvuqdisk-1.0.7-1.rpm grid@racnode2:/home/grid
Nos logueamos como root y exportamos la siguiente variable de entorno.
[grid@racnode1 rpm]$ su -
Contraseña:
[root@racnode1 rpm]# export CVUQDISK_GRP=oinstall
[grid@racnode2 ~]$ su -
Contraseña:
[root@racnode2 ~]# cd /home/grid/
[root@racnode2 grid]# export CVUQDISK_GRP=oinstall
[root@racnode1 rpm]# rpm -iv cvuqdisk-1.0.7-1.rpm
Preparando paquetes para la instalación...
cvuqdisk-1.0.7-1
[root@racnode2 grid]# rpm -iv cvuqdisk-1.0.7-1.rpm
Preparando paquetes para la instalación...
cvuqdisk-1.0.7-1
13.- Instalación Oracle Grid Infraestructure for a Cluster
Esta configuración se debe realizar en uno de los dos nodos del RAC.
Antes de empezar con la instalación vamos a hacer un "pequeño truco" para evitar un error al finalizar la instalación. Como estamos haciendo una instalación de test y la vamos a hacer sin ningún servidor DNS o GNS, como se puede ver mas adelante, el instalador al acabar hace una validación y falla. Vamos a hacer una solución un tanto casera, vamos a modificar el nslookup para que piense que el nombre racnode-cluster-scan lo resuelve via servidor dns en lugar de resolverlo via /etc/hosts.
Renombramos el nslookup
[root@racnode1 ~]# mv /usr/bin/nslookup /usr/bin/nslookup.original
Creamos un script que se llama nslookup con el siguiente código. Imaginemos que nuestro servidor DNS es 192.168.1.100
#!/bin/bash
HOSTNAME=${1}
if [[ $HOSTNAME = "racnode-cluster-scan" ]]; then
echo "Server: 192.168.1.100"
echo "Address: 192.168.1.100#53"
echo "Non-authoritative answer:"
echo "Name: racnode-cluster-scan"
echo "Address: 10.0.9.230"
else
/usr/bin/nslookup.original $HOSTNAME
fi
Le damos los permisos correctos.
[root@racnode1 ~]# chmod 755 /usr/bin/nslookup
Comprobamos que lo esta resolviendo correctamente.
[root@racnode1 ~]# nslookup racnode-cluster-scan
Server: 192.168.1.100
Address: 192.168.1.100#53
Non-authoritative answer:
Name: racnode-cluster-scan
Address: 10.0.9.230
Empezamos con la instalación.
[grid@racnode1 grid]$ cd /home/grid/software/grid/
[grid@racnode1 grid]$ export DISPLAY=10.0.0.100:0.0
[grid@racnode1 grid]$ ./runInstaller
Añadimos el racnode2 tal y como se muestra en la imagen, y configuramos el SSH introduciendo la contraseña del usuario grid del sistema operativo.
Identificamos las redes de los nodos como Pública la que es pública y Privada la que se va a destinar para el uso privado.
Creamos un grupo para el CRS con el volumen CRS1 que hemos creado anteriormente. Seleccionamos redundancia externa porque la protección en nuestro caso nos lo proporciona nuestro almacenamiento externo.
Ejecutamos los scripts que nos pide para finalizar con la instalación, en los dos nodos del rac.
[root@racnode1 ~]# /u01/app/oraInventory/orainstRoot.sh
Cambiando permisos de /u01/app/oraInventory.
Agregando permisos de lectura y escritura para el grupo.
Eliminando permisos de lectura, escritura y ejecución para el público.
Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado
[root@racnode2 ~]# /u01/app/oraInventory/orainstRoot.sh
Creando el archivo de punteros del inventario de Oracle (/etc/oraInst.loc)
Cambiando permisos de /u01/app/oraInventory.
Agregando permisos de lectura y escritura para el grupo.
Eliminando permisos de lectura, escritura y ejecución para el público.
Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado
Cambiando el nombre de grupo de /u01/app/oraInventory a oinstall.
La ejecución del archivo de comandos ha terminado
[root@racnode1 Server]# /u01/app/11.2.0/grid/root.sh
Running Oracle 11g root.sh script...
The following environment variables are set as:
ORACLE_OWNER= grid
ORACLE_HOME= /u01/app/11.2.0/grid
Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2012-07-12 16:34:26: Parsing the host name
2012-07-12 16:34:26: Checking for super user privileges
2012-07-12 16:34:26: User has super user privileges
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
root wallet
root wallet cert
root cert export
peer wallet
profile reader wallet
pa wallet
peer wallet keys
pa wallet keys
peer cert request
pa cert request
peer cert
pa cert
peer root cert TP
profile reader root cert TP
pa root cert TP
peer pa cert TP
pa peer cert TP
profile reader pa cert TP
profile reader peer cert TP
peer user cert
pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
CRS-2672: Intentando iniciar ''ora.gipcd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.mdnsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gpnpd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssdmonitor'' en ''racnode1''
CRS-2676: El inicio de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.diskmon'' en ''racnode1''
CRS-2676: El inicio de ''ora.diskmon'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.ctssd'' en ''racnode1''
CRS-2676: El inicio de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente
ASM se ha creado e iniciado correctamente.
El grupo de discos CRS se ha creado correctamente.
clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-2672: Intentando iniciar ''ora.crsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-4256: Updating the profile
Successful addition of voting disk 3ab5ad5212924f10bf919e96d6983692.
Successfully replaced voting disk group with +CRS.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 3ab5ad5212924f10bf919e96d6983692 (ORCL:CRS1) [CRS]
Located 1 voting disk(s).
CRS-2673: Intentando parar ''ora.crsd'' en ''racnode1''
CRS-2677: La parada de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.asm'' en ''racnode1''
CRS-2677: La parada de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.ctssd'' en ''racnode1''
CRS-2677: La parada de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.cssdmonitor'' en ''racnode1''
CRS-2677: La parada de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.cssd'' en ''racnode1''
CRS-2677: La parada de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.gpnpd'' en ''racnode1''
CRS-2677: La parada de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.gipcd'' en ''racnode1''
CRS-2677: La parada de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2673: Intentando parar ''ora.mdnsd'' en ''racnode1''
CRS-2677: La parada de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.mdnsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.mdnsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gipcd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gipcd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.gpnpd'' en ''racnode1''
CRS-2676: El inicio de ''ora.gpnpd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssdmonitor'' en ''racnode1''
CRS-2676: El inicio de ''ora.cssdmonitor'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.cssd'' en ''racnode1''
CRS-2672: Intentando iniciar ''ora.diskmon'' en ''racnode1''
CRS-2676: El inicio de ''ora.diskmon'' en ''racnode1'' se ha realizado correctamente
CRS-2676: El inicio de ''ora.cssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.ctssd'' en ''racnode1''
CRS-2676: El inicio de ''ora.ctssd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.asm'' en ''racnode1''
CRS-2676: El inicio de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.crsd'' en ''racnode1''
CRS-2676: El inicio de ''ora.crsd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.evmd'' en ''racnode1''
CRS-2676: El inicio de ''ora.evmd'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.asm'' en ''racnode1''
CRS-2676: El inicio de ''ora.asm'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.CRS.dg'' en ''racnode1''
CRS-2676: El inicio de ''ora.CRS.dg'' en ''racnode1'' se ha realizado correctamente
CRS-2672: Intentando iniciar ''ora.registry.acfs'' en ''racnode1''
CRS-2676: El inicio de ''ora.registry.acfs'' en ''racnode1'' se ha realizado correctamente
racnode1 2012/07/12 16:38:54 /u01/app/11.2.0/grid/cdata/racnode1/backup_20120712_163854.olr
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
Updating inventory properties for clusterware
Iniciando Oracle Universal Installer...
Comprobando el espacio de intercambio: debe ser mayor que 500 MB. Real 5951 MB Correcto
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList' realizado correctamente.
14.- Comprobaciones sobre la instalación de Grid.
Esta comprobaciones se deben realizar en los dos nodos el RAC.
Check estado CRS.
[grid@racnode1 ~]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
Check de los recursos de Clusterware.
[grid@racnode1 ~]$ crs_stat -t -v
Name Type R/RA F/FT Target State Host
----------------------------------------------------------------------
ora.CRS.dg ora....up.type 0/5 0/ ONLINE ONLINE racnode1
ora....ER.lsnr ora....er.type 0/5 0/ ONLINE ONLINE racnode1
ora....N1.lsnr ora....er.type 0/5 0/0 ONLINE ONLINE racnode1
ora.asm ora.asm.type 0/5 0/ ONLINE ONLINE racnode1
ora.eons ora.eons.type 0/3 0/ ONLINE ONLINE racnode1
ora.gsd ora.gsd.type 0/5 0/ OFFLINE OFFLINE
ora....network ora....rk.type 0/5 0/ ONLINE ONLINE racnode1
ora.oc4j ora.oc4j.type 0/5 0/0 OFFLINE OFFLINE
ora.ons ora.ons.type 0/3 0/ ONLINE ONLINE racnode1
ora....SM1.asm application 0/5 0/0 ONLINE ONLINE racnode1
ora....E1.lsnr application 0/5 0/0 ONLINE ONLINE racnode1
ora....de1.gsd application 0/5 0/0 OFFLINE OFFLINE
ora....de1.ons application 0/3 0/0 ONLINE ONLINE racnode1
ora....de1.vip ora....t1.type 0/0 0/0 ONLINE ONLINE racnode1
ora....SM2.asm application 0/5 0/0 ONLINE ONLINE racnode2
ora....E2.lsnr application 0/5 0/0 ONLINE ONLINE racnode2
ora....de2.gsd application 0/5 0/0 OFFLINE OFFLINE
ora....de2.ons application 0/3 0/0 ONLINE ONLINE racnode2
ora....de2.vip ora....t1.type 0/0 0/0 ONLINE ONLINE racnode2
ora....ry.acfs ora....fs.type 0/5 0/ ONLINE ONLINE racnode1
ora.scan1.vip ora....ip.type 0/0 0/0 ONLINE ONLINE racnode1
Check nodos del cluster.
[grid@racnode1 ~]$ olsnodes -n
racnode1 1
racnode2 2
Check del listener.
[grid@racnode1 ~]$ ps -ef|grep tns
grid 6686 1 0 09:11 ? 00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER_SCAN1 -inherit
grid 7577 1 0 09:24 ? 00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
grid 8833 8644 0 09:32 pts/1 00:00:00 grep tns
grid 30503 1 0 08:44 ? 00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
Confirmación ASM funcionando para CRS.
[grid@racnode1 ~]$ srvctl status asm -a
ASM se está ejecutando en racnode1,racnode2
ASM está activada.
Check Oracle Cluster Registry
[grid@racnode1 ~]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2404
Available space (kbytes) : 259716
ID : 864014600
Device/File Name : +CRS
Device/File integrity check succeeded
Device/File not configured
Device/File not configured
Device/File not configured
Device/File not configured
Cluster registry integrity check succeeded
Logical corruption check bypassed due to non-privileged user
Check voting disk.
[grid@racnode1 ~]$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 9b71f02b34904fb0bf5f6ce2460dd50e (ORCL:CRS1) [CRS]
Located 1 voting disk(s).
Backup de root.sh
Oracle recomienda hacer backup del archivo root.sh por si se instala otro software en la misma ubicación, éste sobreescribiría el root.sh de esta instalación con el de la nueva instalación.
[root@racnode1 ~]# cd /u01/app/11.2.0/grid/
[root@racnode1 grid]# cp root.sh root.sh-BACKUP
[root@racnode2 ~]# cd /u01/app/11.2.0/grid/
[root@racnode2 grid]# cp root.sh root.sh-BACKUP
15.- Creación de volúmenes ASM para la base de datos.
Solo en uno de los dos nodos el RAC.
Con el usuario grid ejecutamos el asistente.
[grid@racnode1 ~]$ asmca &
Pulsamos sobre el botón crear, para crear los nuevos grupos +DATA y +FRA.
Para finalizar pulsamos sobre el botón salir.
16.- Instalación Oracle Database Software.
Solo en uno de los dos nodos el RAC.
Empezamos con la instalación.
[oracle@racnode1 database]$ ./runInstaller
Iniciando Oracle Universal Installer...
Seleccionamos la opción "Base de datos Real Application Clusters", escribimos la contraseña del usuario Oracle, pulsamos sobre "configurar", "probar" y "Siguiente".
Elegimos la versión que queramos para nuestra instalación.
17.- Creación base de datos.
Solo en uno de los dos nodos el RAC.
La creación de la base de datos se lanzará desde uno de los dos nodos del rac, en nuestro caso lo haremos desde el racnode1.
[oracle@racnode1 ~]$ dbca &
Seleccionamos Base de datos Oracle Real Applications Cluster.
Seleccionamos "Personalizar base de datos".
Configuramos el nombre de la BD y el SID, seleccionamos los dos nodos del RAC.
Configuramos los parámetros según el hardware del que disponemos.
Lo personalizamos a nuestro gusto, o según nuestras necesidades, como es una BD de test yo lo dejo todo por defecto.
Terminamos creando la base de datos.
Una vez nos salga la ventana informando que la instalación ha finalizado, ya podremos acceder a nuestra Base de datos con Enterprise Manager.
Ya hemos acabado con la instalación!
18.- Configuración tnsnames.
Solo en el equipo cliente.
Para probar la infraestructura RAC que acabamos de finalizar es necesario que nos configuremos el tnsnames correctamente desde nuestro equipo cliente.
Contra el SCAN.
RACDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode-cluster-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RACDB.test)
))
Directamente contra los Nodos del cluster.
RACDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1522))
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1522))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RACDB.test)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
Es imprescindible que nuestro equipo sea capaz de resolver el nombre del scan, en este caso "racnode-cluster-scan", si no puede resolver este nombre nos aparecerá el error: "ORA-12545: Connect failed because target host or object does not exist".
Un saludo,
Está super bien documentado.
ResponderEliminarGracias!
EliminarFelicitaciones por el excelenet tutorial publicado. He seguido paso a paso las indicaciones de Instalación Oracle RAC 11g + ASM publicada en su blog. La experiencia ha sido muy fructífera por ser el primer acercamiento a las tecnologías de Oracle.
ResponderEliminarEn mi inexperiencia, uno de los inconvientes que se me presentó fue conocer el tamaño de espacio en disco requerido, pues siempre me tocaba aumentar mas el tamaño e iniciar nuevamente con el proceso. Seria ideal complementar con informacion sobre espacio requerido. Me gustaría conocer sobre la forma aconsejable de realizar las pruebas para alta disponibilidad y balanceo de carga tanto en lectura y escritura a la base de datos en diferentes escenarios de fallas, la informacion que he estado consultando es un poco confusa, no es claro las herramientas a usar ni como configurar un equipo cliente.
Hola!!!
EliminarLas primeras pruebas que podrías hacer es conectarte a través de un cliente, ya sea desde consola UNIX con un sqlplus con con un cliente gráfico como SQLDEVELOPER. Configúrate en tu cliente el tnsnames.ora, con esta última parte del post (18), y empieza con pruebas de conexión. Por simplificar diremos que hay dos formas de conectarte, con el primer ejemplo del tnsnames te conectarás a la ip SCAN del cluster, de este modo cuando una instancia del cluster se cae oracle se encarga de balancearte al otro nodo. Si usas el segundo ejemplo de la configuración del tnsnames, es tu cliente el que en caso de caída se encargará de conectar con el otro nodo, de ahí la propiedad FAILOVER_MODE. Una vez ya tengas el cliente configurado prueba a ejecutar selects o cualquier operación contra la base de datos, y tira una de ellas, ya sea con un comando del cluster para bajar una instancia o matándola con un kill -9 al proceso del pmon (ps -ef|grep pmon|grep -v grep|xargs kill -9). Verás como cuando hayas matado una de ellas seguirás funcionando en la otra sin apreciar ninguna interrupción del servicio.
Quiero agradecerte el haberte tomado el tiempo para dedicarlo en hacer esta documentación tan completa. Soy afortunado en haberme podido actualizar en estas tecnologías y a pesar del curso el cual es muy completo, no alcanza el tiempo para poder tener un ambiente de pruebas, con esto podré sacar jugo a lo aprendido. muchas gracias!
ResponderEliminarUno de los Mejores documentos de Implementación..!!!
ResponderEliminarFelicitaciones...!!
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola, soy uno más de los que ha seguidos tu manual, y te solo para agradecerte el esfuerzo realizado.
ResponderEliminarEs un placer encontrarse con este tipo de documentación tan clara y directa.
Saludos.
Hola, soy un poco nuevo implementando esta tecnología, estoy siguiendo tu documentación, pero tengo unas dudas:
ResponderEliminar1. Como te moves al directorio [root@racnode1 Packages]# (creo que hay que instalar algo no estoy seguro)
2. supongo que por lo mismo de arriba no puedo ejectuar este comando crsctl check ctss Me da error Bash: crsctl: Command not found
Agradezco si podes ayudarme Gracias!
Quisiera preguntarle, en este indicas "en nuestro caso como es un sistema para hacer pruebas usaremos para este propósito la tarjeta eth1 que se usa también para el RAC interconnect". Quiero simular un ambiente de produccion y tengo 3 tarjetas de red en cada equipo para hacerlo, ¿En que paso debo configurar el RAC interconnect aprovechando la tarjeta adicional?.
ResponderEliminarMuchas gracias.