Amélioration de la haute disponibilité dans HCL Commerce avec IBM Db2 HADR

Vous pouvez activer IBM Db2 HADR pour garantir l'accès de votre site HCL Commerce aux clients en cas de pannes de la base de données ou d'arrêts planifiés. La fonction HADR permet aussi de récupérer les données métier moyennant seulement un minimum d'interruptions de votre site.

Procedure

  1. Activez la reprise à haut niveau de disponibilité après incident dans votre base de données IBM Db2.
  2. Activez IBM Db2 Automatic Client Rerouting (ACR) dans HCL Commerce.
    Assurez-vous que les données sont conservées dans vos conteneurs Docker en définissant des propriétés personnalisées dans vos sources de données de transaction et de recherche. Dans le cas d'un scénario de prise de contrôle HADR, cela vous permettra de passer de façon transparente d'une base de données principale à une base de données en veille. Les propriétés personnalisées à mettre à jour, qui activeront IBM Db2 ACR pour les conteneurs de transactions et de recherche, sont les suivantes :
    • clientRouteAlternateServerName (elle est obligatoire),
    • clientRerouteAlternatePortNumber (obligatoire),
    • maxRetriesForClientReoute (facultative) et
    • retryIntervalForClientReoute (facultative).
      Note: L'intervalle entre les nouvelles tentatives de réacheminement du client est mesuré en secondes.
    Ajoutez ces variables et leurs valeurs au fichier de configuration approprié à votre environnement (vos fichiers de configuration peuvent être des fichiers YAML, des chartes Helm ou des fichiers de propriétés XML). Lors du déploiement Docker, la commande qui génère le conteneur utilise ces valeurs comme arguments pour ses propres scripts afin de définir les propriétés personnalisées ci-dessus.
    1. Le Transaction server Docker container est dérivé de l'architecture WebSphere Application Server. Par conséquent, lorsque vous déployez un nouveau conteneur Docker, utilisez le script wsadmin pour mettre à jour les propriétés ci-dessus. Pour plus d'informations, voir l'outil wsadmin dans WebSphere Application Server Knowledge Center.
    2. La transaction de recherche est dérivée de l'architecture du serveur WebSphere Application Server V8.5.5 Liberty. Liberty est configuré à l'aide de fichiers XML, avec des connexions de base de données configurées dans le fichier datasource.xml. Lorsque vous déployez un nouveau conteneur Docker, mettez à jour ce fichier (par programme) pour ajouter les propriétés ci-dessus pour le réacheminement automatique du client.

Example

Exemple 1 : Définition d'ACR dans le Transaction server Docker container
Cet exemple concerne le Transaction server. Il est écrit à l'aide de Python et utilise des commandes wsadmin pour configurer ACR pour le Transaction server Docker container.

Le nom du script est update_txn_alternate_server.py.

Ses paramètres (les paramètres sont les valeurs respectives des propriétés personnalisées ACR WebSphere) sont les suivants :
  • <alternate_server_name>,
  • <alternate_port_number>,
  • <max_retries_for_client_reroute>et
  • <retry_interval_for_client_reroute>

Créez le script dans votre répertoire Transaction server Docker container /SETUP/scripts/.

Le contenu de ce script doit être le suivant :
# Init variables 
propertyNames  = [ 'clientRerouteAlternateServerName', 'clientRerouteAlternatePortNumber', \
                   'maxRetriesForClientReroute', 'retryIntervalForClientReroute' ]
propertyValues = [ <alternate_server_name>, <alternate_port_number>, \
                   <max_retries_for_client_reroute>, <retry_interval_for_client_reroute> ]
propertyTypes  = [ 'java.lang.String', 'java.lang.Integer', 'java.lang.Integer', \
                   'java.lang.Integer' ]
    
# Get the datasource
datasource = AdminConfig.getid('/Cell:localhost/Node:localhost/Server:server1/JDBCProvider:WCDataSource_provider/DataSource:WCDataSource/')
print 'datasource = ', datasource
    
# Get the property set 
propertySet = AdminConfig.showAttribute( datasource, 'propertySet')
print 'propertySet = ', propertySet
    
# Get the list of properties
propertyList = AdminConfig.list('J2EEResourceProperty', propertySet).splitlines()
a = [ p.split( '(' )[ 0 ] for p in propertyList ]
    
# Adding or updating ACR custom variables
for i in range( len( propertyNames ) ):
    if propertyNames[ i ] not in a:
        propertyAttributes = [['name', propertyNames[ i ]], ['value', propertyValues[ i ]], \
                              ['type', propertyTypes[ i ]], ['description', ''], \
                              ['required', 'true']]
        AdminConfig.create( 'J2EEResourceProperty', propertySet, propertyAttributes )
        print propertyNames[ i ], ' created'
    else:
        propertyAttributes = [['value', propertyValues[ i ]], ['description', ''], \
                              ['required', 'true']]
        AdminConfig.modify( propertyNames[ i ], propertyAttributes )
        print propertyNames[ i ], ' updated'
AdminConfig.save()
Appelez le script en utilisant la syntaxe de commande suivante :
/opt/WebSphere/AppServer/profiles/default/bin/wsadmin.sh -conntype NONE 
     -f /SETUP/scripts/update_txn_alternate_server.py alternate_server_name alternate_port_number 
         max_retries_for_client_reroute retry_interval_for_client_reroute
Exemple 2 : Définition d'ACR pour le conteneur de recherche
Cet exemple est également écrit à l'aide de Python et de sa configuration ACR pour le conteneur de recherche. Le nom du script est update_search_alternate_server.py, et la syntaxe pour l'appeler est la suivante :
python update_search_alternate_server.py alternate_server_name alternate_port_number max_retries_for_client_reroute 
retry_interval_for_client_reroute
Voici le script Python :
import sys
import xml.etree.ElementTree as et

filename = '/opt/WebSphere/Liberty/usr/servers/default/configDropins/overrides/datasources.xml'

tree = et.parse( filename )
root = tree.getroot()
d = root.find( 'dataSource' )
children = d.getchildren()
for child in children:
     if 'properties.db2.jcc' in str( child ):
         print 'found'
         print child.tag, child.attrib
         dict = child.attrib
         print 'dict = ', dict
         dict[ 'clientRerouteAlternateServerName' ] = sys.argv[0]
         dict[ 'clientRerouteAlternatePortNumber' ] = sys.argv[1]
         max_retries_for_client_reroute = sys.argv[2]
         retry_interval_for_client_reroute = sys.argv[3]
         if len( max_retries_for_client_reroute ) != 0:
              dict[ 'maxRetriesForClientReroute' ] = max_retries_for_client_reroute
         if len( retry_interval_for_client_reroute ) != 0:
              dict[ 'retryIntervalForClientReroute' ] = retry_interval_for_client_reroute

         d.remove( child ) 
         b = et.SubElement( d, 'properties.db2.jcc' )
         b.attrib = dict
         tree.write( filename )