HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다. 공식 사이트 참조
haproxy를 통해 부하를 분산하는 등의 용도로 서비스 효율을 높일 수 있다.
설치
여기에서 다운 받아도 되며, yum epel-release에 포함되어 있으므로 epel-release 리포지터리 추가 후 yum 이나 dnf 명령 등을 통해 설치할 수 있다.
sudo dnf install -y haproxy
마지막 메타자료 만료확인 7:58:42 이전인: 2022년 07월 28일 (목) 오전 12시 23분 23 초.
종속성이 해결되었습니다.
================================================================================
꾸러미 구조 버전 레포지터리 크기
================================================================================
설치 중:
haproxy x86_64 1.8.27-4.el8 appstream 1.4 M
연결 요약
================================================================================
설치 1 꾸러미
총계 내려받기 크기: 1.4 M
설치된 크기 : 4.2 M
...중략...
설치되었습니다:
haproxy-1.8.27-4.el8.x86_64
완료되었습니다!
서비스가 구동 될 모든 서버에 설치해준다. 자동으로 서비스가 구동될 수있도록 서비스를 등록 해준다.
sudo systemctl enable haproxy.service
또는
sudo service haproxy start
설정
기본적으로 /etc/haproxy/haproxy.cfg 가 존재한다.
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# status web 설정
# haproxy 서비스 상태, 백엔드 서비스의 상태 등을 웹을 통해 확인할 수 있다.
# 필수는 아니다.
#---------------------------------------------------------------------
listen hastats
mode http
bind *:8088
stats enable
stats show-legends
stats uri /hastat
# 서버 주소가 192.168.0.1이라면 http://192.168.0.1/hastat으로 접속한다.
stats auth admin:admin
# hastats 웹에 접속 시 인증으로 제한하려면 계정과 패스워드를 지정한다.
#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
# 외부에서 haproxy를 통해 연결을 시도할 때 사용하는 포트
frontend kubeproxy
bind *:16443
default_backend kubeproxy
mode tcp
#---------------------------------------------------------------------
# 백엔드 설정
# 프론트엔드에서 defaultbackend 타겟으로 설정 된 백엔드 정보
#---------------------------------------------------------------------
backend kubeproxy
balance roundrobin
# Balance Option
# Roundrobin : 순차적으로 분배
# static-rr : 서버에 부여된 가중치에 따라서 분배
# leastconn : 접속수가 가장 적은 서버로 분배
# source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배
# uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱)
# url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리)
# hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리)
# rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배
mode tcp
option tcp-check
option tcplog
# 외부에서 16443 포트로 연결을 시도하면 아래의 서버에 순차적으로 연결해준다.
server storage01 192.168.0.1:6443 check
server storage02 192.168.0.2:6443 check
server storage03 192.168.0.3:6443 check
frontend web-console
bind *:18080
default_backend web-console
mode tcp
backend web-console
balance roundrobin
mode tcp
option tcp-check
option tcplog
server storage01 192.168.1.1:8080 check
server storage02 192.168.1.2:8080 check
server storage03 192.168.1.3:8080 check
keepalive 참조 keepalive는 Linux 시스템 혹은 Linux 기반 인프라에서의 로드밸런싱 및 고가용성을 위한 기능을 제공한다. 단순하게 설명하면, 두 개 이상의 Linux 시스템이 존재할 경우, virtual IP 를 생성하고 시스템의 상태에 따라 해당 virtual IP를 할당해주는 기능을 한다.
! Configuration File for keepalived Master
global_defs {
router_id rtr_0 # Master와 Backup 구분
}
vrrp_instance VI_0 { # Master와 Backup과 구분
state MASTER # 또는 BACKUP
interface eth0 # 노드에서 실제 사용할 인터페이스 지정
virtual_router_id 10 # Master와 Backup 모두 같은 값으로 설정.
priority 200 # 우선순위, 값이 높은 쪽인 Master가 된다.
advert_int 1
authentication {
auth_type PASS # Master와 Backup 모두 같은 값으로 설정.
auth_pass P@ssW0rd # Master와 Backup 모두 같은 값으로 설정.
}
virtual_ipaddress {
192.168.0.100 # Master와 Backup 동일하게 설정한 VIP
}
}
# #으로 시작하는 내용은 모두 삭제한다.
Backuo(slave)
! Configuration File for keepalived
global_defs {
router_id rtr_1
}
vrrp_instance VI_1 {
state BACKUP # MASTER가 아니므로 수정
interface eth0
virtual_router_id 10
priority 100 # 낮은 우선순위를 위해 수정
advert_int 1
authentication {
auth_type PASS
auth_pass P@ssW0rd
}
virtual_ipaddress {
192.168.0.100
}
}
구동
각각의 서버에서 서비스를 구동한다.
sudo systemctl enable keepalived --now
# BACKUP 서버들에서도 동일하게 서비스를 구동해준다.
확인
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4e:be:1a:32:52:04 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.41/24 brd 192.168.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.1.40/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::4cbe:1aff:fe32:5204/64 scope link
valid_lft forever preferred_lft forever
192.168.1.40/32가 virtual IP. backup 노드로 설정된 서버에는 해당 ip가 보이지 않는다.
다른 시스템에서 가상아이피를 이용하여 ssh 접속, 혹은 ping 명령등을 수행해서 확인하면 된다.
마이크로소프트 파워포인트(Microsoft Power Point)를 사용하다 보면 자동으로 한글이 영어로 영어에서 한글로 바뀌는 경우를 볼 수 있다. 아주 아주 편리한 기능으로 ‘database’라는 단어를 입력하고 싶을 때 한글이 선택된 상태로 ‘ㅇㅁㅅ뮴ㄴㄷ’를 입력하면 자동으로 제대로 된 영문으로 고쳐주는 기능이다.
하지만 종종 내가 원하지 않는 경우에도 변환이 되는 경우가 있는데 이런 경우라면 [파일] – [옵션] – [언어교정] – [자동 고침 옵션(A)…] 메뉴에서 [한/영 자동 고침(K)] 항목을 비활성화 해주면 된다
하.지.만
사실 위 기능은 구글에 ‘파워포인트 한영전환’ 9자만 검색하면 어떻게 바꾸는지 엄청 많이 나오므로 굳이 이렇게 포스팅할 필요가 없지만…
이런 어처구니 없는 동작을 하는 경우엔?
분명히 [한/영 자동 고침(K)] 항목을 비활성화 했음에도 제 멋대로 변경되는 것을 확인할 수 있다. “spark”의 경우는 아무런 문제가 없는 영단어인데 제 멋대로 자꾸 ‘rk ‘만 ‘가’로 치환하는데다 “repository”의 경우는 ‘sitory’ㅇ를 ‘냐새교’로 있지도 않은 단어로 자꾸 치환 해대니 미쳐버릴 노릇.
사실 이 문제는 파워포인트의 한영 전환 기능이 아니라 윈도우즈에 설치된 한글 입력기가 개입 하는 것으로 비단 파워포인트 뿐 아니라 다른 모든 어플리케이션에서 제 멋대로 문자를 치환해버리는 경우이다. 그러니까 파워포인트 문서를 작성하다가 문자가 변경된다고 옵션을 백번 바꿔봐야 소용이 없고, 엑셀에서도 제 멋대로 문자를 치환하고, 크롬의 경우는 제 멋대로 주소표시줄에서 자동완성을 시전하는 아주 전방위에서 사용자를 괴롭히는 그런 문제가 되겠다.
원인은 ‘한글과 컴퓨터 아래아한글’. 정확히 말하면 한컴 오피스를 설치 할 때 함께 설치되는 “한컴입력기”.
두 번째 동영상과 같은 증상이 나타나면 “한컴 입력기”를 제거함으로써 증상을 고칠 수 있다. 방법은 다음과 같다
기본적으로 렌즈 필터라 함은 렌즈의 앞에 장착하여 부가적인 효과를 더해주는 도구를 말한다. 요즘에야 디지털 카메라로 촬영한 디지털 결과물을 포토샵 등의 프로그램으로 수정을 하니까 필터로 얻는 효과가 무엇이 있을까 싶기도 하지만 과거 필름을 주로 사용하던 시절은 촬영한 이후 결과물을 수정하는 것이 쉽지 않았기 때문에 필터를 장착함으로써 다양한 효과를 추가하였다.
필터의 종류와 세세한 역할은 이후에 포스팅 하기로 하고 이번 포스트에서는 몇 가지 종류와 개념만 소개한다.
PL 필터 또는 CPL 필터 : Polarizing Filter 또는 Circular Polarizing Filter. 빛을 굴절시켜서 유리면이나, 수면의 반사광을 제거하는 역할을 한다.
ND 필터 : Neutral-density filter. 아주 밝은 날 혹은 밝은 공간에서 빛이 너무 강해 아무리 조리개를 조이고 셔터스피드를 짧게 해도 밝게 나오는 경우 혹은, 밝은 렌즈에서 오는 배경 흐림 효과 등을 사용하고 싶은데 빛이 강한 경우 등에 사용한다. ND100, 200 등의 숫자를 붙여서 빛의 차단 정도를 표기한다.
크로스 필터: Cross filter. 렌즈에 규칙적인 금이 가있는 필터로 금이간 모양대로 빛이 갈라지는 효과를 얻기 위한 필터이다. 광원이 십자가 모양 등으로 명확히 갈라지는 사진 등을 떠올리면 된다.
UV 필터 또는 MCUV 필터 등: Ultra-Violet Filter 또는 Multi-Coated Ultra-Violet Filter. 필터 유리면에 자외선 등의 특정 빛을 차단하는 코팅이 되어있는 필터를 말한다. 일반적으로는 자외선 차단의 효과보다는 렌즈 보호의 목적으로 사용한다.
이번 포스트에서는 렌즈의 보호를 위한 목적으로 필터를 사용하는 경우 (말그대로 렌즈 보호가 목적이므로 가격이 상대적으로 저렴한 필터를 사용하는 경우가 많다) 필터의 품질에 따라 사진이 어떻게 변하는가를 비교해보고자 한다. 어쩌면 당여한 얘기일 수 있지만 과거 초기의 디지털 카메라의 경우 센서의 부족한 성능으로 화질이 상대적으로 좋지 않았고 화소수도 적다보니 세밀한 차이는 도드라지지 않는 경우도 있었지만 근래 고화소 카메라의 경우는 필터의 품질에 따라 차이가 있을 수 있음을 이해하는 것이 그 목적이다.
실제 비교
실험에 사용한 장비는 다음과 같다. – 바디 : 소니 a7M4 (모델명 :ILCE-7M4) – 렌즈 : 소니 FE 200-600 F5.3-6.3 G OSS (모델명 : SEL200600G) – 필터 : ALLDA UV 렌즈필터 95mm (온라인 가격비교 최저가 약 5000원) SIGMA Protector 95mm (온라인 가격비교 최저가 약 11만원) 1상기 장비 선정 사유 : 200-600 렌즈 구입 후 부담되는 필터 가격에 (95mm 필터는 비싸다..) 1만원도 안하는 필터를 장착하고 촬영한 사진의 품질이 너무 좋지 않아 과연 이 품질 저하가 필터 탓인가 하는 의문에서 시작했기 때문이다.
sigma Protector : 특이사항은 없다. 자세히 보면 Allda UV filter #1.의 경우 품질이 떨어짐을 알 수 있고, (굵은 선의 경계을 자세히 보자) Allda filter #2. 의 경우는 초점이 맞는 영역의 앞과 뒤 그러니까 0에서 멀어지는 선들이 두 개 씩 보이는 것을 확인할 수 있다. (처음에는 핀이 안맞는 것이라 생각했다.)
해당 부분만 좀 더 확대 해보면
비교
우측 사진은 +2, -2 부터 상이 이중으로 맺히는 것이 확연히 보인다.
2종의 필터임에도 세 장의 결과를 비교한 이유는 필터의 비교를 위해 필터를 교체해야 하니 필터를 헐겁게 체결하였는데 필터를 헐겁게 체결 했을 때와 그렇지 안을 때의 차이가 있었음을 발견했기 때문이었는데, 실제 동일한 필터임에도 약 90도 회전시켜 촬영을 해보니 상이 이중으로 촬영 되는 정도의 차이가 있음을 쉽게 확인할수 있었다.
여기서 왜 이와 같은 차이가 나는가에 대한 원인을 짐작해 볼 수 있었다. 2당연한 이야기지만 진짜 원인은 알 수 없다. 전문가도 아니고, 촬영을 통해 결과물의 비교 외에 다른 측정 (표면 굴곡 등)은 불가능 했기 때문이다. 증상이 난시와 비슷한 것으로 미루어 보아 첫 번째 의심 사유는 필터의 표면이 울퉁 불퉁 한것이 아닌가 하는 것. 불규칙적인 것은 아니고 아마도 물결처럼 일정한 방향의 패턴을 가지지 않을까 하는 것이다. 두 번째는 고른 연마가 되지 않았기에 연삭의 흔적이 있고 3필터를 뚫어져라 처다본다고 확인할 수 있는 정도로 보이는 흔적은 아니다.4첫 번째 원인가 비슷한데 이 경우는 울퉁불퉁이 아니라 거친 사포로 표면을 문질렀을때 깎여 나가는 형태의 모양이다. 이 흔적에 따라 빛이 꺾이면서 상이 두개로 찍히는 것이 아닐까 한다.
결국 각도를 조절했을 때 결과물이 달라지는 것으로 보아 일정한 패턴의 굴절을 일으키는 무언가가 필터에 있다는 이야기가 아닐까 한다.
결론
필자의 경우 항상 비주류 카메라에 저가의 렌즈만 사용하는 데다 실력도 워낙에 개차반인지라 애진작에 결과물의 해상도도 낮고 품질 자체도 낮다 보니 렌즈 필터는 제조사 등에 따라 딱히 결과물에 영향을 주지 않는 다고 생각했었다. 하지만 이번 실험 결과 렌즈 보호 용으로 사용하는 필터라 할지라도 제조사 혹은 가격 등에 따라 엄연히 품질의 차이가 존재하며, 기준 이하의 필터는 결과물에 아주 많은 영향을 미친다는 것이다.
일반적으로 개발사 등에서 제공되는 docker image 들은 운영에 필요한 최소한의 바이너리들만 담는 경우가 많기 때문에 컨테이너에 문제가 생기거나, 컨테이너 내부의 프로세스를 확인하고자 하는 경우에 ps 명령이 없어서 프로세스 확인이 불가능하거나, ping 명령이 없어서 연결 여부 확인이 안된다거나 하는 경우가 있을 수 있다. 또 docker 명령을 이용해 컨테이너에 진입하여 작업을 하는 것이 이래저래 불편해서 ssh의 아쉬움을 느끼는 경우도 왕왕 있을 것이다.
이 포스트에서는 특정한 도커 이미지에 운영에 편의를 위한 패키지들을 설치하고 SSH 서버도 추가하여 이미지를 새로 만들 것이다.
dockerfile 예제
실제 docker image build를 위한 예제이다. 세부 내용은 주석을 참고하면된다.
# base가 될 이미지
# bitnami/jupyter-base-notebook
# 최신의 이미지에 append 하는 형태로 빌드하고자 한다면 latest tag 를 붙여준다.
# FROM haedongg.net/library/jupyter/pyspark-notebook:latest
FROM haedongg.net/library/jupyter/pyspark-notebook:spark-3.2.0
# 레이블. 없어도 된다.
LABEL comment "essential tools & configuration"
# 아래 작업들을 수행할 계정
# USER ACCOUNT 다음 라인은 별도로 USER를 변경하는 작업이 없다면 모두 ACCOUNT 계정으로 작업이 수행된다.
USER root
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Seoul
# 편의를 위해 기본적으로 필요한 것들
# 프록시를 사용하는 경우 apt-get 앞에 다음을 추가한다.
# RUN sudo https_proxy=PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT
RUN apt-get update
RUN apt-get install -y openssh-server sudo procps curl vim git openssh-client telnet net-tools tcpdump htop --no-install-recommends
# 컨테이너 이미지 파일의 크기를 줄이기 위해 apt 수행 중 생성된 임시 파일들을 삭제해준다.
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#### 여기부터 SSH
RUN mkdir /var/run/sshd
# root password 변경, $PASSWORD를 변경한다.
RUN echo 'root:$PASSWORD' | chpasswd
# ssh 설정 변경
# root 계정으로의 로그인을 허용한다. 아래 명령을 추가하지 않으면 root 계정으로 로그인이 불가능하다.
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
# 응용 프로그램이 password 파일을 읽어 오는 대신 PAM이 직접 인증을 수행 하도록 하는 PAM 인증을 활성화
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN mkdir /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
####여기까지 SSH
# sudo 설정
# 사용자 추가, $USER 가 사용자 명, $PASSWORD 가 패스워드이다.
RUN adduser --disabled-password --gecos "" $USER &&\
echo '$USER:$PASSWORD' | chpasswd &&\
adduser $USER sudo &&\
echo 'USER ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# user 변경
USER $USER
# alias를 추가하고 싶은 경우
RUN echo "alias ll='ls -lha'" >> /home/$USER/.bashrc
# pip 패키지 인스톨
# 프록시를 사용한다면 RUN https_proxy=http://PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT
RUN pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install --no-cache-dir s3fs py4j pytz toml xgboost==1.5.1 lightgbm==3.3.1 scikit-learn==1.0.1 mlflow mlflow-skinny sqlalchemy alembic sqlparse tqdm boto3
# 설정된 home directory의 권한 부여
RUN chown -R $USER /home/$USER
_-t 옵션 및 tag 옵션으로 지정하는 이미지 이름은 build에 사용한 원래 이미지의 이름, 경로와는 상관이 없다. 내가 사용하고자 하는 이름을 지정하면 된다. 단, local 이미지가 아닌 harbor나 docker hub 등의 외부 리포지터리에 업로드 하고자 한다면 정확한 이름을 지정해줘야 push가 가능하다._
댓글을 달려면 로그인해야 합니다.