вторник, 2 декабря 2014 г.

JVM timezone

Класс для проверки JVM timezone:

cat ./TimeTest.java
import java.util.Date;
import java.util.TimeZone;

public class TimeTest {

    public static void main(String args[]) {
    long time = System.currentTimeMillis();
    String millis = Long.toString(time);
    Date date = new Date(time);
    System.out.println("Current time in milliseconds = " + millis + " => " + date.toString());
    System.out.println("Current time zone: " + TimeZone.getDefault().getID());
    }
}
$JAVA_HOME/bin/javac TimeTest.java
$JAVA_HOME/bin/java TimeTest
Current time in milliseconds = 1417528126582 => Tue Dec 02 16:48:46 MSK 2014
Current time zone: Europe/Moscow

четверг, 24 июля 2014 г.

Weblogic Server Migration


Server Migration - технология, позволяющая организовать отказоустойчивое решение с  защитой от потери сервиса при потере одного из хостов кластера. Управляемый сервер со всеми приложениями и сервисами поднимается на новом хосте. Решение особенно эффективно для singleton-сервисов.  

Моё окружение.

Host 1: 172.16.1.1 hostname: sms_a
Host 2: 172.16.1.2 hostname: sms_b
VIP     : 172.16.1.3
Weblogic Server 12.1.2
Oracle Linux 6.4

1.Настройки ОС.

1.1 Для пользователя oracle обновить CLASSPATH на обоих хостах.
export MW_HOME=/opt/oracle/middleware/Oracle_WL
PATH=$PATH:$MW_HOME/user_projects/domains/sms_domain/nodemanager:$MW_HOME/user_projects/domains/sms_domain/bin/server_migration:$MW_HOME/Oracle_WL/wlserver/common/bin
export PATH
 1.2 Добавить пользователю oracle возможность запускать утилиты с правами суперпользователя. Для этого на обоих хостах редактируется файл /etc/sudoers 

oracle ALL=NOPASSWD: /sbin/ifconfig,/sbin/arping,$DOMAIN_HOME/bin/server_migration/wlsifconfig.sh


Если этого не сделать, в логах nodemanager-а можно наблюдать вот такие сообщения:
<Jul 16, 2014 11:41:19 AM MSK> <WARNING> <sudo: sorry, you must have a tty to run sudo>
<Jul 16, 2014 11:41:19 AM MSK> <WARNING> <Failed to remove 172.16.5.231 netmask  from eth0:1.>
<Jul 16, 2014 11:41:19 AM MSK> <WARNING> <Exception while executing 'PostStop' ExecutableCallbacks>
java.io.IOException: Exception while executing 'PostStop' ExecutableCallbacks
        at weblogic.nodemanager.server.WLSProcess$MultiExecuteCallbackHook.execute(WLSProcess.java:290)
        at weblogic.nodemanager.server.WLSProcess.executePostStopHooks(WLSProcess.java:239)
        at weblogic.nodemanager.server.WLSProcess.waitForProcessDeath(WLSProcess.java:205)
        at weblogic.nodemanager.server.ServerMonitor.runMonitor(ServerMonitor.java:298)
        at weblogic.nodemanager.server.ServerMonitor.run(ServerMonitor.java:254)
        at java.lang.Thread.run(Thread.java:745)
Caused by: weblogic.nodemanager.util.MultiException:

В Linux обычно запрещено выполнение команд вида
ssh oracle@servername sudo ifconfig
Они не безопасны, так как передают пароль в открытом виде. Такая команда завершится с ошибкой.
sudo: sorry, you must have a tty to run sudo
Вообще говоря, при подключении по ssh у пользователя нет tty не только для sudo:
ssh oracle@servername tty
not a tty
1.4 Опционально можно настроить аутентификацию без пароля
ssh-keygen
ssh-copy-id oracle@servername_1

После выполнения этих пунктов у пользователя oracle будет достаточно прав для создания интерфейса eth0:1 и назначения ему виртуального ip-адреса. Во время миграции сервера этот интерфейс будет создаваться с помощью скрипта wlsifconfig.sh, запущенного nodemanager-ом.
Интерфейс с VIP-адресом (в моём случае это 172.16.1.3) необходимо создать до того, как будет запущен сервер, слушающий на нём.
1.5 Создание интерфейса eth0:1 на первом хосте:
[oracle@servername_1 ~]sudo $DOMAIN_HOME/bin/server_migration/wlsifconfig.sh -addif eth0 172.16.1.3 255.255.240.0
 Здесь 172.16.1.3        - VIPадрес
            255.255.240.0 - маска подсети.
Если скрипт отработает без ошибок, в выводе ifconfig появится новый интерфейс.
eth0      Link encap:Ethernet  HWaddr 55:53:56:56:11:30
          inet addr:172.16.1.1  Bcast:172.16.15.255  Mask:255.255.240.0
         [...]
eth0:1    Link encap:Ethernet  HWaddr 5:53:56:56:11:30
          inet addr:172.16.1.3  Bcast:172.16.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Теперь можно обновить arp-таблицу на ближайшем свиче командой
sudo arping -q -U -c 5 -I eth0 172.16.1.3

 2. Настройка Nodemanager.

 К конфигурационный файл nodemanager.properties добавить строки

Interface=eth0
NetMask=255.255.240.0
UseMACBroadcast=true
ListenAddress=172.16.1.1
В качестве  ListenAddress указываются ip адреса хостов. В моём случае это 172.16.1.1 и 172.16.1.2 соответственно.

3. Настройки Weblogic сервера.

3.1. Необходимо создать кластер. В моём случае это trvlrCluster.

3.2. Создать две машины.


 В настройках первой указать ip-адрес (hostname) и порт nodemanager-a первого хоста 172.16.1.1 (sms-a) Для второго - 172.16.1.2 (sms-b)


 3.3. Создать два сервера. trvlr_1 и trvlr_2.  Для первого серверa указать Listen Address - адрес виртуального интерфейса, созданного на шаге 1.5. В моём случае это 172.16.1.3. Для второго сервера - ip адрес второго хоста(172.16.1.2). Возможности мигрировать у второго сервера не будет.



 В настройках серверов (Servers -> trvlr_1 -> Configuration - > General) выбрать имя кластера, созданного в пункте 3.2 и машину, созданную в пункте 3.2
 Для второго сервера мои настройки выглядят так:

 В настройках первого сервера выбрать Automatic Server Migration Enabled


 3.4 Опционально с помощью скрипта $WL_HOME/wlserver/server/db/oracle/920/leasing.ddl  можно создать в БД таблицу лизинга для кластера. Затем создать датасорс (в моём случае leasingDS), назначить его всем серверам кластера и на вкладке Clustername - > Configuration ->Migration   выбрать в качетве Migration Basis базу данных.

4. Проверка работоспособности.

4.1 На вкладке servers -> trvlr_1 -> Control -> Migration можно проверить возможность мигрировать на второй хост. 
После нажатия кнопки "Save" на втором хосте будет поднят интерфейс eth0:1 с адресом  172.16.1.3 и сервер trvlr_1. На хосте 172.16.1.1 (sms-a) соответствующий интерфейс будет опущен автоматически.
4.2 После того как сервер поднимется на втором хосте можно проверить автоматическую миграцию сервера. Для этого надо выключить host 172.16.1.2. Если возможности выключить хост нет, можно погасить на нём nodemanager, сервер trvlr_1 и интерфейс eth0:1

killall -f -9 weblogic.NodeManager
killall -f -9 trvlr_1
sudo $DOMAIN_HOME/bin/server_migration/wlsifconfig.sh -removeif eth0 172.16.1.3 255.255.240.0





понедельник, 14 июля 2014 г.

Проверка загруженности дисков

 Проблема нехватки  I/O c дискаового массива выглядит примерно так:
 %iowait растёт при не самой высокой нагрузке (35 Mb/сек достойный результат для диска, но не для полки HP 9500):
 Ещё один признак того, что массив не справляется - очередь на диск.
Второй столбец на скриншоте (b) - количество процессов в очереди.
2 - это много. 5-6 - это очень много.

Получить скорость блочного чтения hdparm -t. На скриншоте проблемный раздел даёт 75 Mb/сек

Скорость записи в файл без использования кэша операционки.
time dd if=/dev/zero of=filename bs=8192 count=10000 oflag=direct

четверг, 15 мая 2014 г.

Использование HugePages и hugetlbfs для JVM

1. Необходимо включить использование HugePages в операционной системе.
Для линукса размер страницы почти всегда равен 2Mb. Проверить можно так:
cat /proc/meminfo|grep Hugepagesize

Hugepagesize:       2048 kB

В файле /etc/sysctl.conf необходимо добавить количество необходимых страниц и id группы,
 которой разрешено эти страницы использовать.

vm.nr_hugepages=3000
Количество страниц nr_hugepages=(HeapSize + PermSize)/Hugepagesize

 JVM запускается с опцией java -XX:+UseLargePages


понедельник, 5 мая 2014 г.

Настройки OVD для связки Oracle Portal + OVD + MS Active Directory

Для связки Oracle Virtual Directory и продуктов Oracle Portal необходима некоторая дополнительная настройка OVD.

1. Убрать отметку в настройках адаптера follow referrals.


2. Для связки ODV - Acrive Directory
Добавить список классов, соответствующие пользователю в Actie Directory в файл jps-config.xml
<serviceInstance name="idstore.ldap" provider="idstore.ldap.provider">
            <property name="idstore.config.provider" value="oracle.security.jps.wls.internal.idstore.WlsLdapIdStoreConfigProvider"/>
            <property name="CONNECTION_POOL_CLASS" value="oracle.security.idm.providers.stdldap.JNDIPool"/>
            <extendedProperty>
                <name>user.object.classes</name>
                <values>
                    <value>top</value>
                    <value>person</value>
                    <value>inetorgperson</value>
                    <value>organizationalperson</value>
                </values>
            </extendedProperty>

        </serviceInstance>
3. Добавить виртуальный атрибут orclguid в настройках виртуального адаптера VirtualAttrPlugin.
AddAttribute orclguid=%objectguid%


понедельник, 24 марта 2014 г.

Аутентификация на weblogic-серверах через домен windows. Настройка SSO.


Настройки моего окружения:
домен: WCC.LOCAL
Контроллер домена ( KDC-сервер): dc1.wcc.local
Сервер приложений: budwf.moscow.mydomain.ru

Настройки на стороне домена AD.

Необходимо создать пользователя с произвольным именем. Для аутентификации будут использоваться principals этого пользователя. Использование протокола Kerberos предполагает шифрование. В настройках созданной учётной записи необходимо отметить поддержку, например, AES 128. При использовании это типа шифрования не понадобится скачивание дополнительных библиотек на сервера приложений.

ktpass -princ HTTP/srv_budwf@WCC.LOCAL -mapuser  srv_budwf -kvno 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass ***** -out c:\distr\budwf.keytab
Targeting domain controller: DC1.wcc.local
Successfully mapped HTTP/srv_budwf to srv_budwf.
Password succesfully set!
Key created.
Output keytab to c:\distr\oracleadmintst.keytab:
Keytab version: 0x502
keysize 60 HTTP/srv_budwf@WCC.LOCAL ptype 1 (KRB5_NT_PRINCIPAL) vno 0 etype 0x1
1 (AES128-SHA1) keylength 16 (0x5e4018d5c51d4445677201f95477046f)

setspn -L srv_budwf
Зарегистрирован ServicePrincipalNames для CN=srv_budwf,OU=System Accounts,OU=Ser
ver,OU=CentralOffice,DC=wcc,DC=local:
        HTTP/srv_budwf
Можно удалить бесполезные service principal name командой
setspn -D HTTP/srv_budwf srv_budwf
и добавить spn с полным именем сервера
setspn -S HTTP/budwf.moscow.mydomain.ru srv_budwf
Checking domain DC=gksm,DC=local

Registering ServicePrincipalNames for CN=srv_budwf,OU=System Accounts,OU=Server,OU=CentralOffice,DC=wcc,DC=local
HTTP/budwf.moscow.mydomain.ru srv_budwf
Updated object
Должно получиться что-то похожее на это:
setspn -L srv_budwf
Registered ServicePrincipalNames for CN=srv_budwf,OU=System Accounts,OU=Server,OU=CentralOffice,DC=wcc,DC=local:
        HTTP/budwf.moscow.mydomain.ru srv_budwf
        HTTP/budwf

Настройки хоста сервера приложений.

Готовый кейтаб можно копировать на сервер приложений, в корневую директорию домена.
На сервере приложений необходимо отредактировать файл /etc/krb5.conf

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = WCC.LOCAL
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

 default_tgs_enctypes = aes128-cts
 default_tkt_enctypes = aes128-cts
 permitted_enctypes = aes128-cts
 clockskew = 300


[realms]
 WCC.LOCAL = {
  kdc = dc1.wcc.local
  admin_server = dc1.wcc.local
  default_domain = wcc.local
 }

[domain_realm]
 .wcc.local = WCC.LOCAL
 wcc.local = WCC.LOCAL

Проверить правильность конфигов можно командой kinit. Ей вывод должен быть пустой:
kinit -k -t /opt/oracle/middleware/user_projects/domains/budwf_domain/budwf.keytab  HTTP/srv_budwf@WCC.LOCAL
В качестве второго аргумента нужно указать principal из keytab-а. Его можно посмотреть командой:
klist -k -t /opt/oracle/middleware/user_projects/domains/budwf_domain/budwf.keytab
Keytab name: FILE:/opt/oracle/middleware/user_projects/domains/budwf_domain/budwf.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
   0 01/01/70 03:00:00 HTTP/srv_budwf@WCC.LOCAL

Настройка Weblogic для SSO.

1.Конфигурационный файл JAAS. В качестве principal указывается principal кейтаба.
В качестве keyTab - путь к кейтабу относительно корня домена.

/opt/oracle/middleware/user_projects/domains/budwf_domain $ cat krb5Login.conf
com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  principal="HTTP/srv_budwf@WCC.LOCAL"
  useKeyTab=true
  keyTab=budwf.keytab
  storeKey=true
  debug=false;
};

com.sun.security.jgss.krb5.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  principal="HTTP/srv_budwf@WCC.LOCAL"
  useKeyTab=true
  keyTab=budwf.keytab
  storeKey=true
  debug=false;
};
2.Ключи для запуска JVM weblogic-сервера. Их необходимо добавить в переменную JAVA_OPTIONS либо на странице ServerStart консоли. Путь для Djava.security.auth.login.config необходимо указывать либо относитьельно корня файловой системы, либо относительно корня домена.
-Dsun.security.krb5.debug=true
-Djava.security.krb5.realm=wcc.LOCAL
-Djava.security.krb5.kdc=dc1.wcc.local
-Djava.security.auth.login.config=/opt/oracle/middleware/user_projects/domains/budwf_domain/krb5Login.conf-Djavax.security.auth.useSubjectCredsOnly=false

3. Настройка AD-провайдера.
Настраивается как обычно.
4. Настройка WebLogic Negotiate Identity Assertion provider
Заключается в выборе имени для этого провайдера. Он должен стоять выше, чем AD-провайдера в списке.

Настройка браузера

В адресоной строке firefox набрать about:config.
изменить значения