አስቀድመን ተናግረናል
የሚስብ? ከዚያም በቆራጩ ስር እጠይቃለሁ, ሁሉንም ነገር እንናገራለን እና እናሳያለን.
በምሳሌ እንጀምር
የእኛን ሚና ተግባራዊነት በከፊል ብቻ እንሸፍናለን። የሁሉም ባህሪያቱ እና የግቤት ግቤቶች የተሟላ መግለጫ ሁልጊዜ ማግኘት ይችላሉ።
Tarantool Cartridge አለው። api
и storage
ለአብነት ሊመደብ የሚችል።
Cartridge ራሱ ሂደቶችን እንዴት እንደሚጀምሩ ምንም ነገር አይናገርም, ቀድሞውኑ እየሰሩ ያሉ ሁኔታዎችን የማዋቀር ችሎታ ብቻ ይሰጣል. ተጠቃሚው የቀረውን እራሱ ማድረግ አለበት: የውቅረት ፋይሎችን መበስበስ, አገልግሎቶቹን መጀመር እና ቶፖሎጂን ማዘጋጀት. እኛ ግን ይህን ሁሉ አናደርግም, Ansible ያደርግልናል.
ከቃላት ወደ ተግባር
ስለዚህ የእኛን መተግበሪያ ወደ ሁለት ምናባዊ ማሽኖች እናሰማራ እና ቀላል ቶፖሎጂን እናዋቅር፡
- Replicaset
app-1
ሚና ይጫወታልapi
ሚናውን የሚያካትትvshard-router
. እዚህ አንድ ምሳሌ ብቻ ይሆናል. - replicaset
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
የ Tarantool Cartridgeን ሊቻል የሚችል ሚና ይጫኑ፡-
$ 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
.
ለእያንዳንዱ ምሳሌ የግንኙነቶች መለኪያዎችን ለአስተዋይ መንገር አለብን። ምሳሌዎችን ወደ ምናባዊ ማሽን ቡድኖች መቧደን ምክንያታዊ ይመስላል። ይህንን ለማድረግ, ምሳሌዎች በቡድን ይጣመራሉ. 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
: ቶፖሎጂ አስተዳደር (replicaset አስተዳደር እና ቋሚ ማስወገድ (ማባረር) ከጥቅሉ ውስጥ አጋጣሚዎች;cartridge-config
ሌሎች የክላስተር መለኪያዎችን ያቀናብሩ (vshard bootstrapping፣ auto failover mode፣ የፍቃድ መለኪያዎች እና የመተግበሪያ ውቅር)።
የምንፈልገውን የሥራውን ክፍል በግልፅ ልንገልጽ እንችላለን, ከዚያም ሚናው የተቀሩትን ስራዎች ይዘልላል. በእኛ ሁኔታ, ከቶፖሎጂ ጋር ብቻ መስራት እንፈልጋለን, ስለዚህ ገለጽን 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 መጠቀም ትችላለህ። እዚህ የሆነ ነገር በራስ-ሰር ማድረግ ይችላሉ፣ ለምሳሌ፣ በ Python ውስጥ ስክሪፕት ይፃፉ።
- ሦስተኛው አማራጭ (በመንፈስ ለጠንካራ ሰዎች): ወደ አገልጋዩ ይሂዱ, ከተጠቀሙባቸው አጋጣሚዎች አንዱን ያገናኙ
tarantoolctl connect
እና ሁሉንም አስፈላጊ ማጭበርበሮችን በሉአ ሞጁል ያከናውኑcartridge
.
የእኛ ፈጠራ ዋና ተግባር ለእርስዎ በጣም አስቸጋሪ የሆነውን ይህን ማድረግ ነው.
ሊነበብ የሚችል የራስዎን ሞጁል እንዲጽፉ እና በአንድ ሚና ውስጥ እንዲጠቀሙበት ይፈቅድልዎታል. የእኛ ሚና እነዚህን ሞጁሎች በመጠቀም የክላስተርን የተለያዩ ክፍሎች ለማስተዳደር ይጠቀማል።
እንዴት እንደሚሰራ? የሚፈለገውን የክላስተር ሁኔታ ገላጭ ውቅረት ውስጥ ይገልፃሉ፣ እና ሚናው ለእያንዳንዱ ሞጁል የውቅር ክፍሉን እንደ ግብአት ይሰጣል። ሞጁሉ የክላስተር ወቅታዊ ሁኔታን ይቀበላል እና ከመግቢያው ጋር ያወዳድራል. በመቀጠል, አንድ ኮድ በአንዱ አጋጣሚዎች ሶኬት ውስጥ ይካሄዳል, ይህም ክላስተር ወደ ተፈላጊው ሁኔታ ያመጣል.
ውጤቶች
ዛሬ ማመልከቻዎን በ Tarantool Cartridge ላይ እንዴት እንደሚያሰማሩ እና ቀላል ቶፖሎጂን እንደሚያዘጋጁ ነግረን እና አሳይተናል። ይህንን ለማድረግ በቀላሉ ለመጠቀም ቀላል የሆነ እና ብዙ የመሠረተ ልማት ኖዶችን በአንድ ጊዜ እንዲያዋቅሩ የሚያስችል ኃይለኛ መሳሪያ Ansible ተጠቀምን (በእኛ ሁኔታ እነዚህ ክላስተር ምሳሌዎች ናቸው)።
ከዚህ በላይ፣ አንሲብልን በመጠቀም የክላስተር ውቅርን ከሚገልጹት ከብዙ መንገዶች አንዱን አነጋግረናል። ለመቀጠል ዝግጁ መሆንዎን ካወቁ በኋላ ይማሩ group_vars
и host_vars
.
በጣም በቅርብ ጊዜ ምሳሌዎችን ከቶፖሎጂ እንዴት በቋሚነት ማስወገድ (ማባረር) እንደሚችሉ እንነግርዎታለን ፣ bootstrap vshard ፣ አውቶማቲክ ውድቀት ሁነታን ያስተዳድሩ ፣ ፈቃድን ማዋቀር እና የክላስተር ውቅረትን ማስተካከል። እስከዚያው ድረስ, በራስዎ ማጥናት ይችላሉ
የሆነ ነገር ካልሰራ እርግጠኛ ይሁኑ
ምንጭ: hab.com