четверг, 15 марта 2012 г.

Клонирование Oracle Fusion Middleware 11g

Клонирование Oracle Fusion Middleware 11g (SOA Suite, ODI, IDM, Webcenter и т.д.) условно можно разделить на две логические части:
  • Клонирование Middleware Home;
  • Клонирование доменов.
Существует несколько ограничений по клонированию:
  • окружения должны быть идентичными, т.к. сервер назначения и сервер источник должны иметь одну и ту же операционную систему и разрядность (32 или 64);
  • система назначения и система источник должны иметь одного и того же административного пользователя (например, weblogic), но пароли могут быть различны. После завершения клонирования можно изменить пользователя.
Клонирование СУБД и других внешних систем, которые используются в приложениях/композитах выходят за рамки данной статьи.

Клонирование Middleware Home

Типовая структура Middleware Home (MW_HOME):
  1. Останавливаем все сервера (AdminServer и ManagedServer-а) всех доменов (на источнике), которые используют клонируемый Middleware Home;
  2. На источнике перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
  3. Затем выполнить команду:
     $ ./copyBinary.sh -javaHome /opt/jrockit-jdk1.6.0_26-R28.1.4-4.0.1/ 
    -archiveLoc /tmp/mw_copy.jar -sourceMWHomeLoc /opt/Middleware/
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceMWHomeLoc – директория в которой развернут MW_HOME.

  4. Скопировать файл экспорта с сервера источника на сервер назначения. А так же следующие файлы:
     $ ls $MW_HOME/oracle_common/bin/pasteBinary.sh  
     $ ls $MW_HOME/oracle_common/jlib/cloningclient.jar  
    

  5. Запускаем импорт Middleware Home на сервере назначения:
     $ ./pasteBinary.sh -javaHome /u01/jdk1.6.0_30/ 
    -archiveLoc mw_copy.jar -targetMWHomeLoc /u01/ofm  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для импорта;
          targetMWHomeLoc – директория в которой будет развернут MW_HOME.

Клонирование доменов

  1. Проверяем, что все сервера домена (на источнике) для клонирования стартованы.
  2. Если в домене есть machine типа Unix Machine, то необходимо изменить её на тип Machine. Для этого необходимо:
     $ cp $DOMAIN_HOME/config/config.xml $DOMAIN_HOME/config/config.xml.bkp  
     $ vi $DOMAIN_HOME/config/config.xml  
    
    Далее найти следующую строку (или строки если несколько машин):
     <machine xsi:type="unix-machineType">  
    
    И заменить её (или их) на:
     <machine>  
    
    После этого перезапустить AdminServer.
  3. На сервере источнике перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
    
  4. Затем выполнить на источнике команду:
     $ ./copyConfig.sh -javaHome /opt/jrockit-jdk1.6.0_26-R28.1.4-4.0.1/  
                    -archiveLoc /tmp/soa_domain.jar 
                    -sourceDomainLoc /opt/user_projects/domains/soa_domain/     
                    -sourceMWHomeLoc /opt/Middleware/                         
                    -domainHostName oracle-sb.tsretail.ru    
                    -domainPortNum 9000 
                    -domainAdminUserName weblogic 
                    -domainAdminPassword /tmp/wlspwd.txt  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceDomainLoc – директория домена;
          sourceMWHomeLoc – директория в которой развернут MW_HOME;
          domainHostName – хост домена;
          domainPortNum – порт AdminServer-а;
          domainAdminUserName – логин администратора;
          domainAdminPassword – путь к текстовому файлу с паролем администратора.
  5. Скопировать файл экспорта с сервера источника на сервер назначения.
  6. На сервере назначения перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
    
  7. Запускаем генерацию плана переноса домена на сервере назначения:
     $ ./extractMovePlan.sh -javaHome /u01/jdk1.6.0_30  
                   -archiveLoc /home/weblogic/clone_domain/soa_domain.jar
                   -planDirLoc /home/weblogic/clone_domain/plan  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          planDirLoc – директория в которую будет сгенерирован план.
  8. Редактируем сгенерированный план переноса:
     $ vi /home/weblogic/clone_domain/plan/moveplan.xml  
    
    Следует обратить внимание на создание текстовых файлов содержащих пароли к Data Source-ам и указание пути к файлу с паролем для каждого конкретного Data Source-а.
  9. Если требуется, то можно и изменить параметры адаптеров, композитов и деплоймент планов в соответствующих директориях:
     $ /home/weblogic/clone_domain/plan/  
     $ ls -l  
     total 312  
     drwxr-xr-x 2 weblogic app  4096 Mar 14 10:47 adapters  
     drwxr-xr-x 2 weblogic app 12288 Mar 14 10:47 composites  
     drwxr-xr-x 2 weblogic app  4096 Mar 14 10:48 deployment_plans  
     -rw-r--r-- 1 weblogic app 274543 Mar 14 10:44 moveplan.xml  
    
  10. Запускаем импорт домена на сервере назначения:
     $ ./pasteConfig.sh -javaHome /u01/jdk1.6.0_30   
          -archiveLoc /home/weblogic/clone_domain/soa_domain.jar   
          -movePlanLoc /home/weblogic/clone_domain/plan/moveplan.xml  
          -targetDomainLoc /u01/user_projects/domains/clonned_soa_domain  
          -targetMWHomeLoc /u01/ofm/   
          -domainAdminPassword /home/weblogic/clone_domain/plan/domainpwd.txt  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceDomainLoc – директория домена;
          movePlanLoc – имя файла плана переноса;
          targetDomainLoc – директория в которую импортируется домен;
          targetMWHomeLoc – директория в которой развернут MW_HOME;
          domainAdminPassword – путь к текстовому файлу с паролем администратора.

понедельник, 20 февраля 2012 г.

Основы Oracle Fusion Middleware High Availability

Обеспечение высокой доступности это одна из ключевых требований в любом промышленном внедрении. Внедрение систем высокой доступности обеспечивает минимизацию времени простоя системы и максимизацию времени доступности.
Простой системы бывает двух видов:
  • Планируемый – запланированные административные операции;
  • Непланируемый – любой незапланированный сбой.
Оба типа простоя обычно рассматриваются отдельно когда выставляются требования по высокой доступности. Системам необходимо иметь очень ограниченное время к непланируемым простоям и максимально гибко конфигурированными к планируемым простоям.

Табл.1 Планируемые простои и их решения для семейства продуктов Oracle Fusion Middleware
ОперацииРешения
Развертывание и удаление приложенийHot Deployment
ПатчингRolling Patching
Конфигурационные измененияOnline configuration Changes
Change Notification
Batching of changes
Deferred Activation
МасштабируемостьCluster Scale-Out

Табл.2 Непланируемые простои и их решения для семейства продуктов Oracle Fusion Middleware
Тип сбояРешения
Программный сбойDeath Detection and restart using Node Manager for Java EE and OPMN for system components.
Server Clusters & Load Balancing
Cold Failover Clusters
Server Migration
Service Migration
State Replication and Replica aware Stubs
Аппаратный сбойServer Clusters & Load Balancing
Server Migration
Clusterware Integration
Потеря данныхBackup and Recovery
Site DisasterOracle Fusion Middleware Disaster Recovery Solution

Решения высокой доступности можно разделить на два вида:
  • Локальная высокая доступность – предоставляется в одном датацентре;
  • Глобальная высокая доступность – предоставляется в географически различных датацентрах (защищает от региональных бедствий, например наводнений).
Решения локальной высокой доступности можно разделить на два вида:
  • «Активный-Активный» - развертываются на двух или более инстансах, которые улучшают масштабируемость и предоставляют высокую доступность . В данном виде все инстансы работают параллельно. Самым ярким примером является кластеризация.
  • «Активный-Пассивный» - один инстанс (активный) обслуживает запросы, а другой (пассивный) находится в стадии ожидания. В случае выхода из строя активного инстанса все запросы перенаправляются на выполнение на пассивный инстанс, который становится активным. Пассивный инстанс так же называют standby-инстансом.

Концептуальная схема решения глобальной высокой доступности:

четверг, 26 января 2012 г.

Ошибка "java.lang.AssertionError: Could not obtain the localhost address" при старте Weblogic-сервера и вариант её решения

Ошибка:
При старте Weblogic-сервера возникает следующая ошибка и происходит ошибка старта (сервер переходит в статус FAILED):
 <BEA-000386> <Server subsystem failed. Reason: java.lang.AssertionError: Could not obtain the localhost address. The most likely cause is an error in the network configuration of this machine.  
 java.lang.AssertionError: Could not obtain the localhost address. The most likely cause is an error in the network configuration of this machine.  
     at weblogic.server.channels.AddressUtils$AddressMaker.getLocalHost(AddressUtils.java:38)  
     at weblogic.server.channels.AddressUtils$AddressMaker.<clinit>(AddressUtils.java:33)  
     at weblogic.server.channels.AddressUtils.getIPAny(AddressUtils.java:154)  
     at weblogic.protocol.configuration.ChannelHelper.checkConsistency(ChannelHelper.java:61)  
     at weblogic.server.channels.ChannelService.start(ChannelService.java:207)  
     at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)  
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)  
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)  
 Caused By: java.net.UnknownHostException: vm1.mydomain.com : vm1.mydomain.com 
     at java.net.InetAddress.getLocalHost(InetAddress.java:1360)  
     at weblogic.server.channels.AddressUtils$AddressMaker.getLocalHost(AddressUtils.java:36)  
     at weblogic.server.channels.AddressUtils$AddressMaker.<clinit>(AddressUtils.java:33)  
     at weblogic.server.channels.AddressUtils.getIPAny(AddressUtils.java:154)  
     at weblogic.protocol.configuration.ChannelHelper.checkConsistency(ChannelHelper.java:61)  
     at weblogic.server.channels.ChannelService.start(ChannelService.java:207)  
     at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)  
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)  
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)  
Причина:
По имени хоста (выделено синим выше) на котором напускается Weblogic-сервер невозможно получить его IP-адрес.

Решение:
Варианты решения:
  • Прописать в DNS
  • Прописать в файл /etc/hosts

понедельник, 19 декабря 2011 г.

Выгрузка данных по измерениям Hyperion EPMA из Oracle RDBMS

  1. Подключиться к схеме данных приложения EPMA.
  2. Выполнить запрос:
     SELECT TYPE_NAME,lpad(' ',2*(level-1))|| member_code AS member_code,  
         alias_default,  
         operation,  
         generation,  
         data_storage,  
         uda_text AS uda,  
         formula,  
         smart_list_name,  
         smart_list_label  
     FROM  
      (SELECT ob_type.TYPE_NAME ,  
       obj.object_name member_code,  
       al.object_name alias_default,  
       obj.generation,  
       obj.parent_id,  
       obj_par.object_name parent_member,  
       (CASE  
        WHEN m.consol_op1=0 THEN '+'  
        WHEN m.consol_op1=1 THEN '-'  
        WHEN m.consol_op1=2 THEN '*'  
        WHEN m.consol_op1=3 THEN '/'  
        WHEN m.consol_op1=4 THEN '%'  
        WHEN m.consol_op1=5 THEN '~'  
        WHEN m.consol_op1=6 THEN '^'  
        ELSE 'Undefined'  
       END) AS operation,  
       (CASE  
        WHEN m.data_storage=0 THEN 'Store data'  
        WHEN m.data_storage=1 THEN 'Never share'  
        WHEN m.data_storage=2 THEN 'Label Only'  
        WHEN m.data_storage=3 THEN 'Shared member'  
        WHEN m.data_storage=4 THEN 'DynamicCalc and Store'  
        WHEN m.data_storage=5 THEN 'Dynamic'  
        ELSE 'Undefined'  
       END) data_storage,  
       uda.uda_text,  
       en.name AS smart_list_name,  
       en.label AS smart_list_label,  
       mf.formula  
      FROM hsp_object obj,    
        hsp_object obj_par,   
        hsp_object_type ob_type,  
        (SELECT obj_al.object_name,al.member_id  
         FROM hsp_alias al, hsp_object obj_def,
              hsp_object obj_al, hsp_object_type ob_al_type  
         WHERE al.aliastbl_id = obj_def.object_id(+) 
          AND al.alias_id = obj_al.object_id(+) 
          AND obj_def.object_name = 'Default' 
          AND obj_al.object_type = ob_al_type.object_type 
          AND ob_al_type.type_name = 'Alias'  
        ) al,  
        hsp_member m,  
        hsp_member_formula mf,  
        hsp_enumeration en,  
        (SELECT uda.member_id,sys_xmlagg(xmlelement(col, ud.uda_value||' ')).extract('/ROWSET/COL/text()').getclobval() AS uda_text  
        FROM hsp_member_to_uda uda, hsp_uda ud  
        WHERE uda.uda_id=ud.uda_id  
        GROUP BY uda.member_id  
        ) uda  
      WHERE obj.parent_id = obj_par.object_id(+)   
       AND obj.object_type = obj_par.object_type(+)   
       AND obj.object_type = ob_type.object_type   
       AND ob_type.TYPE_NAME IN ('Scenario','Year','Time Period','Version','Entity','Account','User Defined Dimension Member' )   
       AND al.member_id(+) = obj.object_id   
       AND m.member_id=obj.object_id   
       AND mf.member_id(+)=obj.object_id   
       AND uda.member_id(+)=obj.object_id   
       AND m.enumeration_id=en.enumeration_id(+)  
      ORDER BY ob_type.TYPE_NAME,obj.generation)  
      START WITH parent_member  IS NULL  
      CONNECT BY prior member_code = parent_member;  
    
  3. По результату данного запроса сделать подзапрос по колонке TYPE_NAME (соответствует типу измерения). Варианты:
    • Account
    • Entity
    • Version
    • Time Period
    • Year
    • Scenario
    • User Defined Dimension Member

четверг, 8 декабря 2011 г.

WSDL: абстрактный и конкретный

Секции в WSDL:
  • Types - определяет типы данных для сообщений, которыми обменивается Web-сервис (XSD-схема)
  • Messages - определяет сообщения, используемые Web-сервисом
  • PortTypes - определяет методы, предоставляемые Web-сервисом
  • Bindings - определяет протоколы взаимодейcтвия, используемые Web-сервисом
  • Services - определяет адрес по которому возможен доступ к Web-сервису

Полезная информация для начинающих по WSDL - школа WSDL