Ansible Tower: DB Replication
Ansible Tower ကိုစမ်းဖူးရင် ဒီအခြေအနေလေးကိုကြုံဖူးကြမှာပါ။ Documentation ထဲမှာတော့ Installation လုပ်တဲ့အခါ Single Machine ရယ် HA Multi-Machine Cluster ရယ်ဆိုပြီးတွေ့ရပေမဲ့ နောက်ကွယ်က Database ကိုတော့ Cloud ဒါမှမဟုတ် Single Machine အနေနဲ့ပဲသုံးပြထားပါတယ်။ Cloud အနေနဲ့ကတော့ သိပ်ပြဿနာမရှိပေမဲ့ Local မှာပဲ ထားချင်တဲ့အခါကျ Single Machine ကအဆင်မပြေပါဘူး။ Tower instance တွေကို ဘယ်လိုပဲ Cluster လုပ်လုပ် အဓိက DB တစ်ခုခုဖြစ်သွားရင် ပြဿနာတက်မှာပါပဲ။ Online မှာ လိုက်ရှာဖတ်ကြည့်ရသလောက်ကလည်း remote database တစ်ခုတည်းကို Multi-Machine Cluster ကနေချိပ်သုံးတဲ့နည်းတွေပဲတွေ့ရပါတယ်။ ဒါပေမဲ့ ရှားရှားပါးပါး Linkedin က post တစ်ခုကိုရှာတွေ့လိုက်ပါတယ်။ အဲ့ဒီ post မှာတော့ Tower ကို remote database နဲ့ ပုံမှန်အတိုင်း install လုပ်ပါတယ်။ ပြီးမှ Database ကို နောက် server တစ်လုံးနဲ့ replicate ထပ်လုပ်တာပါ။ ဒါနဲ့ပဲ အကြံရသွားပြီး Github ပေါ်မှာ Automate လုပ်ပေးတဲ့ဟာများ share ထားလေမလားဆိုပြီး လျှောက်ရှာကြည့်မိတယ်။ ansible-role-postgres-ha နဲ့ ansible-role-pgsql-replication ဆိုတဲ့ နှစ်ခုရှာတွေ့ပေမဲ့ နှစ်ခုလုံးက တော်တော်လေးပြည့်စုံအောင်လုပ်ပေးထားတဲ့အတွက် အနည်းငယ်ရှုပ်ထွေးပါတယ်။ ပထမတစ်ခုက ပိုဆိုးပါတယ် သူ့မှာက Replication အပြင် Auto Failover အတွက် pacemaker နဲ့ cluster လုပ်ပေးတဲ့အပိုင်းတွေပါ ပါတာကြောင့် ကိုယ့် environment နဲ့ကိုက်ညီအောင် တော်တော်လေးပြင်ဆင်ပြီးမှ run လို့ရမယ့်အနေအထားမျိုးဖြစ်နေပါတယ်။ ဒါကြောင့် ပထမရှာတွေ့ထားတဲ့ Linkedin post ထဲကအတိုင်းပဲ manually လုပ်ကြည့်ဖြစ်သွားပါတယ်။ အဆင်ပြေတဲ့အပြင် ကောင်းတဲ့တစ်ချက်က လုပ်ရမယ့် step အကုန်လုံးကို Ansible Ad-hoc command တွေနဲ့လုပ်ပြထားတာပါပဲ။ အားလုံးအဆင်ပြေပေမဲ့ သူ့ထဲမှာက replica တစ်လုံးပဲလုပ်ပြထားတဲ့အပြင်၊ Auto Failover မဟုတ်တဲ့အတွက် Master DB down သွားရင် Replica နဲ့ဘယ်လိုအစားထိုးမလဲဆိုတာလည်းမပါပါဘူး။ ဒါကြောင့် Multiple Replicas ရဖို့ကို Automate လုပ်ကြည့်ရင်ကောင်းမှာပဲဆိုပြီး Playbook တစ်ခုရေးကြည့်ဖြစ်တယ်။ အဆင်ပြေတဲ့အနေအထားတစ်ခုရမှ ပိုပြီး ရှင်းရှင်းလင်းလင်းလေးဖြစ်အောင် Role တွေနဲ့ခွဲရေးလိုက်တယ်။ ဒါပေမဲ့ RHEL 7 တစ်ခုတည်းအတွက်ပဲစမ်းထားတာဖြစ်ပြီး Failover အတွက်လည်းမပါသေးပါဘူး။ စိတ်ဝင်စားရင်တော့ ဝိုင်းကူရေးပေးဖို့ဖိတ်ခေါ်ချင်ပါတယ်။ ဒီ Post လေးမှာတော့ အသုံးပြုပုံနဲ့ Replica ကို Master အနေနဲ့ဘယ်လို promote လုပ်မလဲဆိုတာလေးပါဖော်ပြပေးလိုက်ပါတယ်။
လိုအပ်ချက်များ
- Ansible Tower အတွက် VM တစ်လုံးနဲ့ Database အတွက် VM ၂လုံး အနည်းဆုံးလိုအပ်ပါမယ်။
- VM အားလုံး Internet ရနေဖို့လိုအပ်ပြီး Network အနေနဲ့ တစ်လုံးနဲ့တစ်လုံး Reachable ဖြစ်နေရပါမယ်။
- VM အားလုံး RHEL 7 install လုပ်ထားပြီး Repository အနေနဲ့ကတော့
rhel-7-server-rpms
နဲ့rhel-7-server-extras-rpms
ကို Enable လုပ်ထားဖို့လိုပါတယ်။ - VM အကုန်လုံးရဲ့ /etc/hosts ထဲမှာ IP နဲ့ Hostname လေးတွေထည့်ပေးထားပါ။ ဥပမာ -
# cat /etc/hosts
172.25.0.10 tower.example.com tower
172.25.0.21 master.example.com master
172.25.0.21 db01.example.com db01
172.25.0.22 db02.example.com db02
Ansible Tower Installation
- Ansible Tower install လုပ်မယ့် VM ပေါ်မှာ SSH Key ထုတ်ပြီး Database VM ၂လုံးထဲကိုကူးထည့်ထားပါ။
# ssh-keygen
# ssh-copy-id db01
# ssh-copy-id db02
- Database VM တွေထဲကို Tower VM ကနေတဆင့် SSH နဲ့ ဝင်ကြည့်ပါ။
# ssh root@master
# ssh root@db01
# ssh root@db02
- လိုအပ်တဲ့ Tower Installer package ကို Download ဆွဲပြီး extract လုပ်ပါ။
# curl -O https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-3.3.1-1.el7.tar.gz
# tar -xf ansible-tower-setup-bundle-3.3.1-1.el7.tar.gz
- extract လုပ်ထားသော directory ထဲသို့ဝင်ရောက်ပြီး
inventory
file ကို နမူနာပြထားတဲ့အတိုင်းပြင်ပါ။
# cd ansible-tower-setup-bundle-3.3.1-1.el7
# cat inventory
[tower]
localhost ansible_connection=local
[database]
master
[all:vars]
admin_password='RHT0w3r'
pg_host='master.example.com'
pg_port='5432'
pg_database='awx'
pg_username='awx'
pg_password='RHT0w3r'
rabbitmq_username=tower
rabbitmq_password='RHT0w3r'
rabbitmq_cookie=cookiemonster
- ပြီးရင်တော့
setup.sh
ဆိုတဲ့ script လေးကို run လိုက်ပါ။ Installation စတင်ပါလိမ့်မယ်။
# ./setup.sh
- Complete ဖြစ်သွားပြီဆိုရင်တော့ Browser ကနေ Tower ရဲ့ IP Address ကိုသုံးပြီးခေါ်ကြည့်ပါ။
- Login Page ကျလာပြီဆိုရင်တော့ Username: admin နဲ့ inventory ဖိုင်ထဲသတ်မှတ်ခဲ့တဲ့ admin_password ကိုသုံးပြီး Login ဝင်လိုက်ပါ။ License ဖိုင် ထည့်ရမယ့် page ကိုမြင်ရပါလိမ့်မယ်။
- License ဖိုင်ကိုတော့ https://www.ansible.com/license မှာရယူနိုင်ပါတယ်။
PostgreSQL DB Streaming Replication
- Ansible Tower VM ထဲမှာပဲ
tower-db-replica
git repo ကို clone လုပ်ပါ။
# git clone https://github.com/naingyeminn/tower-db-replica.git
- ရလာတဲ့
tower-db-replica
directory ထဲဝင်ပြီးinventory
ဖိုင်ကိုပြင်ပါမယ်။
# cd tower-db-replica
# cat inventory
[pg_master]
master
[pg_replicas]
db02
- ပြီးရင်တော့
playbook.yml
ကို run လိုက်ရုံပါပဲ။
# ansible-playbook -i inventory playbook.yml
- ဘာ error မှမတက်ပဲ complete ဖြစ်သွားရင်တော့ replication အဆင်ပြေမပြေကို Master node ထဲဝင်ပြီးစစ်ကြည့်ပါ။
# ssh master
# su - postgres
-bash-4.2$ psql -c 'select application_name, state, sync_priority, sync_state from pg_stat_replication;'
application_name | state | sync_priority | sync_state
------------------+-----------+---------------+------------
db02 | streaming | 1 | sync
(1 row)
- အပေါ်ကအတိုင်း မြင်ရပြီဆိုရင်တော့ Replication အဆင်ပြေသွားပါပြီ။
Promote Replica to Master
- Master node down သွားပြီဆိုရင်တော့ Tower VM ရဲ့
/etc/hosts
ထဲမှာရှိတဲ့master.example.com
ကို IP ပြောင်းပေးရပါမယ်။ ဥပမာdb01.example.com
ရဲ့ IP172.25.0.21
ကိုmaster.example.com
နဲ့ထပ်တွဲပေးထားတာကနေdb02.example.com
ရဲ့ IP172.25.0.22
နဲ့ ပြောင်းပေးလိုက်တာမျိုးပါ။
# cat /etc/hosts
172.25.0.10 tower.example.com tower
172.25.0.22 master.example.com master
172.25.0.21 db01.example.com db01
172.25.0.22 db02.example.com db02
- ပြီးရင်တော့ Replica node ဖြစ်တဲ့
db01
ထဲကိုဝင်ပြီး အောက်မှာ ဖော်ပြထားတဲ့ command လေးတွေရိုက်လိုက်ပါ။
# mv /var/lib/pgsql/9.6/data/recovery.{conf,done}
# systemctl restart postgresql-9.6.service
# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload
- Tower VM ပုံမှန်အတိုင်းအလုပ်ပြန်လုပ်သွားပါလိမ့်မယ်။
Adding New Replica
- ဒီအတွက်ကတော့ အပေါ်ကနည်းအတိုင်း Tower VM ရဲ့
tower-db-replica
ထဲinventory
ဖိုင်ကိုပြင်ပြီး Playbook ထပ် run ပေးလိုက်ပါ။ - Replica ကို ၁လုံးထက်ပိုပြီးတော့လည်းချိပ်ထားနိုင်ပါတယ်။
[pg_replicas]
အောက်မှာထပ်ဖြည့်ရုံပါပဲ။
ဒီလောက်ဆို လုံလောက်မယ်ထင်ပါတယ်။ ကိုယ့် environment နဲ့ကိုက်ညီအောင်တော့ tune လုပ်ဖို့လိုကောင်းလိုပါလိမ့်မယ်။ အဓိကကတော့ Ansible ကိုလေ့လာရင်း use case လေးတစ်ခုနဲ့တည်ပြီး စမ်းကြည့်တဲ့သဘောပါ။ Auto Failover အတွက်လည်း အချိန်ရရင်ထပ်မံကြိုးစားဖြည့်စွက်ပါဦးမယ်။ လိုအပ်ချက်လေးတွေရှိသေးတဲ့အတွက် Github ပေါ်က Project လေးမှာ ဝင်ရောက်ပါဝင်အကြံပြုပေး၊ ဝိုင်းဝန်း ရေးသားပြင်ဆင်ပေးဖို့ ထပ်မံဖိတ်ခေါ်ချင်ပါတယ်။