끄적이는 보송

[Linux] 리눅스 서버 시간 동기화하기 본문

STUDY/Linux

[Linux] 리눅스 서버 시간 동기화하기

끄적이는 보송 2023. 3. 12. 15:18
반응형

서버 시간이 틀어졌을 때를 가정하고 Chrony를 사용해서 리눅스 서버 시간 동기화를 해 볼 생각이다.

Chrony란?
주로 Chrony와 NTP 둘 다 사용하며, 둘 다 시간 동기화에 사용되는 프로토콜이지만 Chrony가 일반적으로 더 나은 선택지로 취급된다. 이유는 NTP보다 더 정교하고, 리소스 사용량도 적고, 효율적이며 기타 등등 여하튼 최신 Linux 시스템에서 시간 동기화에 권장되는 옵션이라고 한다.

NTP는 무쓸모일까?
그렇다면 NTP는 Chrony보다 떨어지니 전혀 쓸 일이 없을까? 아마 일부 구형 시스템의 경우, Chrony와 호환되지 않을 수 있어 NTP를 사용해야 하는 경우가 있을 수도 있다. 혹은 이전부터 쭈욱 사용해 왔던 시간 동기화 프로토콜이 NTP이거나, 다른 동기화 프로토콜에 비해 사용할 수 있는 공용 NTP 서버가 더 많은 점에서 누군가에겐 신뢰도가 더 높은 선택지일 수도 있다.

여하튼 각설하고 바로 Chrony로 시간 동기화하는 실습을 해보자. 이번 글 역시 TMI 성향이 다분하다...

 

1. 실습 (AWS의 ubuntu 환경)

# chrony config 파일에 접근해 server 169.254.169.123을 추가해준다.
# chrony.conf 경로는 OS마다 상이다. ex)centos의 경우 /etc/chrony.conf
[root@localhost ~]$ vi /etc/chrony/chrony.conf

# server 169.254.169.123 라인을 추가해 준다.
# Amazon Time Sync Service를 우선적으로 이용하겠다는 설정이다.
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
pool ntp.ubuntu.com        iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2

# 재부팅 시, chrony 자동 시작 및 설정 적용을 위한 restart
[root@localhost ~]$ systemctl enable chrony
[root@localhost ~]$ sudo systemctl restart chrony

# 시간 동기화 확인
# chrony.conf에 한 줄 추가한 설정으로 169.254.169.123 IP주를 이용해 우선적으로 시간 동기화를 하고 있는 상태
[root@localhost ~]$ chronyc sources -v
  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^? 169.254.169.123               3   4     7     2    -14us[  -14us] +/-  491us
^? alphyn.canonical.com          2   6     7     1   +142us[ +142us] +/-  156ms
^? pugot.canonical.com           2   6     3     2   +536us[ +536us] +/-  153ms
^? prod-ntp-5.ntp4.ps5.cano>     2   6     7     1  +1517us[+1517us] +/-  124ms
^? prod-ntp-3.ntp1.ps5.cano>     2   6     3     3  -2813us[-2813us] +/-  120ms
^? 38.229.52.9                   2   6     3     2   +708us[ +708us] +/-  214ms
^? send.mx.cdnetworks.com        2   6     7     1  +1018us[+1018us] +/-   35ms
^? 106.247.248.106               2   6     7     0   +480us[ +480us] +/-   40ms
^? ec2-13-209-84-50.ap-nort>     2   6     3     3    -19ms[  -19ms] +/-   23ms

여기서 우리는 시간 동기화를 위해 chrony와 169.254.169.123 IP주소를 이용했다. 우선 169.254.169.123 IP주소가 무엇인지부터 정리해 본다.

1-1. 169.254.169.123 IP 주소?

169.254.169.123 IP 주소는 인스턴스 내부에서 NTP(Network Time Protocol) 클라이언트가 자동으로 접근하는 NTP 서버를 의미하며, 인스턴스 메타데이터 서비스를 통해 UTC 시간 기준으로 시간동기화 서비스를 제공해 주는 녀석이다. 

장점으로는 AWS 내부에서 동작함으로 시간 동기화의 정확성과 안정성이 보장된다는 점, 일부 인스턴스의 경우 추가 구성 없이 자동으로 동기화된다는 점, 내부적으로 동작하기에 외부 인터넷 통신이 필요 없다는 점이 있다.

단점으로는 AWS 내부에 위치해야만 하며, AWS 종속적이어야만 한다는 것이다. 즉, 서비스를 벗어나는 경우, 시간 동기화 기능이 제대로 동작하지 않을 수 있다. AWS 서비스에 종속적이어도 괜찮은 경우에는 169.254.169.123을 사용하여 간편하게 시간 동기화를 수행할 수 있다. 만약 향후 AWS 외부로 마이그레이션 계획이 있다면 이 점도 고려해야 한다.

1-2. chrony 설정 관련

chrony.conf 파일에 아래 줄을 채웠는데, NTP 설정 중, 169.254.169.123 NTP 서버를 선호하며, 최소 및 최대 폴링 간격을 4로 설정한다는 내용이다. 

server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

# server 169.254.169.123:
# NTP 서버를 추가하는 설정. 
# 169.254.169.123은 Amazon EC2 인스턴스에서 시간 동기화를 위해 사용되는 NTP 서버의 IP 주소.

# prefer:
# 169.254.169.123 서버를 클라이언트가 선호하는 NTP 서버로 설정하겠다는 의미.
# 즉, 다른 NTP 서버보다 169.254.169.123 서버와 더 자주 통신하도록 유도하는 역할을 함.

# iburst:
# 최초 요청 시에 빠르게 시간 동기화를 수행하기 위해 사용되는 옵션.
# 최초 4개의 요청은 minpoll 옵션 값 대신, 2초 혹은 그 이하의 간격으로 동기화 됨

# minpoll 4:
# 클라이언트가 NTP 서버에 대한 최소 폴링 간격을 2의 4제곱으로 설정하는 내용 (16초). 
# 폴링 간격은 클라이언트가 NTP 서버와 통신하여 시간 동기화를 수행하는 주기를 의미. 
# 이 설정은 클라이언트가 NTP 서버와 자주 통신하여 정확한 시간 동기화를 수행하도록 구성하는 역할을 함.

# maxpoll 4:
# 클라이언트가 NTP 서버에 대한 최대 폴링 간격을 2의 4제곱으로 설정하는 내용 (16초).
# 클라이언트가 NTP 서버와 통신하여 시간 동기화를 수행하는 주기를 제한하는 역할을 함. 
# 이를 통해 불필요한 트래픽과 네트워크 부하를 줄일 수 있음.

[+] https://chrony.tuxfamily.org/doc/3.4/chrony.conf.html

 

chrony – chrony.conf(5)

chrony was written by Richard Curnow, Miroslav Lichvar, and others.

chrony.tuxfamily.org

1-3. 동기화된 시간을 UTC에서 KST로 변경

여기까지 왔다면 시간 동기화는 완료된 거다. 디폴트로 시간은 UTC 기준이다. 기본으로 설정된 UTC timezone을 KST로 변경하는 것은 아래 포스팅을 참고해 보자.

[+] https://bosungtea9416.tistory.com/entry/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-timezone-%EC%84%A4%EC%A0%95-UTC%EC%97%90%EC%84%9C-KST%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0

 

[Linux] 리눅스 timezone 설정 UTC에서 KST로 변경하기

 

bosungtea9416.tistory.com

 

2. 서버 시간이 틀어지는 이유

서버의 시간이 실제 시간과 다른 이유는 여러 가지가 있다고 한다. 잘못된 설정, NTP 서버 오작동 및 연결 이슈, 시스템 클럭 이슈, 네트워크 대역폭 이슈, EC2 Instance 하드웨어 이슈 등 정말 많은 원인이 있을 수 있다. 하지만 그중에 꽤 흥미로웠던 것이 

아인슈타인 상대성이론에 따른 시간은 중력의 영향을 받으며 대륙별로 중력 세기가 다르므로 전 세계 곳곳에 있는 서버마다 기준이 되는 시간이 다른다는 점이었다. 전 세계 곳곳에 분포되어 있는 시간동기화 서버 중, 하나는 중력이 센 곳에, 나머지 하나는 중력이 약한 곳에 위치하고 있다면 두 서버는 시간이 흘러 서로 다른 시간 결괏값을 가져올 수도 있겠다는 생각도 들었다.

https://www.galsys.co.uk/news/category/atomic-clocks/page/3/

 

atomic clocks Archives - Galleon Systems

Most people will have heard of atomic clocks, most people, probably without realising have even used them; however, I doubt many people reading this will have ever seen one. Atomic clocks are highly technical and complicated pieces of machinery. Relying on

www.galsys.co.uk

 

3. 서버 시간은 어떻게 흐를까?

서버의 시간이 어떻게 동기화되고 어떻게 하는지는 이제 알았다. 하지만 서버 시간이 동기화 됐다고 해서 시간이 흐르는 것은 아니다. 서버 시간 동기화와 시간이 흐르는 것은 별개의 주제다. 그렇다면 내 서버는 어떻게 특정 시간을 기준으로 1초가 지났다는 것을 알 수 있는 걸까?

여기서 오실레이터(oscillator) 혹은 크리스탈이라고 불리는 개념이 나온다. 대부분의 서버에서는 오실레이터를 이용해 시간을 측정한다. 오실레이터란 전기 신호를 이용하여 일정한 주기로 진동하여 전기 신호를 발생하는 기기인데 다양한 전자 제품에서 이것이 사용된다. 서버도 마찬가지로 오실레이터가 내장되어 있으며, 동기화된 시간을 이것을 통해 유지하면 시간이 흐르는 것이다.

이 역시 품질이 있으며, 주기적으로 발생하는 진동을 기준으로 시간을 측정하니 오차가 발생할 수 있다. 이것을 보정하기 위해 NTP와 같은 시간 동기화 프로토콜을 이용하는 것이고, 필요하다면 더 비싸고 정확한 오실레이터를 이용하는 거다.

Amazon EC2라고 별다른 게 있을까? 아마 호스팅 장비에도 오실레이터가 내장되어 있을 것이고 EC2라는 VM은 그 위에서 이를 참고하고 있을 거라는 추측(?)이 든다.

[+] https://www.techtarget.com/whatis/definition/oscillator

 

What is oscillator? | Definition from TechTarget

Click this page to learn the definition of an oscillator and how the technology works.

www.techtarget.com

반응형

 

4. Amazon Linux2에서 발생한 chrony 설정 오류

여담으로 Amazon Linux2에도 기존 설정을 주석처리하고 동일한 설정을 해줬는데, 약간의 오류가 발생했다. 

chrony.conf 파일에 접근해 기존의 'sourcedir /run/chrony-dhcp' 설정을 주석 처리하고 169.254.169.123 설정 해봄. 
[root@localhost ~]$ vi /etc/chrony.conf

# Use NTP servers from DHCP.
# sourcedir /run/chrony-dhcp
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

chony 상태를 보니 내가 추가한 169.254.169.123을 NTP 서버로 추가하지 못했다는데... 

정작 돌아가는 걸 확인해 보면 이미 169.254.169.123 IP주소가 등록되어 있어, 추가가 안 됐던 것이다.

Amazon Linux2 OS는 이미 디폴트로 169.254.169.123을 포함한 기타 NTP 서버를 바라보도록 설정되어 있다. 참고로 아래 경로의 설정 세 줄을 날리면 169.254.169.123을 제외한 다른 NTP 서버 설정은 사라진다.

/etc/chrony.d/ntp-pool.sources

반응형
Comments