[MySQL] MySQL 5.6 Replication and Failover

Preparation :
1.準備四台CentOS 6.x 64bit的VM
2.在上面先裝好MySQL在每個VM裡

1.安裝MySQL UtilitiesMySQL Connector/Python
// for utilties
#python setup.py install
// for connector/python
#rpm -ivh mysql-connector-python-1.0.12-1.el6.noarch.rpm

2.設定my.cnf在每台MySQL上
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
server-id=1  #每台機器都要不一樣

[Other] 如何打包.run在Linux環境

最近寫了PESI的Agent Code,想要讓安裝容易一些,所以把腦筋動到了Linux上的.run檔,經過Google大神的引導,讓我找到了makeself

makeself裡面的東西就請大家自己到該網頁看囉!!這裡主要是記錄我如何打包PESIAgent。

1.先安裝好makeself...其實就是解壓縮XD
# ./makeself.run

2.準備安裝所有的檔案在同一個folder
# cd makeself-2.1.5/
# mkdir pesi_src
# cp PESIAgent.jar ./pesi_src/
# cp pesi.properties ./pesi_src/
# cp pesi.userparams.conf ./pesi_src/

3.編寫install shell...
# cd pesi_src
# vi pesi_install.sh
----------------------------
#!/bin/bash
Dir=`pwd`
cd ${Dir}
mkdir -p /opt/zabbix/bin
mkdir -p /opt/zabbix/etc

cp PESIAgent.jar /opt/zabbix/bin/
cp pesi.properties /opt/zabbix/etc/
cp pesi.userparams.conf /opt/zabbix/etc/

#sed -i `grep -n 'Include=' /opt/zabbix/etc/zabbix_agentd.conf | awk -F ":" '{ print $1 }' | tail -1`'a Include=/opt/zabbix/etc/pesi.userparams.conf' /opt/zabbix/etc/zabbix_agentd.conf

sed -i '/^# Include=$/ {
a\Include=/opt/zabbix/etc/pesi.userparams.conf
}' /opt/zabbix/etc/zabbix_agentd.conf
----------------------------

4.利用makeself來打包囉
格式如下:
makeself.sh [args] archive_dir file_name label startup_script [script_args]
# ./makeself.sh pesi_src pesi_agent_install.run "PESI Agent Install" ./pesi_install.sh

archive_dir:就是pesi_src,就是把你要打包的所有東西存放的folder < pesi_src >
file_name:打包出來的檔 < pesi_agent_install.run >
label:顯示在安裝時的訊息
start_script:安裝要執行script,必須是./開頭喔!!


[PostgreSQL & PPAS]監控項目小計

1.檢查pg_xlog/archive_status目錄下的.ready檔案是否有很多個,如果有很多,表示該目錄的寫性能不好。
unit?=個數
#./check_postgres_archive_ready -H 127.0.0.1 -p 5432 -db test -u postgres

2.當table的age到達一定的值後,db需要適時的做vacuum freeze,否則會有資料消失的問題。
unit?=百分比
#./check_postgres_autovac_freeze -H 127.0.0.1 -p 5432 -db test -u postgres --include=test

3.監測最大連線數(整個資料庫instance)。
unit?=個數
#./check_postgres_backends -H 127.0.0.1 -p 5432 -db test -u postgres --output=simple

4.監測Table跟Index的膨脹量(Checks the amount of bloat in tables and indexes.)
db膨脹量與autovacuum_vacuum_scale_factor有關,預設是0.2,所以一般超過20%就要告警,利用vacuum full來回收。
perflimit -> 找前幾名
unit?=容量(bytes, kilobytes, megabytes, gigabytes, terabytes, exabytes, petabytes, and zettabytes.)
#./check_postgres_bloat -H 127.0.0.1 -p 5432 -db test -u postgres --perflimit=5

5.檢查最後一次checkpoint發生到現在經過了多少時間。
unit?=時間,秒
#./check_postgres_checkpoint --datadir=/usr/local/pgsql/data -w 10s

6.監測transaction commit ratio。反過來說就是監測rollback的百分比
unit?=百分比
./check_postgres_commitratio -H 127.0.0.1 -p 5444 -db edb -u enterprisedb --include=edb --output=simple

7.資料庫連線狀態
unit?=1(available) or 0(unavailable)
#./check_postgres_connection -H 127.0.0.1 -p 5432 -db test -u postgres --output=simple

8.自訂SQL監測 (有一定的限制,看場合使用)
最多只能有兩個return值。一個要是result另一個隨便
#./check_postgres_custom_query -H 127.0.0.1 -p 5432 -db test -u postgres --query="select relname AS result, relpages AS pages from pg_class where relpages>10" --valtype=string -w 6

9.資料庫容量監測
unit?=容量(bytes, kilobytes, megabytes, gigabytes, terabytes, exabytes, petabytes, and zettabytes.)
#./check_postgres_database_size -H 127.0.0.1 -p 5432 -db test -u postgres --include=test -w 10M -c 20M --output=simple

10.Buffer命中率 (blks_hit/(blks_hit+blks_read)) 從 pg_stat_database 這個統計view查的到
unit?=百分比
#./check_postgres_hitratio -H 127.0.0.1 -p 5444 -db edb -u enterprisedb --include=edb --output=simple

11.Last vacuum, analyze, autovacuum, autoanalyze到現在的時間間隔
unit?=table=時間,秒
#./check_postgres_last_analyze -H 127.0.0.1 -p 5444 -db edb -u enterprised --output=simple
#./check_postgres_last_autoanalyze -H 127.0.0.1 -p 5444 -db edb -u enterprisedb --output=simple
#./check_postgres_last_vacuum -H 127.0.0.1 -p 5444 -db edb -u enterprisedb --output=simple
#./check_postgres_last_autovacuum -H 127.0.0.1 -p 5444 -db edb -u enterprisedb --output=simple

12.prepared transaction監測(前提是postgresql.conf裡面的max_prepared_transactions有設定)
unit?=個數 ->有多少個還沒完成的tx(未commit的量)
#./check_postgres_prepared_txns -H 127.0.0.1 -p 5432 -db test -u postgres --output=simple

13.是否發生slowquery
unit?=時間,秒
#./check_postgres_query_time  -H 127.0.0.1 -p 5432 -db test -u postgres --include=test -w 300s --output=simple

14.監控tx的Idle時間
unit?=時間,秒
#./check_postgres_txn_idle -H 127.0.0.1 -p 5432 -db test -u postgres -w 60s

14.監控tx的最長執行時間 (8.3以後才能使用)
unit?=時間,秒
#./check_postgres_txn_time -H 127.0.0.1 -p 5432 -db test -u postgres -w 60s

[PostgreSQL/PPAS] Ora2Pg - Migrates Oracle Databases to PostgreSQL

1. 下載所需檔案
    a.Oracle:下載OCI 的base及sdk(這裡)
    b.Perl:下載DBD:Oracle(這裡)
    c.Ora2Pg:下載ora2pg source (這裡)

2. 安裝OCI
    # rpm -Uvh oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm
    # rpm -Uvh oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64.rpm
    # vi /etc/ld.so.conf.d/oci.conf
============oci.conf start================
/usr/lib/oracle/12.1/client64/lib
============oci.conf  EOF================
    # ldconfig -v

3. 安裝Perl DBD:Oracle模組
   # tar -zxvf DBD-Oracle-1.68.tar.gz
   # cd DBD-Oracle-1.6
   # export ORACLE_HOME=/usr/lib/oracle/12.1/client64
   # export PATH=$PATH:$ORACLE_HOME/bin
   # export LD_LIBRARY_PATH=$ORACLE_HOME/lib
   # perl Makefile.PL -V 12.1.0
   # make install

4. 安裝Ora2Pg
   # tar -jxvf ora2pg-12.0.tar.bz2
   # cd ora2pg-12.0
   # perl Makefile.PL
   # make && make install

5.定義轉換時所需的workspace
./create_workspace.sh

6.組態資料庫連線
$ sudo vim mig_config/ora2pg.conf
# modify the following lines
ORACLE_HOME     /home/cenoq/app/cenoq/product/11.2.0/client_1
ORACLE_DSN      dbi:Oracle:host=172.16.1.129;sid=db1;port=1521
ORACLE_USER     csapi
ORACLE_PWD      csapi

ALLOW   CS_*

7.進行資料庫轉出
$ ora2pg -t TABLE -o table.sql -b mig_table/ -c mig_config/ora2pg.conf -l exp_table.log
$ ora2pg -t COPY -o data.sql -b mig_data/ -c mig_config/ora2pg.conf -l exp_table.log
$ ora2pg -t SEQUENCE -o sequence.sql -b mig_sequence/ -c mig_config/ora2pg.conf -l exp_table.log

8.檢視轉出結果
$ vim exp_xxx.log
$ vim table.sql
$ vim data.sql
$ vim sequence.sql

9.進行資料庫匯入
$ psql -U csapi -h localhost -p 5555 -d csapi -f table.sql
$ psql -U csapi -h localhost -p 5555 -d csapi -f data.sql
$ psql -U csapi -h localhost -p 5555 -d csapi -f sequence.sql

10.檢視匯入結果
$ psql -U csapi -h localhost -p 5555 -d csapi
csapi# select count(1) from cs_*;

[PostgreSQL/PPAS] 利用 pgBadger 來分析 Postgres log file

1.下載pgBadger,並解壓
# tar -zxvf pgbadger-3.6.tar.gz

2.安裝(optional)
# cd pgbadger-3.6
# perl Makefile.PL
# make && make install

3.執行
./pgbadger --prefix 'postgresql.conf裡面log_line_prefix的值 ' /path/to/your/pglog/*.log -o out.html

4.用browser看結果囉!!




[PostgreSQL/PPAS] Barman - Backup and Recovery Manager

1.Barman:
Braman (Backup & Recovery Manager) - 是PostgreSQL資料庫伺服器非常方便的備份與還原工具,它可以遠端執行備份、集中管理備份及允許由一個備份還原資料庫。
它的原理是利用PostgreSQL的PITR來達到的,對PITR有興趣的"捧油",可以到這裡去看看喔!!

2.環境說明:

172.16.1.89 - PostgreSQL Backup Server
172.16.1.90 - Zabbix Server
172.16.1.91 - PostgreSQL 8.2
172.16.1.92 - PostgreSQL 8.3
172.16.1.93 - PostgreSQL 8.4
172.16.1.94 - PostgreSQL 9.0
172.16.1.95 - PostgreSQL 9.1
172.16.1.96 - EDB PPAS 9.2

3.安裝:
先到Barman的官網 http://www.pgbarman.org 下載安裝包到 PostgreSQL Backup Server。
3.1 解壓縮。
# tar -zxvf barman-1.2.3.tar.gz
3.1 cd到 barman-1.2.3,開始build and install
# cd barman-1.2.3
# ./setup.py build
# ./setup.py install
3.3 由於barman是利用python來實作的,所以它有相依的python lib如下:
a). python-argh     b). python-dateutil    c). python-psycopg2
安裝步驟如下:
# wget http://mirror-fpt-telecom.fpt.net/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm     (optional)  選一個
# yum install epel-release-6-8.noarch.rpm  (optional)  選一個
# yum repolist
# yum -y install python-pip
# yum -y install python-argh python-dateutil python-psycopg2
# pip install argcomplete

[JBoss] JBoss7 & JEAP6 如何安裝EDB 的JDBC Driver,並設定DATASOURCE

1. 先下載好JDBC Driver JAR。
EDB-PPAS   : edb-jdbc16.jar or edb-jdbc14.jar (看你的JDK ver囉!!)

2. 在JBOSS_HOME/modules/下建立com/edb資料夾
這裡要注意,如果你是JBoss7,就是在JBOSS_HOME/modules下建立
如果是JEAP6就是在JBOSS_HOME/modules/system/layers/base/建立囉
一般來說裡面都有com資料夾了,只需再加上edb folder (如下圖)

3. 複製JDBC Driver並建立Module檔。
先將EDB JDBC Jar COPY進去,接著建立一個module.xml檔,內容如下:

[PostgreSQL][Slony]如何在Slony環境下實現Partitionting

Slony-I的官方文件內有寫到:

5.3 Partitioning Support:
Slony-I does not directly provide support for the PostgreSQL methodology of partitioning via inheritance, but it does not, by the same token, prevent the Gentle User from using that sort of replication scheme, and then replicating the underlying tables.

那如何完成slony的自動化Table Partition就是本文的課題啦~

1. 環境準備
    a). 準備兩個Linux VM(這裡用CentOS),ip各為192.168.38.25~26。
    b). 先利用這章建立slony的環境,確保slony有正常運作。
    c). 安裝PLSH extension (不知怎裝看這邊喔!!)。

2. 步驟
    a). Create Database 在slony的兩個節點。
        SQL> CREATE DATABASE demo WITH ENCODING='UTF8' OWNER=slony;
    b). 建立所需Function

[PPAS] Migration Studio 8.4 by EnterpriseDB - How to ?

PPAS 9.1以後Migration ToolKIt 就只有command line下的runMTK.sh,沒有像8.4時預設有一個Migration Studio可以使用,其實EnterpriseDB有Open Migration Studio的Source Code在(按我下載)。這裡記錄下如何在CentOS 6.x下讓它動起來。

1. 安裝ANT (預設應該有OpenJDK,沒有請Google囉)
# yum install ant

2. copy相關jdbc jar file到jdk的jre/lib下,需要oracle migrate到EDB PPAS就需要oracle jdbc jar file,其它的database請自行複製相關JDBC DRIVER。
# cp ojdbc14.jar /usr/lib/jvm/jre/lib/ext

3. Download Source Code:
到這個網址http://www.enterprisedb.com/downloads/component-source-code 下載Migration Studio 8.4 by EnterpriseDB,你會得到一個MigrationStudio-84410.tar.bz2壓縮檔。

4. 解壓該壓縮檔:
# tar -jxvf MigrationStudio-84410.tar.bz2

5. 修改build.xml中的 edb-debugger相關
# cd MigrationStudio-84410
# vi build.xml ,刪除以下幾行(如不知該如何修改,請點我)

[RHCS] 以CentOS 6 實作 HA

1.安裝環境:
這篇文章主要介紹EnterpriseDB的cluster架構,整個RHCS由三台Server組成,分別有兩台EDB資料庫及一台iSCSI Server,在這個架構下任一台EDB資料庫crash都會由另一台接手,以確保資料庫可以不間斷的運行。


2. Install Preparation
三台CentOS 6.3的VM(一台當iSCSI主機,另兩台為Cluster的DB),各組態如下所示。

*iSCSI在前一篇文有介紹過了,這裡列出指令,但不多加贅述。
*EDB的安裝與設定也請自行處理,這裡主要針對RHCS。


[iSCSI] 建立iSCSI target / initiator on CentOS 6.x


1. 先準備兩台CentOS 6.x,vm配置如下:
  • iSCSIServer (192.168.38.10) - CentOS 6.4 
  • HA1 (192.168.38.11) - CentOS 6.4 
2. 於iSCSIServer安裝設定 iSCSI target
  • yum install scsi-target-utils -y
  • 安裝後可參考下列的組態跟可執行程式
         /etc/tgt/targets.conf:主要設定檔,設定要分享的磁碟格式與哪幾顆;
         /usr/sbin/tgt-admin:線上查詢、刪除 target 等功能的設定工具;
         /usr/sbin/tgt-setup-lun:建立 target 以及設定分享的磁碟與可使用的用戶端等工具軟體。
         /usr/sbin/tgtadm:手動直接管理的管理員工具 (可使用設定檔取代);
         /usr/sbin/tgtd:主要提供 iSCSI target 服務的主程式;
         /usr/sbin/tgtimg:建置預計分享的映像檔裝置的工具 (以映像檔模擬磁碟);
         (參考鳥哥的Linux 私房菜)

[PPAS] 清除xDB所有設定

EnterpriseDB - xDB架構上是有一台Publication Server及一台Subscription Server組成,其背後有一台Database在維護這些資料,常有時會有設定錯後,導致再也無法加DB or Publication / Subscription,然後出現

Publication control schema does not exist on target database

這時我們就得清除所有的xDB metadata才能再讓xDB重振雄風 (誤...

以下記錄清除的步驟:
1.Stop Publication / Subscription Server
     -#/etc/init.d/edb-xdbpubserver stop
     -#/etc/init.d/edb-xdbsubserver stop

2.確認publication 的 metadata database objects

    -for Oracle
       SQL> CONNECT pubuser/password
            SQL> SELECT table_name FROM user_tables;
            SQL> SELECT sequence_name FROM user_sequences;
            SQL> SELECT DISTINCT name FROM user_source WHERE type = 'PACKAGE';
            SQL> SELECT trigger_name FROM user_triggers;
        -synchronization
            會多出RRST_開頭的Table
            會多出RRPI_, RRPU_及RRPD_開頭的Trigger, for每個repl的table.
        -snapshot
            就沒有RRST_開頭的Table及沒有任何Trigger

    -for EDB
        會產生_edb_replicator_pub這個schema。如下圖

3.刪除這些Publication Database Objects
    -for Oracle
           SQL> CONNECT system/password
           SQL> DROP USER pubuser CASCADE;

    -for EDB
            postgres=# \c edb postgres
            edb=# DROP SCHEMA _edb_replicator_pub CASCADE;

[PPAS] xDB Configuration - xDB 組態

xDB Setup
1. 先確認所有service是否running…






2.選xDB Replication Console

3.Console的使用者介面














[PPAS] xDB Installation Guide - xDB 安裝說明

xDB Installation Guide
1.點選StackBuilder Plus (或直接執行edb-xdb.bin,跳到第7步)










2.選擇資料庫















3.選擇Postgres Plus xDB Replication Server














[轉] postgresql 8.x tuning

優化分了三個部分的內容:查詢類,更新類,管理類
查詢類:work_mem參數
該參數是postgresql每個進程可以使用的工作內存空間。如果進程需要的容量超過了這個範圍,就要把處理內容輸出到臨時文件里,相當於OS的swap處理。
查詢時如果用到了排序,哈希關聯,bitmap檢索等方式的話,就要分別利用work_mem的內存空間。也就是一個SQL語句可能會同時使用多個工作內存空間,而不是共用一個。
設置這個參數的時候,就要考慮到同時連接數以及每個連接平均使用的內存空間數。總內存數減去 (同時連接數”平均使用數的總和),剩下的才是OS和postgresql可以利用的緩存。(參考值,不是絕對值) 設置的太大的話,反倒會引起OS的swap,影響性能。
正確設置work_mem的方法如下:
1) psql連接數據庫
2)database=# set client_min_messages=’LOG’;
3) database=# set log_temp_files = 0; //顯示所有使用臨時文件的日誌
4) 執行比較慢的SQL語句
5) 如果顯示了類似下列的日誌的話,就要加大work_mem的值,然後重復第五步
LOG: temporary file: path “base/pgsql_tmp/pgsql_tmp27660.1568″, size 88155700
修改這個參數不用重啓數據庫,reload一下就可以了。
最好先執行一下SQL語句,把需要的資源全部放到緩存里,然後再調試,可以排除IO的影響。

[Postgresql] Slony - 如何在slon的table做DDL的動作(add column, alter column...etc)

話說那天我們家"理哥"在上課時說slony內的table如果要行DDL就一定要先把該Table先移出slony,然後兩邊都alter完後再重新加入slony才行(這我不大相信,PostgreSQL這種集大家力量完成的東西會沒人想到,而用這麼瞎的方式做).後來在Google上發現Execute Script的方法可以用,以下就是實現的方式,給大家做個參考,當然如果您有更好的方法可以互相交流一下喔:

pre.
slony-Master 192.168.38.25 (EDBDemo)
slony-Slave   192.168.38.26 (EDBDemo1)

DB name : demo
Table name : tb1 (id, name)

[PPAS] 使用pgagent來實現資料庫排程(Jobs)

1. 先確認pgagent是否有正常安裝與啟動。(在安裝PPAS時的最後一步會問要不要自動啟動,請選)
在Linux下可利用以下方法確認




2. 安裝pgagent.sql
# ./psql -U enterprisedb -d demodb < ../share/pgagent/pgagent.sql





裝好上述SQL後會在database裡面看到pgagent這個catalog

[PostgreSQL] 實作PostgreSQL Synchronous Hot stand-by Server

前幾天客戶在問PostgreSQL的異地備援方案,沒做過相關的案子,所以上網看了一些文章,有一段在說明什麼樣的資料與business應該採用什麼方案,下面的解說很有趣,給大家參考一下:
  • 可口可樂的秘方:異地備份
據說可口可樂的配方只有三個人知道,這三個人不可以同時搭一班飛機,免得萬一飛機掉下來我們就只能喝百事可樂了。
所以可口可樂的秘方需要做的是「異地備份」。

***就是每隔一段時間找個地方把資料另外存一份,NBU?
  • 我一秒鐘幾十萬上下:即時備援
有沒有看過少林足球呀?公司eBusiness生意這麼大,我一秒鐘幾十萬上下,無緣無故跟你們做什麼備份﹗不好意思啊,你知道我這人就這麼直啊!
如果一秒鐘幾十萬上下,需要的是一個「生意不停頓」Business non-stop系統,知道嗎!

***資料要能同步,而且在Master掛了後馬上能接手。
  • 副總統的責任:異地備援
妳知道 副總統的責任是什麼呢? 就是 ----------- 「不要死
正副總統不但不可以同時搭一班飛機,而且正總統一秒鐘何只幾十萬上下,所以副總統只能「遠遠地」老實的待著,乖乖地做正總統的「異地備援」。

***資料同步能接受delay,但資料所在位置不能在同一棟大樓或區域。另外在原有的機器掛的時後也能接手工作。

回到正題:

為了模擬即時備援+異地備援,我利用VirtualBox實作了Synchronous Hot Standby 的PostgreSQL,在這裡把過程記錄下來。

[JBoss] JBoss ON Re-install Agent

1.     先確認版本.
rhq-enterprise-agent4.4.0.JON310GA.jar,表示是 JON 3.1.0版本的,/webap/有兩個, rhq-enterprise-agent-4.4.0.JON310GA.jarrhq-enterprise-agent-4.4.0.JON312GA.jar

舊的版本會裝在/webap/rhq-agent,而且預設是被啟動的所以要先砍掉原來在runprocess,請參考下圖做法
# ps –ef | grep rhq
# kill -9 xxxx (下圖是1439,請注意那個值我電腦上跟server不一樣)

2.     接著將原版本備份起來
# mv rhq-agent rhq-agent.bak

3.     執行安裝,用下列指令裝完後會產生新的rhq-agent資料夾
# java -jar rhq-enterprise-agent-4.4.0.JON310GA.jar --install


4.     接著就要啟動agent,因之前有安裝過其它版本,所以啟動要多加一個參數
# cd rhq-agent/bin/
# ./rhq-agent.sh –cleanconfig
Agent Name [localhost] : sym-P   ß一般來說是機器名稱(hostname)
Agent Hostname or IP Address [!*] : 192.168.38.13   ß本機ip
Agent Port [16163] :           ß直接按enter,用預設port 16163
RHQ Server Hostname or IP Address [127.0.0.1] : 192.168.38.50 ßJON server ip
RHQ Server Port [7080] :       ß直接按enter,用預設port 7080
出現 > 就完成了

5.     然後用browser去連http://192.168.38.50:7080
上述的192.168.38.50是我的jon server ip
登入的帳密預設如果沒改的話是 rhqadmin / rhqadmin
然後點上方Inventory再點左方Discovery Queue你就會看到剛剛啟動的Agent就會出現勾選後點下方import (請參考下面兩張圖)

6.     import 後會看到如下圖
接著點左方Platforms就會看到該機器裝上去了!!


[JBoss] JBoss ON 安裝與組態設定

客戶買了RedHat的JBossON,所以來寫個安裝手冊備份一下。
先介紹一下安裝環境
a.CentOS 6.3 x86_64 (ram 2048, 1 core)
b.JDK (Oracle JDK1.6.0_41)
c.Postgresql (8.4.13)
d.JBossON (3.1)

1.首先要先安裝JDK,請直接到Oracle下載rpm版本這裡demo的是jdk-6u41-linux-x64-rpm.bin
# chmod 777 jdk-6u41-linux-x64-rpm.bin
# ./jdk-6u41-linux-x64-rpm.bin     #執行安裝,rpm預設安裝path為/usr/java/下
# vi /etc/profile
     JAVA_HOME=/usr/java/jdk1.6.0_41
     PATH=$PATH:$JAVA_HOME/bin
     CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
     export PATH JAVA_HOME CLASSPATH

# mv /usr/bin/java /usr/bin/java.bak
# mv /usr/bin/javac /usr/bin/javac.bak
# mv /usr/bin/javaws /usr/bin/javaws.bak
# ln -s /usr/java/jdk1.6.0_41/bin/java /usr/bin/java
# ln -s /usr/java/jdk1.6.0_41/bin/javac /usr/bin/javac
# ln -s /usr/java/jdk1.6.0_41/bin/javaws /usr/bin/javaws
# reboot

2.安裝PostgreSQL,然後組態一下JBossON所需的資料庫
# yum install postgresql postgresql-server postgresql-contrib
# service postgresql initdb    #初始化資料庫 
# chkconfig postgresql on     #設定開機啟動
# cd /var/lib/pgsql/data/

# vi pg_hba.conf                  #連入設定
     local   all         all                                        trust
     host    all         all         192.168.38.0/24    trust
     host    all         all         127.0.0.1/32          trust

# vi postgresql.conf             #設定Performance組態
     listen_addresses = '*'
     max_connections = 60
     superuser_reserved_connections = 5
     shared_buffers = 80MB
     work_mem = 1MB
     checkpoint_segments = 10
     max_prepared_transactions = 60

# service postgresql restart
# psql -U postgres

postgres=# alter user postgres password '你要的密碼';
postgres=# create user rhqadmin password 'rhqadmin的密碼';
postgres=# create database rhq owner rhqadmin;
postgres=# \l      #查看database是否正確建立
 rhq       | rhqadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
postgres=# \q     #離開psql


3.安裝JON
先到redhat的customer portal下載JON。
# cp jon-server-3.1.0.GA.zip /op/
# unzip jon-server-3.1.0.GA.zip
# /opt/jon-server-3.1.0.GA/bin/rhq-server.sh start

*如果用rhq-server.sh start 無法啟動server,可以利用 rhq-server.sh console,來開啟console模式,此模式會將背端jboss啟動的所有訊息列出,方便 debug.

接著就可以用browser去連http://localhost:7080




















[Cloud] Import VMDK to Amazon EC2

1.從ESXi Server先將虛擬機export 出來

export出後會得到如下圖的內容,裡面的vmdk就是我們要匯入到EC2的東東啦!!

2.安裝EC2的Command Line Tool可由此下載
解壓後就算完成安裝,別忘了設定EC2_HOME及JAVA_HOME,所有的指令才能正常使用
Linux : export EC2_HOME=/opt/ec2-api-tools
            export JAVA_HOME=/usr/local/java/jdk-1.6.0_43

M$Win : set EC2_HOME=C:\ec2-api-tools
              set JAVA_HOME=C:\java\jdk1.6.0_31

3.利用ec2-import-instance command來直接匯入VMDK並利用它產生EC2的instance.


/EC2_HOME/bin/ec2-import-instance /PATH_TO_VMDK_FILE/Win8x64.vmdk -f VMDK -t m1.small -a x86_64 -b vmdk2ec2 -o AKIAJQ6QAZ2H3LHOPMDQ -w Kt/G8SfqwertyU3eNaO/kQUb123tjm1Qa/YN -O AKIAJQ6QAZ2H3LHOPMDQ -W Kt/G8SfqwertyU3eNaO/kQUb123tjm1Qa/YN --region ap-southeast-1

其中 -t : Instance Type(m1.small,m1.medium,m1.large...etc),指的是要使用的機器效能
       -a : architecture (i386, x86_64)
       -f  : format (VMDK, VHD...etc)
       -b : S3 的bucket名稱
       -o/O  : owner id (可由Security credential取得)
       -w/W : security key (可由Security credential取得)

執行結果如下:

4.上傳後可透過 ec2-describe-conversion-tasks 來確認上傳後的轉檔過程與階段
請注意StatusMessage 狀態會由 Pending -> Completed

/EC2_HOME/bin/ec2-describe-conversion-tasks import-i-fg7n41ey -O AKIAJQ6QAZ2H3LHOPMDQ -W Kt/G8SfqwertyU3eNaO/kQUb123tjm1Qa/YN --region ap-southeast-1
執行結果如下:
(Pending)
(Completed)

進到EC2 Console啟動它!!



小提醒:
如果你這個Instance不用了你要terminate掉,別忘了在Terminate後要到Volume去把這個Instance相對應用到的 volume 也刪除!!

[Postgres] Postgres-XC 安裝手冊

1.Download, untar, make, install
$groupadd pgxc
$useradd pgxc -g pgxc
$passwd pgxc
$mkdir /pgdata_xc
$chown -R pgxc:pgxc /pgdata_xc
$tar -zxvf pgxc-v1.0.3.tar.gz
$cd postgres-xc/
$yum install gcc flex perl readline-devel zlib-devel openssl-devel pam-devel libxml2-devel libxml2 libxslt libxslt-devel openldap openldap-devel python-devel bison
$./configure --prefix=/opt/pgsql_xc  --with-segsize=8 --with-wal-segsize=64 --with-wal-blocksize=64 --with-perl --with-python --with-openssl --with-pam --with-ldap --with-libxml --with-libxslt --enable-thread-safety
$gmake
$gmake install

Global setting (edit ~/.bash_profile)
-------------------------------------
(Optional)
export PGPORT=XXXX
export PGDATA=/pgdata_xc/XXXXXX
export LANG=en_US.utf8

(Conv)
export PGHOME=/opt/pgsql_xc
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
alias rm='rm -i'
alias ll='ls -lh'
--------------------------------------

2.Config Data Node
### data node 1 ###
$mkdir -p /pgdata_xc/db_data
$initdb -D /pgdata_xc/db_data --nodename db_data_1  -E UTF8 -U postgres -W

modify postgresql.conf
-----------------------
port = 15431
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
gtm_host = '192.168.1.53'
gtm_port = 6666
#pgxc_node_name = 'db_data_1'
pooler_port = 6667
max_pool_size = 100
-----------------------

modify pg_hba.conf
-----------------------
host all all 192.168.38.0/24 trust
or
host all all gtm_server_ip/32 trust
-----------------------

### data node 2 ###
$mkdir -p /pgdata_xc/db_data   <- data="" node="" p="" second="">$initdb -D /pgdata_xc/db_data --nodename db_data_2  -E UTF8 -U postgres -W

modify postgresql.conf
-----------------------
port = 15432
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
gtm_host = '192.168.1.53'
gtm_port = 6666
#pgxc_node_name = 'db_data_2'
pooler_port = 6667
max_pool_size = 100
-----------------------

modify pg_hba.conf
-----------------------
host all all 192.168.38.0/24 trust
or
host all all gtm_server_ip/32 trust
-----------------------

3.Config GTM
$mkdir -p /pgdata_xc/gtm
$initgtm -Z gtm -D /pgdata_xc/gtm


4.Config Coordinator Node
### coordinator node 1 ###
$mkdir -p /pgdata_xc/coord1
$initdb -D /pgdata_xc/coord1 --nodename coord1  -E UTF8 -U postgres -W

modify postgresql.conf
-----------------------
listen_addresses = '*'
port = 1921
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
gtm_host = '192.168.38.53'
gtm_port = 6666
#pgxc_node_name = 'coord1'
pooler_port = 6667
max_pool_size = 100
-----------------------

modify pg_hba.conf
-----------------------
host all all 192.168.38.0/24 trust
or
host all all data_node_ip/32 trust
-----------------------

### coordinator node 2 ###
$mkdir -p /pgdata_xc/coord2
$initdb -D /pgdata_xc/coord2 --nodename coord2  -E UTF8 -U postgres -W

modify postgresql.conf
-----------------------
listen_addresses = '*'
port = 1921
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
gtm_host = '192.168.38.53'
gtm_port = 6666
#pgxc_node_name = 'coord2'
pooler_port = 6667
max_pool_size = 100
-----------------------

modify pg_hba.conf
-----------------------
host all all 192.168.38.0/24 trust
or
host all all data_node_ip/32 trust
-----------------------

5.Startup (su - pgxc)
a)GTM
$gtm -D /pgdata_xc/gtm &
b)Data node
$postgres -X -D /pgdata_xc/db_data -p 15431  -i &   <- data="" first="" node="" p=""> $postgres -X -D /pgdata_xc/db_data -p 15431  -i &   <- data="" node="" p="" second="">c)Coordinator node
$postgres -C -D /pgdata_xc/coord2 -p 1921  -i &
$postgres -C -D /pgdata_xc/coord1 -p 1921  -i &

d) stop all service
#pg_ctl stop -D /pgdata_xc/coord2 -p 1921    (node2)
#pg_ctl stop -D /pgdata_xc/coord1 -p 1921    (node1)
#pg_ctl stop -D /pgdata_xc/db_data -p 15431  (node1)
#pg_ctl stop -D /pgdata_xc/db_data -p 15431  (node2)
#pg_ctl stop -D /pgdata_xc/db_data_slave -p 15432 (node1)
#pg_ctl stop -D /pgdata_xc/db_data_slave -p 15432 (node2)
#gtm_ctl stop -Z gtm -D /pgdata_xc/gtm       (gtm server)

6.check status
a)GTM
[pgxc@pgxc-1 ~]$ gtm_ctl status -Z gtm -D /pgdata_xc/gtm
gtm_ctl: server is running (PID: 1551)
  "-D" "/pgdata_xc/gtm"
1 master
b)Data node and Coordinator node
[pgxc@pgxc-1 ~]$ ps -ef | grep pgxc
pgxc      1551  1526  0 11:36 pts/0    00:00:00 gtm -D /pgdata_xc/gtm   <-gtm p=""> pgxc      1561  1526  0 11:38 pts/0    00:00:00 postgres -X -D /pgdata_xc/db_1/pg_root -p 15431 -i    <-datanode nbsp="" p=""> pgxc      1569  1526  0 11:39 pts/0    00:00:00 postgres -C -D /pgdata_xc/coord_1 -p 1921 -i    <-coordinatornode p=""> pgxc      1572  1569  0 11:39 ?        00:00:00 postgres: pooler process  <-pooler atanode="" oordinator="" p="" process="">

7.在CoordinatorNode上註冊DataNode
### coordinator node 1 ###
#psql -p 1921 -U postgres
postgres=# CREATE NODE db_data_1 WITH (TYPE='datanode',HOST = '192.168.38.53', PORT=15431);
postgres=# CREATE NODE db_data_2 WITH (TYPE='datanode',HOST = '192.168.38.54', PORT=15431);
postgres=# CREATE NODE coord2 WITH (TYPE='coordinator',HOST = '192.168.38.54', PORT=1921);
postgres=# select * from pgxc_node;
node_name | node_type | node_port |   node_host   | nodeis_primary | nodeis_preferred |   node_id
-----------+-----------+-----------+---------------+----------------+------------------+-------------
coord1    | C         |      5432 | localhost     | f              | f                |  1885696643
db_data_1 | D         |     15431 | 192.168.38.53 | t              | t                |  1356996994
db_data_2 | D         |     15431 | 192.168.38.54 | t              | t                |  -822936791
coord2    | C         |      1921 | 192.168.38.54 | f              | f                | -1197102633

#SELECT pgxc_pool_reload();  (if alter node, execute it)

### coordinator node 2 ###
#psql -p 1921 -U postgres
postgres=# CREATE NODE db_data_1 WITH (TYPE='datanode',HOST = '192.168.38.53', PORT=15431);
postgres=# CREATE NODE db_data_2 WITH (TYPE='datanode',HOST = '192.168.38.54', PORT=15431);
postgres=# CREATE NODE coord1 WITH (TYPE='coordinator',HOST = '192.168.38.53', PORT=1921);
postgres=# select * from pgxc_node;
node_name | node_type | node_port |   node_host   | nodeis_primary | nodeis_preferred |   node_id
-----------+-----------+-----------+---------------+----------------+------------------+-------------
coord2    | C         |      5432 | localhost     | f              | f                | -1197102633
db_data_1 | D         |     15431 | 192.168.38.53 | t              | t                |  1356996994
db_data_2 | D         |     15431 | 192.168.38.54 | t              | t                |  -822936791
coord1    | C         |      1921 | 192.168.38.53 | f              | f                |  1885696643

#SELECT pgxc_pool_reload();  (if alter node, execute it)

8.Test (在Coordinator1做的create database, table and insert data,會在Coordinator2看到一樣的結果,反之亦然)
### Coordinator node 1 ###
$psql -p 1921 -U postgres
postgres=# \l
postgres=# create database test_xc;
postgres=# \l
postgres=# \c test_xc
test_xc=# create table test_1 (id integer,name varchar(32));
test_xc=# insert into test_1 select generate_series(1,100),'test_xc';
test_xc=# select count(*) from test_1;
count
-------
  402
(1 row)

### Coordinator node 2 ###
$psql -p 1921 -U postgres
postgres=# \l
postgres=# \c test_xc
test_xc=# \d
test_xc=# select count(*) from test_1;
count
-------
  402
(1 row)

### Data node 1 ### (可以看到每個Data node的筆數不同,表示他會平均分散資料存放,可減少IO增進Query performance)
$psql -p 15431 -U postgres -d test_xc
test_xc=# \d
test_xc=# select count(*) from test_1;
  count
-------
    204
(1 row)

### Data node 2 ###
$psql -p 15431 -U postgres -d test_xc
test_xc=# \d
test_xc=# select count(*) from test_1;
count
-------
  198
(1 row)