Dell DVD Store Sample Data Base: um Banco de Dados pronto para testes

Procurando por um Banco de Dados pronto para testes? Precisa de um modelo de dados relacional para implementar um laboratório, testar um novo framework, testar uma integração envolvendo acesso a banco de dados, provar um conceito ou algo do tipo? Quer fazer um benchmark do seu Banco de Dados para aplicar um Tuning específico? Data Base

Bom, eu precisei disso recentemente e, para poupar tempo resolvi “googlar” antes…

Eu poderia usar a criatividade e criar um modelo de domínio fictício para implementar um Banco de Dados na mão. Mas preferi usar um pronto e focar na ideia que estava querendo implementar.

Na Wiki do Postgres encontrei uma página que descreve e oferece várias opções de “Bancos de Dados de Exemplo”. Alguns com dados abertos de algumas agências governamentais e ONGs, outros para testes de performance (Benchmarks), outros com modelo de um determinado domínio de negócio. Os exemplos contemplam tabelas, relacionamento e integridade referencial , funções (Stored Procedures) e o melhor: dados pré carreados! \o/

Nessa Wiki encontrei uma referência para um Banco de Dados chamado “Dell DVD Store“. Trata-se de um Banco de Dados que implementa o modelo de domínio de uma loja de DVDs – básico né?! Bom, o que mais me interessa não é o modelo em si, mas a massa de dados. O Modelo do banco é composto por 8 tabelas e 6 funções (Stored Procedures).

O mais interessante deste exemplo é que ele é composto por um Kit que lhe permite gerar diferentes cargas de dados: small, medium e large. Veja a tabela abaixo com os tipos de carga disponível.

Database    Size     Customers             Orders   Products
Small      10 MB        20,000        1,000/month     10,000
Medium      1 GB     2,000,000      100,000/month    100,000
Large     100 GB   200,000,000   10,000,000/month  1,000,000

Com os scripts (Scripts Perl) disponíveis no Kit é possivel gerar uma massa de dados de 100GB. Excelente para testes de performance!

O Kit também oferece uma forma de gerar testes de carga simulando transações OLTP. E também oferece uma implementação de aplicação PHP e JSP para interagir com o Banco. Imagine a possibilidade dessa funcionalidade! Com isso você pode gerar uma carga real de transações e ao mesmo tempo testar o comportamento de sua aplicação neste cenário de carga na camada de dados…. Show né?!

Mais um detalhe importante: é possível gerar o Banco de Dados para diferentes SGBDs (Oracle, MS SQL Server, MySQL e Postgres).

Neste post descrevo os passos que executei para criar o Banco de Dados (tamanho small) em uma instalaçao do Postgres 9.4 que já possuia em uma VM rodando Red Hat Enterprise Linux 7. Caso queira explorar as demais opções do Kit, leia as instruções no arquivo ‘ds2/ds2.1_Documentation.txt

Acesse a página do exemplo (Dell DVD Store 2 Sample Database) e faça o download dos arquivos:

ds21.tar.gz
ds21_postgresql.tar.gz
readme.txt

Extraia os arquivos tgz e, um diretório temporário (ex: /tmp)

cd /tmp
tar -zxvf ds21.tar.gz
tar -zxvf ds21_postgresql.tar.gz

Para carregar criar o DB (small) no Postgres 9 abra o arquivo ‘/tmp/ds2/pgsqlds2/ds2_pgsql_readme.txt
e siga as instruções a partir do tópico ‘On PostgreSQL machine

sudo su - postgres

-bash-4.2$ createuser -d -l -P --interactive ds2
Enter password for new role: 'ds2'
Enter it again: 'ds2'
Shall the new role be a superuser? (y/n) y

Altere o arquivo ‘/var/lib/pgsql/9.4/data/pg_hba.conf‘ para permitir que usuários locais (do sistema operacional) possam se conectar ao postgres
Mude o valor da coluna ‘METHOD‘ de ‘ident‘ para ‘trust

vim /var/lib/pgsql/9.4/data/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust

volte para o shell anterior e reinicie o serviço do Postgres

sudo systemctl stop postgresql-9.4.service
sudo systemctl start postgresql-9.4.service

teste a conexão com o banco

psql -h localhost -p 5432 -U ds2 -d postgres
psql (9.4.1)
Type "help" for help.

postgres=# \q

acesse o diretório ‘/tmp/ds2/pgsqlds2

Ctrl + D
cd /tmp/ds2/pgsqlds2

altere o script ‘pgsqlds2_create_all.sh’

onde está

'createlang plpgsql ds2'

altere por

'createlang plpgsql $CONNSTR -d $DBNAME -U $SYSDBA'

execute o Script shell para carregar os dados

bash pgsqlds2_create_all.sh

A seguinte saída deve aparecer na console

NOTICE: database "ds2" does not exist, skipping
DROP DATABASE
CREATE DATABASE
ERROR: role "ds2" already exists
ALTER ROLE
ERROR: relation "customers" does not exist
ERROR: relation "orders" does not exist
ERROR: relation "orderlines" does not exist
ERROR: relation "cust_hist" does not exist
...
CREATE TABLE
CREATE TABLE
CREATE TABLE
...
COPY 5010
COPY 4942
COPY 5010
COPY 5163
COPY 4992
COPY 4951
ALTER TABLE
ALTER TABLE
COPY 10000
ALTER TABLE
ALTER TABLE
COPY 10000
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
...
CREATE ROLE
GRANT
GRANT
GRANT
ANALYZE

O Banco de Dados ‘ds2‘ foi gerado com o seguinte Schema

DVD Store Release 2 Database Schema
-----------------------------------

Table Columns Number of Rows (Large database)
----- ------- -------------------------------

Customers CUSTOMERID 200 million
FIRSTNAME
LASTNAME
ADDRESS1
ADDRESS2
CITY
STATE
ZIP
COUNTRY
REGION
EMAIL
PHONE
CREDITCARDTYPE
CREDITCARD
CREDITCARDEXPIRATION
USERNAME
PASSWORD
AGE
INCOME
GENDER

Orders ORDERID 120 million
ORDERDATE
CUSTOMERID
NETAMOUNT
TAX
TOTALAMOUNT

Orderlines ORDERLINEID 600 million
ORDERID
PROD_ID
QUANTITY
ORDERDATE

Cust_Hist CUSTOMERID 600 million
ORDERID
PROD_ID

Products PROD_ID 1 million
CATEGORY
TITLE
ACTOR
PRICE
SPECIAL
COMMON_PROD_ID

Inventory PROD_ID 1 million
QUAN_IN_STOCK
SALES

Reorder PROD_ID variable
DATE_LOW
QUAN_LOW
DATE_REORDERED
QUAN_REORDERED
DATE_EXPECTED

Categories CATEGORY 16
CATEGORYNAME

Execute um o seguinte comando SQL para testar o Banco de Dados criado:

psql -h localhost -p 5432 -U ds2 -d ds2
ds2=# select count(*) from customers;
count
-------
20000
(1 row)

Após a criação e carga inicial a tabela ‘CUSTOMERS‘ possui 20 mil registros.

Por enquanto é isso.

Em um próximo post pretendo explorar os scripts de carga disponíveis no Kit.

Dica para usuários do YUM: gerenciador de pacotes em sistemas Red Hat like

Volta e meia preciso usar algum comando mais específico do YUM ou RPM no Red Hat Enterprise Linux. Entenda por “mais específico” qualquer comando diferente de:YUM Cheat Sheet for RHEL

yum search‘, ‘yum install‘, ‘yum erase, remove

rpm -qa‘ ou ‘rpm -ivH

Em uma ocasião mais recente precisei investigar onde o yum havia instalado o conteúdo de um determinado pacote no sistema.

Pesquisando no Google descobri o utilitário ‘repoquery‘ disponível no pacote ‘yum-utils‘. Este comando permite listar o conteúdo do pacote rpm mostrando os paths dos arquivos instalados no sistema de arquivos.

Exemplo: para listar o conteúdo do pacote ‘rhscl-dockerfiles’ instalado no RHEL 7, utilize o comando abaixo.

$ sudo repoquery -l rhscl-dockerfiles
/usr/share/rhscl-dockerfiles
/usr/share/rhscl-dockerfiles/rhel6
/usr/share/rhscl-dockerfiles/rhel6/httpd24
/usr/share/rhscl-dockerfiles/rhel6/httpd24/Dockerfile
/usr/share/rhscl-dockerfiles/rhel6/httpd24/README.md
/usr/share/rhscl-dockerfiles/rhel6/httpd24/enablehttpd24.s
...

Bem, a dica é que existe um documento chamado  ‘YUM COMMAND CHEAT SHEET‘ disponível no site da documentação oficical do Red Hat Enterprise Linux. Trata-se de uma listagem bem objetiva dos principais comandos e opções avançadas do mecanismo de gerência de pacotes do RHEL (yum). O PDF é público e pode ser obtido através do link [1]

___

[1] https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-1.pdf

Montando um ambiente JBoss EAP 6 (Domain Mode) com Monitoramento e Gerência

Recentemente resolvi escrever um roteiro de como implementar um ambiente para hospedar aplicações corporativas desenvolvidas em JavaEE utilizando o Red Hat JBoss Enterprise Application Platform 6.

O ambiente proposto nesse roteiro utiliza uma stack inteiramente Red Hat. Existem vários roteiros disponíveis pela Internet utilizando as versões Community dos produtos JBoss Middleware: Wildfly, RHQ, Fedora etc. Eu particularmente recomendo um excelente roteiro escrito pelo colega Maurício Magnani em seu blog JBoss Divers:

A motivação de escrever “mais um” roteiro sobre este tópico surgiu após a realização de algumas Provas de Conceito (PoC) envolvendo a versão Enterprise dos Produtos JBoss fornecidos e mantido pela Red Hat.

Após escrever o roteiro decidi torná-lo público de forma a ajudar outros profissionais com interesse em experimentar um ambiente utilizado o JBoss EAP.

O ambiente proposto no roteiro utiliza o modo Domain do JBoss EAP 6 que permite a implantação e o provisionamento de instâncias do Servidor de Aplicação de forma distribuída em vários Hosts. Oferecendo ainda uma administração centralizada através do componente Domain Controller. O ambiente também contempla um servidor web que atua como proxy reverso e balanceado de carga para requisições Htttp utilizando o mod_cluster, bem como a parte de monitormaento e gestão do ambiente utilizando o JBoss Operations Network.

Enfim, o roteiro está disponível em meu repositório GitHub chamado asciidocs.Utilizei o formato texto AsciiDoc para escrever o documento, pois considero um formato simples, fácil de compartilhar e manter e extremamente portável. Textos em AsciiDoc podem ser convertidos em diversos outros formatos: html, pdf, ePUB, DocPub etc.

Para renderizar o documento asciidoc utilizo a ferramenta AsciiDoctor. Veja o resultado do documento no formato html5 na imagem abaixo

AsciiDoc convertido para HTML5 utilizando o AsciiDoctor

AsciiDoc convertido para HTML5 utilizando o AsciiDoctor

Sinta-se a vontade para clonar o texto disponível no GitHub e compor sua própria documentação!

Por se tratar de um documento texto o asccidoc pode ser editado em qualquer editor de texto. Eu particularmente utilizei um editor de texto moderno chamado Atom editor. Esse editor foi criado pelo time do GitHub e possui inúmeras funcionalidades e plugins. Veja o Atom com o plugin do AsciiDoctor

Atom editor com plugin do AsciiDoctor instalado.

Atom editor com plugin do AsciiDoctor instalado.

NOTA: para utilizar a ferramenta AsciiDoctor é necessário instalar o suporte ao Ruby em seu ambiente.

Excluindo uma tag de um repositório Docker em um registro remoto

Quando voce publica uma imagem Docker em algum repositório remoto (privado ou público) não é possível excluir uma tag da imagem utilizando o cliente docker na linha de comando.

docker rmi <id da imagem>

isso removerá apenas do seu registro local.

Para remover do registro público é necessário utilizar a API REST [1] do serviço de registro do docker.

De acordo com a documentação da API Docker Registry [2] o endpoint é o seguinte:

DELETE /v1/repositories/(namespace)/(repository)/tags/(tag*)

Exemplo:

DELETE /v1/repositories/reynholm/help-system-server/tags/latest HTTP/1.1
Host: registry-1.docker.io
Accept: application/json
Content-Type: application/json
Cookie: (Cookie provided by the Registry)

Exemplo que usei no meu caso:

[root@rhel7-server-1 httpd]# curl -X DELETE my-private-docker-registry.com:5000/v1/repositories/rsoares/rhel7/tags/latest
true

Pronto!

Se o retorno for ‘true‘ sua tag foi removida!

Execute novamente a requisição REST para se certificar

curl -X DELETE my-private-docker-registry.com:5000/v1/repositories/rsoares/rhel7/tags/latest
{"error": "Tag not found"}

Observe o retorno:

{"error": "Tag not found"}

[1] https://docs.docker.com/reference/api/registry_api
[2] https://docs.docker.com/reference/api/registry_api/#delete-a-repository-tag

Installing the OpenJDK 7 in a RHEL 7 Docker Image: systemd dep issue

Hello guys!

redhat-docker

Maybe you are thinking… WTF! Why have this guy written this post in English?!

Well,
I think this is my first blog post in this blog written in en_US. The motivation is simple. The subject (Docker and all the related things around it) is attracting almost all the attention of IT at this moment. So the basic idea is to help more people that might face the same issue described in this post.

So, please ignore any language/typo mistake.

;-)

Ok!

For those trying to build a RHEL 7 Docker Base Image with Java 7 support (OpenJDK 7 packages), the openjdk pkgs depends on systemd. When you try to install the openjdk via yum you may see the following error:

bash-4.2# yum install java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64
Resolving Dependencies
--> Running transaction check
---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.71-2.5.3.1.el7_0 will be installed
...
Dependencies Resolved
==================================================================================================================================================
 Package Arch Version Repository Size
==================================================================================================================================================
Installing:
 java-1.7.0-openjdk x86_64 1:1.7.0.71-2.5.3.1.el7_0 rhel-7-server-rpms 196 k
 java-1.7.0-openjdk-devel x86_64 1:1.7.0.71-2.5.3.1.el7_0 rhel-7-server-rpms 9.1 M
Installing for dependencies:
...
systemd x86_64 208-11.el7_0.5 rhel-7-server-rpms 2.6 M
 systemd-sysv x86_64 208-11.el7_0.5 rhel-7-server-rpms 36 k
 sysvinit-tools x86_64 2.88-14.dsf.el7 rhel-7-server-rpms 63 k
...
Transaction Summary
==================================================================================================================================================
Install 2 Packages (+86 Dependent packages)
'Transaction check error:
file /usr/lib/rpm/macros.d/macros.systemd from install of systemd-208-11.el7_0.5.x86_64 conflicts with file from package fakesystemd-1-14.el7.x86_64'

The rhel7 official base image includes a fakesystemd (from @koji-override-0/7.0 repo) instead of full systemd. I’m not sure if this fafesystemd pkg is shipped with rhel 7 docker base image (I have to check to confirm). I saw some blogs posts saying it is used to avoid a number of bad implications with running full systemd on Docker Containers. I thik it come as a dependence with the openssh-server pkg I’ve installed before. This fakesystemd provides only some fake files to satisfy some other pkgs requirements that depends on systemd service:

bash-4.2# rpm -ql fakesystemd-1-14.el7.x86_64
/etc/binfmt.d
/etc/modules-load.d
/etc/sysctl.d
/etc/systemd
/etc/systemd/system
/etc/systemd/user
/etc/tmpfiles.d
/etc/udev
/etc/udev/rules.d
/usr/lib/binfmt.d
/usr/lib/modules-load.d
/usr/lib/rpm/macros.d/macros.systemd
/usr/lib/sysctl.d
/usr/lib/systemd
/usr/lib/systemd/catalog
/usr/lib/systemd/ntp-units.d
/usr/lib/systemd/system-generators
/usr/lib/systemd/system-preset
/usr/lib/systemd/system-shutdown
/usr/lib/systemd/system-sleep
/usr/lib/systemd/user-generators
/usr/lib/systemd/user-preset
/usr/lib/tmpfiles.d
/usr/share/pkgconfig
/usr/share/systemd
/var/lib/systemd
/var/lib/systemd/catalog

The workaround I’ve found for now is to remove the fakesystemd in order to be able to install the openjdk packages.

bash-4.2# yum remove fakesystemd-1-14.el7.x86_64

As I mentioned before to avoid the issues with the full systemd inside Docker containers I followed this approach: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Well, I hope this could help you.

Access Denied após habilitar o RBAC no JBoss EAP 6

Após criar o usuário administrador do JBoss…

[jboss@rhel7-server-1 bin]$ cd $JBOSS_HOME/bin
[jboss@rhel7-server-1 bin]$ ./add-user.sh

What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a):

Enter (a) para criar um usuário de administração.

Enter the details of the new user to add.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : admin

Após definir o nome do usuário (admin neste exemplo) defina uma senha obedecendo algus prereqs.

The username 'admin' is easy to guess
Are you sure you want to add user 'admin' yes/no? yes
Password requirements are listed below. To modify these restrictions edit the add-user.properties configuration file.
- The password must not be one of the following restricted values {root, admin, administrator}
- The password must contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
- The password must be different from the username
Password :
Re-enter Password :

Caso queira criar/associar o usuário à um grupo (ex: administradores) informe o nome do(s) grupo(s) neste momento. Ou Enter para continuar sem grupo.

What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
About to add user 'admin' for realm 'ManagementRealm'
Is this correct yes/no? yes

Por padrão o mecanismo de autenticação (Simple) do EAP mantém usuários e grupos em arquivos texto. As senhas são codificadas usando um algoritmo Hash.

Added user 'admin' to file '/opt/redhat/jboss-eap-6.3/standalone/configuration/mgmt-users.properties'
Added user 'admin' to file '/opt/redhat/jboss-eap-6.3/domain/configuration/mgmt-users.properties'
Added user 'admin' with groups to file '/opt/redhat/jboss-eap-6.3/standalone/configuration/mgmt-groups.properties'
Added user 'admin' with groups to file '/opt/redhat/jboss-eap-6.3/domain/configuration/mgmt-groups.properties'

Este usuário será usado para chamadas remotas ou por algum Host Controller (Domain Mode)?

Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? no

Você acessa a console, abre a aba Administration e vê a seguinte mensagem:

JBoss EAP 6 RBAC Auth

Ahmmm! Legal! Quero habilitar o mecanismo de autenticação RBAC para criar usuários com diferentes perfis de gerência (Administrator, Deployer, Monitor, Operator, etc)…

Aí você copia o comando, acessa a CLI e executa…

[jboss@rhel7-server-1 bin]$ ./jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] connect 192.168.122.65:9999
[standalone@192.168.122.65:9999 /] /core-service=management/access=authorization:write-attribute(name=provider,value=rbac)
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
[standalone@192.168.122.65:9999 /] reload

Volta na console web e tenta logar novamente ou executar alguma operação…

jboss-eap-access-denied-after-enable-rbac

Ops! :-/

Deu merda!

Sim! Quando você habilita o RBAC o JBoss troca o mecanismo de autenticação original (simple) pelo mecanismo RBAC. Por este motivo a role que antes era mapeada nos arquivos:

/opt/redhat/jboss-eap-6.3/standalone/configuration/mgmt-users.properties
/opt/redhat/jboss-eap-6.3/standalone/configuration/mgmt-groups.properties

passa a ser mapeada dentro do standalone.xml ou domain.xml.

...
        <access-control provider="rbac">
            <role-mapping>
                <role name="SuperUser">
                    <include>
                        <user name="$local"/>
                    </include>
                </role>
            </role-mapping>
        </access-control>
...

Agora precisamos mapear o usuário admin (criado com o script add-user.sh) para as roles pré definidas no RBAC. Como o admin é o usuário administrador, precisamos associar ele à role SuperUser. Para isso execute o comando abaixo na CLI do JBoss.

[standalone@192.168.122.65:9999 /] /core-service=management/access=authorization/role-mapping=SuperUser/include=user-admin:add(name=admin,realm=ManagementRealm,type=USER)
{"outcome" => "success"}

Pronto!

Agora se abrir o standalone.xml irá observar que o usuário admin está associado à role Super User

...
        <access-control provider="rbac">
            <role-mapping>
                <role name="SuperUser">
                    <include>
                        <user name="$local"/>
                        <user name="admin" realm="ManagementRealm"/>
                    </include>
                </role>
            </role-mapping>
        </access-control>
...

Agora o usuário admin pode ser visto na console.

jboss-eap-after-fix-rbac

;-)


Ref: https://access.redhat.com/solutions/696693