hakkında zaten konuştuk
İlginç? Sonra kesimin altına soruyorum, her şeyi anlatacağız ve göstereceğiz.
Bir örnekle başlayalım
Rolümüzün işlevselliğinin yalnızca bir kısmını ele alacağız. Tüm özelliklerinin ve giriş parametrelerinin tam bir açıklamasını her zaman içinde bulabilirsiniz.
Tarantool Kartuşu vardır api
и storage
örneklere atanabilir.
Kartuşun kendisi işlemlerin nasıl başlatılacağı hakkında hiçbir şey söylemez, yalnızca zaten çalışan örnekleri yapılandırma yeteneği sağlar. Kullanıcı gerisini kendisi yapmalıdır: yapılandırma dosyalarını ayrıştırın, hizmetleri başlatın ve topolojiyi kurun. Ama tüm bunları biz yapmayacağız, Ansible bizim yerimize yapacak.
Sözlerden tapuya
Şimdi uygulamamızı iki sanal makineye dağıtalım ve basit bir topoloji oluşturalım:
- replikaset
app-1
rol oynayacakapi
rolü içerenvshard-router
. Burada sadece bir örnek olacak. - çoğaltma kümesi
storage-1
rolü uygularstorage
(ve aynı zamandavshard-storage
), burada farklı makinelerden iki örnek ekliyoruz.
Örneği çalıştırmak için ihtiyacımız var
Rolün kendisi
Depoyu bir örnekle klonlayın:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Sanal makineleri yükseltiyoruz:
$ vagrant up
Tarantool Cartridge sorumlu rolünü kurun:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Yüklü rolü çalıştırın:
$ ansible-playbook -i hosts.yml playbook.yml
Oyun kitabının yürütülmesinin bitmesini bekliyoruz, gidin
Veri dökebilirsiniz. Harika, değil mi?
Şimdi bununla nasıl çalışacağımızı bulalım ve aynı zamanda topolojiye başka bir replika seti ekleyelim.
anlamaya başlıyoruz
Peki ne oldu?
İki sanal makinemiz var ve kümemizi kuran sorumlu bir oyun kitabı çalıştırıyoruz. Dosyanın içeriğine bakalım playbook.yml
:
---
- name: Deploy my Tarantool Cartridge app
hosts: all
become: true
become_user: root
tasks:
- name: Import Tarantool Cartridge role
import_role:
name: tarantool.cartridge
Burada ilginç bir şey olmuyor, adı verilen cevaplayıcı rolü başlatıyoruz. tarantool.cartridge
.
En önemlilerinin tümü (yani, küme yapılandırması) şurada bulunur: hosts.yml
:
---
all:
vars:
# common cluster variables
cartridge_app_name: getting-started-app
cartridge_package_path: ./getting-started-app-1.0.0-0.rpm # path to package
cartridge_cluster_cookie: app-default-cookie # cluster cookie
# common ssh options
ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key
ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
app-1:
config:
advertise_uri: '172.19.0.3:3301'
http_port: 8182
storage-1-replica:
config:
advertise_uri: '172.19.0.3:3302'
http_port: 8183
children:
# GROUP INSTANCES BY MACHINES
host1:
vars:
# first machine connection options
ansible_host: 172.19.0.2
ansible_user: vagrant
hosts: # instances to be started on the first machine
storage-1:
host2:
vars:
# second machine connection options
ansible_host: 172.19.0.3
ansible_user: vagrant
hosts: # instances to be started on the second machine
app-1:
storage-1-replica:
# GROUP INSTANCES BY REPLICA SETS
replicaset_app_1:
vars: # replica set configuration
replicaset_alias: app-1
failover_priority:
- app-1 # leader
roles:
- 'api'
hosts: # replica set instances
app-1:
replicaset_storage_1:
vars: # replica set configuration
replicaset_alias: storage-1
weight: 3
failover_priority:
- storage-1 # leader
- storage-1-replica
roles:
- 'storage'
hosts: # replica set instances
storage-1:
storage-1-replica:
Tek ihtiyacımız olan, bu dosyanın içeriğini değiştirerek örnekleri ve replika kümeleri nasıl yöneteceğimizi öğrenmek. Ardından, ona yeni bölümler ekleyeceğiz. Nereye ekleyeceğiniz konusunda kafanızın karışmaması için bu dosyanın son haline göz atabilirsiniz. hosts.updated.yml
, örnek depoda olan.
Örnek Yönetimi
Ansible açısından, her örnek bir ana bilgisayardır (bir demir sunucuyla karıştırılmamalıdır), yani. Ansible'ın yöneteceği altyapı düğümü. Her ana bilgisayar için bağlantı parametrelerini belirtebiliriz (örneğin, ansible_host
и ansible_user
), örnek yapılandırmasının yanı sıra. Örneklerin açıklaması bölümdedir hosts
.
Örnek yapılandırmasını göz önünde bulundurun storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
bir değişkende config
örnek parametrelerini belirledik - advertise URI
и HTTP port
.
Örnek parametreleri aşağıdadır app-1
и storage-1-replica
.
Ansible'a her örnek için bağlantı parametrelerini söylememiz gerekiyor. Örnekleri sanal makine gruplarında gruplamak mantıklı görünüyor. Bunu yapmak için örnekler gruplar halinde birleştirilir. host1
и host2
ve bölümdeki her grupta vars
değerler ansible_host
и ansible_user
bir sanal makine için. Ve bölümde hosts
- bu gruba dahil olan ana bilgisayarlar (örneklerdir):
all:
vars:
...
hosts:
...
children:
# GROUP INSTANCES BY MACHINES
host1:
vars:
# first machine connection options
ansible_host: 172.19.0.2
ansible_user: vagrant
hosts: # instances to be started on the first machine
storage-1:
host2:
vars:
# second machine connection options
ansible_host: 172.19.0.3
ansible_user: vagrant
hosts: # instances to be started on the second machine
app-1:
storage-1-replica:
değişmeye başlıyoruz hosts.yml
. İki örnek daha ekleyelim, storage-2-replica
ilk sanal makinede ve storage-2
ikincisinde:
all:
vars:
...
# INSTANCES
hosts:
...
storage-2: # <==
config:
advertise_uri: '172.19.0.3:3303'
http_port: 8184
storage-2-replica: # <==
config:
advertise_uri: '172.19.0.2:3302'
http_port: 8185
children:
# GROUP INSTANCES BY MACHINES
host1:
vars:
...
hosts: # instances to be started on the first machine
storage-1:
storage-2-replica: # <==
host2:
vars:
...
hosts: # instances to be started on the second machine
app-1:
storage-1-replica:
storage-2: # <==
...
Ansible Playbook'u çalıştırın:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Seçeneğe dikkat edin --limit
. Her bir küme örneği, Ansible açısından bir ana bilgisayar olduğundan, çalışma kitabı çalıştırılırken hangi örneklerin yapılandırılması gerektiğini açıkça belirtebiliriz.
Web kullanıcı arayüzüne dön
Başarılarımıza güvenmeyeceğiz ve topoloji kontrolünde ustalaşacağız.
topoloji yönetimi
Yeni örneklerimizi bir çoğaltma kümesinde birleştirelim storage-2
. yeni bir grup ekle replicaset_storage_2
ve değişkenlerinde replika setinin parametrelerini şuna benzeterek açıklayın: replicaset_storage_1
. Kısımda hosts
bu gruba (yani bizim kopya kümemize) hangi örneklerin dahil edileceğini belirtin:
---
all:
vars:
...
hosts:
...
children:
...
# GROUP INSTANCES BY REPLICA SETS
...
replicaset_storage_2: # <==
vars: # replicaset configuration
replicaset_alias: storage-2
weight: 2
failover_priority:
- storage-2
- storage-2-replica
roles:
- 'storage'
hosts: # replicaset instances
storage-2:
storage-2-replica:
Oyun kitabını yeniden başlatalım:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
seçenek başına --limit
bu kez kopya kümemize karşılık gelen grubun adını geçtik.
Seçeneği göz önünde bulundurun tags
.
Rolümüz, aşağıdaki etiketlerle işaretlenmiş çeşitli görevleri sırayla gerçekleştirir:
cartridge-instances
: örnek yönetimi (yapılandırma, üyelik bağlantısı);cartridge-replicasets
: topoloji yönetimi (kopya kümesi yönetimi ve örneklerin kümeden kalıcı olarak çıkarılması (çıkarılması));cartridge-config
: diğer küme parametrelerini yönetin (vshard önyükleme, otomatik yük devretme modu, yetkilendirme parametreleri ve uygulama yapılandırması).
İşin hangi bölümünü yapmak istediğimizi açıkça belirtebiliriz, ardından rol geri kalan görevleri atlar. Bizim durumumuzda sadece topoloji ile çalışmak istiyoruz, bu yüzden cartridge-replicasets
.
Çabalarımızın sonucunu değerlendirelim. Yeni bir kopya kümesi bulma
Yaşasın!
Örnekleri ve replika kümeleri yeniden yapılandırmayı deneyin ve küme topolojisinin nasıl değiştiğini görün. Farklı operasyonel senaryoları deneyebilirsiniz, örneğin, memtx_memory
. Rol, uygulamanızın olası kapalı kalma süresini azaltmak için örneği yeniden başlatmadan bunu yapmaya çalışacaktır.
koşmayı unutma vagrant halt
onlarla işiniz bittiğinde sanal makineleri durdurmak için.
Ve kaputun altında ne var?
Burada, deneylerimiz sırasında sorumlu rol başlığı altında neler olduğundan daha fazla bahsedeceğim.
Bir Kartuş uygulamasını adım adım dağıtmaya bir göz atalım.
Paketi yükleme ve örnekleri başlatma
Öncelikle paketi sunucuya teslim etmeniz ve kurmanız gerekiyor. Artık rol, RPM ve DEB paketleri ile çalışabilir.
Ardından, örnekleri başlatıyoruz. Burada her şey çok basit: her örnek ayrı bir systemd
-hizmet. Bir örnekten bahsediyorum:
$ systemctl start myapp@storage-1
Bu komut örneği başlatacak storage-1
uygulamaların myapp
. Başlatılan örnek, arayacak /etc/tarantool/conf.d/
. Örnek günlükleri kullanılarak görüntülenebilir journald
.
Birim dosyası /etc/systemd/system/[email protected]
systemd hizmeti için paket ile teslim edilecektir.
Ansible, paketleri kurmak ve sistem hizmetlerini yönetmek için yerleşik modüllere sahiptir, burada yeni bir şey icat etmedik.
Küme topolojisini yapılandırma
Ve burada en ilginç başlıyor. Katılıyorum, paketleri yüklemek ve çalıştırmak için özel bir sorumlu rolle uğraşmak garip olurdu systemd
-Hizmetler.
Kümeyi manuel olarak ayarlayabilirsiniz:
- İlk seçenek: Web kullanıcı arayüzünü açın ve düğmeleri tıklayın. Birkaç örneğin tek seferlik başlangıcı için oldukça uygundur.
- İkinci seçenek: GraphQl API'sini kullanabilirsiniz. Burada zaten bir şeyi otomatikleştirebilirsiniz, örneğin Python'da bir komut dosyası yazabilirsiniz.
- Üçüncü seçenek (ruhu güçlü olanlar için): sunucuya gidin, kullanarak örneklerden birine bağlanın
tarantoolctl connect
ve gerekli tüm manipülasyonları Lua modülü ile gerçekleştirincartridge
.
Buluşumuzun asıl görevi, işin en zor kısmı olan bunu sizin için yapmaktır.
Ansible, kendi modülünüzü yazmanıza ve onu bir rolde kullanmanıza izin verir. Rolümüz, kümenin çeşitli bileşenlerini yönetmek için bu modülleri kullanır.
Nasıl çalışır? Kümenin istenen durumunu bildirimsel bir yapılandırmada tanımlarsınız ve rol, her modüle kendi yapılandırma bölümünü girdi olarak verir. Modül, kümenin mevcut durumunu alır ve bunu girdiyle karşılaştırır. Ardından, örneklerden birinin soketinden kümeyi istenen duruma getiren bir kod çalıştırılır.
sonuçlar
Bugün uygulamanızı Tarantool Kartuş üzerine nasıl kuracağınızı ve basit bir topoloji kuracağınızı anlattık ve gösterdik. Bunu yapmak için, kullanımı kolay ve birçok altyapı düğümünü aynı anda yapılandırmanıza izin veren güçlü bir araç olan Ansible'ı kullandık (bizim durumumuzda bunlar küme örnekleridir).
Yukarıda, Ansible kullanarak küme yapılandırmasını tanımlamanın birçok yolundan birini ele aldık. Devam etmeye hazır olduğunuzu anladığınızda, öğrenin group_vars
и host_vars
.
Çok yakında size örnekleri topolojiden nasıl kalıcı olarak kaldıracağınızı (kovacağınızı), önyükleme vshard'ı, otomatik yük devretme modunu yönetmeyi, yetkilendirmeyi yapılandırmayı ve küme yapılandırmasına yama eklemeyi anlatacağız. Bu arada, kendi başına çalışabilirsin.
Bir şey işe yaramazsa, emin olun
Kaynak: habr.com