Implementación de un sistema de escalabilidad horizontal de SAP HANA con nodo en espera en VM de Azure mediante Azure NetApp Files en SUSE Linux Enterprise Server
En este artículo se describe cómo implementar un sistema SAP HANA de alta disponibilidad en una configuración de escalabilidad horizontal con nodos en espera en VM de Azure mediante Azure NetApp Files para los volúmenes de almacenamiento compartido.
En las configuraciones de ejemplo, como en los comandos de instalación, la instancia de HANA es 03 y el identificador del sistema de HANA es HN1. Los ejemplos se basan en HANA 2.0 SP4 y SUSE Linux Enterprise Server para SAP 12 SP4.
Antes de comenzar, consulte las siguientes notas y documentos de SAP:
- Documentación sobre Azure NetApp Files
- Nota de SAP 1928533, que incluye:
- Una lista de los tamaños de máquina virtual de Azure que se admiten para la implementación de software de SAP
- Información importante sobre la capacidad para los tamaños de máquina virtual de Azure
- Software de SAP admitido y combinaciones de sistema operativo y base de datos
- La versión del kernel de SAP necesaria para Windows y Linux en Microsoft Azure.
- Nota de SAP 2015553: enumera los requisitos previos para las implementaciones de software de SAP admitidas por SAP en Azure.
- Nota de SAP 2205917: configuraciones recomendadas del sistema operativo para SUSE Linux Enterprise Server para SAP Applications.
- Nota de SAP 1944799: contiene guías de SAP para SUSE Linux Enterprise Server para SAP Applications.
- Nota de SAP 2178632: contiene información detallada sobre todas las métricas de supervisión notificadas para SAP en Azure.
- Nota de SAP 2191498: incluye la versión de SAP Host Agent necesaria para Linux en Azure.
- Nota de SAP 2243692: contiene información sobre las licencias de SAP en Linux en Azure.
- Nota de SAP 1984787: contiene información general sobre SUSE Linux Enterprise Server 12.
- Nota de SAP 1999351: contiene información adicional sobre la solución de problemas de la extensión de supervisión mejorada de Azure para SAP.
- Nota de SAP 1900823: incluye información sobre los requisitos de almacenamiento de SAP HANA.
- SAP Community Wiki (wiki de la comunidad de SAP): Contiene todas las notas de SAP que se requieren para Linux.
- Planeación e implementación de Azure Virtual Machines para SAP en Linux
- Implementación de Azure Virtual Machines para SAP en Linux
- Implementación de DBMS de Azure Virtual Machines para SAP en Linux
- Guías de procedimientos recomendados para la alta disponibilidad de SUSE SAP: contiene toda la información necesaria para configurar la alta disponibilidad de NetWeaver y la replicación del sistema local de SAP HANA (para usarse como base de referencia; proporcionan información mucho más detallada).
- Notas de la versión de la Extensión 12 SP3 de alta disponibilidad para SUSE
- Volúmenes NFS v4.1 en Azure NetApp Files para SAP HANA
Información general
Un método para lograr la alta disponibilidad de HANA es mediante la configuración de la conmutación por error automática del host. Para configurar la conmutación por error automática del host, agregue una o más máquinas virtuales al sistema HANA y configúrelas como nodos en espera. Cuando se produce un error en el nodo activo, un nodo en espera toma automáticamente el control. En la configuración presentada con máquinas virtuales de Azure, la conmutación por error automática se consigue mediante NFS en Azure NetApp Files.
Nota
El nodo en espera debe tener acceso a todos los volúmenes de la base de datos. Los volúmenes HANA deben montarse como volúmenes NFSv4. El mecanismo de bloqueo mejorado basado en la concesión de archivos en el protocolo NFSv4 se usa para el vallado I/O
.
Importante
Para compilar la configuración admitida, debe implementar los volúmenes de datos y de registro de HANA como volúmenes NFSv 4.1 y montarlos mediante el protocolo NFSv 4.1. La configuración de conmutación por error automática del host de HANA con nodo en espera no se admite con NFSv3.
En el diagrama anterior, que sigue las recomendaciones de red de SAP HANA, se representan tres subredes dentro de una red virtual de Azure:
- Para la comunicación del cliente
- Para la comunicación con el sistema de almacenamiento
- Para la comunicación interna entre nodos de HANA
Los volúmenes de Azure NetApp están en una subred independiente y delegan a Azure NetApp Files.
En esta configuración de ejemplo, las subredes son:
client
10.23.0.0/24storage
10.23.2.0/24hana
10.23.3.0/24anf
10.23.1.0/26
Configuración de la infraestructura de Azure NetApp Files
Antes de continuar con la configuración de la infraestructura de Azure NetApp Files, familiarícese con la documentación correspondiente.
Azure NetApp Files está disponible en varias regiones de Azure. Compruebe si la región de Azure seleccionada ofrece Azure NetApp Files.
Para obtener información sobre la disponibilidad de Azure NetApp Files según la región de Azure, consulte Disponibilidad de Azure NetApp Files por región de Azure.
Consideraciones importantes
A medida que cree Azure NetApp Files para SAP NetWeaver en la arquitectura de alta disponibilidad de SUSE, tenga en cuenta las consideraciones importantes documentadas en Volúmenes NFS v4.1 en Azure NetApp Files para SAP HANA.
Ajuste del tamaño de la base de datos HANA en Azure NetApp Files
El rendimiento de un volumen de Azure NetApp Files es una función del tamaño del volumen y del nivel de servicio, como se documenta en Nivel de servicio para Azure NetApp Files.
Cuando diseñe la infraestructura para SAP HANA en Azure con Azure NetApp Files, tenga en cuenta las recomendaciones de Volúmenes NFS v4.1 en Azure NetApp Files para SAP HANA.
La configuración de este artículo se presenta con volúmenes de Azure NetApp Files simples.
Importante
En el caso de los sistemas de producción, donde el rendimiento es una clave, se recomienda evaluar y considerar el uso de un grupo de volúmenes de aplicación de Azure NetApp Files para SAP HANA.
Implementación de recursos de Azure NetApp Files
En las siguientes instrucciones se supone que ya ha implementado la red virtual de Azure. Los recursos de Azure NetApp Files y las VM en las que esos recursos se montarán se deben implementar en la misma red virtual de Azure o en redes virtuales de Azure emparejadas.
Cree una cuenta de NetApp en la región de Azure seleccionada. Para ello, siga las instrucciones en Creación de una cuenta de NetApp.
Configure el grupo de capacidad de Azure NetApp Files según disponibles en Configuración en un grupo de capacidad de Azure NetApp Files.
La arquitectura de HANA que se presenta en este artículo utiliza un único grupo de capacidad de Azure NetApp Files, el nivel de servicio Ultra. Para las cargas de trabajo HANA en Azure, se recomienda usar el nivel de servicio Ultra o Premium de Azure NetApp Files.
Delegue una subred en Azure NetApp Files tal como se describe en las instrucciones de Delegación de una subred en Azure NetApp Files.
Implemente los volúmenes de Azure NetApp Files según las instrucciones de Creación de un volumen de NFS para Azure NetApp Files.
Cuando vaya a implementar los volúmenes, asegúrese de seleccionar la versión NFSv 4.1. Actualmente, para acceder a NFSv 4.1 es necesario agregarlo a una lista de permitidos. Implemente los volúmenes en la subred de Azure NetApp Files designada. Las direcciones IP de los volúmenes de Azure NetApp se asignan automáticamente.
Tenga en cuenta que los recursos de Azure NetApp Files y las VM de Azure deben estar en la misma red virtual de Azure o en redes virtuales de Azure emparejadas. Por ejemploHN1-data-mnt00001, HN1-log-mnt00001, etc. son los nombres de los volúmenes y nfs://10.23.1.5/HN1-data-mnt00001, nfs://10.23.1.4/HN1-log-mnt00001, etc. son las rutas de acceso para los volúmenes de Azure NetApp Files.
- volumen HN1-data-mnt00001 (nfs://10.23.1.5/HN1-data-mnt00001)
- volumen HN1-data-mnt00002 (nfs://10.23.1.6/HN1-data-mnt00002)
- volumen HN1-log-mnt00001 (nfs://10.23.1.4/HN1-log-mnt00001)
- volumen HN1-log-mnt00002 (nfs://10.23.1.6/HN1-log-mnt00002)
- volumen HN1-shared (nfs://10.23.1.4/HN1-shared)
En este ejemplo, usamos instancias de Azure NetApp Files independientes para cada volumen de datos y registro de HANA. Para una configuración optimizada para costo en sistemas más pequeños o no productivos, es posible colocar todos los montajes de datos y todos los montajes de registros en un único volumen.
Implementación de máquinas virtuales Linux en Azure Portal
Primero deberá crear los volúmenes de Azure NetApp Files. Luego, siga estos pasos:
Cree las subredes de la red virtual de Azure en la red virtual de Azure.
Implemente las VM.
Cree las interfaces de red adicionales y conecte las interfaces de red a las VM correspondientes.
Cada máquina virtual tiene tres interfaces de red, que corresponden a las tres subredes de la red virtual de Azure (
client
,storage
yhana
).Para más información, consulte Creación de una máquina virtual Linux en Azure con varias tarjetas de interfaz de red.
Importante
Para las cargas de trabajo de SAP HANA, una baja latencia resulta fundamental. Para lograr una baja latencia, trabaje con su representante de Microsoft para asegurarse de que las máquinas virtuales y los volúmenes de Azure NetApp Files se implementen en ubicaciones muy cercanas entre sí. Envíe la información necesaria al incorporar un nuevo sistema SAP HANA, que usa Azure NetApp Files de SAP HANA.
En las instrucciones siguientes, se supone que ya ha creado el grupo de recursos, la red virtual de Azure y las tres subredes de la red virtual de Azure: client
, storage
y hana
. Al implementar las máquinas virtuales, seleccione la subred de cliente, de modo que la interfaz de red de cliente sea la interfaz principal de las VM. También tendrá que configurar una ruta explícita a la subred delegada de Azure NetApp Files mediante la puerta de enlace de la subred de almacenamiento.
Importante
Asegúrese de que el sistema operativo seleccionado esté certificado por SAP para SAP HANA en los tipos específicos de VM que use. Para obtener una lista de los tipos de VM certificados para SAP HANA y las versiones de sistema operativo correspondientes, consulte el sitio Plataformas de IaaS certificadas para SAP HANA. Haga clic en los detalles del tipo de VM de la lista para obtener la lista completa de las versiones de sistema operativo compatibles con SAP HANA para ese tipo.
Cree un conjunto de disponibilidad para SAP HANA. Asegúrese de establecer el dominio máximo de actualización.
Cree tres máquinas virtuales (hanadb1, hanadb2, hanadb3). Para ello, haga lo siguiente:
a. Use una imagen SLES4SAP en la galería de Azure que sea compatible con SAP HANA.
b. Seleccione el conjunto de disponibilidad que creó anteriormente para SAP HANA.
c. Seleccione la subred de la red virtual de Azure del cliente. Seleccione Accelerated Networking.
Al implementar las máquinas virtuales, el nombre de la interfaz de red se genera automáticamente. Para simplificar, en estas instrucciones haremos referencia a las interfaces de red generadas automáticamente, que están conectadas a la subred de la red virtual de Azure del cliente, como hanadb1-client, hanadb2-client y hanadb3-client.
Cree tres interfaces de red, una para cada máquina virtual, para la subred de la red virtual
storage
(en este ejemplo hanadb1-storage, hanadb2-storage y hanadb3-storage).Cree tres interfaces de red, una para cada máquina virtual, para la subred de red virtual
hana
(en este ejemplo hanadb1-hana, hanadb2-hana y hanadb3-hana).Conecte las interfaces de red virtual recién creadas a las máquinas virtuales correspondientes. Para ello, siga estos pasos:
- Vaya a la máquina virtual en Azure Portal.
- En el menú de la izquierda, seleccione Máquinas virtuales. Filtre por el nombre de máquina virtual (por ejemplo, hanadb1) y luego seleccione la máquina virtual.
- En el panel Información general, seleccione Detener para desasignar la máquina virtual.
- Seleccione Redes y adjunte la interfaz de red. En la lista desplegable Adjuntar interfaz de red, seleccione las interfaces de red ya creadas para las subredes
storage
yhana
. - Seleccione Guardar.
- Repita los pasos del b al e para las demás máquinas virtuales (en nuestro ejemplo, hanadb2 y hanadb3).
- Deje las máquinas virtuales en estado detenido por ahora. A continuación, habilitaremos la opción Redes aceleradas para todas las interfaces de red que se acaban de conectar.
Habilite redes aceleradas para las interfaces de red adicionales de las subredes
storage
yhana
. Para ello, siga estos pasos:Abra Azure Cloud Shell en Azure Portal.
Ejecute los siguientes comandos para habilitar las redes aceleradas para las interfaces de red adicionales, conectadas a las subredes
storage
yhana
.az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb1-storage --accelerated-networking true az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb2-storage --accelerated-networking true az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb3-storage --accelerated-networking true az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb1-hana --accelerated-networking true az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb2-hana --accelerated-networking true az network nic update --id /subscriptions/your subscription/resourceGroups/your resource group/providers/Microsoft.Network/networkInterfaces/hanadb3-hana --accelerated-networking true
Inicie las máquinas virtuales. Para ello, siga estos pasos:
- En el menú de la izquierda, seleccione Máquinas virtuales. Filtre por el nombre de máquina virtual (por ejemplo, hanadb1) y luego seleccione la máquina virtual.
- En el panel Información general, seleccione Iniciar.
Configuración y preparación del sistema operativo
Las instrucciones de las secciones siguientes tienen como prefijo una de las siguientes opciones:
- [A] : Aplicable a todos los nodos
- [1] : Aplicable solo al nodo 1
- [2] : Aplicable solo al nodo 2
- [3] : aplicable solo al nodo 3
Configure y prepare el sistema operativo. Para ello, siga estos pasos:
[A] Mantenga los archivos de host en las máquinas virtuales. Incluya las entradas para todas las subredes. En este ejemplo se agregaron las siguientes entradas a
/etc/hosts
.# Storage 10.23.2.4 hanadb1-storage 10.23.2.5 hanadb2-storage 10.23.2.6 hanadb3-storage # Client 10.23.0.5 hanadb1 10.23.0.6 hanadb2 10.23.0.7 hanadb3 # Hana 10.23.3.4 hanadb1-hana 10.23.3.5 hanadb2-hana 10.23.3.6 hanadb3-hana
[A] Cambie los valores de configuración de DHCP y de la nube para la interfaz de red a fin de evitar cambios de nombre de host imprevistos.
En las instrucciones siguientes se presupone que la interfaz de red de almacenamiento es
eth1
.vi /etc/sysconfig/network/dhcp # Change the following DHCP setting to "no" DHCLIENT_SET_HOSTNAME="no" vi /etc/sysconfig/network/ifcfg-eth1 # Edit ifcfg-eth1 #Change CLOUD_NETCONFIG_MANAGE='yes' to "no" CLOUD_NETCONFIG_MANAGE='no'
[A] Agregue una ruta de red, de modo que la comunicación con Azure NetApp Files pase a través de la interfaz de red de almacenamiento.
En las instrucciones siguientes se presupone que la interfaz de red de almacenamiento es
eth1
.vi /etc/sysconfig/network/ifroute-eth1 # Add the following routes # RouterIPforStorageNetwork - - - # ANFNetwork/cidr RouterIPforStorageNetwork - - 10.23.2.1 - - - 10.23.1.0/26 10.23.2.1 - -
Reinicie la máquina virtual para activar los cambios.
[A] Prepare el sistema operativo para ejecutar SAP HANA en sistemas NetApp con NFS, tal y como se describe en la nota de SAP 3024346 - Configuración de Linux Kernel para NetApp NFS. Cree el archivo de configuración /etc/sysctl.d/91-NetApp-HANA.conf para la configuración de NetApp.
vi /etc/sysctl.d/91-NetApp-HANA.conf # Add the following entries in the configuration file net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 131072 16777216 net.ipv4.tcp_wmem = 4096 16384 16777216 net.core.netdev_max_backlog = 300000 net.ipv4.tcp_slow_start_after_idle=0 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1
[A] Cree el archivo de configuración /etc/sysctl.d/MS-AZ.conf con las opciones de configuración de Microsoft para Azure.
vi /etc/sysctl.d/ms-az.conf # Add the following entries in the configuration file net.ipv6.conf.all.disable_ipv6 = 1 net.ipv4.tcp_max_syn_backlog = 16348 net.ipv4.conf.all.rp_filter = 0 sunrpc.tcp_slot_table_entries = 128 vm.swappiness=10
[SUGERENCIA] Evite establecer net.ipv4.ip_local_port_range y net.ipv4.ip_local_reserved_ports explícitamente en los archivos de configuración de sysctl para permitir que el agente de host de SAP administre los intervalos de puertos. Consulte la nota de SAP 2382421 para más información.
[A] Ajuste la configuración de sunrpc para los volúmenes NFSv3, como se recomienda en la nota de SAP 3024346 - Configuración de Linux Kernel para NetApp NFS.
vi /etc/modprobe.d/sunrpc.conf # Insert the following line options sunrpc tcp_max_slot_table_entries=128
Montaje de los volúmenes de Azure NetApp Files
[A] Cree puntos de montaje para los volúmenes de bases de datos HANA.
mkdir -p /hana/data/HN1/mnt00001 mkdir -p /hana/data/HN1/mnt00002 mkdir -p /hana/log/HN1/mnt00001 mkdir -p /hana/log/HN1/mnt00002 mkdir -p /hana/shared mkdir -p /usr/sap/HN1
[1] Cree directorios específicos de nodo para /usr/sap en el recurso compartido HN1.
# Create a temporary directory to mount HN1-shared mkdir /mnt/tmp # if using NFSv3 for this volume, mount with the following command mount 10.23.1.4:/HN1-shared /mnt/tmp # if using NFSv4.1 for this volume, mount with the following command mount -t nfs -o sec=sys,nfsvers=4.1 10.23.1.4:/HN1-shared /mnt/tmp cd /mnt/tmp mkdir shared usr-sap-hanadb1 usr-sap-hanadb2 usr-sap-hanadb3 # unmount /hana/shared cd umount /mnt/tmp
[A] Compruebe la configuración del dominio NFS. Asegúrese de que el dominio esté configurado como dominio predeterminado de Azure NetApp Files, es decir,
defaultv4iddomain.com
y que la asignación se haya establecido en nobody.Importante
Asegúrese de establecer el dominio NFS de
/etc/idmapd.conf
en la máquina virtual para que coincida con la configuración de dominio predeterminada en Azure NetApp Files:defaultv4iddomain.com
. Si hay alguna discrepancia entre la configuración de dominio del cliente NFS (es decir, la máquina virtual) y el servidor NFS (es decir la configuración de Azure NetApp), los permisos de archivos en volúmenes de Azure NetApp que estén montados en las máquinas virtuales se mostrarán comonobody
.sudo cat /etc/idmapd.conf # Example [General] Verbosity = 0 Pipefs-Directory = /var/lib/nfs/rpc_pipefs Domain = defaultv4iddomain.com [Mapping] Nobody-User = nobody Nobody-Group = nobody
[A] Compruebe
nfs4_disable_idmapping
. Debe establecerse en S. Para crear la estructura de directorio en la que se encuentranfs4_disable_idmapping
, ejecute el comando mount. No podrá crear manualmente el directorio en /sys/modules, ya que el acceso está reservado para el kernel o los controladores.# Check nfs4_disable_idmapping cat /sys/module/nfs/parameters/nfs4_disable_idmapping # If you need to set nfs4_disable_idmapping to Y mkdir /mnt/tmp mount 10.23.1.4:/HN1-shared /mnt/tmp umount /mnt/tmp echo "Y" > /sys/module/nfs/parameters/nfs4_disable_idmapping # Make the configuration permanent echo "options nfs nfs4_disable_idmapping=Y" >> /etc/modprobe.d/nfs.conf
[A] Cree el grupo de SAP HANA y el usuario manualmente. Los identificadores del grupo hn1adm del usuario y de sapsys deben establecerse en los mismos identificadores que se proporcionan durante la incorporación. (En este ejemplo, los identificadores se establecen en 1001). Si los identificadores no se configuran correctamente, no podrá acceder a los volúmenes. Los identificadores del grupo sapsys y las cuentas de usuario hn1adm y sapadm deben ser los mismos en todas las máquinas virtuales.
# Create user group sudo groupadd -g 1001 sapsys # Create users sudo useradd hn1adm -u 1001 -g 1001 -d /usr/sap/HN1/home -c "SAP HANA Database System" -s /bin/sh sudo useradd sapadm -u 1002 -g 1001 -d /home/sapadm -c "SAP Local Administrator" -s /bin/sh # Set the password for both user ids sudo passwd hn1adm sudo passwd sapadm
[A] Monte los volúmenes de Azure NetApp Files compartidos.
sudo vi /etc/fstab # Add the following entries 10.23.1.5:/HN1-data-mnt00001 /hana/data/HN1/mnt00001 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 10.23.1.6:/HN1-data-mnt00002 /hana/data/HN1/mnt00002 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 10.23.1.4:/HN1-log-mnt00001 /hana/log/HN1/mnt00001 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 10.23.1.6:/HN1-log-mnt00002 /hana/log/HN1/mnt00002 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 10.23.1.4:/HN1-shared/shared /hana/shared nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 # Mount all volumes sudo mount -a
En el caso de las cargas de trabajo, que requieren un mayor rendimiento, considere la posibilidad de usar la opción de montaje
nconnect
, como se describe en Volúmenes NFS v4.1 en Azure NetApp Files para SAP HANA. Compruebe sinconnect
es compatible con Azure NetApp Files en la versión de Linux.[1] Monte los volúmenes específicos del nodo en hanadb1.
sudo vi /etc/fstab # Add the following entries 10.23.1.4:/HN1-shared/usr-sap-hanadb1 /usr/sap/HN1 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 # Mount the volume sudo mount -a
[2] Monte los volúmenes específicos del nodo en hanadb2.
sudo vi /etc/fstab # Add the following entries 10.23.1.4:/HN1-shared/usr-sap-hanadb2 /usr/sap/HN1 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 # Mount the volume sudo mount -a
[3] Monte los volúmenes específicos del nodo en hanadb3.
sudo vi /etc/fstab # Add the following entries 10.23.1.4:/HN1-shared/usr-sap-hanadb3 /usr/sap/HN1 nfs rw,nfsvers=4.1,hard,timeo=600,rsize=262144,wsize=262144,noatime,lock,_netdev,sec=sys 0 0 # Mount the volume sudo mount -a
[A] Compruebe que todos los volúmenes de HANA estén montados con la versión del protocolo NFS NFSv4.1.
sudo nfsstat -m # Verify that flag vers is set to 4.1 # Example from hanadb1 /hana/data/HN1/mnt00001 from 10.23.1.5:/HN1-data-mnt00001 Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.5 /hana/log/HN1/mnt00002 from 10.23.1.6:/HN1-log-mnt00002 Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.6 /hana/data/HN1/mnt00002 from 10.23.1.6:/HN1-data-mnt00002 Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.6 /hana/log/HN1/mnt00001 from 10.23.1.4:/HN1-log-mnt00001 Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.4 /usr/sap/HN1 from 10.23.1.4:/HN1-shared/usr-sap-hanadb1 Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.4 /hana/shared from 10.23.1.4:/HN1-shared/shared Flags: rw,noatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.23.2.4,local_lock=none,addr=10.23.1.4
Instalación
En este ejemplo para implementar SAP HANA en la configuración de escalabilidad horizontal con un nodo en espera con Azure, usamos HANA 2.0 SP4.
Preparación de la instalación de HANA
[A] Antes de realizar la instalación de HANA, establezca la contraseña raíz. Puede deshabilitar la contraseña raíz una vez completada la instalación. Ejecute como
passwd
del comandoroot
.[1] Compruebe que puede iniciar sesión a través de SSH en hanadb2 y hanadb3, sin que se le pida una contraseña.
ssh root@hanadb2 ssh root@hanadb3
[A] Instale paquetes adicionales, necesarios para HANA 2.0 SP4. Para más información, consulte la nota de SAP 2593824.
sudo zypper install libgcc_s1 libstdc++6 libatomic1
[2], [3] Cambie la propiedad de los directorios
data
ylog
de SAP HANA a hn1adm.# Execute as root sudo chown hn1adm:sapsys /hana/data/HN1 sudo chown hn1adm:sapsys /hana/log/HN1
Instalación de HANA
[1] Instale SAP HANA. Para ello, siga las instrucciones de la guía de instalación y actualización de SAP HANA 2.0. En este ejemplo, se instala la escalabilidad horizontal de SAP HANA con el nodo maestro, un nodo de trabajo y uno en espera.
Inicie el programa hdblcm desde el directorio de software de instalación de HANA. Use el parámetro
internal_network
y pase el espacio de direcciones a la subred que se usa para la comunicación interna entre nodos de HANA../hdblcm --internal_network=10.23.3.0/24
Escriba los siguientes valores en el símbolo del sistema:
- En Elegir una acción: escriba 1 (para la instalación)
- En Additional components for installation (Componentes adicionales para la instalación): especifique 2, 3
- Para la ruta de instalación: presione Entrar (el valor predeterminado es/Hana/Shared).
- En Local Host Name (Nombre de host local): presione Entrar para aceptar el valor predeterminado.
- En Do you want to add hosts to the system? (¿Desea agregar hosts al sistema): escriba y.
- En comma-separated host names to add (nombres de host separados por comas que se deben agregar): escriba hanadb2, hanadb3
- En Root User Name (Nombre de usuario raíz) [raíz]: presione Entrar para aceptar el valor predeterminado.
- En Root User Password (Contraseña de usuario raíz): escriba la contraseña del usuario raíz.
- Para los roles de host hanadb2: escriba 1 (para el rol de trabajo)
- En Host Failover Group (Grupo de conmutación por error de host) para el host hanadb2 [valor predeterminado]: presione Entrar para aceptar el valor predeterminado.
- En Número de partición de almacenamiento for host hanadb2 [<<asignar automáticamente>>]: presione Entrar para aceptar el valor predeterminado
- En Worker Group (Grupo de roles de trabajo) para el host hanadb2 [valor predeterminado]: presione Entrar para aceptar el valor predeterminado.
- En Select roles (Seleccionar roles) para host hanadb3: escriba 2 (para el modo de espera).
- En Host Failover Group (Grupo de conmutación por error de host) para el host hanadb3 [valor predeterminado]: presione Entrar para aceptar el valor predeterminado.
- En Worker Group (Grupo de roles de trabajo) para el host hanadb3 [valor predeterminado]: presione Entrar para aceptar el valor predeterminado.
- En SAP HANA ID (Id. de SAP HANA) del sistema: escriba HN1.
- En Instance number (Número de instancia) [00]: escriba 03.
- En Local Host Worker Group (Grupo de trabajo de host local) [valor predeterminado]: presione Entrar para aceptar el valor predeterminado.
- En Select System Usage / Enter index [4] (Seleccionar uso del sistema o especificar el índice [4]): escriba 4 (para personalizar).
- En Location of Data Volumes (Ubicación de los volúmenes de datos) [/hana/data/HN1]: presione Entrar para aceptar el valor predeterminado.
- En Location of Log Volumes (Ubicación de los volúmenes de registro) [/hana/log/HN1]: presione Entrar para aceptar el valor predeterminado.
- En Restrict maximum memory allocation? [n]: escriba n
- En Certificate Host Name For Host hanadb1 (Nombre de host del certificado para el host hanadb1) [hanadb1]: presione Entrar para aceptar el valor predeterminado.
- En Certificate Host Name For Host hanadb2 (Nombre de host del certificado para el host hanadb2) [hanadb2]: presione Entrar para aceptar el valor predeterminado.
- En Certificate Host Name For hanadb3 (Nombre de host del certificado para el host hanadb3) [hanadb3]: presione Entrar para aceptar el valor predeterminado.
- En System Administrator (hn1adm) Password (Contraseña del administrador del sistema (hn1adm)): escriba la contraseña.
- En System Database User (system) Password (Contraseña de usuario de base de datos del sistema (sistema)): escriba la contraseña del sistema.
- En Confirm System Database User (system) Password (Confirmar la contraseña del usuario (sistema) de la base de datos del sistema): escriba la contraseña del sistema.
- En ¿Reiniciar el sistema tras el reinicio de la máquina? [n]: escriba n
- En Do you want to continue (y/n) (¿Desea continuar (sí/no)?): valide el resumen y, si todo es correcto, especifique s.
[1] Compruebe global.ini.
Muestre global.ini y asegúrese de que la configuración de la comunicación interna entre nodos de SAP HANA esté presente. Compruebe la sección de communication. Debe tener el espacio de direcciones para la subred
hana
, ylisteninterface
debe estar establecido en.internal
. Compruebe la sección internal_hostname_resolution. Debe tener las direcciones IP de las máquinas virtuales de HANA que pertenezcan a la subredhana
.sudo cat /usr/sap/HN1/SYS/global/hdb/custom/config/global.ini # Example #global.ini last modified 2019-09-10 00:12:45.192808 by hdbnameserve [communication] internal_network = 10.23.3/24 listeninterface = .internal [internal_hostname_resolution] 10.23.3.4 = hanadb1 10.23.3.5 = hanadb2 10.23.3.6 = hanadb3
[1] Agregue la asignación de host para asegurarse de que las direcciones IP del cliente se utilizan para la comunicación del cliente. Agregue la sección
public_host_resolution
y agregue las direcciones IP correspondientes de la subred del cliente.sudo vi /usr/sap/HN1/SYS/global/hdb/custom/config/global.ini #Add the section [public_hostname_resolution] map_hanadb1 = 10.23.0.5 map_hanadb2 = 10.23.0.6 map_hanadb3 = 10.23.0.7
[1] Reinicie SAP HANA para activar los cambios.
sudo -u hn1adm /usr/sap/hostctrl/exe/sapcontrol -nr 03 -function StopSystem HDB sudo -u hn1adm /usr/sap/hostctrl/exe/sapcontrol -nr 03 -function StartSystem HDB
[1] Compruebe que la interfaz de cliente utilizará las direcciones IP de la subred
client
para la comunicación.sudo -u hn1adm /usr/sap/HN1/HDB03/exe/hdbsql -u SYSTEM -p "password" -i 03 -d SYSTEMDB 'select * from SYS.M_HOST_INFORMATION'|grep net_publicname # Expected result "hanadb3","net_publicname","10.23.0.7" "hanadb2","net_publicname","10.23.0.6" "hanadb1","net_publicname","10.23.0.5"
Para más información sobre cómo comprobar la configuración, consulte la nota de SAP 2183363 - Configuration of SAP HANA internal network (Configuración de la red interna de SAP HANA).
Para optimizar SAP HANA para el almacenamiento de Azure NetApp Files subyacente, establezca los siguientes parámetros de SAP HANA:
max_parallel_io_requests
128async_read_submit
activadoasync_write_submit_active
activadoasync_write_submit_blocks
todo
Para más información, consulte Configuración de pila de E/S para SAP HANA.
A partir de los sistemas SAP HANA 2.0, puede establecer los parámetros en
global.ini
. Para más información, consulte la nota de SAP 1999930.En el caso de los sistemas SAP HANA 1.0, en las versiones SPS12 y anteriores, estos parámetros se pueden establecer durante la instalación, tal y como se describe en la nota de SAP 2267798.
El almacenamiento que usa Azure NetApp Files tiene un límite de tamaño de archivo de 16 terabytes (TB). SAP HANA no es consciente implícitamente de la limitación de almacenamiento y no creará automáticamente un nuevo archivo de datos cuando se alcance el límite de tamaño de archivo de 16 TB. Cuando SAP HANA intente aumentar el tamaño del archivo más allá de 16 TB, se producirán errores y finalmente se bloqueará el servidor de índice.
Importante
Para evitar que SAP HANA intente aumentar los archivos de datos más allá del límite de 16 TB del subsistema de almacenamiento, establezca los parámetros siguientes en
global.ini
.
Prueba de la conmutación por error de SAP HANA
Nota:
Este artículo contiene referencias a términos que Microsoft ya no utiliza. Cuando se eliminen estos términos del software, se eliminarán también de este artículo.
Haga una simulación del bloqueo de nodos en un nodo de trabajo de SAP HANA. Haga lo siguiente:
Antes de simular el bloqueo del nodo, ejecute los siguientes comandos como hn1adm para capturar el estado del entorno:
# Check the landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | ok | | | 1 | 1 | default | default | master 1 | master | worker | master | worker | worker | default | default | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | yes | ignore | | | 0 | 0 | default | default | master 3 | slave | standby | standby | standby | standby | default | - | # Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GREEN
Para simular un bloqueo de nodo, ejecute el siguiente comando como raíz en el nodo de trabajo, que en este caso es hanadb2:
echo b > /proc/sysrq-trigger
Supervise el sistema para la finalización de la conmutación por error. Cuando se haya completado la conmutación por error, capture el estado, que debería tener el aspecto siguiente:
# Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GREEN hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GRAY # Check the landscape status /usr/sap/HN1/HDB03/exe/python_support> python landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | ok | | | 1 | 1 | default | default | master 1 | master | worker | master | worker | worker | default | default | | hanadb2 | no | info | | | 2 | 0 | default | default | master 2 | slave | worker | standby | worker | standby | default | - | | hanadb3 | yes | info | | | 0 | 2 | default | default | master 3 | slave | standby | slave | standby | worker | default | default |
Importante
Cuando un nodo experimenta un estado de pánico del kernel, para evitar retrasos con la conmutación por error de SAP HANA, establezca
kernel.panic
en 20 segundos en todas las máquinas virtuales de HANA. La configuración está terminada en/etc/sysctl
. Reinicie las máquinas virtuales para activar el cambio. Si no se realiza este cambio, la conmutación por error puede tardar 10 minutos o más cuando un nodo está experimentando un estado de pánico del kernel.
Termine el servidor de nombres. Para ello, haga lo siguiente:
Antes de la prueba, ejecute los siguientes comandos como hn1adm para comprobar el estado del entorno:
#Landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | ok | | | 1 | 1 | default | default | master 1 | master | worker | master | worker | worker | default | default | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | no | ignore | | | 0 | 0 | default | default | master 3 | slave | standby | standby | standby | standby | default | - | # Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GRAY
Ejecute los siguientes comandos como hn1adm en el nodo principal activo, que en este caso es hanadb1:
hn1adm@hanadb1:/usr/sap/HN1/HDB03> HDB kill
El nodo en espera hanadb3 asumirá el control como nodo maestro. Este es el estado de los recursos una vez completada la prueba de conmutación por error:
# Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GRAY hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GREEN # Check the landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | no | info | | | 1 | 0 | default | default | master 1 | slave | worker | standby | worker | standby | default | - | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | yes | info | | | 0 | 1 | default | default | master 3 | master | standby | master | standby | worker | default | default |
Reinicie la instancia de HANA en hanadb1, es decir, en la misma máquina virtual donde se ha terminado el servidor de nombres. El nodo hanadb1 volverá a unirse al entorno y mantendrá su rol de nodo en espera.
hn1adm@hanadb1:/usr/sap/HN1/HDB03> HDB start
Después de que se haya iniciado SAP HANA en hanadb1, espere el siguiente estado:
# Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GREEN # Check the landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | info | | | 1 | 0 | default | default | master 1 | slave | worker | standby | worker | standby | default | - | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | yes | info | | | 0 | 1 | default | default | master 3 | master | standby | master | standby | worker | default | default |
Ahora, vuelva a terminar el servidor de nombres en el nodo maestro actualmente activo, es decir, en el nodo hanadb3.
hn1adm@hanadb3:/usr/sap/HN1/HDB03> HDB kill
El nodo hanadb1 reanudará el rol del nodo maestro. Una vez completada la prueba de conmutación por error, el estado tendrá el aspecto siguiente:
# Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList & python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GRAY # Check the landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | ok | | | 1 | 1 | default | default | master 1 | master | worker | master | worker | worker | default | default | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | no | ignore | | | 0 | 0 | default | default | master 3 | slave | standby | standby | standby | standby | default | - |
Inicie SAP HANA en hanadb3, que estará preparado para funcionar como nodo en espera.
hn1adm@hanadb3:/usr/sap/HN1/HDB03> HDB start
Una vez que SAP HANA se haya iniciado en hanadb3, el estado tiene el aspecto siguiente:
# Check the instance status sapcontrol -nr 03 -function GetSystemInstanceList & python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus GetSystemInstanceList OK hostname, instanceNr, httpPort, httpsPort, startPriority, features, dispstatus hanadb1, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb2, 3, 50313, 50314, 0.3, HDB|HDB_WORKER, GREEN hanadb3, 3, 50313, 50314, 0.3, HDB|HDB_STANDBY, GRAY # Check the landscape status python /usr/sap/HN1/HDB03/exe/python_support/landscapeHostConfiguration.py | Host | Host | Host | Failover | Remove | Storage | Storage | Failover | Failover | NameServer | NameServer | IndexServer | IndexServer | Host | Host | Worker | Worker | | | Active | Status | Status | Status | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | Config | Actual | | | | | | | Partition | Partition | Group | Group | Role | Role | Role | Role | Roles | Roles | Groups | Groups | | ------- | ------ | ------ | -------- | ------ | --------- | --------- | -------- | -------- | ---------- | ---------- | ----------- | ----------- | ------- | ------- | ------- | ------- | | hanadb1 | yes | ok | | | 1 | 1 | default | default | master 1 | master | worker | master | worker | worker | default | default | | hanadb2 | yes | ok | | | 2 | 2 | default | default | master 2 | slave | worker | slave | worker | worker | default | default | | hanadb3 | no | ignore | | | 0 | 0 | default | default | master 3 | slave | standby | standby | standby | standby | default | - |
Pasos siguientes
- Planeamiento e implementación de Azure Virtual Machines para SAP
- Implementación de Azure Virtual Machines para SAP
- Implementación de DBMS de Azure Virtual Machines para SAP
- Volúmenes NFS v4.1 en Azure NetApp Files para SAP HANA
- Para más información sobre cómo establecer la alta disponibilidad y planear la recuperación ante desastres de SAP HANA en VM de Azure, consulte Alta disponibilidad de SAP HANA en Azure Virtual Machines (VM).