Tomcatのメモリ割り当てを自動で計算する
はじめに
AWSでTomcatサーバを作ったとき、インスタンスタイプに合わせて、毎回別のチューニングするのは面倒臭い。
なので、Tomcatに割り当てるメモリサイズを自動計算するスクリプトを作った
参考サイト
Tomcatのメモリサイズの自動計算
参考にしたサイトに以下のことが書いてあった
- パーマネント領域(-XX:MaxPermSize)搭載メモリの8分の1程度(初期値:64m)。
- メモリ最大使用量(-Xmx)搭載メモリの半分程度。
- メモリ初期使用量(-Xms)Xmxで指定した数値の半分位。
なので、書き込みを鵜呑みにして、以下のスクリプトを作成
# https://groupsession.jp/support/setup_08.html # http://yasuhiroa24.hateblo.jp/entry/2017/01/11/162101 MAX_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 2)}') START_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 4)}') PERM_MEM_SIZE=$(free -m | awk '/^Mem:/ {printf("%d", $2 / 8)}') if [ $PERM_MEM_SIZE -gt 256 ] then PERM_MEM_SIZE=256 fi CATALINA_OPTS="-Xms${START_MEM_SIZE}m -Xmx${MAX_MEM_SIZE}m -XX:MaxPermSize=${PERM_MEM_SIZE}m -server"
XX:MaxPermSizeのサイズは「256MBあれば十分」といくつかのサイトで見かけたので、256MB以上割り当てないようにした。
Tomcatをダウンロードした場合
【Tomcatの解凍ディレクトリ】/binの中にファイル「setenv.sh」(Windowsの場合は「setenv.bat」らしい)を新規作成する。
Tomcatをコマンドでインストールした場合
Amazon Linuxでは、Tomcat8がyumからインストールできる。
yumコマンドからインストールしたとき、setenv.shを作成しても設定が反映されなかった。
色々フォルダ・ファイルを漁ってみると、/etc/tomcat8/tomcat8.confというファイルがあり、このファイルで変数を突っ込む感じ
なので、ファイル/etc/tomcat8/tomcat8.confの最後に追加する
確認
以下のコマンドで、Tomcatのパラメータを確認
ps aux | grep java
/usr/lib/jvm/jre/bin/java -Xms246m -Xmx493m -XX:MaxPermSize=123m -server -classpath :/usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat8 -Dcatalina.home=/usr/share/tomcat8 -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat8/temp -Djava.util.logging.config.file=/usr/share/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
ora2pgでOracleのテーブルをPostgreSQL9.6に移行した話
はじめに
とあるサービスを作ることになった。
あるパッケージに連帯するサービスで、パッケージではOracleDBを使用していた。
サービスの機能で、OracleDBの一部のテーブルのデータを取り出したかった。
しかし、サービス用のWebアプリをSpringBootで構築しようとし、OracleDBに接続できるかどうか試したところ上手くいかない・・・
運用するとなるとOracleDBのライセンス料がかかるし、どうせサービス用にパッケージとは別のDBを構築しないといけないし・・・
私はOracleDBを使ったことがなく、OracleDBのバージョンで別の部署の人がいつも揉めているイメージであまり使いたくない・・・
もうPostgreSQLを使いたい。もはやPostgreSQL信者
調べてみると、ora2pgというツールがあり、Oracle/MySQLからPostgreSQLへの移行を支援するツールがある。
パッケージで使用している一部のテーブルを、サービス用のDB(PostgreSQL)に移行・コピーしようとした
目次
環境
- Windows Server 2012(AWS)
- Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
- CentOS 7.5(ローカル・Vagrant)
- PostgreSQL 9.6.9
- ora2pg 18.2
参考サイト
以下のサイトを参考にした。
ora2pgのインストール
ora2pgの動作に必要なパッケージをインストール
yum groupinstall "Development Tools" yum install libdbi-dbd-pgsql perl-ExtUtils-MakeMaker perl-DBI perl-CPAN
ora2pgに必要なパッケージをインストールするため、以下のツールをInstant Client for Linux x86-64 のダウンロードからダウンロードする。(アカウントの登録が必要)
Oracle client tool
- oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
ダウンロードしたパッケージをインストール
rpm -Uvh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm rpm -Uvh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm rpm -Uvh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
ファイル「/etc/profile.d/oracle.sh」を新規作成し、Oracle用の環境変数を追加。
vim /etc/profile.d/oracle.sh #!/bin/sh export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib export ORACLE_HOME=/usr/lib/oracle/11.2/client64/
. /etc/profile
ora2pgはperlを使っていて、perlがOracleに接続できるようにDBD::Oracleのインストールする
cpan DBD::Oracle
このとき、cpanの設定(?)を聞かれたけど、全部デフォルトにした。
cd /usr/local/src/ wget https://github.com/darold/ora2pg/archive/v18.2.tar.gz -O ora2pg_v18.2.tar.gz tar xf ora2pg_v18.2.tar.gz cd ora2pg_v18.2 perl Makefile.PL make && make install
ora2pgの設定ファイルの作成
cd /etc/ora2pg
cp ora2pg.conf.dist ora2pg.conf
vim ora2pg.conf
以下の項目を修正
- ORACLE_DSN dbi:Oracle:host=<DBのホスト>;sid=<サービス名>;port=1521
- ORACLE_USER <ユーザ名>
- ORACLE_PWD <パスワード>
- SCHEMA <移行対象のスキーマ名>
移行してみる
ora2pg -c /etc/ora2pg/ora2pg.conf ↓終了するとこんな出力がある [========================>] 836/836 tables (100.0%) end of scanning. [========================>] 836/836 tables (100.0%) end of table export.
コマンドを実行したディレクトリに「output.sql」が出来ている
あとは、PostgreSQLのコマンドでSQLを実行する。
psql -U 【ユーザ名】 【DB名】 < output.sql
ちなみに、「output.sql」にはテーブルのCreate文のみだった。
エクスポートタイプが設定ファイル(/etc/ora2pg/ora2pg.conf)の「TYPE」で設定されてあり、デフォルトは「TABLE」になっている。
エクスポートタイプを変更するには、設定ファイルを修正するか、「-t」または「--type」オプションを追加してコマンドを実行する
エクスポートタイプはこんな感じ
# Type of export. Values can be the following keyword: # TABLE Export tables, constraints, indexes, ... # PACKAGE Export packages # INSERT Export data from table as INSERT statement # COPY Export data from table as COPY statement # VIEW Export views # GRANT Export grants # SEQUENCE Export sequences # TRIGGER Export triggers # FUNCTION Export functions # PROCEDURE Export procedures # TABLESPACE Export tablespace (PostgreSQL >= 8 only) # TYPE Export user defined Oracle types # PARTITION Export range or list partition (PostgreSQL >= v8.4) # FDW Export table as foreign data wrapper tables # MVIEW Export materialized view as snapshot refresh view # QUERY Convert Oracle SQL queries from a file. # KETTLE Generate XML ktr template files to be used by Kettle.
とりあえず、自分の環境ではテーブルとデータがあれば良かったので、「TABLE」と「INSERT」のエクスポートタイプを使用した。
ちなみに移行するテーブルは限られていたので、「-a/--allow」オプションで、移行テーブルを選択することができた。
※「/etc/ora2pg/ora2pg.conf」の「ALLOW」に移行対象のテーブル名を記載する方法もあり。
↓ドキュメントの該当箇所
https://ora2pg.darold.net/documentation.html#Ora2Pg-usage
おわりに
LONG RAW型を使用しているカラムがあるテーブルは変換が出来ず、レコード数が4件しかないのに処理が数時間たっても終わらなかった。
やっぱり完璧に変換できるわけではなさそうだけど、LONG RAW型カラム持ちのテーブルを変換する方法は有るらしい(試してない)
Vagrantを使ったPostgreSQL9.6非同期レプリケーションの環境構築
はじめに
とあるリリース前のサービスの負荷試験をやったときに、将来的にDBを複数台使用するとして、Webアプリケーションをどのように変更したら良いか分からなかった。
WebアプリケーションはSpringBootを使用しており、アプリケーションの機能追加で、DBの負荷分散に対応するようにした。
その時の記事はこれ↓
そんな経緯があったので、アプリケーションを改造する前に、AWSでリードレプリカを使用するのを想定して、PostgreSQLで非同期レプリケーション環境が開発環境に欲しかった。
なので、今回はPostgreSQLで非同期レプリケーション環境をVagrantで構築したお話。
目次
参考サイト
以下のサイトを参考にした。
環境
- CentOS 7
- PostgreSQL 9.6
- マスタ側IP:192.168.35.10
- スレーブ側IP:192.168.35.11
マスタ側の構築スクリプトの作成
マスタ側のプロビジョニングスクリプトを作成する。
マスタ側のプロビジョニングスクリプトは以下の感じ
ファイル名は「create_db_master_server.sh」で保存
# いつものやーつ sudo yum update -y sudo yum install vim wget -y # 時刻を日本にする sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime # 時刻を自動で調整するようにする cp /etc/chrony.conf /etc/chrony.conf_preprovision sudo sed -i -e "s/server 0.centos.pool.ntp.org iburst/server ntp.nict.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 1.centos.pool.ntp.org iburst/server ntp1.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 2.centos.pool.ntp.org iburst/server ntp2.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 3.centos.pool.ntp.org iburst/server ntp3.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo chronyc -a makestep # PostgreSQLのインストール sudo rpm -U https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm sudo yum install -y postgresql96 postgresql96-server # postgresユーザで「initdb」を実行するため、rootユーザになる sudo su - sudo su postgres -c "/usr/pgsql-9.6/bin/initdb /var/lib/pgsql/9.6/data/" PG_DIR="/var/lib/pgsql/9.6/data/" sudo su postgres -c "cp ${PG_DIR}postgresql.conf ${PG_DIR}postgresql.conf_preprovision" # 接続受付IPを変更 sudo sed -i -e "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" ${PG_DIR}postgresql.conf # 各ログの設定を変更 # Webアプリの接続先が読み取り用と更新用で分かれるか確認のため、 # 「log_connections」、「log_disconnections 」を有効にする sudo sed -i -e "s/log_filename = 'postgresql-%a.log'/log_filename = 'postgresql-%m%d.log'/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#log_checkpoints = off/log_checkpoints = on/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#log_connections = off/log_connections = on/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#log_disconnections = off/log_disconnections = on/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#log_lock_waits = off/log_lock_waits = on/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/log_timezone = 'UTC'/log_timezone = 'Japan'/g" ${PG_DIR}postgresql.conf # レプリケーション設定の変更 # https://qiita.com/U_ikki/items/e117acad0413546d6923 sudo sed -i -e "s/#checkpoint_timeout = 5min/checkpoint_timeout = 15min/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#hot_standby = off/hot_standby = on/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#wal_level = minimal/wal_level = replica/g" ${PG_DIR}postgresql.conf sudo sed -i -e "s/#max_wal_senders = 0/max_wal_senders = 3/g" ${PG_DIR}postgresql.conf # 接続許可の設定を変更 sudo su postgres -c "cp ${PG_DIR}pg_hba.conf ${PG_DIR}pg_hba.conf_preprovision" sudo sed -i -e "87i host replication postgres 192.168.35.0/24 trust" ${PG_DIR}pg_hba.conf sudo sed -i -e "88i host all all 192.168.35.0/24 md5" ${PG_DIR}pg_hba.conf # 参照先DNSサーバの変更(今回あまり関係なし) sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf_preprovision sudo sed -i -e "26i dns=none" /etc/NetworkManager/NetworkManager.conf sudo systemctl restart NetworkManager sudo sed -i -r "s/nameserver [\.0-9]+/nameserver 192.168.35.20/g" /etc/resolv.conf # 自動起動ON&PostgreSQL起動 sudo systemctl enable postgresql-9.6 sudo systemctl start postgresql-9.6 # アカウントのパスワードを変更するSQLを実行 sudo psql -U postgres sample_db < /vagrant/db/set_password_to_db.sql
スレーブ側の構築スクリプトの作成
スレーブ側のプロビジョニングスクリプトを作成する。
スレーブ側のプロビジョニングスクリプトは以下の感じ
ファイル名は「create_db_slave_server.sh」で保存する。
# いつものやーつ sudo yum update -y sudo yum install vim wget -y # 時刻を日本にする sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime # 時刻を自動で調整するようにする cp /etc/chrony.conf /etc/chrony.conf_preprovision sudo sed -i -e "s/server 0.centos.pool.ntp.org iburst/server ntp.nict.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 1.centos.pool.ntp.org iburst/server ntp1.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 2.centos.pool.ntp.org iburst/server ntp2.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo sed -i -e "s/server 3.centos.pool.ntp.org iburst/server ntp3.jst.mfeed.ad.jp/g" /etc/chrony.conf sudo chronyc -a makestep # PostgreSQLのインストール sudo rpm -U https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm sudo yum install -y postgresql96 postgresql96-server # postgresユーザで「pg_basebackup」を実行するため、rootユーザになる sudo su - sudo su postgres -c "pg_basebackup -h 192.168.35.10 -D /var/lib/pgsql/9.6/data/ -X stream --progress -U postgres -R" # 参照先DNSサーバの変更(今回あまり関係なし) sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf_preprovision sudo sed -i -e "26i dns=none" /etc/NetworkManager/NetworkManager.conf sudo systemctl restart NetworkManager sudo sed -i -r "s/nameserver [\.0-9]+/nameserver 192.168.35.20/g" /etc/resolv.conf # 自動起動ON&PostgreSQL起動 sudo systemctl enable postgresql-9.6 sudo systemctl start postgresql-9.6
仮想マシンの設定ファイルの作成
仮想マシンのCPU数・メモリサイズを定義する設定ファイルを用意する。
設定ファイル名は「vmconf.yml」で保存
# 仮想マシンのスペック設定 vm: # DBサーバ(マスター・スレーブ共通) db: cpus: 2 memory: 1024
マスター・スレーブ両方同じ設定を使用
今回はCPUコア数2個、メモリサイズ1GBに設定
Vagrantファイルの作成
# -*- mode: ruby -*- # vi: set ft=ruby : require 'yaml' settings = YAML.load_file 'vmconf.yml' Vagrant.configure("2") do |config| config.vm.box = "centos/7" # postgresql マスターサーバ config.vm.define :db_master do |define| define.vm.hostname = "db-master" define.vm.provision "db-master", type: "shell", :path => "create_db_master_server.sh", :privileged => false define.vm.network "forwarded_port", guest: 5432, host: 5432 define.vm.network "private_network", ip: "192.168.35.10" define.vm.provider "virtualbox" do |provider| provider.name = "db-master" provider.cpus = settings['vm']['db']['cpus'] provider.memory = settings['vm']['db']['memory'] end end # postgresql スレーブサーバ config.vm.define :db_slave do |define| define.vm.hostname = "db-slave" define.vm.provision "db-slave", type: "shell", :path => "create_db_slave_server.sh", :privileged => false define.vm.network "forwarded_port", guest: 5432, host: 55432 define.vm.network "private_network", ip: "192.168.35.11" define.vm.provider "virtualbox" do |provider| provider.name = "db-slave" provider.cpus = settings['vm']['db']['cpus'] provider.memory = settings['vm']['db']['memory'] end end end
おわりに
レプリケーション構成のPostgreSQLを開発環境に構築することができ、この環境をもとにアプリケーションの改造が出来た。