시간 동기화는 서버의 정확한 시간 유지에 필수적인 요소입니다. 특히 분산 환경에서 여러 서버가 일관된 시간을 유지하는 것은 데이터의 일관성과 정확성을 보장하는 데 중요합니다. 이번 포스트에서는 Chrony를 사용하여 Red Hat Enterprise Linux (RHEL)에서 시간 동기화를 설정하고 관리하는 방법을 소개합니다. Chrony는 경량의 NTP(Network Time Protocol) 클라이언트 및 서버로, 네트워크 상태에 맞춰 시간을 동기화하는 데 매우 효율적입니다.
Chrony 설치
RHEL에는 기본적으로 chrony가 설치되어 있습니다. 설치 여부를 확인하고 필요한 경우 설치하려면
# yum install chrony
Chrony 서비스 관리
Chrony 상태 확인:
$ systemctl status chronyd
chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
Active: active (running) since Wed 2024-10-24 10:23:16 CEST; 11h ago
Chrony 시작:
# systemctl start chronyd
Chrony 시스템 시작 시 자동 시작 설정:
# systemctl enable chronyd
Chrony 중지:
# systemctl stop chronyd
Chrony 시스템 시작 시 자동 시작 해제:
# systemctl disable chronyd
Chrony 동기화 확인
Chrony 추적 정보 확인:
$ chronyc tracking
Reference ID : CB00710F (ntp-server.example.net)
Stratum : 3
Ref time (UTC) : Fri Jan 27 09:49:17 2017
System time : 0.000006523 seconds slow of NTP time
Last offset : -0.000006747 seconds
RMS offset : 0.000035822 seconds
Frequency : 3.225 ppm slow
Residual freq : 0.000 ppm
Skew : 0.129 ppm
Root delay : 0.013639022 seconds
Root dispersion : 0.001100737 seconds
Update interval : 64.2 seconds
Leap status : Normal
- NTP 서버, 시간 오프셋, 주파수 드리프트 등 자세한 정보가 표시됩니다.
현재 시간 소스 확인:
$ chronyc sources
210 Number of sources = 3
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
#* GPS0 0 4 377 11 -479ns[ -621ns] /- 134ns
^? a.b.c 2 6 377 23 -923us[ -924us] +/- 43ms
^ d.e.f 1 6 377 21 -2629us[-2619us] +/- 86ms
- GPS 또는 다른 시간 소스에서 데이터를 수집하고 있는지 확인할 수 있습니다.
- 선택 사항
-v
인수를 지정하여 자세한 정보를 출력할 수 있습니다.
소스 통계 확인:
$ chronyc sourcestats
210 Number of sources = 1
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
===============================================================================
abc.def.ghi 11 5 46m -0.001 0.045 1us 25us
- 각 소스의 주파수 드리프트 및 오프셋 추정치를 확인할 수 있습니다.
이 명령들을 통해 Chrony 서비스의 동작과 NTP 시간 동기화 상태를 관리할 수 있습니다.
시스템 시계 수동 조정
시스템 시계를 즉시 전환:
현재 진행 중인 조정을 무시하고, 시스템 시계를 즉시 조정하려면 chronyc
의 makestep
명령을 사용합니다.
이 명령은 시스템 시간과 NTP 시간 사이의 차이가 설정된 임계값보다 클 때, 즉시 시스템 시간을 동기화합니다.
# chronyc makestep
주의:
rtcfile
지시문이chrony.conf
에 설정된 경우, 실시간 클록을 수동으로 조정하지 않아야 합니다. Chrony는 실시간 클록의 드리프트 속도를 측정해야 하며, 임의의 수동 조정이 이 프로세스에 방해가 될 수 있습니다.
chrony 디스패치 스크립트 비활성화
절차
디스패치 스크립트 기능:
NetworkManager는 NTP 서버가 온라인 및 오프라인 상태로 전환될 때 chrony
의 디스패치 스크립트를 실행합니다. 그러나 NetworkManager 이외의 방법으로 네트워크 구성을 관리하는 경우, NTP 서버가 오프라인 상태로 남을 수 있습니다.
디스패치 스크립트 비활성화:
다음 스크립트를 수정하여 chrony
디스패치 스크립트를 비활성화할 수 있습니다:
스크립트의 내용:
vi /etc/NetworkManager/dispatcher.d/20-chrony-online
#!/bin/sh
exit 0
주의:
chrony
패키지를 업그레이드하거나 다시 설치할 때 디스패치 스크립트가 원래 상태로 되돌아갈 수 있습니다.
격리된 네트워크에서 chrony 설정
절차
서버 설정:
인터넷 연결이 없는 네트워크에서 기본 타이머 역할을 할 서버의 chrony.conf
설정을 다음과 같이 편집합니다:
# vi chrony.conf
driftfile /var/lib/chrony/drift
commandkey 1
keyfile /etc/chrony.keys
initstepslew 10 client1 client3 client6
local stratum 8
manual
allow 192.0.2.0/24
192.0.2.0/24
는 클라이언트가 연결할 수 있는 네트워크 또는 서브넷입니다.
클라이언트 설정:
# vi chrony.conf
server ntp1.example.net
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
log measurements statistics tracking
keyfile /etc/chrony.keys
commandkey 24
local stratum 10
initstepslew 20 ntp1.example.net
allow 192.0.2.123
192.0.2.123
는 서버의 IP 주소이고, ntp1.example.net
은 서버의 호스트 이름입니다.
로컬 참조 모드 활성화:
고립 옵션을 사용하여 여러 서버가 서로 동기화하도록 로컬 참조 모드를 설정할 수 있습니다.
# vi chrony.conf
에서 고립 모드를 활성화:
local stratum 10 orphan
이를 통해 격리된 네트워크에서도 chrony 설정을 관리할 수 있습니다.
원격 모니터링 액세스 구성
chronyc
는 두 가지 방법으로 chronyd
에 액세스할 수 있습니다:
- 인터넷 프로토콜 (IPv4 또는 IPv6).
- Unix 도메인 소켓 – 기본적으로 로컬 시스템에서
root
또는chrony
사용자만 액세스 가능합니다.
chronyc
는 기본적으로 Unix 도메인 소켓 (/var/run/chrony/chronyd.sock
)에 연결됩니다. 이 연결이 실패하거나, 루트 권한 없이 실행하는 경우 chronyc
는 먼저 127.0.0.1
, 그다음 ::1
로 연결을 시도합니다.
원격 모니터링 명령
네트워크를 통해 보안상 허용된 모니터링 명령만 사용 가능:
- 활동 (
activity
) - 수동 목록 (
manual list
) - rtcdata
- 완화 중 (
tracking
) - 소스 (
sources
) - Sourcestats
- 추적 (
tracking
) - waitsync
기타 모든 명령은 Unix 도메인 소켓을 통해서만 실행 가능하며, 네트워크 상에서는 Not authorized
오류가 발생합니다.
원격 액세스 설정 절차
IPv4 및 IPv6에서 원격 액세스 허용:
vi /etc/chrony.conf 파일을 편집하고, 다음 중 하나를 추가:
bindcmdaddress 0.0.0.0
또는
bindcmdaddress ::
원격 명령 허용:
특정 IP 주소, 네트워크, 또는 서브넷에서 원격 명령을 허용하려면
vi /etc/chrony.conf 파일에 다음 내용을 추가:
cmdallow 192.168.1.0/24
방화벽 설정:
원격 시스템에서 연결을 허용하기 위해 UDP 포트 323
을 열어야 합니다.
# firewall-cmd --zone=public --add-port=323/udp
선택적으로 --permanent
옵션을 사용하여 포트 323을 영구적으로 열 수 있습니다.
# firewall-cmd --permanent --zone=public --add-port=323/udp
323 포트를 영구적으로 여는 경우 방화벽 구성을 다시 로드합니다.
# firewall-cmd --reload
RHEL 시스템 역할을 사용하여 시간 동기화 관리
timesync
역할은 여러 대상 시스템에서 시간 동기화를 쉽게 관리할 수 있도록 NTP 또는 PTP 클라이언트를 설정하는 기능을 제공합니다. 이 역할을 사용하면, NTP 또는 Chrony를 선택하여 다양한 Red Hat Enterprise Linux(RHEL) 버전(RHEL 6 이상)에서 동일한 플레이북을 활용할 수 있으며, Chrony로의 마이그레이션도 간편해집니다.
주요 기능:
- NTP(또는 PTP) 클라이언트 설치 및 설정
- 동일한 플레이북을 통해 여러 RHEL 버전에서 시간 동기화 관리 가능
timesync
역할을 통해 이전 설정이 대체되므로 주의가 필요
주의 사항:
timesync
역할은timesync_ntp_provider
변수를 통해 제공된 설정을 적용하며, 지정되지 않은 경우 기존 설정을 대체합니다. 만약 이 변수가 설정되지 않으면, 제공자 선택만 유지되고 나머지 설정은 손실됩니다.
예제: 단일 서버 풀에 대한 시간 동기화 설정
다음은 timesync
역할을 이용해 하나의 NTP 서버 풀을 구성하는 Ansible 플레이북 예제입니다.
---
- hosts: timesync-test
vars:
timesync_ntp_servers:
- hostname: 2.rhel.pool.ntp.org
pool: yes
iburst: yes
roles:
- rhel-system-roles.timesync
변수 설명:
timesync_ntp_servers
: 설정할 NTP 서버 리스트hostname
: NTP 서버의 호스트 이름pool
: 여러 서버를 위한 풀 기능 활성화 (yes
로 설정)iburst
: 빠른 시간 동기화를 위한iburst
옵션 활성화
참고:
rhel-system-roles
패키지의timesync
역할에 대한 더 많은 정보는 다음 파일에서 확인할 수 있습니다:/usr/share/doc/rhel-system-roles/timesync/README.md
/usr/share/doc/rhel-system-roles/timesync/README.html
Chrony와 NTP 차이
Chrony와 NTP(Network Time Protocol)는 모두 시스템 시계를 네트워크 시간 서버와 동기화하는 데 사용되는 도구입니다. 두 가지 모두 NTP 프로토콜을 구현하지만, 다양한 환경에서의 효율성, 성능, 유연성 면에서 차이가 있습니다. 다음은 Chrony와 NTP의 주요 차이점입니다.
1. 시간 동기화 속도
- Chrony: 초기 동기화가 매우 빠릅니다. 특히 가상 환경이나 빈번하게 부팅되는 시스템에서는 시간을 빠르게 동기화할 수 있습니다.
- NTP: 동기화 속도가 느리며, 안정적인 동기화를 이루기 위해 몇 분 또는 몇 시간이 걸릴 수 있습니다.
2. 네트워크 환경에 대한 적응성
- Chrony: 일시적인 네트워크 연결 중단이나 불안정한 네트워크 환경에서 매우 효과적으로 작동합니다. 네트워크가 복구되면 빠르게 다시 동기화할 수 있습니다.
- NTP: 네트워크 상태가 불안정하거나 오랜 시간 동안 네트워크에 연결되지 않는 경우 동기화 성능이 저하될 수 있습니다.
3. 오프라인 동기화
- Chrony: 오프라인 상태에서 시스템 클럭의 드리프트를 계산하고 보정할 수 있습니다. 따라서 일시적으로 네트워크에 연결되지 않은 상태에서도 정확한 시간 유지가 가능합니다.
- NTP: 네트워크 연결이 없는 경우 시간 동기화를 수행할 수 없으며, 네트워크가 복구된 후에야 동기화가 가능합니다.
4. 시스템 리소스 사용량
- Chrony: 경량화된 설계로 메모리와 CPU 사용량이 매우 적습니다. 특히 임베디드 시스템이나 가상 머신과 같은 환경에서 효율적입니다.
- NTP: 상대적으로 많은 메모리와 CPU 자원을 사용합니다. 고정된 환경에서 작동할 때는 큰 문제가 없지만, 자원이 제한된 시스템에서는 부담이 될 수 있습니다.
5. 정확성
- Chrony: 시간 오프셋을 빠르게 보정하고, 시스템의 클럭 드리프트를 더 정밀하게 조정할 수 있습니다. 특히 장시간 네트워크 연결이 불안정한 상황에서 더 나은 정확성을 제공합니다.
- NTP: 장기적으로 안정적인 네트워크 연결 상태에서는 정확한 동기화를 제공합니다. 하지만 네트워크 장애 발생 시 시간 오차가 발생할 수 있습니다.
6. 사용 환경
- Chrony: 빠르게 부팅하거나, 빈번하게 재부팅되는 시스템, 클라우드나 가상화 환경에서 주로 사용됩니다. 또한 일시적으로 네트워크에서 떨어져 있는 노트북 등에서도 유용합니다.
- NTP: 오래된 시스템이나 안정적인 네트워크 환경에서 주로 사용됩니다. 물리 서버나 데이터 센터에서 많이 활용됩니다.
7. 구성 파일 차이
- Chrony: 주요 구성 파일은
/etc/chrony.conf
이며, 설정이 간단하고 빠르게 적용됩니다. - NTP: 주요 구성 파일은
/etc/ntp.conf
이며, 복잡한 설정이 가능하지만 상대적으로 설정 파일이 더 크고 복잡합니다.
주요 선택 기준
- Chrony는 부팅 시간이 빠르고, 네트워크 연결이 불안정하거나 오프라인 상태에서도 시간이 중요한 시스템에 적합합니다.
- NTP는 안정적인 네트워크 연결이 보장되는 환경에서 장기적으로 시간 동기화를 유지해야 하는 시스템에 더 적합합니다.
결론
대부분의 최신 리눅스 배포판에서 Chrony는 NTP의 대안으로 기본 제공되고 있으며, 더 유연하고 빠른 동기화 성능을 제공합니다. 특히 가상화나 클라우드 환경에서 더 많이 채택되고 있습니다.