Manual Instalação EVE

This release of the manual describe the installation process in a Linux Red Hat Advance Server or CentOS versions 7.8 for:

  • Apache 2.4.43
  • PHP 7.0.33
  • Oracle 19.6
  • CouchBase 6.5.1

We assume that the media to install the OS was “minimal install” type.

Create OS user

To clearly identify our processes we are going to create a group and an user:

  • groupadd isretail
  • useradd -g isretail eve
  • passwd eve

Network

To avoid problems during installation or while running the system we suggest check the following configuration files:

  • /etc/hostname where you should be defined the server name
  • /etc/sysconfig/network-scripts/ifcfg-eth0/1/… where IP address is defined
  • /etc/hosts where can be defined the address for servers name when no complex DNS services are uses

These files are also to be remembered when a clone of a VM is the base of a new installation.

Firewall rules are also important if you prefer to mantain the firewall service active:

  • check in which zone we are (normally public) with firewall-cmd –get-active-zones
  • list the services with firewall-cmd –zone=public –list-services
  • add the services we need: firewall-cmd –zone=public –add-service=http
  • and make it permanent: firewall-cmd –zone=public –add-service=http –permanent

You may want to do the same for https service and other ports; for example if you need to open port 1235: firewall-cmd –zone=public –add-port=1235/tcp. Remeber to use “–permanent” for definition that must exist after reboot.

Update and Install packages

OS must be up to date and the following packages must be installed:

  • yum update
  • yum groupinstall “Development Tools” -y
  • yum install pcre-devel -y
  • yum install openssl-devel -y
  • yum install libxml2-devel -y
  • yum install libcurl-devel -y
  • yum install libjpeg-devel -y
  • yum install libpng-devel -y
  • yum install freetype-devel -y
  • yum install memcached -y
  • yum install pkgconfig -y
  • yum install openssl098e -y
  • yum install epel-release -y
  • yum install libmcrypt libmcrypt-devel -y
  • yum install mcrypt -y
  • yum install mhash -y
  • yum install wget -y

After this:

  • mkdir -p /root/install
  • cd /root/install

Apache installation

Please run the following commands from console:

  • wget https://mirrors.up.pt/pub/apache/httpd/httpd-2.4.43.tar.gz
  • wget https://mirrors.up.pt/pub/apache/apr/apr-1.7.0.tar.gz
  • wget https://mirrors.up.pt/pub/apache/apr/apr-util-1.6.1.tar.gz
  • wget https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.gz
  • tar -zxvf httpd-2.4.43.tar.gz
  • tar -zxvf apr-1.7.0.tar.gz
  • tar -zxvf apr-util-1.6.1.tar.gz
  • tar -zxvf expat-2.2.9.tar.gz
  • mv apr-1.7.0 httpd-2.4.43/srclib/apr
  • mv apr-util-1.6.1 httpd-2.4.43/srclib/apr-util
  • cd /root/install/expat-2.2.9
  • ./configure
  • make
  • make install
  • cd /root/install/httpd-2.4.43
  • ./configure –prefix=/www –with-mpm=prefork –enable-so –enable-rewrite –enable-vhosts-alias –enable-ssl –enable-modules=’unique-id’ –with-included-apr –with-expat=/usr/local
  • make
  • make install
  • vi /www/conf/httpd.conf to set some parameters:
    • Listen 192.168.45.223:80
    • Listen 192.168.45.223:1235 (if you need for voice)
    • LoadModule deflate_module modules/mod_deflate.so
    • LoadModule expires_module modules/mod_expires.so
    • LoadModule proxy_module modules/mod_proxy.so
    • LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
    • LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
    • LoadModule rewrite_module modules/mod_rewrite.so
    • User eve
    • Group isretail
    • ServerName [hostname]
    • before DocumentRoot “/www/htdocs”
      • <FilesMatch \.php$>
      • SetHandler “proxy:fcgi://127.0.0.1:9000”
      • </FilesMatch>
    • inside directory “/www/htdocs”
      • AllowOverride All
    • end of file:
      • <IfModule mod_expires.c>
        • ExpiresActive On
        • ExpiresByType image/x-icon “access plus 15 days”
        • ExpiresByType image/gif “access plus 15 days”
        • ExpiresByType image/png “access plus 15 days”
        • ExpiresByType image/jpg “access plus 15 days”
        • ExpiresByType image/jpeg “access plus 15 days”
        • ExpiresByType text/css “access plus 15 days”
        • ExpiresByType application/javascript “access plus 15 days”
      • </IfModule>
      • <IfModule deflate_module>
        • SetOutputFilter DEFLATE
        • DeflateCompressionLevel 9
        • BrowserMatch ^Mozilla/4 gzip-only-text/html
        • BrowserMatch ^Mozilla/4.0[678] no-gzip
        • BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        • SetEnvIfNoCase Request_URI (?:gif|jpe?g|png|swf)$ no-gzip dont-vary
      • </IfModule>
      • <IfModule proxy_module>
        • ProxySet timeout=600000
        • ProxyPassMatch ^/(..php(/.)?)$ fcgi://127.0.0.1:9000/www/htdocs/$1
        • ProxyPassMatch ^/(status?)$ fcgi://127.0.0.1:9000/www/htdocs/$1
        • SetEnvIf Authorization “(.)” HTTP_AUTHORIZATION=$1
        • SetEnvIf Content-Type “(.)” HTTP_CONTENT_TYPE=$1
        • SetEnvIf Accept “(.*)” HTTP_ACCEPT=$1
      • </IfModule>
      • ExtendedStatus On
      • <Location /server-status>
        • SetHandler server-status
        • Order Deny,Allow
        • Deny from all
        • Allow from all
      • </Location>
      • AddDefaultCharset Off

Database connections

Before install PHP engine we need to get a client for the database we are going to access.

Oracle client

This step is necessary if you want to access an Oracle Database Server installed in a different machine. If database and application servers are the same you don’t need to.

First obtain from Oracle site the client and the development libraries, then install.

  • wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm
  • wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-devel-19.6.0.0.0-1.x86_64.rpm
  • rpm -ivh oracle-instantclient19.6*
  • create a tnsnames.ora file in /usr/lib/oracle/19.6/client64/network/admin

MySQL client

Since PHP 5.4 there is no need to install MySQL client libraries since the MySQL native driver is embedded in the PHP extension.

PHP and modules

The version we are going to install is 7.0.33

Some changes to the configure command suggested may be needed; for example:

  • –with-oci8=instantclient,/usr/lib/oracle/19.6/client64/lib if you are using the instant client from oracle
  • –with-mysqli instead of –with-oci8 if you are using MySQL instead of Oracle

In our case we have Oracle Server in the same machine; so:

PHP

  • wget https://www.php.net/distributions/php-7.0.33.tar.gz
  • tar -zxvf php-7.0.33.tar.gz
  • cd php-7.0.33
  • ./configure –prefix=/usr/local –with-libdir=/lib64 –enable-fpm –with-xmlrpc –with-iconv –enable-sockets –enable-mbstring –with-curl –with-gd –enable-soap –with-freetype-dir=/usr/local/lib –with-mcrypt=/usr/lib64 –with-openssl –enable-pcntl –enable-posix –enable-shmop –enable-sysvsem –enable-sysvshm –enable-sysvmsg –enable-sigchild –enable-zip –with-jpeg-dir=/usr/local/lib –with-png-dir=/usr/local/lib64 –with-zlib-dir=/usr/local/lib64 –with-oci8=$ORACLE_HOME
  • make && make install
  • cp php.ini-development /usr/local/lib/php.ini and adapt; about usefull settings:
    • max_execution_time = 300
    • max_input_vars = 10000
    • memory_limit = 256M
    • error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
    • display_errors = Off
    • ignore_repeated_errors = On
    • error_log = /www/logs/php_errors.log
    • upload_max_filesize = 4M
    • session.gc_maxlifetime = 3600 (very important since it is used in EVE to decide after how much inactivity an user should re-login)
    • output_buffering = Off
  • cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
  • chmod +x /etc/init.d/php-fpm
  • cp ./sapi/fpm/status.html /www/htdocs/
  • chown eve.isretail -R /www/htdocs/
  • chkconfig php-fpm on
  • cd /usr/local/etc/
  • cp php-fpm.conf.default php-fpm.conf
  • vi php-fpm.conf and adapt; some settings that can be useful:
    • error_log = log/php-fpm.log
    • log_level = notice
    • process.max = 128
  • cd /usr/local/etc/php-fpm.d
  • cp www.conf.default www.conf
  • vi www.conf; some settings that can be useful:
    • user = eve
    • group = isretail
    • pm.max_children = 35
    • pm.start_servers = 5
    • pm.max_requests = 100
    • pm.status_path = /status
    • slowlog = /tmp/$pool.log.slow
    • request_slowlog_timeout = 3s
    • env[HOSTNAME] = $HOSTNAME
    • env[PATH] = /usr/local/bin:/usr/bin:/bin
    • env[TMP] = /tmp
    • env[TMPDIR] = /tmp
    • env[TEMP] = /tmp
    • env[ORACLE_HOME] = /opt/oracle/product/19c/dbhome_1
    • env[LD_LIBRARY_PATH] = /opt/oracle/product/19c/dbhome_1/lib:/lib:/usr/lib
    • env[NLS_LANG] = american_america.UTF8
    • env[NLS_COMP] = LINGUISTIC
    • env[NLS_SORT] = GENERIC_M_AI
    • env[DOCUMENT_ROOT] = /www/htdocs

At this point if we start php-fpm and we use a phpinfo.php page … it should works.

To start php-fpm: systemctl start php-fpm.service

To restart php-fpm: systemctl restart php-fpm.service

To stop php-fpm: systemctl stop php-fpm.service

opcache

In production environment remember to enable opcache from php.ini.

igbinary

  • cd /root/install
  • wget https://pecl.php.net/get/igbinary-3.1.2.tgz
  • tar -zxvf igbinary-3.1.2.tgz
  • cd igbinary-3.1.2
  • phpize
  • ./configure CFLAGS=”-O2 -g” –enable-igbinary –with-php-config=/usr/local/bin/php-config
  • make && make install
  • echo extension=igbinary.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep igbinary and the output should be:

igbinary
igbinary support => enabled
igbinary version => 3.1.2
igbinary APCu serializer ABI => no
igbinary session support => yes
igbinary.compact_strings => On => On
Registered serializer handlers => php_serialize php php_binary igbinary

memcache

  • cd /root/install
  • wget https://pecl.php.net/get/memcache-4.0.5.2.tgz
  • tar -zxvf memcache-4.0.5.2.tgz
  • cd memcache-4.0.5.2
  • phpize
  • ./configure
  • make && make install
  • echo extension=memcache.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep memcache and the output should be:

memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 32768 => 32768
memcache.compress_threshold => 20000 => 20000
memcache.default_port => 11211 => 11211
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => consistent => consistent
memcache.lock_timeout => 15 => 15
memcache.max_failover_attempts => 20 => 20
memcache.prefix_host_key => 0 => 0
memcache.prefix_host_key_remove_subdomain => 0 => 0
memcache.prefix_host_key_remove_www => 1 => 1
memcache.prefix_static_key => no value => no value
memcache.protocol => ascii => ascii
memcache.redundancy => 1 => 1
memcache.session_prefix_host_key => 0 => 0
memcache.session_prefix_host_key_remove_subdomain => 0 => 0
memcache.session_prefix_host_key_remove_www => 1 => 1
memcache.session_prefix_static_key => no value => no value
memcache.session_redundancy => 2 => 2
memcache.session_save_path => no value => no value

xdebug

Warning! This extension must always be declared after opcache when enabled.

  • cd /root/install
  • wget https://xdebug.org/files/xdebug-2.7.2.tgz
  • tar -zxvf xdebug-2.7.2.tgz
  • cd xdebug-2.7.2
  • phpize
  • ./configure –enable-xdebug
  • make && make install
  • echo zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep xdebug and the output should be:

xdebug
xdebug support => enabled
xdebug.auto_trace => Off => Off
xdebug.cli_color => 0 => 0
xdebug.collect_assignments => Off => Off
xdebug.collect_includes => On => On
xdebug.collect_params => 0 => 0
xdebug.collect_return => Off => Off
xdebug.collect_vars => Off => Off
xdebug.coverage_enable => On => On
xdebug.default_enable => On => On
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.extended_info => On => On
xdebug …

xls2csv – catdoc

To import xls files we need the catdoc package:

  • yum install catdoc -y

Couchbase

With EVE we are going to use more and more NoSQL databases: the immediate purpose is performance; but in the future we cannot exclude some advantages of this kind of approach: geographical distribution, smaller DB server and upgrade on running environments.

The community edition is enough to work with; since we are in a development environment and we can legally install the enterprise edition that give some tools about query analysis and monitoring we will use this one.

  • wget https://packages.couchbase.com/releases/6.5.1/couchbase-server-enterprise-6.5.1-centos7.x86_64.rpm
  • yum install couchbase-server-enterprise-6.5.1-centos7.x86_64.rpm -y
  • firewall-cmd –zone=public –add-port=8091-8092/tcp –permanent
  • firewall-cmd –zone=public –add-port=4396/tcp –permanent
  • firewall-cmd –zone=public –add-port=21100-21199/tcp –permanent
  • firewall-cmd –zone=public –add-port=11209-11211/tcp –permanent
  • firewall-cmd –reload
  • in the browser go to: http://192.168.45.223:8091/ui/index.html
Setup New Cluster
Choose a cluster name and a password: for example “EVE” and “isretail”
Accept terms and go to “Configure Disk…”
Example of configuration 1. Don’t use 127.0.0.1 but the host name or the ip address.
Example of configuration 2

After this step you can add the user “eve” from the dashboard and assign a password.

Now the php client:

  • vi /etc/yum.repos.d/couchbase-Base.repo

[couchbase-server]
name=Couchbase Server
baseurl=http://packages.couchbase.com/releases/couchbase-server/enterprise/rpm/$releasever/$basearch/
enabled=1
s3_enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

[couchbase-server-community]
name=Couchbase Server (Community Edition)
baseurl=http://packages.couchbase.com/releases/couchbase-server/community/rpm/$releasever/$basearch/
enabled=1
s3_enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

[couchbase-sdk]
name = Couchbase SDK package repository
baseurl = http://packages.couchbase.com/rpm/$releasever/$basearch
enabled = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

  • yum update
  • cd /root/install
  • yum install libcouchbase-devel libcouchbase2-libevent -y
  • wget https://pecl.php.net/get/couchbase-2.6.2.tgz
  • tar -zxvf couchbase-2.6.2.tgz
  • cd couchbase-2.6.2
  • phpize
  • ./configure
  • make && make install
  • echo extension=couchbase.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep couchbase and the output should be:

couchbase
couchbase support => enabled
libcouchbase runtime version => 2.10.6 (git: 61e274aae48b6edeecb081afec843dbe31d72790)
libcouchbase headers version => 2.10.6 (git: 61e274aae48b6edeecb081afec843dbe31d72790)
couchbase.decoder.json_arrays => 0 => 0
couchbase.encoder.compression => off => off
couchbase.encoder.compression_factor => 0.0 => 0.0
couchbase.encoder.compression_threshold => 0 => 0
couchbase.encoder.format => json => json
couchbase.log_level => WARN => WARN
couchbase.pool.max_idle_time_sec => 60 => 60

Extras

Usefull staff.

syntax highlight in vi

  • yum -y install vim-enhanced
  • echo alias vi=vim >> /etc/profile.d/vi.sh

Reorganizações e Agendamentos

Objetivo

O objetivo deste documento é identificar e descrever o processo de reorganização e agendamentos.

Reorganizações

O processo de reorganizações é de extrema importância para evitar alguma perda de performance do EVE com informação que já não seja necessária para o dia-a-dia da operação.

Devemos sempre relembrar que o EVE é uma ferramenta operacional e não de histórico de informação.

Relembramos, contudo, que existe informação que devemos guardar por questões legais.

Para automatizar a tarefa é necessário criar agendamentos no EVE com os objetos de reorganização após definir as regras de retenção de acordo com a política de dados da empresa.

Como boa prática, deve ser criado um utilizador que execute apenas este tipo de trabalhos. Por exemplo criar um utilizador com o nome eve-batch.

Em alguns casos é possível pedir a criação de um ficheiro com todos os registos eliminados para arquivo ou importação noutras bases de dados

Também é possível automatizar a tarefa – fortemente aconselhada – de reconstrução e otimização dos índices das tabelas: atividade necessária quando uma tabela é sujeita a grandes alterações na quantidade de registos que contem.

Listar Objetos de Reorganização

Os objetos de reorganização de dados disponíveis podem ser listados em IA003:

No detalhe de cada um existem parâmetros com um valor por defeito que pode ser alterado.

Os parâmetros mais comuns são:

  • DAYS (dias de retenção): representa o numero de dias que se pretende manter em linha no sistema e depende das indicações do negocio. Quando o objeto de reorganização é invocado procura os registos mais antigos da data do dia menos os dias aqui indicados;
  • LN2C (linhas para commit): é uma escolha de quem administra a base de dados e não do negocio. Indica ao objeto o numero de registos que tem que ser tratados antes de um commit na BD. Um valor demasiado pequeno torna o processo mais lento, um valor demasiado grande utiliza muita memoria;
  • BCKP (Backup): não é sempre presenta mas, quando está e mudando o valor para “1”, um ficheiro com o nome “backup_” + nome do objecto, da sequencia e data é criado na pasta dos backups
  • OPTM (otimização): se o responsável da administração da base de dados pretende automatizar a tarefa de reconstrução dos índices e estatísticas para toda as tabelas que tiveram registos apagados, é preciso mudar o valor por defeito para “1”

Agendamentos

O EVE tem a funcionalidade de agendamento de “ocorrências” e que permite uma maior flexibilidade de gestão de processos e sua repetição de ocorrência.

Existem 4 grandes tipos de ocorrências:

  1. – Reorganizações
  2. – Processos de eliminação de artigos
  3. – Alimentação de estatísticas
  4. – Envio de informação de um report para uma “mailing list”

Neste documento iremos entrar em mais detalhe nas ocorrências de reorganizações.

Agendar execução de Objeto de Reorganização

O processo começa em IA003 escolhendo, por simplicidade, o objeto de reorganização no ecrã de seleção:

Pedida a lista é possível, clicando no perfil do utilizador, escolher a função “Agendar Execução”:

Aparece um popup que ajuda na criação do agendamento:

Opções disponíveis no agendamento

Chamamos a atenção para alguma das opções disponíveis que podem gerar mais duvidas:

  • Data e hora de inicio: indica a primeira vez que o agendamento irá correr;
  • Repetição e Data e hora de fim: estes dois parâmetros trabalham em conjunto. O agendamento é repetido até não ultrapassar a data e hora de fim;
  • Serviço/Prioridade: indica a fila e a prioridade que se pretende para o trabalho agendado.

Vamos ver uns exemplos de repetição:

Tem que ser lido assim: a partir do dia 16 de Outubro 2021 às 10:00 repete uma vez por semana (23 de Outubro às 10:00, 30 de Outubro às 10:00 …) até não ultrapassar o dia 1 de Janeiro 2030.
Tem que ser lido assim: a partir do dia 16 de Outubro 2021 às 10:00 repete a cada 6 horas (16 de Outubro às 16:00, 16 de Outubro às 22:00 …) até não ultrapassar o dia 1 de Janeiro 2030.

Criar um agendamento de um report

Existe também a possibilidade de efetuar um agendamento a partir da seleção de informação de uma transação.

Para tal, basta na transação selecionar no menu opção sistema → agendar execução.

Neste exemplo estamos na transação AL258.

Ao escolhermos a opção “Agendar execução”, iremos para o ecrã de opções que já foi descrito neste documento.

Lista de agendamentos

A lista de todos os agendamentos está acessível na transação IA006. Aqui poderá verificar o estado do agendamento assim como informação do seu inicio, a próxima vez que irá ocorrer e o seu fim.

Nesta transação é possível modificar um agendamento assim como reter, libertar ou remover. Para tal basta aceder ao menu “Opções”.

No caso de escolher “modificar”, irá para o ecrã das opções disponíveis de agendamento já descritas neste documento.

Troubleshooting

O meu agendamento não arranca

Deve verificar se o serviço de schedule → agendamento se encontra ativo na transação dos serviços IA004.

No caso de não estar ativo deve iniciar o serviço.

Verifiquei que o meu agendamento não está a fazer tudo o que devia

É possível que exista muita informação a tratar para este processo especifico, e poderá ser necessário aumentar o limite de memória para a fila de trabalho onde ocorre este agendamento.

Para aumentar esse limite deve utilizar a transação IG009.

Esta situação também pode decorrer devido a intervalos de tempo de ocorrência do agendamento muito espaçados entre si. Para esta situação, deve-se aumentar a ocorrência do agendamento.