Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

hakkında zaten konuştuk Tarantool Kartuşu, dağıtılmış uygulamalar geliştirmenize ve bunları paketlemenize olanak tanır. Geriye hiçbir şey kalmadı: bu uygulamaları nasıl dağıtacağınızı ve yöneteceğinizi öğrenin. Merak etmeyin, biz her şeyi düşündük! Tarantool Kartuş ile çalışmak için tüm en iyi uygulamaları bir araya getirdik ve yazdık sorumlu rolpaketi sunuculara ayıracak, bulut sunucularını başlatacak, bunları bir kümede birleştirecek, yetkilendirmeyi yapılandıracak, vshard'ı önyükleyecek, otomatik yük devretmeyi etkinleştirecek ve küme yapılandırmasına yama uygulayacak.

İ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. belgeleme. Ancak yüz kez görmektense bir kez denemek daha iyidir, bu yüzden küçük bir uygulama dağıtalım.

Tarantool Kartuşu vardır öğretici banka müşterileri ve hesapları hakkında bilgi depolayan ve ayrıca HTTP yoluyla veri yönetimi için bir API sağlayan küçük bir Kartuş uygulaması oluşturmak. Bunu yapmak için, uygulama iki olası rolü tanımlar: 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 oynayacak apirolü içeren vshard-router. Burada sadece bir örnek olacak.
  • çoğaltma kümesi storage-1 rolü uygular storage (ve aynı zamanda vshard-storage), burada farklı makinelerden iki örnek ekliyoruz.

Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

Örneği çalıştırmak için ihtiyacımız var serseri и yanıtlayıcı ' (sürüm 2.8 veya üstü).

Rolün kendisi cevaplanabilir galaksi. Bu, çalışmalarınızı paylaşmanıza ve hazır rolleri kullanmanıza izin veren bir havuzdur.

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 http://localhost:8181/admin/cluster/dashboard ve sonucun tadını çıkarın:

Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

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: envanter-dosya 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 и host2ve 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 http://localhost:8181/admin/cluster/dashboard ve yeni örneklerimizi gözlemleyin:

Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

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 http://localhost:8181/admin/cluster/dashboard.

Tarantool Kartuşunda Uygulamaları Kolayca ve Doğal Olarak Dağıtma (Bölüm 1)

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, yuvarlanan güncelleme veya artırmak 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 haltonlarla 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 yapılandırma в /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ştirin cartridge.

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 en iyi uygulamalar Oyun kitapları yazmak için. ile topolojiyi yönetmeyi daha uygun bulabilirsiniz. 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. belgeleme ve küme parametrelerini değiştirmeyi deneyin.

Bir şey işe yaramazsa, emin olun bilgi vermek bize sorun hakkında. Çabuk kıracağız!

Kaynak: habr.com

Yorum ekle