728x90
λ°˜μ‘ν˜•

14μž₯ μ—…κ·Έλ ˆμ΄λ“œμ™€ 둀백을 μ΄μš©ν•œ μ—…λ°μ΄νŠΈ μžλ™ν™”

14.1 도컀λ₯Ό μ‚¬μš©ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ—…κ·Έλ ˆμ΄λ“œ ν”„λ‘œμ„ΈμŠ€

배포 μ£ΌκΈ°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 버전을 μ œμ™Έν•˜κ³  μ•„λž˜ 4가지λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

A. 의쑴 λͺ¨λ“ˆμ˜ μ—…λ°μ΄νŠΈ

B. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λŠ” 데 μ‚¬μ˜ν•˜λŠ” SDK μ—…λ°μ΄νŠΈ

C. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μž‘ν•˜λŠ” ν”Œλž«νΌμ˜ μ—…λ°μ΄νŠΈ

D. 운영체제 μ—…λ°μ΄νŠΈ

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 변경이 없더라도 맀달 μƒˆ 버전을 배포해야 ν•˜λŠ”κ²ƒμ€ λΆ€λ‹΄μŠ€λŸ¬μš΄ 일이닀.
  • ν•˜μ§€λ§Œ, 주기적인 배포λ₯Ό μžλ™ν™”ν•˜λ©΄ λΉŒλ“œμ— 신뒰감이 생기고, λ‹€μŒ 배포 μ£ΌκΈ°λ₯Ό 기닀리지 μ•Šκ³ λ„ μž‘μ—…μ΄ λλ‚œ μƒˆ κΈ°λŠ₯을 λ°”λ‘œ 배포에 ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€.
  • λΉŒλ“œμ— λŒ€ν•œ 신뒰감은 성곡적인 배포가 계속 λ˜μ–΄μ•Όλ§Œ μŒ“μ„ 수 μžˆλ‹€.
  • 이 λ•Œ μ€‘μš”ν•œ 것은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν—¬μŠ€ 체크이고, ν—¬μŠ€ 체크 μ—†μ΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 자기 μˆ˜λ³΅μ„±μ„ κ°€μ§ˆ 수 μ—†κ³  μ•ˆμ „ν•œ μ—…λ°μ΄νŠΈμ™€ 둀백도 λΆˆκ°€λŠ₯ν•˜λ‹€.
$ docker compose -f docker-compose.yml -f prod.yml config > stack.yml
$ vi stack.yml

name: numbers
services:
  numbers-api:
    deploy:
      replicas: 6
      resources:
        limits:
          cpus: 0.5
          memory: "78643200"
    image: diamol/ch08-numbers-api
    networks:
      app-net: null
  numbers-web:
    deploy:
      mode: global
      resources:
        limits:
          cpus: 0.75
          memory: "157286400"
    environment:
      RngApi__Url: <http://numbers-api/rng>
    image: diamol/ch08-numbers-web
    networks:
      app-net: null
    ports:
      - mode: host
        target: 80
        published: "80"
        protocol: tcp
networks:
  app-net:
    name: numbers-prod

도컀 μŠ€μ›œμ—μ„œλŠ” μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ„œλΉ„μŠ€κ°€ 배포될지 κ²°μ •ν•  수 μžˆλŠ” μ„œλΉ„μŠ€ λͺ¨λ“œκ°€ μžˆλ‹€.

  • global
    • ν΄λŸ¬μŠ€ν„° λ‚΄μ˜ λͺ¨λ“  λ…Έλ“œμ— μ„œλΉ„μŠ€μ˜ μž‘μ—…μ„ ν•˜λ‚˜μ”© λ°°ν¬ν•œλ‹€.
    • 즉, λ…Έλ“œμ˜ 수만큼 μ„œλΉ„μŠ€μ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€.
    • ν•œ λ…Έλ“œμ— λ¬Έμ œκ°€ λ°œμƒν•˜λ”λΌλ„ λ‹€λ₯Έ λ…Έλ“œμ—μ„œ μ„œλΉ„μŠ€κ°€ 계속 μž‘λ™ν•œλ‹€.
    • λͺ¨λ“  λ…Έλ“œμ— λΆ€ν•˜κ°€ κ³ λ₯΄κ²Œ λΆ„μ‚°λœλ‹€.
    • κ·ΈλŸ¬λ‚˜, λΆˆν•„μš”ν•˜κ²Œ μ„œλΉ„μŠ€κ°€ 많이 배포될 수 μžˆλ‹€.
  • replicated
    • μ‚¬μš©μžκ°€ 직접 μ„œλΉ„μŠ€μ˜ μΈμŠ€ν„΄μŠ€ 수λ₯Ό μ§€μ •ν•œλ‹€.
    • μŠ€μΌ€μ€„λŸ¬κ°€ μ§€μ •λœ 수만큼의 μΈμŠ€ν„΄μŠ€λ₯Ό ν΄λŸ¬μŠ€ν„° λ‚΄μ˜ λ…Έλ“œμ— λΆ„μ‚°ν•˜μ—¬ λ°°ν¬ν•œλ‹€.
    • ν•„μš”ν•œ 만큼의 μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•˜μ—¬ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
    • κ·ΈλŸ¬λ‚˜, μΈμŠ€ν„΄μŠ€ 수λ₯Ό 직접 κ΄€λ¦¬ν•΄μ•Όν•œλ‹€.
    • 기본적으둜 도컀 μŠ€μ›œμ—μ„œλŠ” replicated 둜 λ™μž‘ν•œλ‹€.

14.2 운영 ν™˜κ²½μ„ μœ„ν•œ 둀링 μ—…λ°μ΄νŠΈ μ„€μ •ν•˜κΈ°

둀링 μ—…λ°μ΄νŠΈλž€?

$ docker compose -f docker-compose.yml -f prod.yml -f prod-healthcheck.yml -f v2.yml --log-level ERROR config > stack.yml

$ docker stack deploy -c stack.yml numbers

$ docker stack ps numbers
  • 둀링 μ—…λ°μ΄νŠΈλž€ κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ¨Όμ € μ’…λ£Œμ‹œν‚€κ³  μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λŠ” 방식이닀.
  • κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트 μ»΄ν“¨ν„°μ˜ 포트λ₯Ό 계속 μ—°κ²°ν•˜κ³  μžˆλ‹€λ©΄, μƒˆ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
  • λ ˆν”Œλ¦¬μΉ΄λŠ” ν•˜λ‚˜μ”© ꡐ체되며, μƒˆ μ»¨ν…Œμ΄λ„ˆκ°€ 정상 μ‹€ν–‰ 확인이 μ™„λ£Œλœ ν›„ λ‹€μŒ μ»¨ν…Œμ΄λ„ˆ μ—…λ°μ΄νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€.
  • μƒˆ μ»¨ν…Œμ΄λ„ˆκ°€ μ •μƒμ μœΌλ‘œ μ‹œμž‘λ˜μ§€ μ•ŠμœΌλ©΄ 전체 μ—…λ°μ΄νŠΈκ°€ μ€‘λ‹¨λœλ‹€.

도컀 μŠ€μ›œμ—μ„œ 둀링 μ—…λ°μ΄νŠΈλ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄ 컴포즈 파일의 deploy ν•­λͺ©μ—μ„œ μ„€μ •ν•  수 μžˆλ‹€.

numbers-api:
	deploy:
		update_config:
			parallelism: 3
			monitor: 60s
			failure_action: rollback
			order: start-first
  • parallelism
    • ν•œ λ²ˆμ— κ΅μ²΄ν•˜λŠ” λ ˆν”Œλ¦¬μΉ΄μ˜ 수
    • κΈ°λ³Έκ°’ 1
  • monitor
    • λ‹€μŒ μ»¨ν…Œμ΄λ„ˆ ꡐ체둜 λ„˜μ–΄κ°€κΈ° 전에 μƒˆλ‘œ μ‹€ν–‰ν•œ μ»¨ν…Œμ΄λ„ˆμ˜ 이상 μ—¬λΆ€λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜λŠ” μ‹œκ°„
    • κΈ°λ³Έκ°’ 0
    • ν—¬μŠ€ 체크 섀정을 ν¬ν•¨ν•œ μ΄λ―Έμ§€μ˜ 경우 섀정값을 λŠ˜λ €μ•Ό 됨.
    • monitor μ‹œκ°„μ΄ 길수둜 둀링 μ—…λ°μ΄νŠΈμ˜ 신뒰성이 μ¦κ°€ν•œλ‹€.
  • failure_action
    • monitor에 μ„€μ •ν•œ μ‹œκ°„ 이내에 ν—¬μŠ€ 체크가 μ‹€νŒ¨ν•˜κ±°λ‚˜ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•„ 둀링 μ—…λ°μ΄νŠΈκ°€ μ‹€νŒ¨ν•œ 경우의 쑰치
    • 기본값은 μ—…λ°μ΄νŠΈ 쀑지.
  • order
    • μ„œλΉ„μŠ€ μ—…λ°μ΄νŠΈ ν•  λ•Œ κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ œκ±°ν•˜κ³  μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜λŠ” μˆœμ„œλ₯Ό μ •μ˜ν•˜λŠ” μ˜΅μ…˜.
    • κΈ°λ³Έκ°’ stop-first
    • μƒˆλ‘œμš΄ λ ˆν”Œλ¦¬μΉ΄λ₯Ό μƒμ„±ν•˜κΈ° 전에 κΈ°μ‘΄ λ ˆν”Œλ¦¬μΉ΄λ₯Ό λ¨Όμ € 쀑지.

14.3 μ„œλΉ„μŠ€ λ‘€λ°± μ„€μ •ν•˜κΈ°

  • 도컀 μŠ€μ›œμ— λ”°λ‘œ λ‘€λ°± λͺ…λ Ήμ–΄λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 둀백은 μ—…λ°μ΄νŠΈ κ³Όμ •μ—μ„œ 였λ₯˜λ₯Ό μΌμœΌμΌ°μ„λ•Œ μˆ˜ν–‰λœλ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 이전 μƒνƒœλ‘œ λ˜λŒλ¦¬λŠ” 것은 μ„œλΉ„μŠ€ λ‹¨μœ„λ‘œ 이루어 진닀.
numbers-api:
	deploy:
		rollback_config:
			parallelism: 6
			monitor: 0s
			failure_action: continue
			order: start-first
  • start-first
    • κΈ°μ‘΄ λ ˆλΈ”λ¦¬μΉ΄ μ’…λ£Œλ₯Ό μ‹ κ²½ 쓰지 μ•Šκ³  λ¨Όμ € μƒˆ λ ˆν”Œλ¦¬μΉ΄λ₯Ό μ‹€ν–‰
  • monitor
    • κΈ°λ³Έκ°’ 0
    • 둀백이 μ‹€νŒ¨ν•˜λ”λΌλ„ λ‹€μŒ λ ˆν”Œλ¦¬μΉ΄λ₯Ό ꡐ체할 κ²ƒμ΄λ―€λ‘œ λͺ¨λ‹ˆν„°λ§ μ‹œκ°„μ΄ λΆˆν•„μš”ν•˜λ‹€.

14.4 ν΄λŸ¬μŠ€ν„°μ˜ 쀑단 μ‹œκ°„

  • μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λ„κ΅¬λŠ” μ—¬λŸ¬ λŒ€μ˜ 컴퓨터λ₯Ό λ¬Άμ–΄ ν•˜λ‚˜μ˜ ν΄λŸ¬μŠ€ν„°λ‘œ λ§Œλ“œλŠ” 것이닀.
  • ν•˜μ§€λ§Œ, κ²°κ΅­ μ‹€μ œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 각각의 컴퓨터이기 λ•Œλ¬Έμ— 쀑단 μ‹œκ°„μ΄ λ°œμƒν•  수 μžˆλ‹€.

λ“œλ ˆμΈ λͺ¨λ“œ(drain mode)

  • λ…Έλ“œλ₯Ό μœ μ§€λ³΄μˆ˜ λͺ¨λ“œλ‘œ μ „ν™˜ν•˜μ—¬ μ„œλΉ„μŠ€μ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•˜λ©΄μ„œ λ…Έλ“œλ₯Ό μ•ˆμ „ν•˜κ²Œ μ œκ±°ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•œ λͺ©μ .
  • λ“œλ ˆμΈ λͺ¨λ“œλ‘œ μ„€μ •λœ λ…Έλ“œλŠ” μƒˆλ‘œμš΄ μž‘μ—…μ„ 받지 μ•Šκ³ , 기쑴에 μ‹€ν–‰ μ€‘μ΄λ˜ μž‘μ—…λ“œμ„ 순차적으둜 μ’…λ£Œ.
  • λ§€λ‹ˆμ € λ…Έλ“œμ˜ 경우, ν΄λŸ¬μŠ€ν„° 관리 κΈ°λŠ₯은 μœ μ§€ν•˜μ§€λ§Œ μƒˆλ‘œμš΄ μž‘μ—… λΆ„λ°°λŠ” μ°Έμ—¬ν•˜μ§€ μ•ŠμŒ.
  • 단, λ“œλ ˆμΈ λͺ¨λ“œλŠ” λ…Έλ“œλ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜λŠ”κ²ƒμ΄ μ•„λ‹˜. λ…Έλ“œλ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜λ €λ©΄ docker node rm λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©.

리더 λ§€λ‹ˆμ €

  • ν΄λŸ¬μŠ€ν„°μ˜ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κ³ , λ‹€λ₯Έ λ…Έλ“œμ— μž‘μ—…μ„ λΆ„λ°°ν•˜λŠ” μ—­ν• .
  • λ§€λ‹ˆμ € λ…Έλ“œ 쀑 ν•˜λ‚˜κ°€ λ¦¬λ”λ‘œ μ„ μΆœ, 리더가 κ³ μž₯ λ‚˜λ©΄ λ‚˜λ¨Έμ§€ λ§€λ‹ˆμ € λ…Έλ“œ 쀑 ν•˜λ‚˜κ°€ μƒˆλ‘œμš΄ λ¦¬λ”λ‘œ μ„ μΆœ.
  • 리더 λ§€λ‹ˆμ €κ°€ κ³ μž₯ λ‚˜λ”λΌλ„ λ‹€λ₯Έ λ§€λ‹ˆμ € λ…Έλ“œκ°€ μžλ™μœΌλ‘œ 역할을 μˆ˜ν–‰. κ°€μš©μ„±μ„ 보μž₯.

μž₯μ•  λ°œμƒ μ‹œ μ‹œλ‚˜λ¦¬μ˜€

  • λͺ¨λ“  λ§€λ‹ˆμ € λ…Έλ“œ κ³ μž₯: 클러슀 관리 κΈ°λŠ₯이 μƒμ‹€λ˜μ–΄ μ„œλΉ„μŠ€ 배포밀 관리가 λΆˆκ°€λŠ₯. μƒˆλ‘œμš΄ λ§€λ‹ˆμ € λ…Έλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ν΄λŸ¬μŠ€ν„°λ₯Ό 볡ꡬ해야 함.
  • 리더가 μ•„λ‹Œ ν•œ λŒ€μ˜ λ§€λ‹ˆμ € λ…Έλ“œ κ³ μž₯: 남은 λ§€λ‹ˆμ € λ…Έλ“œκ°€ 리더 역할을 이어받아 ν΄λŸ¬μŠ€ν„° 정상 λ™μž‘.
  • λͺ¨λ“  μ›Œμ»€ λ…Έλ“œ κ³ μž₯: μ„œλΉ„μŠ€ 싀행을 μœ„ν•œ λ…Έλ“œκ°€ μ—†μœΌλ―€λ‘œ μ„œλΉ„μŠ€κ°€ 쀑단. μƒˆλ‘œμš΄ μ›Œμ»€ λ…Έλ“œ μΆ”κ°€λ₯Ό ν†΅ν•œ μ„œλΉ„μŠ€ 볡ꡬ.

14.5 μŠ€μ›œ ν΄λŸ¬μŠ€ν„°μ˜ κ³ κ°€μš©μ„±

  • μ—¬λŸ¬ 데이터 센터에 λΆ„μ‚°λœ 도컀 μŠ€μ›œ ν΄λŸ¬μŠ€ν„°μ—μ„œ λ„€νŠΈμ›Œν¬ μ§€μ—°μœΌλ‘œ μΈν•œ μ„±λŠ₯ μ €ν•˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.
  • 특히, λ§€λ‹ˆμ € λ…Έλ“œμ™€ μ›Œν¬ λ…Έλ“œ κ°„μ˜ λ„€νŠΈμ›Œν¬ 지연이 μ‹¬κ°ν•œ 경우 ν΄λŸ¬μŠ€ν„° μ„±λŠ₯에 큰 영ν–₯을 λ―ΈμΉœλ‹€.
  • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 데이터 μ„Όν„°λ²Όλ‘œ 독립적인 ν΄λŸ¬μŠ€ν„°λ₯Ό κ΅¬μ„±ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€.
  • 각 ν΄λŸ¬μŠ€ν„°κ°€ λ…λ¦½μ μœΌλ‘œ μš΄μ˜λ˜λ―€λ‘œ, ν•œ 데이터 센터에 μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ λ‹€λ₯Έ 데이터 μ„Όν„°μ˜ μ„œλΉ„μŠ€μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.
  • μ™ΈλΆ€ DNS μ„œλΉ„μŠ€λ₯Ό ν™œμš©ν•˜μ—¬ μ‚¬μš©μž νŠΈλž˜ν”½μ„ κ°€μž₯ κ°€κΉŒμš΄ ν΄λŸ¬μŠ€ν„°λ‘œ λΌμš°νŒ…ν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
728x90
λ°˜μ‘ν˜•
MyeongDev