사랑스러운 나의 도시 #2-2. 베트남 하노이 – 먹거리

일본식 라면

대충 여기 쯤 있는 가게이다.

진짜 쌀국수 (돼지고기)

도마, 식탁, 가게 모두 정말 지저분하다. 하지만 정말 맛잇다.
대충 우리돈 3000원 정도, 고기가 너무 맛있어서 추가 주문했다. (보통은 그리 안먹는 듯 하지만) 추가로 대충 1000원씩

대략 3개월 하노이에 머물면서 먹었던 쌀국수 중에 가장 맛있었다. 대우호텔 북쪽 골목 어딘가였던 기억이 나는데 정확한 것은 잘 기억이 나지 않는다. 다시 하노이에 간다면 꼭 다시 찾아가고 싶은 곳이다.

또 진짜 쌀국수 (닭고기)

분짜 (분:넓은 쌀국수, 짜:고기)

베트남 음식 중 가장 좋아하는 음식이다. 야채는 무한 리필, 쌀국수(분)도 어마어마하게 많이 준다. 물론, 야채는 손님 상에 여러 번 오르락 내리락 하므로 깨끗하지 않다. 거기에 쌀국수도 재탕한다. 위와 장이 튼튼하지 않거나 물갈이가 심한 사람은 분명 설사로 고생할거다.

치킨(?)

백종원의 스트리트 머시기 하는 프로그램에도 나왔던 음식이다.

꿀 같기도 하고 조청같기도 하고 아무튼 달달한게 맛이 좋다.
절인건지 뭔지 이런 녀석과 함께 먹는데….. 이건 내 취향은 아니었다.

닭이 작은 건지, 아니면 살을 떼어 낸건지, 아니면 이래저래 찢어 놔서 그런 건지는 알 수 없지만 고기가 풍성하게 붙어있는 느낌은 아니다. 거기다 가격도 싸진 않다. 저렇게 두 명이 먹고 2만원 쯤 썼는데, 한국인이나 한국인 수준의 소득이 있는 사람이 크게 부담되지 않겠지만 분명 현지인이 먹기에 쉬운 가격은 아이다.

하지만 구운 반미를 함께 먹으니 양이 부족한 느낌이 들지는 않고, 맛이 참 좋다. 꼭 한번은 들러야 할 곳이다.

BBQ 뷔페 – 셰프 중(?)

대우호텔에서 동쪽으로 조금 가다보면 큰 몰이 하나 있는데 그 근처에 있는 식당이다.

김치도 있고 대충 저런 것들을 구워먹는다.

가격은 1인당 3만원 정도 했던 듯 하다. 돼지고기도 있고 소고기도 있고, 염통 이라던가 이런저런 특수 부위와 해산물도 있고 뭔가 종류는 참 많은데, 그런데…….. 별로다. 두 번은 가지 않았다. 김치도 더럽게 맛 없었다. 추천하지 않는다.

사랑스러운 나의 도시 #2-1. 베트남 하노이

두 번째 해외 여행은 베트남. 한국말로 하면 업무상 출장 이었으니 여행이라 하기 좀 그럴 수 있겠지만 영어로는 Business trip 이므로, trip이 들어가서 여행.
‘비행기 탈 때 신발 벗어야 해요?’ 수준으로 경험이 없던 내게 두 번째 여행이다. 이유야 어찌 됐건 낯선 어딘가로의 발걸음은 늘 즐겁다. 2016년 11월 27일 이번에는 직장 동료들과 함께 비행기에 몸을 실을 수 있었다. 출장비도 넉넉히 들어왔겠다 면세점에서 즐거운(?) 시간을 보내고 별 다섯 개 호텔에서의 3개월은 또 다른 낯섬. 평범하게 뛰던 내 심장을 두근거리게 하는 데 있어 부족함이 전혀 없었다.

이번엔 비싼 렌즈도 하나 더 구매했겠다 두 세트의 카메라와 액션캠으로 내가 보고 듣는 모든 것을 담으리라.

석달 동안 머물 숙소는 하노이 서쪽에 위치한 ‘하노이 대우 호텔’ . 투레 호수를 끼고 있어 기가막힌 풍경을 선사한다. 역시 5성 호텔은 5성. 택시에서 내리니 캐리어를 받아주고 나는 몸만 움직이면 된다. 거기에 호칭은 늘 ‘Sir’. 뭔가 대우 받고 있다는 느낌이 확 와 닿는다.

석달을 머물 예정이었기에 미리 숙박비, 조식, 세탁 서비스 등에 대해 조율을 마쳤다. 100USD /일, 세탁물은 5개/일, 조식 포함. 당연히 수영장과 사우나, 짐 등은 모두 포함.

어쨌거나 설레는 첫 날부터 호텔방에 박혀있어야 할 이유는 없었으니 함께 길을 떠났던 동료들과 길을 나섰다. 대충 점심 쯤 먹어야할 시간이었기에 미리 하노이 경험이 있던 동료의 안내에 따라 길을 나섰다. 목적지는 ‘하노이 성 요셉 성당‘. 위치는 대략 호안끼엠1현지인들은 ‘환콈’에 가깝게 발음한다. 호수의 남쪽 끝자락의 서쪽에 위치한다.

일단 성당이고 뭐고 무작정 거닐며 여기저기 둘러보고 싶은 마음이야 굴뚝 같았지만 이 곳에 온 목적은 끼니의 해결이었기에 나름 베트남의 명물이라는 ‘콩카페의 코코넛 커피’를 하나씩 손에 쥐고 식당가로 향했다.

이후 식사를 했던 식당은 사진이 없다….
아무튼 첫 번 째 마주한 베트남 식당은 ‘위생이 개판’ 이라는 점. 좌석에 앉아 음식을 주문하고, 더운 날씨에 맥주가 빠질 수 없으니 주문한 맥주. 이 곳에서 맥주를 주문하면 주로 미지근한 녀석이 나오고 얼음이 담긴 컵이 함께 나오는데………. 이 컵이 기가 막힌다. 대체 설거지를 하긴 한 것인지, 언제 닦은 것인지 알 수가 없다. 여기저기 얼룩에 음식물이 묻어있기 일수에, 세 번이나 교체를 해도 똑같은 컵. 결국 마지막 교체 요청을 하니 점원이 컵을 구석으로 가지고 가 휴지로 닦아서 내어 오더라….

이 것이 하노이 도착 첫 날의 기억.
딱히 무리하지 않았던 듯 하다. 어차피 석 달이나 이 곳에 머물러야 하고 주말은 온전히 나만의 여행이 될 터였으니까.

Redmine : docker-compose.yaml

Redmine 이 무엇인지는 링크 참조.

docker-compose.yaml

version: '3.1'

services:

  redmine:
    container_name: redmine
    image: redmine
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: fpemakdls
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_ENCODING: utf8
      #REDMINE_NO_DB_MIGRATE: true
    volumes:
      - ./volumes/redmine/usr/src/redmine/files:/usr/src/redmine/files
      - ./volumes/redmine/usr/src/redmine/plugins:/usr/src/redmine/plugins
      - ./volumes/redmine/usr/src/redmine/public/themes:/usr/src/redmine/public/themes

  db:
    container_name: mariadb
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: fpemakdls
      MYSQL_DATABASE: redmine
    ports:
      - 3306:3306
    volumes:
      - ./volumes/mysql/var/lib/mysql:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

디렉토리 생성

mkdir  -p  ./volumes/redmine/usr/src/redmine/files
mkdir      ./volumes/redmine/usr/src/redmine/plugins
mkdir  -p  ./volumes/redmine/usr/src/redmine/public/themes
mkdir  -p  ./volumes/mysql/var/lib/mysql

Nginx Proxy Manager : docker-compose.yaml

Nginx Proxy Manager가 무엇인지는 링크를 참조.

docker-compose.yaml

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '80:80'                  # 일반 http 용 port
      - '81:81'                  # 관리 페이지 용 port
      - '443:443'                # https 서비스 용 port
    environment:
      DB_MYSQL_HOST: "db" 
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm" 
      DB_MYSQL_PASSWORD: "npm" 
      DB_MYSQL_NAME: "npm" 
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql
#      - ./etc/my.cnf.d:/etc/my.cnf.d       mariadb(mysql을 사용할 때도 동일) 설정을 변경하고자 할 때 생성하고 설정 파일을 넣는다.

디렉토리 생성

docker-compose.yaml 파일이 존재하는 디렉토리에 아래와 같이 세 개의 디렉토리를 생성한다.


mkdir ./data
mkdir ./letsencrypt
mkdir -p ./data/mysql
mkdir -p ./etc/my.cnf.d

사랑스러운 나의 도시 #1-4. 타이페이 넷째 날, 그리고 처음의 그 끝.

타이페이 첫째 날

타이페이 둘째 날

타이페이 셋째 날

역시 글쓰기는 미루면 안된다. 기억이 나질 않는다…..

넷째 날

넷째 날은 국립국부기념관1(25.04078879331904, 121.56202618676458)과 101타워2(25.03554776247256, 121.564297909543)를 방문했다.

첫 포스트에서 이야기 했던 것처럼 무작정 비행기 표 한장과 카메라 하나 들고 비행기를 탔었기에 아무런 정보가 없던 터. 첫 날 숙소에서 마주쳤던 외국인이 이야기 했던 101타워가 생각나 지도를 바라보면 무조건 걷기 시작했다.

운이 좋았다고 해야 할까, 101타워 북서쪽에는 국립국부기념관이 있었기에 101타워를 향하던 중 기념관을 들를 수 있었고 근위병 교대식을 기다렸다 교대식을 한번 더 볼 수 있었다.

장제스 기념관의 근위병 교대식과 크게 다르지 않다.

101타워, One-o-one 타워라고 많이 불리우는 듯 하다. 국부 기념관 동쪽으로는 타이페이 시청이 있다.


멀리(?) 보이는 101타워. 정확한 이름은 타이페이101 (타이페이 금융센터)이다. 두바이에 부르즈칼리파카 세워지기 전까지는 말리이시아의 페트로나스 트윈 타워를 뒤이어 약 7년간 세계 최 고층 마천루로 그 위용을 뽐냈었다.(고 한다)

사람마다 다르겠지만 높고 유명한 건물이라 하여 들렀지 그리 큰 관심사는 아니었다. 하지만 공돌이의 마음을 설레게 하는 중요한 것 하나

전망대 89층을 둘러보고 88층으로 내려가면 볼 수 있는 92층에 메달려있는 저 크고 아름다운 쇳덩어리. 건물의 높이가 워낙 높다보니 외부 영향(바람 등)으로 부터의 건물의 흔들림을 방지하기 위한 구조물이다. 두께 12.5cm 원반 41장을 붙여 만들었다고 하는데 무게가 무려 660t. 건물의 흔들림을 방지 한다고 무작정 흔들리게 둘 수 없으니 댐퍼와 여러 구조물들이 이를 적당히 고정하는 구조로 되어있다. 101층 높이에 660t 짜리 쇠공이라니… 대단하다.

외부 전망대로 올라가면 사진과 같이 타이페이 전경을 한 눈에 볼 수 있다.

 

그리고 처음의 그 끝

계획도, 예산도 없이 시작한 여행이라지만 빈손으로 돌아갈 수야 있나 무언가 기념이 될 것을 찾기 위해 현지인 친구에 물었다. 차(茶)를 사가라 한다.

뜨거운 해 아래 이제 다시 돌아가야 할 시간이다.
돌아오는 과정이야 뭐 출발의 역 순.

여행기랍시고 글을 써보고 싶었는데 쉽지 않다. 여러 번 이야기 했듯, 계획도 없었고, 사전 조사도 없었고, 돈도 넉넉하지 않았다. 입국 시 머물 곳에 대한 정보를 제출해야 한다는 얘기를 출발 당일 알고 부랴부랴 하룻밤 숙박 예약을 했으니 무슨 말을 더 하랴.

남들 다 다녀왔다는 고양이 마을은 물론이거니와 고궁 박물관도 들르지 못했다. 흔히들 말하는 남들 다 보고, 들을 것 듣고, 먹을 것 먹는 여행으로써는 0점인 셈이다.
거기다 6년 전에 다녀왔던 여행의 여행기를 쓰고 앉아있으니…

하지만 6년이 지난 지금도, 그리고 10년이 더 지나도 한 가지는 절대 잊지 못할 것 같다.
첫 날 처음 출국장을 통과할 때의 그 기분, 그리고 처음 타오위안 공항에 발을 디뎠을 때의 그 기분, 처음 타본 낯선 나라의 지하철 풍경들.
마치 놀이공원에 엄마를 잃고 혼자 남겨진 8살 아이가 됐던 듯 한 그 기분 말이다.
형용할 수 없는 그 설레는 기분.
특별한 여행지였기 때문이 아닌 처음이었기에 느낄 수 있었던 그 기분.

여행기로써는 부족하고, 별다른 정보가 없는 쓸 데 없는 긴 글이었지만, 만약 이 글을 당신이 여기까지 읽었다면 꼭 이렇게 이야기 하고 싶다.

어디든 좋으니 계획 따위는 머리 속에서 지우고 떠나보라고.
놀이공원에서 엄마의 손을 놓친 아이의 마음과 같은 홀로 됨을 다시 한번 느껴보라고.

HAproxy 를 이용한 로드밸런싱 고가용성 구성

개요

HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다.
공식 사이트 참조

설정에 따라 Server #A와 #B로 번갈아가며 연결해준다.

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

백엔드로 동작할 모든 서버에 동일한 설정 파일을 넣어준다.

확인

haproxy 웹 서비스를 통해 정보 확인이 가능한다.

백엔드 서비스에 문제가있다면 붉은색으로 표시된다.