Trendyol Tech’te Veritabanı Provision İşlemlerini Nasıl Kolaylaştırdık?

Hüseyin Demir
Trendyol Tech
Published in
5 min readDec 3, 2019

Trendyol tech ortamında, veritabanı ekibi olarak temelde kullandığımız 4 farklı teknoloji var SQL Server,PostgreSQL,Couchbase ve Neo4j olmak üzere… Her teknolojinin içerisinde birden çok instance mevcut ve her instance altında yine birden çok veritabanı var. Yani veritabanı sayımız bir hayli fazla ve farklı teknolojilere ait farklı cluster tiplerimiz var.

Bunlarla birlikte ortalama 30'a yakın PostgreSQL cluster’ı 40'a yakın Couchbase cluster’ı mevcttur. 30'a yakın ise SQL Server cluster ortamı mevcuttur. Geleneksel yöntemlerle yönetilmesi zor ve çok fazla iş gücü gerektiren bir ortamımız var. Yeni cluster deployment’ı ve mevcut cluster üzerinde değişiklik yönetiminin bize yarattığı maliyeti azaltmak,hata payını minimize etmek için geliştirdiğimiz yaklaşımlar mevcut. Bu yaklaşımlardan en temeli Database as Service mantığını ekibe uygulamak oldu. Bu kapsamda, ortamları deploy ederken ya da değişiklik yaparken yönetebileceğimiz, takip edebileceğimiz bir yapıya geçmemiz gerekti. Ekip arkadaşlarımızın geliştirdiği değişiklikleri ya da konfigürasyonları merkezi bir yerden takip etmek ve uygulamak için Ansible ve Powershell çözümlerini kendi veritabanı ortamlarımızda uygulamaya başladık.

İlk olarak Ansible üzerinden başlayacak olursak, Ansible üzerinde yeni PostgreSQL ve Couchbase kurulumlarımızı tamamlıyoruz. Burada bizim kurulum öncesi + kurulum esnası + kurulum sonrası uyguladığımız iyi pratiklerin adım adım uygulandığı görevler mevcut. Örnek olarak, swap ayarlarının optimize edilmesi ve directory yetkilerinin tanımlanması gibi.

Aynı işlemler SQL Server ortamlarında Powershell ile yapılıyor. Bu ortamda da uyguladığımız iyi pratiklerin ve kurulumların her SQL Server sunucusunda aynı standartta olduğundan emin oluyoruz. Tüm bunlarla birlikte bu işlemleri asla bir birey kendisi tek başına yapmıyor. Bu sayede herhangi bi ayar ya da iyi pratik asla atlanmıyor.

Tüm bunların yanında, kurulumlar ve ortam hazırlama işlerine harcanan zaman kayda değer ölçüde düştü. Mikroservis mimarisi yaygınlaştıkça daha fazla farklı veritabanına ortamına ihtiyaç duyuyoruz bu nedenle de farklı ortamların provision edilmesi gibi bir iş yükümüz var. Ansible pratiklerini uygulayarak buradaki iş gücünü ansible playbooklarına devrettik :) Bu sayede, bizim için tüm ekip olarak yönetilebilir, genişletilebilir ve değiştirilebilir bir yapı elde etmiş olduk.

PostgreSQL Ansible Playbook Kalıbı

Ansible üzerinde oluşturulan PostgreSQL deployment yaml içeriği aşağıdaki gibidir. Bu playbook ile sunucular üzerinde, DBA ekibinin önem verdiği iyi pratikler uygulanmaktadır. Buna ek olarak yine DBA ekibi için “must” olan paketler işletim sistemine yüklenmektedir. Bu işlemden sonra konfigürasyonlar yapılıp cluster deployment’ı yapılabilir.

— -
- name: PostgreSQL Installation Playbook — Developed by Demir.
hosts: hedef_postgresql_sunucu_grubu
tasks:
— name: Disable Swap Option on PostgreSQL Servers
sysctl:
name: vm.swappiness
value: 0
state: present
— name: Tune Background Dirty Ratio
sysctl:
name: vm.dirty_background_ratio
value: 7
state: present

- name: Install PostgreSQL Packages(Yum Package Manager)
yum:
name:
— “{{ item }}”
state: present
with_items:
— https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos_surum.noarch.rpm
— postgresqlsurum-server
— postgresqlsurum-contrib
— gcc
— python-devel
— epel-release
— python-psycopg2
— python-pip
— PyYAML
— python2-pip
— pgbackrest-surum_bilgisi

- name: Upgrade Pip and Setuptools via Pip
pip:
name:
— “{{ item }}”
state: forcereinstall
with_items:
— pip
— setuptools
— name: Install Patroni Packages
pip:
name:
— “{{ item }}”
with_items:
— patroni
— python-etcd
— name: Grant Permissions to PostgreSQL Operating System User for Data Directory
file:
path: /pgsql-data
owner: postgres
group: postgres
mode: ‘0700’
— name: Grant Permissions to PostgreSQL Operating System User for WAL Directory
file:
path: /pgsql-wal
owner: postgres
group: postgres
mode: ‘0700’

Bu playbook içerisinde, DBA ekibi olarak işletim sistemi seviyesinde dikkat ettiğimiz swap ve dirty background ratio ayarlarının yanısıra, dizinlerin izinlerini de ayarlayıp paketleri geçiyoruz.

Not: Sunucu kurulumları esnasında, ansible sunucusu ile hedef sunucular arasında ssh-key entegrasyonu yapıldığı için asla root şifresi kullanma gibi bir ihtiyacımız da olmuyor :)

Playbook içerisine kurulum yapmak istediğimiz sunucuları “hosts” dosyası altında gruplayıp doğrudan o grubun ismini yaml dosyası içerisinde belirtebiliriz ve aşağıdaki şekilde playbook’u kurulumlar için başlatabiliriz.

ansible-playbook install-pg.yml

Bu işlemden sonra, playbook’u başlattığımızda ise toplu olarak PostgreSQL kurulum işlemlerini tamamlıyoruz.

Her ortamda aynı konfigürasyonlar, eksik adım yok ve tek yerden eforsuz deployment :)

Couchbase Ansible Playbook Kalıbı

PostgreSQL cluster deployment’ı için uygulanan Ansible pratikleri aynı şekilde Couchbase içinde uygulanmaktadır. Sunucular üzerine DBA tarafında iyi pratiklerin uygulanması ve gerekli paketlerin geçilmesi için couchbase playbook’u yapıldı. Bu sayede yine toplu olarak Couchbase ortamlarını neredeyse kullanıma hazır hale getiriyor. Bu işlemden sonra UI üzerinde cluster’ın sahip olacağı sizeları belirleyip multi-dimensional scaling modeline uygun olarak node’lara gerekli servisleri ekliyoruz sadece. Ancak bu durum bile bizim Couchbase hizmetini hazır ederken ki eforumuzu neredeyse %60 oranında azalttı :)

Aşağıdaki playbook’ta da bahsedilen maddelerin taskler halinde düzenlenmiş versiyonu mevcut.

- name: Couchbase Installation
hosts: couchbase_host_grup
become: true

tasks:
— name: Couchbase Installation | Vm Swappines 0
sysctl:
name: vm.swappiness
value: 0
state: present

- name: Couchbase Installation | Install Open JDK
apt:
name: openjdk-XYZ-jdk
state: present
update_cache: yes

- name: Couchbase Installation | Copy installatiob file to /tmp
become: true
copy: src=/etc/ansible/files/couchbase-server-enterprise_surum-ubuntuXX.XX_amd64.deb dest=/tmp/

- name: Couchbase Installation | Install couchbase from deb file
become: true
apt:
deb: /tmp/couchbase-server-enterprise_surum-ubuntuXX.XX_amd64.deb

- name: Start couchbase server
become: true
service:
name: couchbase-server
enabled: yes
state: started

roles:
— customrole.disable-thp
— customrole.couchbase-exporter

Bu işlemlerle birlikte couchbase paketlerinin kurulumları ve iyi pratiklerin uygulanması işlemleri tamamlanmaktadır.

NOT : DevOps ekibine özel teşekkürler :)

HAProxy Ansible Deployment

Aslında veritabanı yönetim sistemlerinde, yükün homojen bir şekilde yayılması için veritabanı mühendisinin load-balancer çözümlerine de aşina olması çok önemlidir. Çünkü TCP/IP seviyesinde yapılamayacak çok az konu mevcut. Bu çözümlerden bir tanesi HAProxy’dir. TCP/IP seviyesinde, yönlendirme yapan platformlar ile veritabanı ortamı ayırt etmeksizin gelen istekleri veritabanı sunucularına yönlendirebiliriz. Proxy ortamlarını da deploy etmek için yine Ansible kullanıyoruz. Proxy ortamlarımızı keep-alive kullanarak da yüksek erişilebilir durumda tutmaya çalışıyoruz. Veritabanı ekibi olarak, kullandığımız her platformun yüksek erişilebilir olması bizi daha da motive ediyor :)

HAProxy deploymentını yapmak için gerekli inventory(hosts) dosyası şu şekilde olabilir;

[haproxy-servers]
XX.XXX.XX.XX(IP) hostname=sunucu_hostname keepalived_role=Master
XX.XXX.XX.XX(IP) hostname=sunucu_hostname keepalived_role=BACKUP keepalived_priority=100

[all:haproxy-servers]
ansible_connection=ssh
ansible_ssh_user=os_kullanıcı_ismi
keepalived_router_id=router_id
keepalived_shared_ip=virtual_ip(sanal ip)

Daha sonrasında, aşağıdaki playbook yardımı ile yüksek erişilebilir bir HAProxy kurulumu tamamlanabilir.

— -
- name: Install haproxy
hosts: haproxy-servers
tags:
— haproxy
roles:
— role: messaguy.haproxy
vars:
haproxy_global: |
global
maxconn 15000

haproxy_defaults: |
defaults
log global
mode tcp
retries 2
timeout client 5s
timeout connect 4s
timeout server 5s
timeout check 5s

haproxy_other_configs: |
diger_konfigürasyonlar_buraya_satır_satır_yazılır

- role: messaguy.prometheus
vars:
prometheus_haproxy_exporter_extra_opts:
— “ — haproxy.scrape-uri=http://localhost:7000/haproxy?stats;csv"
prometheus_manage_client_tgroups: false
prometheus_components:
— haproxy_exporter
— node_exporter

- name: Install keepalived
hosts: haproxy-servers
tags:
— keepalived
roles:
— customrole.keepalived

Ansible — Database Deployment Akışı

Bu akış şemasında, veritabanı ekibi olarak inventory ve playbooklarımızı stash ortamında tutuyoruz. Bu sayede, diğer ekip arkadaşlarımız ile birlikte yaptığımız işlemlerin şeffaf, yönetilebilir ve geliştirilebilir olmasını sağlıyoruz. Ekip olarak, herkesin aynı standartta iş yapmasını sağlıyoruz ve birbirimize feedback vererek playbookları geliştirmeye devam ediyoruz :)

Stash ortamındaki projemizi, CentOS tipinde sanal bir sunucuda kullanıyoruz. Burada deployment işlemlerimizi yapıyoruz ve güncel repository’i çekiyoruz. Aynı zamanda kendi local clientlarımızdan da stash’a yeni özellikler yazabiliyoruz. Merkezi Ansible sunucusundan aynı anda N adet sunucuya deployment işlemlerini yapıyoruz. Bu durum sonrasında, bir sistem altyapı ekibi olarak aşağıdaki kazanımları yakaladık;

  • Standart ve tekrarlanan işlerde eksik iş yapılmasının ve hata yapılmasının önüne geçtik.
  • Yine tekrarlanan işlerde harcadığımız zamanı yüksek oranda geri kazandık ve ekibin sırtlanabileceği iş kapasitesinde artış sağladık. Aynı kaynaklar ile daha çok iş teslim edebilir duruma geldik.
  • Yaptığımız işleri versiyonlanabilir ve diğer ekip üyeleri tarafından geliştirilebilir duruma getirdik.

Bu kazanımlar bizi çok olumlu yönde etkiledi. Bu işlemin ikinci aşamasında, bakım&operasyon işlerimizi de bu yapıya aktarmak ve buradan yönetmek amacındayız.

Sevgiler,

Demir.

--

--