클러스터의 모든 서버에게 ping을 요청하고 싶다.

 

먼저, 각 서버가 broadcast ping에 응답하도록 설정한다.

$ sudo sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=0

 

모든 서버의 설정이 끝나면, 요청하는 서버에서 broadcast ping을 전송한다.

(Broadcast IP는 ifconfig 명령에서 확인할 수 있다.)

$ ping -b {broadcast IP}

 

참고 자료

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8A%B8_%ED%95%91

 

리눅스 브로드캐스트 핑 - 제타위키

다음 문자열 포함...

zetawiki.com

https://www.commandlinefu.com/commands/view/10774/find-all-machines-on-the-network-using-broadcast-ping

 

Find all machines on the network using broadcast ping Using ping

commandlinefu.com is the place to record those command-line gems that you return to again and again. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down. Share Your Command

www.commandlinefu.com

 

  • NTP 설치
CentOS

1
[user@vm1 ~]$ sudo yum install -y ntp
cs

Ubuntu

1
[user@vm1 ~]$ sudo apt-get install -y ntp
cs


  • Local NTP 서버 설정
NTP 서버로 사용할 머신(예시에서는 vm1)에서 NTP의 설정 파일(/etc/ntp.conf)을 수정한다.
/etc/ntp.conf 파일은 root 권한(sudo)이 있어야 수정할 수 있다.

1
[user@vm1 ~]$ sudo vi /etc/ntp.conf
cs

/etc/ntp.conf 파일을 열면 중간에 아래와 같이 server로 시작하는 문장이 있을 것이다.

21
22
23
24
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
cs

기존의 문장들은 주석 처리(문장 앞에 #을 붙인다)하고, 아래와 같이 127.127.1.0을 추가한다.

21
22
23
24
25
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
cs


설정을 완료했으면 NTP 데몬을 재시작한다.


1
[user@vm1 ~]$ sudo service ntpd start
cs


부팅시 자동으로 NTP 데몬을 시작하고 싶다면 다음과 같이 등록한다.


1
[user@vm1 ~]$ sudo chkconfig ntpd on
cs



  • NTP 시간 동기화

Local NTP 서버를 구동하였으면, 이제 다른 서버들(예시에서는 vm2)은 NTP 서버를 통해 시간을 동기화하도록 한다.

각 서버에서 다음과 같은 명령어로 동기화를 요청한다.


1
[user@vm2 ~]$ sudo ntpdate -b vm1
cs


NTP를 사용하여 시간을 동기화할 때, 약 10분 정도를 기다려야 정확한 동기화가 된다고 한다.

하지만 실제로 동기화 작업을 해보니 위의 명령어를 실행하자마자 거의 정확한 동기화가 됨을 확인하였다.


위의 방법은 Local NTP 서버로 한 번만 동기화 작업을 요청하는데, 이는 시간이 지날 경우 동기화가 조금씩 풀리는 문제가 나타날 수 있다.

이 때는 두 가지 방법으로 해결할 수 있다.


첫 번째 방법은 서버와 마찬가지로 /etc/ntp.conf 파일을 수정하고 NTP 데몬을 부팅 레벨에 등록함으로써, 부팅 때마다 동기화되도록 하는 것이다.

이 방법은 재부팅때에만 동기화 작업을 하므로, 재부팅을 거의 하지 않는 서버에서는 해결 방법이 아니다.


두 번째 방법은 crontab에 등록하는 것이다.

crontab은 특정 기간마다 명령어를 자동으로 실행해준다.

이 방법은 주기적으로 동기화 작업을 하지만, 동기화에 약 10분의 대기 시간이 있으므로 빈번한 동기화 시에는 오히려 정확한 동기화가 어렵다.

(crontab에 5분마다 동기화를 했었는데, 너무 짧은 시간이라 동기화가 전혀 되지 않은 문제가 있었다.)




  • Troubleshooting

NTP는 기본적으로 UDP 123 포트를 사용한다고 한다.

따라서 방화벽을 끄거나 방화벽에서 123 포트를 개방하지 않으면, 동기화 작업을 수행하지 못한다.




  • 참고 사이트

RHEL, CentOS에서 ntp 서버 설정하기(사설망 내부 서버들의 시간 동기화)

[CentOS 7 / RHEL 7.2]NTP를 이용한 서버 시간 동기화 


  • 서론

다중 서버에서 측정한 데이터 전송 시간이 음수로 나타나는 문제가 발생하였다.

전송 시간은 [수신 시각 - 송신 시각]으로 계산하였는데, 이 값이 음수로 나타난 것은 서버들의 시간 동기화가 제대로 이루어져 있지 않기 때문으로 보인다.

이를 해결하기 위해, NTP(Network Time Protocol)로 서버들의 시간을 동기화하자.



  • 본론

(1) 전송 시간 측정 프로그램


서버 간의 데이터 전송 시간을 측정하기 위해, 다음과 같이 파이썬으로 구현된 소켓 통신 프로그램을 사용해보자.

소켓 통신 프로그램은 "파이썬에서 간단한 소켓 통신 예제"를 수정하였다. 


먼저 서버 프로그램이다.

  1. 5번 라인에서 인자로 받은 서버의 ip 값을 저장한다.
  2. 6~9번 라인에서 서버 소켓을 열고 대기한다.
  3. 10번 라인에서 클라이언트로부터 데이터를 입력받는다. 데이터는 클라이언트에서 측정한 송신 시각이다.
  4. 11번 라인에서 수신 시각을 측정하고, 전달받은 송신 시각과의 차이를 출력한다. 각 시각은 마이크로초 단위이며, 자세한 내용은 "파이썬에서 Microsecond(마이크로초) 단위까지 시간 출력하기"를 참고한다.
1
2
3
4
5
6
7
8
9
10
11
import socket
import sys
from datetime import datetime
 
ip = sys.argv[1]
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((ip, 12345))
server_socket.listen(0)
client_socket, addr = server_socket.accept()
data = client_socket.recv(65535)
print(int(datetime.utcnow().strftime('%S%f')) - int(data))
cs


다음은 클라이언트 프로그램이다.

  1. 5번 라인에서 인자로 받은 서버의 ip 값을 저장한다.
  2. 6~7번 라인에서 서버와 연결을 요청한다.
  3. 8번 라인에서 서버에게 송신 시각을 측정하여 전달한다.
1
2
3
4
5
6
7
8
import socket
import sys
from datetime import datetime
 
ip = sys.argv[1]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, 12345))
sock.send(datetime.utcnow().strftime('%S%f'))
cs


이제 두 프로그램을 실행하여 전송 시간을 측정해보자.

두 개의 쉘을 열고, 먼저 서버 프로그램을 실행한다.


1
2
[user@vm1~]$ python server.py vm1
 
cs


서버 프로그램이 실행된 후, 클라이언트로부터 연결을 대기하고 있다.

이제 다른 쉘에서 클라이언트 프로그램을 실행한다.


1
2
[user@vm2 ~]$ python client.py vm1
[user@vm2 ~]$
cs


클라이언트 프로그램을 실행하면, 메시지 없이 프로그램이 바로 종료된다.

다시 서버 프로그램을 실행한 쉘로 돌아가보면, 숫자 값이 출력되어 있을 것이다.

이 숫자가 클라이언트에서 서버로 데이터를 송신할 때 걸린 전송 시간(단위: 마이크로 초)이 된다.

아래 예제에서는 1015 마이크로 초(1015 * 10^-6 초)로 측정되었다.


1
2
3
[user@vm1 ~]$ python server.py vm1
1015
[user@vm1 ~]$
cs



(2) 동기화가 되지 않은 다중 서버


어떤 시간 동기화 작업을 하지 않은 경우, 운영 체제를 설치하면서 초기화했던 시간 덕분에 초 단위까지는 거의 비슷할 것이다.

하지만 앞서 (1)에서 설명한 전송 시간 측정 프로그램으로 다중 서버간의 전송 시간을 측정해보면 그 문제를 확인할 수 있다.

예를 들어, 동기화가 되지 않은 세 대의 CentOS 가상머신에서 서로 간의 전송 시간을 측정해보니 다음과 같은 결과가 나타났다.


<동기화가 되지 않은 다중 서버에서 데이터 전송 시간>


측정 결과를 보면, 전송 시간들의 편차가 매우 클뿐만 아니라 음수가 나타난 것을 알 수 있다.

즉, 송신 시각이 수신 시각보다 더 큰 것이다.

따라서 각 서버들의 시간을 반드시 동기화해야 한다.



(3) 공용 NTP 서버 time.bora.net를 이용한 동기화


시간 동기화에 가장 많이 쓰이는 프로토콜인 NTP로 동기화해보자.

동기화 기준으로는 공용 NTP 서버인 time.bora.net을 사용한다.

각 서버에서 다음 명령을 실행하고, 동기화가 잘 이루어지도록 10분을 대기하였다.


1
sudo ntpdate –b time.bora.net
cs


10분이 지난 후, (2)와 같이 (1)의 전송 시간 측정 프로그램으로 서버간의 전송 시간을 측정해보았다.

측정 결과는 아래와 같다.


<공용 NTP 서버를 통한 시간 동기화>


측정 결과를 보면, (2)의 동기화되지 않은 경우에 비해 전송 시간들의 편차가 많이 줄었다.

하지만 여전히 결과에 음수가 포함되어 있다.

이는, 공용 NTP 서버와의 통신에 필요한 hop의 수가 많다보니 서버마다 오차가 발생하기 때문이다.

결과의 음수들은 작게는 수십, 크게는 수백으로 나타났는데 이는 밀리 초 이하의 오차라는 것을 추정할 수 있다.



(4) 로컬 NTP 서버를 이용한 동기화


앞서 (3)에서의 동기화에 오차가 발생한 이유가 공용 서버와의 통신 hop이 많기 때문이라고 하였다.

이를 해결하기 위해, NTP 서버를 공용 서버가 아닌 로컬 서버로 지정한다.

현재 서버는 vm1, vm2, vm3가 있으며, 이 중 vm1을 로컬 NTP 서버로 지정하였다.

로컬 NTP 서버를 통한 동기화 방법은 다음 글을 참고한다.

Linux에서 Local NTP를 이용한 다중 서버의 시간 동기화하기


로컬 NTP 서버로 동기화한 후에 (1)의 전송 시간 측정 프로그램으로 서버간의 전송 시간을 측정해보았다.

측정 결과는 아래와 같다.


<로컬 NTP 서버를 통한 동기화>

측정 결과를 보면, 전송 시간의 편차가 크게 줄었을 뿐만 아니라 음수도 나타나지 않음을 알 수 있다.

이렇듯, 다중 서버에서 시간을 동기화할 때에는 공용 NTP 서버보다 로컬 NTP 서버를 사용한다면 오차를 최소화할 수 있다.




  • 결론

다중 서버의 시간 동기화를 위해 로컬 NTP 서버를 사용해보았다.

그 결과, 공용 NTP 서버에 비해 편차도 적으며 음수도 발생하지 않음을 확인하였다.




  • 참고 사이트

How to keep the time on multiple servers in sync, https://serverfault.com/questions/625072/how-to-keep-the-time-on-multiple-servers-in-sync/625696

date +"%Y-%m-%d %H:%M:%S.%N"


1
2
[user@vm ~]$ date +"%Y-%m-%d %H:%M:%S.%N"
2017-10-17 20:47:09.783257914
cs


%Y: 연

%m: 월

%d: 일

%H: 시

%M: 분

%S: 초

%N: 나노초



  • 참고 사이트

Linux command to get time in milliseconds, https://stackoverflow.com/questions/16548528/linux-command-to-get-time-in-milliseconds

How To Format Date For Display or Use In a Shell Script, https://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/

'프로그래밍 언어 > Shell script' 카테고리의 다른 글

gawk로 csv format 텍스트를 split 하기  (0) 2018.07.15

+ Recent posts