ansibleで始めるpostgre sqlの冗長化
TRANSCRIPT
自己紹介名前:曽根 壮大(そね たけとも) 年齢:30歳(三人の子供がいます) 職業:Webエンジニア
所属:日本PostgreSQLユーザ会
中国支部 支部長
技術的にはLL系言語とかRDBが好きです
Ansibleとはモジュール
1 クライアント(Server側)での動作の事
2 yum,apt-getなどは最初から用意済み
3 モジュールとして自作Codeも可能 ※Python以外のどの言語でも良い
プレイブックの例
- hosts: test-server sudo: yes tasks: - name: be sure httpd is installed yum: name=httpd state=installed - name: be sure httpd is running and enabled service: name=httpd state=running enabled=yes
PostgreSQLとはvar リリース日 主な機能追加
8.4 2009/07/01再帰クエリ, ウィンドウ関数, 列単位のアクセス制御, SQLと関数の性能解析機能
9.0 2010/09/20レプリケーション, 一括権限変更, 匿名プロシージャ, 64bit Windows サポート, 移動平均, 列/条件トリガ, 一意性制約の遅延, 排他制約
9.1 2011/09/12同期レプリケーション, 外部テーブル, パッケージ管理, UNLOGGEDテーブル, 更新可能なWITH句, 近傍検索, SELinux権限制御
9.2 2012/09/10インデックスオンリースキャン, カスケードレプリケーション, JSON型, 範囲型
9.3 2013/09/09マテリアライズドビュー, 外部テーブルへの書き出し, イベントトリガ, データページ・チェックサム, LATERAL句
9.4 2014/12/18マテビューの自動更新,JSONB型,ALTER SYSTEM,集合関数の向上,GINインデックスの向上,NUMERICの性能改善
PostgreSQLの冗長化稼働率 年間停止時間 実現方法
90% 36.5日オンラインバックアップ+リストアだけで十分 オンラインバックアップの取得を実施
99% 3.65日 オンプレミスなら予備マシンが必要 大データならバックアップのリストア所要時間を把握しておく
99.9% 8.7時間 保守停電の無いクラウド~ハウジングが必要 平日日中のみ障害検知対応だと難しい
99.99% 52分バックアップのリストアがほぼ不可能 レプリケーション(データ同期)された待機サーバが必要
99.999% 5分HAクラスタソフトウェアが必要 技術者に要求されるスキルが跳ね上がる
99.9999% 32秒無停止型Serverなどのハードが必要 コストが急に跳ね上がる
PostgreSQLの冗長化稼働率 年間停止時間 実現方法
90% 36.5日オンラインバックアップ+リストアだけで十分 オンラインバックアップの取得を実施
99% 3.65日 オンプレミスなら予備マシンが必要 大データならバックアップのリストア所要時間を把握しておく
99.9% 8.7時間 保守停電の無いクラウド~ハウジングが必要 平日日中のみ障害検知対応だと難しい
99.99% 52分バックアップのリストアがほぼ不可能 レプリケーション(データ同期)された待機サーバが必要
99.999% 5分HAクラスタソフトウェアが必要 技術者に要求されるスキルが跳ね上がる
99.9999% 32秒無停止型Serverなどのハードが必要 コストが急に跳ね上がる
ここを目指します
代表的なモジュール例モジュール名 動作
shellshell上でコマンドを実行 task単位でshellを起動するので環境変数は引継無し
command $HOME, "<", ">", "|", "&"が使えない
lineinfile 指定ファイルの行単位の書き換え
file ファイルやディレクトリの作成、パーミッション設定
template テンプレートを利用したファイルのコピー
synchronize rsync(ファイル同期)
get_url指定URLからダウンロード 既にローカルにファイルがある場合は動作しない
yum yum(rpm から直接インストールも可能)service service & chkconfig
冪等性
- name: 初回のみしか上手くいかない
shell: "echo 'hoge' >> /etc/hoge.conf” !!!- name: Linuxの無効を行単位で置換する(毎回同じ動作)
lineinfile: dest=/etc/sysconfig/selinux regexp="^SELINUX=.*" line=“SELINUX=disabled"
冪等性- name: template postgresql.conf template: src: template/postgresql.conf dest: "{{ postgresql_path }}/postgresql.conf” owner: "{{ postgresql_service_user }}" group: "{{ postgresql_service_group }}" mode: 0640
状態変化- name: 結果の取得
shell: touch /tmp/hoge creates=/tmp/hoge
register: result
- name: print result
debug: msg=“{{ result.stderr }}”
when: result.stdout != ""
状態変化- name: 結果の取得
shell: touch /tmp/hoge creates=/tmp/hoge
register: result
- name: print result
debug: msg=“{{ result.stderr }}”
when: result.stdout != ""
条件に該当した時のみ、Taskが実行される
変数宣言
vars:
port: 5432
postgresql_path: "/var/lib/pgsql/9.4/"
postgresql_service_user: "postgres"
postgresql_service_group: "postgres"
postgresql_user_password: "hoge"
例外処理
- name: locale=Cじゃないとソートが違う
ignore_errors: yes
sudo_user: postgres
command: initdb --no-locale
エラーが出ても 処理を続行する
まとめ
Ansible チュートリアル
公式ドキュメント
Ansible AWXの中身を読む