рдЖрдореНрд╣реА рдпрд╛рдмрджреНрджрд▓ рдЖрдзреАрдЪ рдмреЛрд▓рд▓реЛ рдЖрд╣реЛрдд
рдордиреЛрд░рдВрдЬрдХ? рдордЧ рдХреГрдкрдпрд╛, рдХрдЯ рдЕрдВрддрд░реНрдЧрдд, рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧреВ рдЖрдгрд┐ рд╕рд░реНрд╡рдХрд╛рд╣реА рджрд╛рдЦрд╡реВ.
рдЪрд▓рд╛ рдПрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛
рдЖрдореНрд╣реА рдлрдХреНрдд рдЖрдордЪреНрдпрд╛ рднреВрдорд┐рдХреЗрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪрд╛ рдХрд╛рд╣реА рднрд╛рдЧ рдкрд╛рд╣реВ. рдЖрдкрдг рдиреЗрд╣рдореА рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдХреНрд╖рдорддрд╛ рдЖрдгрд┐ рдЗрдирдкреБрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрдгрди рд╢реЛрдзреВ рд╢рдХрддрд╛
рдЯрд╛рд░рдирдЯреВрд▓ рдХрд╛рдбрддреВрд╕ рдЖрд╣реЗ api
╨╕ storage
, рдЬреЗ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдирд╛ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
рдХрд╛рд░реНрдЯреНрд░рд┐рдЬ рд╕реНрд╡рддрдГ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╢рд╛ рд╕реБрд░реВ рдХрд░рд╛рдпрдЪреНрдпрд╛ рдпрд╛рдмрджреНрджрд▓ рдХрд╛рд╣реАрд╣реА рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА, рддреЗ рдлрдХреНрдд рдЖрдзреАрдкрд╛рд╕реВрди рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдШрдЯрдирд╛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдмрд╛рдХреАрдЪреЗ рд╕реНрд╡рддрдГ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ: рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рд╛, рд╕реЗрд╡рд╛ рд╕реБрд░реВ рдХрд░рд╛ рдЖрдгрд┐ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛. рдкрдг рдЖрдореНрд╣реА рд╣реЗ рд╕рд░реНрд╡ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА; рдЙрддреНрддрд░рджрд╛рдпреА рд╣реЗ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд░реЗрд▓.
рд╢рдмреНрджрд╛рдВрдкрд╛рд╕реВрди рдХреГрддреАрдкрд░реНрдпрдВрдд
рддрд░, рдЪрд▓рд╛ рдЖрдордЪрд╛ рдЕрд░реНрдЬ рджреЛрди рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирд╡рд░ рддреИрдирд╛рдд рдХрд░реВ рдЖрдгрд┐ рдПрдХ рд╕рд╛рдзреА рдЯреЛрдкреЛрд▓реЙрдЬреА рд╕реЗрдЯ рдХрд░реВ:
- рдкреНрд░рддрд┐рдХреГрддреА
app-1
рднреВрдорд┐рдХрд╛ рд░рд╛рдмрд╡реЗрд▓api
, рдЬреНрдпрд╛рдордзреНрдпреЗ рднреВрдорд┐рдХрд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗvshard-router
. рдЗрдереЗ рдПрдХрдЪ рдЙрджрд╛рд╣рд░рдг рдЕрд╕реЗрд▓. - рдкреНрд░рддрд┐рдХреГрддреА
storage-1
рднреВрдорд┐рдХрд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрддреЗstorage
(рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реАvshard-storage
), рдпреЗрдереЗ рдЖрдкрдг рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдорд╢реАрдирдордзреАрд▓ рджреЛрди рдЙрджрд╛рд╣рд░рдгреЗ рдЬреЛрдбреВ.
рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА
рднреВрдорд┐рдХрд╛ рд╕реНрд╡рддрдГ рдордзреНрдпреЗ рдЖрд╣реЗ
рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╣ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрди рдХрд░реВ:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
рдЖрдореНрд╣реА рдЖрднрд╛рд╕реА рдорд╢реАрди рд╡рд╛рдврд╡рддреЛ:
$ vagrant up
рдЯрд╛рд░рдВрдЯреВрд▓ рдХрд╛рд░реНрдЯреНрд░рд┐рдЬ рдЙрддреНрддрд░рджрд╛рдпреА рднреВрдорд┐рдХрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛:
$ ansible-galaxy install tarantool.cartridge,1.0.1
рд╕реНрдерд╛рдкрд┐рдд рднреВрдорд┐рдХрд╛ рд▓рд╛рдБрдЪ рдХрд░рд╛:
$ ansible-playbook -i hosts.yml playbook.yml
рдЖрдореНрд╣реА рдкреНрд▓реЗрдмреБрдХрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЛ, рд╡рд░ рдЬрд╛
рддреБрдореНрд╣реА рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛. рдЫрд╛рди, рдмрд░реЛрдмрд░?
рдЖрддрд╛ рдпрд╛рд╕рд╣ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╢реЛрдзреВ рдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рдЯреЛрдкреЛрд▓реЙрдЬреАрдордзреНрдпреЗ рдЖрдгрдЦреА рдПрдХ рдкреНрд░рддрд┐рдХреГрддреА рдЬреЛрдбреВ.
рдЪрд▓рд╛ рддреЗ рд╢реЛрдзрдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛
рдордЧ рдХрд╛рдп рдЭрд╛рд▓рдВ?
рдЖрдореНрд╣реА рджреЛрди рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕реЗрдЯ рдХреЗрд▓реНрдпрд╛ рдЖрдгрд┐ рдЖрдордЪреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгрд╛рд░реЗ рдЙрддреНрддрд░рджрд╛рдпреА рдкреНрд▓реЗрдмреБрдХ рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ. рдЪрд▓рд╛ рдлрд╛рдИрд▓рдЪреА рд╕рд╛рдордЧреНрд░реА рдкрд╛рд╣реВ 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
рдпреЗрдереЗ рдордиреЛрд░рдВрдЬрдХ рдХрд╛рд╣реАрд╣реА рдШрдбрдд рдирд╛рд╣реА, рдЪрд▓рд╛ рдПрдХ рдЙрддреНрддрд░рджрд╛рдпреА рднреВрдорд┐рдХрд╛ рд╕реБрд░реВ рдХрд░реВ рдпрд╛ tarantool.cartridge
.
рд╕рд░реНрд╡ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреА (рдореНрд╣рдгрдЬреЗ, рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди) рдордзреНрдпреЗ рд╕реНрдерд┐рдд рдЖрд╣реЗрдд 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:
рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдпрд╛ рдлрд╛рдИрд▓рдордзреАрд▓ рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реВрди рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдгрд┐ рдкреНрд░рддрд┐рдХреГрддреА рдХрд╢реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рдпрдЪреА рд╣реЗ рд╢рд┐рдХрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ. рдкреБрдвреЗ рдЖрдкрдг рддреНрдпрд╛рдд рдирд╡реАрди рд╡рд┐рднрд╛рдЧ рдЬреЛрдбреВ. рддреНрдпрд╛рдВрдирд╛ рдХреЛрдареЗ рдЬреЛрдбрд╛рдпрдЪреЗ рдпрд╛рдмрджреНрджрд▓ рдЧреЛрдВрдзрд│ рди рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдпрд╛ рдлрд╛рдИрд▓рдЪреА рдЕрдВрддрд┐рдо рдЖрд╡реГрддреНрддреА рдкрд╛рд╣реВ рд╢рдХрддрд╛, hosts.updated.yml
, рдЬреЗ рдЙрджрд╛рд╣рд░рдг рднрд╛рдВрдбрд╛рд░рд╛рдд рдЖрд╣реЗ.
рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди
рдЙрддреНрддрд░рджрд╛рдпреА рдЕрдЯреАрдВрдордзреНрдпреЗ, рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╣реЛрд╕реНрдЯ рдЖрд╣реЗ (рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХреВ рдирдпреЗ), рдЙрджрд╛. рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдиреЛрдб рдЬреЛ Ansible рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрд▓. рдкреНрд░рддреНрдпреЗрдХ рд╣реЛрд╕реНрдЯрд╕рд╛рдареА рдЖрдореНрд╣реА рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ (рдЬрд╕реЗ рдХреА ansible_host
╨╕ ansible_user
), рддрд╕реЗрдЪ рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рд╡рд┐рднрд╛рдЧрд╛рдд рдЖрд╣реЗ hosts
.
рдЪрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрд╛рд╣реВ storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
рдЪрд▓ рдордзреНрдпреЗ config
рдЖрдореНрд╣реА рдЙрджрд╛рд╣рд░рдг рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ - advertise URI
╨╕ HTTP port
.
рдЦрд╛рд▓реА рдЙрджрд╛рд╣рд░рдг рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрд╣реЗрдд app-1
╨╕ storage-1-replica
.
рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА Ansible рд▓рд╛ рдХрдиреЗрдХреНрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕рд╛рдВрдЧрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЧрдЯрд╛рдВрдордзреНрдпреЗ рдЧрдЯрдмрджреНрдз рдХрд░рдгреЗ рддрд░реНрдХрд╕рдВрдЧрдд рд╡рд╛рдЯрддреЗ. рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рд╕рд╛рдареА, рдЙрджрд╛рд╣рд░рдгреЗ рдЧрдЯрд╛рдВрдордзреНрдпреЗ рдПрдХрддреНрд░ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд host1
╨╕ host2
, рдЖрдгрд┐ рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдЧрдЯрд╛рдд vars
рдореВрд▓реНрдпреЗ рджрд░реНрд╢рд╡рд┐рд▓реА рдЖрд╣реЗрдд ansible_host
╨╕ ansible_user
рдПрдХрд╛ рдЖрднрд╛рд╕реА рдорд╢реАрдирд╕рд╛рдареА. рдЖрдгрд┐ рд╡рд┐рднрд╛рдЧрд╛рдд hosts
тАФ рдпрдЬрдорд╛рди (рдЙрд░реНрдл рдЙрджрд╛рд╣рд░рдгреЗ) рдЬреЗ рдпрд╛ рдЧрдЯрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд:
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:
рдЖрдкрдг рдмрджрд▓реВ рд▓рд╛рдЧрддреЛ hosts.yml
. рдЖрдгрдЦреА рджреЛрди рдЙрджрд╛рд╣рд░рдгреЗ рдЬреЛрдбреВрдпрд╛, storage-2-replica
рдкрд╣рд┐рд▓реНрдпрд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирд╡рд░ рдЖрдгрд┐ storage-2
рджреБрд╕рд▒реНрдпрд╛рд╡рд░:
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 -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
рдХреГрдкрдпрд╛ рдкрд░реНрдпрд╛рдп рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ --limit
. рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрддрд░рджрд╛рдпреА рдЕрдЯреАрдВрдордзреНрдпреЗ рд╣реЛрд╕реНрдЯ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдкреНрд▓реЗрдмреБрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛рдирд╛ рдХреЛрдгрддреА рдЙрджрд╛рд╣рд░рдгреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛рд╡реАрдд рд╣реЗ рдЖрдореНрд╣реА рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ.
рд╡реЗрдм UI рд╡рд░ рдкрд░рдд рдЬрд╛рдд рдЖрд╣реЗ
рдЪрд▓рд╛ рдПрд╡рдвреНрдпрд╛рд╡рд░рдЪ рдерд╛рдВрдмреВ рдирдХрд╛ рдЖрдгрд┐ рдЯреЛрдкреЛрд▓реЙрдЬреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рдд рдорд╛рд╕реНрдЯрд░ рдХрд░реВрдпрд╛.
рдЯреЛрдкреЛрд▓реЙрдЬреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди
рдЪрд▓рд╛ рдЖрдордЪреА рдирд╡реАрди рдЙрджрд╛рд╣рд░рдгреЗ рдкреНрд░рддрд┐рдХреГрддреА рд╕реЗрдЯрдордзреНрдпреЗ рдПрдХрддреНрд░ рдХрд░реВ storage-2
. рдЪрд▓рд╛ рдирд╡реАрди рдЧрдЯ рдЬреЛрдбреВрдпрд╛ replicaset_storage_2
рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреАрд▓ рдкреНрд░рддрд┐рдХреГрддреАрд╕реЗрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╕рд╛рджреГрд╢реНрдп рдХрд░реВрди рд╡рд░реНрдгрди рдХрд░рд╛ replicaset_storage_1
. рд╡рд┐рднрд╛рдЧрд╛рдд hosts
рдпрд╛ рдЧрдЯрд╛рдд рдХреЛрдгрддреА рдЙрджрд╛рд╣рд░рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реА рдЬрд╛рддреАрд▓ рддреЗ рд╕реВрдЪрд┐рдд рдХрд░реВрдпрд╛ (рдореНрд╣рдгрдЬреЗ рдЖрдордЪрд╛ рдкреНрд░рддрд┐рдХреГрддреА рд╕рдВрдЪ):
---
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:
рдЪрд▓рд╛ рдкреНрд▓реЗрдмреБрдХ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реВрдпрд╛:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
рдкреЕрд░рд╛рдореАрдЯрд░рдордзреНрдпреЗ --limit
рдпрд╛рд╡реЗрд│реА рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдХреГрддреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЧрдЯрд╛рдЪреЗ рдирд╛рд╡ рдкрд╛рд╕ рдХреЗрд▓реЗ.
рдЪрд▓рд╛ рдкрд░реНрдпрд╛рдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛ tags
.
рдЖрдордЪреА рднреВрдорд┐рдХрд╛ рдХреНрд░рдорд╛рдХреНрд░рдорд╛рдиреЗ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЗ рдХрд░рддреЗ, рдЬреА рдЦрд╛рд▓реАрд▓ рдЯреЕрдЧрд╕рд╣ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдЖрд╣реЗрдд:
cartridge-instances
: рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди (рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди, рд╕рджрд╕реНрдпрддреНрд╡рд╛рдЪреЗ рдХрдиреЗрдХреНрд╢рди);cartridge-replicasets
: рдЯреЛрдкреЛрд▓реЙрдЬреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди (рдкреНрд░рддрд┐рдХреГрддреА рд╕реЗрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░рдордзреВрди рдЙрджрд╛рд╣рд░рдгреЗ рдХрд╛рдпрдорд╕реНрд╡рд░реВрдкреА рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ);cartridge-config
: рдЗрддрд░ рдХреНрд▓рд╕реНрдЯрд░ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди (vshard рдмреВрдЯрд╕реНрдЯреНрд░реЕрдкрд┐рдВрдЧ, рдСрдЯреЛрдореЕрдЯрд┐рдХ рдлреЗрд▓рдУрд╡реНрд╣рд░ рдореЛрдб, рдСрдереЛрд░рд╛рдпрдЭреЗрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдгрд┐ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди).
рдЖрдореНрд╣реА рдХрд╛рдорд╛рдЪрд╛ рдХреЛрдгрддрд╛ рднрд╛рдЧ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рд╣реЗ рдЖрдореНрд╣реА рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ, рдирдВрддрд░ рднреВрдорд┐рдХрд╛ рдЙрд░реНрд╡рд░рд┐рдд рдХрд╛рд░реНрдпреЗ рд╡рдЧрд│реЗрд▓. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдЯреЛрдкреЛрд▓реЙрдЬреАрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ cartridge-replicasets
.
рдЪрд▓рд╛ рдЖрдкрд▓реНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдЪреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реВрдпрд╛. рдЖрдореНрд╣реА рд╡рд░ рдПрдХ рдирд╡реАрди рдкреНрд░рддрд┐рдХреГрддреА рд╢реЛрдзрддреЛ
рд╣реБрд░реНрд░реЗ!
рдЙрджрд╛рд╣рд░рдгреЗ рдЖрдгрд┐ рдкреНрд░рддрд┐рдХреГрддреА рд╕рдВрдЪрд╛рдВрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рд╛ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╢реА рдмрджрд▓рддреЗ рддреЗ рдкрд╣рд╛. рддреБрдореНрд╣реА рд╡рд┐рд╡рд┐рдз рдСрдкрд░реЗрд╢рдирд▓ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ рд╢рдХрддрд╛, рдЙрджрд╛. memtx_memory
. рддреБрдордЪреНтАНрдпрд╛ рдЕрд░реНрдЬрд╛рдЪрд╛ рд╕рдВрднрд╛рд╡реНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХрдореА рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА рдЙрджрд╛рд╣рд░рдг рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рди рдХрд░рддрд╛ рднреВрдорд┐рдХрд╛ рд╣реЗ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрд▓.
рдзрд╛рд╡рд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░реВ рдирдХрд╛ vagrant halt
рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕реЛрдмрдд рдХрд╛рдо рдкреВрд░реНрдг рдХрд░рддрд╛ рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдВрдирд╛ рдерд╛рдВрдмрд╡рдгреНрдпрд╛рд╕рд╛рдареА.
рдЖрдгрд┐ рд╣реБрдб рдЕрдВрддрд░реНрдЧрдд рдХрд╛рдп рдЖрд╣реЗ?
рдЖрдордЪреНрдпрд╛ рдкреНрд░рдпреЛрдЧрд╛рдВрджрд░рдореНрдпрд╛рди рдЙрддреНрддрд░рджрд╛рдпреА рднреВрдорд┐рдХреЗрдЪреНрдпрд╛ рдЖрдбреВрди рдХрд╛рдп рдШрдбрдд рд╣реЛрддреЗ рдпрд╛рдмрджреНрджрд▓ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдЕрдзрд┐рдХ рд╕рд╛рдВрдЧреЗрди.
рдЪрд▓рд╛ рдХрд╛рд░реНрдЯреНрд░рд┐рдЬ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЗрдк рдмрд╛рдп рд╕реНрдЯреЗрдк рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдгреНрдпрд╛рдХрдбреЗ рдкрд╛рд╣реВ.
рдкреЕрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдЙрджрд╛рд╣рд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреЗ
рдкреНрд░рдердо рддреБрдореНрд╣рд╛рд▓рд╛ рдкреЕрдХреЗрдЬ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рддреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рдзреНрдпрд╛ рднреВрдорд┐рдХрд╛ RPM рдЖрдгрд┐ DEB рдкреЕрдХреЗрдЬрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ.
рдкреБрдвреЗ рдЖрдореНрд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рд▓рд╛рдБрдЪ рдХрд░рддреЛ. рдпреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ: рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рддрдВрддреНрд░ рдЖрд╣реЗ systemd
-рд╕реЗрд╡рд╛. рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдИрди:
$ systemctl start myapp@storage-1
рд╣рд╛ рдЖрджреЗрд╢ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдБрдЪ рдХрд░реЗрд▓ storage-1
рдЕрдиреБрдкреНрд░рдпреЛрдЧ myapp
. рд▓рд╛рдБрдЪ рдХреЗрд▓реЗрд▓реЗ рдЙрджрд╛рд╣рд░рдг рддреНрдпрд╛рдЪрд╛ рд╢реЛрдз рдШреЗрдИрд▓ /etc/tarantool/conf.d/
. рдЙрджрд╛рд╣рд░рдг рд▓реЙрдЧ рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ journald
.
рдпреБрдирд┐рдЯ рдлрд╛рдЗрд▓ /etc/systemd/system/[email protected]
рд╕рд┐рд╕реНрдЯрдордб рд╕реЗрд╡реЗрд╕рд╛рдареА рдкреЕрдХреЗрдЬрд╕рд╣ рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.
Ansible рдордзреНрдпреЗ рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдордб рд╕реЗрд╡рд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдВрдЧрднреВрдд рдореЙрдбреНрдпреВрд▓ рдЖрд╣реЗрдд; рдЖрдореНрд╣реА рдпреЗрдереЗ рдХрд╛рд╣реАрд╣реА рдирд╡реАрди рд╢реЛрдз рд▓рд╛рд╡рд▓реЗрд▓реЗ рдирд╛рд╣реА.
рдХреНрд▓рд╕реНрдЯрд░ рдЯреЛрдкреЛрд▓реЙрдЬреА рд╕реЗрдЯ рдХрд░рдгреЗ
рдЗрдереВрдирдЪ рдордЬрд╛ рд╕реБрд░реВ рд╣реЛрддреЗ. рд╕рд╣рдордд рдЖрд╣реЗ, рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╢реЗрд╖ рдЙрддреНрддрд░рджрд╛рдпреА рднреВрдорд┐рдХреЗрд╕рд╣ рддреНрд░рд╛рд╕ рджреЗрдгреЗ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реЛрдИрд▓ systemd
-рд╕реЗрд╡рд╛.
рддреБрдореНрд╣реА рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд╡рд╣рд╕реНрддреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛:
- рдкрд╣рд┐рд▓рд╛ рдкрд░реНрдпрд╛рдп: рд╡реЗрдм UI рдЙрдШрдбрд╛ рдЖрдгрд┐ рдмрдЯрдгрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛. рд╣реЗ рдЕрдиреЗрдХ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреНрдпрд╛ рдПрдХ-рд╡реЗрд│рдЪреНрдпрд╛ рдкреНрд░рд╛рд░рдВрднрд╛рд╕рд╛рдареА рдЕрдЧрджреА рдпреЛрдЧреНрдп рдЖрд╣реЗ.
- рджреБрд╕рд░рд╛ рдкрд░реНрдпрд╛рдп: рддреБрдореНрд╣реА GraphQl API рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛. рдпреЗрдереЗ рдЖрдкрдг рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдХрд╛рд╣реАрддрд░реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░реВ рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкрд╛рдпрдердирдордзреНрдпреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд╛.
- рддрд┐рд╕рд░рд╛ рдкрд░реНрдпрд╛рдп (рдЬреЛрд░рджрд╛рд░ рдЗрдЪреНрдЫреЗрд╕рд╛рдареА): рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЬрд╛, рд╡рд╛рдкрд░реВрди рдПрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рд╛
tarantoolctl connect
рдЖрдгрд┐ рд▓реБрдЖ рдореЙрдбреНрдпреВрд▓рд╕рд╣ тАЛтАЛрд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХ рд╣рд╛рддрд╛рд│рдгреА рдХрд░рд╛cartridge
.
рдЖрдордЪреНрдпрд╛ рд╢реЛрдзрд╛рдЪреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЗ рдирдХреНрдХреА рдХрд░рдгреЗ рдЖрд╣реЗ, рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдорд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рдХрдареАрдг рднрд╛рдЧ.
Ansible рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рднреВрдорд┐рдХреЗрдд рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЖрдордЪреА рднреВрдорд┐рдХрд╛ рд╡рд┐рд╡рд┐рдз рдХреНрд▓рд╕реНрдЯрд░ рдШрдЯрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд╢рд╛ рдореЙрдбреНрдпреВрд▓реНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддреЗ.
рд╣реЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ? рддреБрдореНрд╣реА рдХреНрд▓рд╕реНрдЯрд░рдЪреНрдпрд╛ рдЗрдЪреНрдЫрд┐рдд рд╕реНрдерд┐рддреАрдЪреЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рдЖрдгрд┐ рднреВрдорд┐рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓рд▓рд╛ рддреНрдпрд╛рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд┐рднрд╛рдЧ рдЗрдирдкреБрдЯ рдореНрд╣рдгреВрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдореЙрдбреНрдпреБрд▓ рдХреНрд▓рд╕реНрдЯрд░рдЪреА рд╕рджреНрдпрд╕реНрдерд┐рддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рдЖрдгрд┐ рдЗрдирдкреБрдЯ рдореНрд╣рдгреВрди рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрд╢реА рддреНрдпрд╛рдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЗ. рдкреБрдвреЗ, рдПрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рд╕реЙрдХреЗрдЯрджреНрд╡рд╛рд░реЗ рдХреЛрдб рд▓реЙрдиреНрдЪ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рд╕реНрдерд┐рддреАрдд рдЖрдгрддреЛ.
рдкрд░рд┐рдгрд╛рдо
рдЖрдЬ рдЖрдореНрд╣реА рддреБрдордЪрд╛ рдЕрд░реНрдЬ Tarantool Cartridge рд╡рд░ рдХрд╕рд╛ рддреИрдирд╛рдд рдХрд░рд╛рдпрдЪрд╛ рдЖрдгрд┐ рдПрдХ рд╕рд╛рдзреА рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╢реА рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреА рддреЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЖрдгрд┐ рджрд╛рдЦрд╡рд▓реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЕрдБрд╕рд┐рдмрд▓ рд╡рд╛рдкрд░рд▓реЗ - рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд╛рдзрди рдЬреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕реЛрдкреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рдиреЛрдбреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ (рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХреНрд▓рд╕реНрдЯрд░ рдЙрджрд╛рд╣рд░рдгреЗ).
рд╡рд░ рдЖрдореНрд╣реА Ansible рд╡рд╛рдкрд░реВрди рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдорд╛рд░реНрдЧрд╛рдВрдкреИрдХреА рдПрдХ рдкрд╛рд╣рд┐рд▓рд╛. рдПрдХрджрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреЗ рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рд╡рд╛рдЯрд▓реЗ рдХреА, рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рд╛ group_vars
╨╕ host_vars
.
рдЯреЛрдкреЛрд▓реЙрдЬреА, рдмреВрдЯрд╕реНрдЯреНрд░реЕрдк рд╡реНрд╣реАрд╢рд╛рд░реНрдб, рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдлреЗрд▓рдУрд╡реНрд╣рд░ рдореЛрдб рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ, рдЕрдзрд┐рдХреГрддрддрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдкреЕрдЪ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рддреЗ рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╡рдХрд░рдЪ рдХрд╕реЗ рд╣рдЯрд╡рд╛рдпрдЪреЗ (рд╣рдХрд▓реВрди рд▓рд╛рд╡рд╛рдпрдЪреЗ) рд╕рд╛рдВрдЧреВ. рджрд░рдореНрдпрд╛рди, рддреБрдореНрд╣реА рд╕реНрд╡рддрдГ рдЕрднреНрдпрд╛рд╕ рдХрд░реВ рд╢рдХрддрд╛
рдХрд╛рд╣реАрддрд░реА рдХрд╛рд░реНрдп рдХрд░рдд рдирд╕рд▓реНрдпрд╛рд╕, рдЦрд╛рддреНрд░реА рдХрд░рд╛
рд╕реНрддреНрд░реЛрдд: www.habr.com