반응형
반응형

사내에서 Confluence & Jira를 도입했는데, Endpoint는 하나로 두고 싶다는 요청이 있어서, 앞단에 Https기반의 Apache Proxy를 두게 되었고, Apache Proxy를 통해 들어오는 요청이다 보니, 기본 프로토콜이 http로 되어 있는, Confluence, Jira에서는 인증서의 보안이 깨지는 현상이 발생하였다. (https -> http 요청 이슈로 보안이 깨지는 현상)


이런 경우 각 어플리케이션의 con/server.xml을 편집하여, 아래와 같이 proxy정보(proxyName, proxyPort)와 프로토콜(scheme)을 추가해주면 해결이 된다.


...
        <Connector port="8080"
                   maxThreads="150"
                   minSpareThreads="25"
                   connectionTimeout="20000"
                   enableLookups="false"
                   maxHttpHeaderSize="8192"
                   protocol="HTTP/1.1"
                   useBodyEncodingForURI="true"
                   redirectPort="8443"
                   acceptCount="100"
                   disableUploadTimeout="true"
                   proxyName="jira.domain.com"
                   proxyPort="443"
                   scheme="https"
                   bindOnInit="false"/>
...


반응형
,
반응형

습관적으로 python 스크립트를 만들 때 한글 처리 등 귀찮은 일을 겪지 않기 위해, 가장 상단에 아래와 같은 구문을 넣어서 만들었었다.

#-*- coding: utf-8 -*-


그런데, 저것만으로는 format 함수 등 string을 세밀하게 다뤄야하는 로직들에서는 utf-8 인코딩 효과를 보질 못하는 것으로 보여, 아래와 같이 명시적으로 선언해주면, 모든 String 처리 시 UTF-8 인코딩으로 동작하게 된다.

#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


reload 함수 호출이 필요가 없어 보일 수 있는데, 호출 하지 않으면 동작하지 않는다.

반응형
,
반응형

/etc/default/docker 파일을 열어서 아래와 같이 DOCKER_OPTS 항목을 추가해준다.

### /etc/default/docker
# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/admin/systemd/
#

# Customize location of Docker binary (especially for development testing).
#DOCKERD="/usr/local/bin/dockerd"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp"
DOCKER_OPTS="-g /data/docker"

docker daemon을 재시작 하면 반영된다.

반응형
,
반응형

패스워드를 강제로 초기화 한 후, 아래와 같은 에러가 발생하며, 아무런 쿼리가 날라가지 않는 경우가 있다.

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.


이런 경우, 아래 명령어로 해결이 가능함.

mysql> set password = PASSWORD('강제로 변경한 패스워드');



반응형
,
반응형

테스트 용도로 세팅해서 사용하던 Ubuntu14.04 머신의 Root볼륨이 20G 였는데,

docker 사용을 남발하다보니, /var/lib/docker 아래에 파일 사이즈가 커지게 되어, 50G 정도로 늘릴 일이 생겼다.


대충 개념을 설명하면, 통으로 바꿔버리는 방식이 아니라, 30G 짜리 물리 Disk를 추가하여, 20G짜리에 붙여서 확장하는 개념이다. 

이런 방식이기 때문에, 디스크를 추가하여 OS부팅 후 인식 시켜놓은 이후에는, 커맨드 라인으로 해결 가능하다.


확장 절차는 아래와 같다.


1. 가상머신 종료

$ vagrant halt


2. 기존 Root 볼륨의 디스크 파일을 VDI 포맷으로 복제 후 용량 증설

$ VBoxManage clonehd box-disk1.vmdk box-disk1.vdi –format VDI
$ VBoxManage modifyhd box-disk1.vdi –resize 50000


3. Root 볼륨의 저장소 컨트롤러가 IDE Controller라면, SATA Controller로 바꾸어 준 후, 복제과정에서 나온 VDI 파일을 추가

VirtualBox GUI 기준으로 [머신 설정] - [저장소]


4. IDE Controller 삭제


5. 가상머신 재실행

$ vagrant up


6. 파티션 생성

$ cfdisk /dev/sda

위 명령어를 치면 GUI가 나오는데, (추가한 디스크 용량 - 현재 용량)정도 되는 파티션을 선택 후 [New] - [Primary] - [Write]

Write까지하면 파티션 명 (ex: sda3)이 나오는데, 기억해두고, [Quit]을 눌러서 빠져 나온다.


6. PV (Phisical Volume)생성

$ pvcreate /dev/sda3


7. Root볼륨의 VG(Volume Group) 확인 및 VG 확장

$ vgdisplay
$ vgextend "위 커맨드로 찾은 Root의 VG Name" /dev/sda3


8. Root볼륨의 LV(Logical Volume)확인 및 LV 확장

$ lvdisplay
$ lvextend "위 커맨드로 찾은 Root의 LV Name" /dev/sda3


9. 파일시스템 갱신

$ resize2fs "8번에서 찾은 Root의 LV Name"


반응형
,
반응형

Maven이나 Gradle에서 자체적으로 관리가 가능한 패키징 파일의 version관리를 이용하고 싶지 않은 경우,

최종적으로 결과로 나오는 jar 파일명에 -0.0.1.SNAPSHOT 이 붙는 것이 거슬리는 경우가 있다.


파일명에서 버전정보를 없애는 방법에 대해 알아보겠다.


Maven같은 경우는 pom.xml에 아래와 같이 작성해준다.

<build>
    <finalName>outputJarFileName</finalName>
    ...
</build>


Gradle의 경우는 build.gradle에 아래와 같이 작성하면 된다.

configurations {
    jar.archiveName = 'outputJarFileName.jar'
}


최근에 확인해보니, 지금 사용하는 버전의 sts에서 ggts를 설치하지 않고 plugin 설치만으로 gradle 이용이 가능해졌길래,

gradle도 비슷한 설정이 있지 않을까하고 찾아봤다. 



반응형
,
반응형

Linux 환경의 경우, fluentd native나 td-agent 모두 stable 버전으로 제공되는데,

Windows 환경의 경우는 공식홈에서 밀고 있는 td-agent 조차 베타버전으로 제공이 되고 있는 상황이고,

Document를 샅샅히 뒤져보다보면, nxlog 라는 놈을 하나 소개해준다. (http://docs.fluentd.org/v0.12/articles/windows)


실제로 테스트를 해봐도 tg-agent랑 nxlog 둘다 써봤지만, 제대로되는 게 nxlog 뿐인것 같다.

하지만, nxlog에서는 fluentd의 forward protocol을 지원하지 않아, tcp를 이용해서 전송을 해야 했다.


1. 서버 설치 (docker)

### docker-compose.yml
version: '2'
services:
  fluentd-recv:
    container_name: 'fluentd-recv'
    image: fluent/fluentd
    volumes:
      - ./conf:/fluentd/etc
    ports:
      - 5170:5170
### conf/fluent.conf
# Input
<source>
  @type tcp     # tcp 프로토콜로 데이터를 받는다.
  port 5170      
  tag testlog    # testlog라는 식별자를 추가한다.
  format json   # json 포맷만 받음.
</source>

# Output
<match testlog> # testlog tag를 가진 데이터만 처리함
  @type file    # 파일로 저장
  path /fluentd/recv/* 
</match>


2. nxlog (Client) 설치

link : http://nxlog.co/products/nxlog-community-edition/download

위 링크에서 다운받아서, 설치하고 나면 C:\Program Files(x86)\nxlog 경로에 있는 nxlog.conf를 아래와 같이 수정한다.

### nxlog.conf
define ROOT C:\Program Files (x86)\nxlog

Moduledir %ROOT%\modules
CacheDir %ROOT%\data
Pidfile %ROOT%\data\nxlog.pid
SpoolDir %ROOT%\data
LogFile %ROOT%\data\nxlog.log

<Input in>
    Module      im_file      # fluentd의 input tail plugin의 역할을 함
	File		'D:\fluentd_test\send\\*.json'     # 해당 경로에 있는 파일들을 감시한다. (와일드카드를 사용하려면 \를 하나 더 붙여줘야 된다.)
	SavePos 	TRUE    # 파일의 position 관리 enable / disable
	InputType	LineBased	 # 파일 내용의 라인 단위로 파싱한다.
</Input>

<Output out>
    Module      om_tcp     # in으로 들어온 파일을 tcp형태로 전송한다.
    Host        192.168.0.10 # 전송할 서버 정보 입력
    Port        5170
</Output>

<route 1> # 위에 설정한 내용들을 어떻게 동작시킬지 지정한다.
    Path        in => out      # in으로 받아서 out으로 보낸다.
</route>

### 전송이 됬는지 안됬는지 판단이 어려우므로 테스트 시 추가한 설정 (선택사항) ###
# 파일을 tcp로 보내고 난 뒤, 내용을 지정한 경로에 파일로 저장한다. 
<Output outfile>
  Module om_file
  File   'D:\fluentd_test\send\backup.log'
</Output>

<route 2> # Route 1과 마찬가지로 동작방식 지정
    Path        in => outfile
</route>
반응형
,
반응형

n개의 클라이언트에서 발생하는 json로그를 서버 한 곳에서 보아야 할 일이 생겼는데,

해당 서버가 fluentd 방식을 지원한다고 하여, json 로그를 특정 폴더에 남겨서, 실시간으로 tailing 하여 fluentd의 forward 프로토콜을 이용하여 전송하는 방식으로 설정을 해보았다.


1. 서버 구성 (docker)

### docker-compose.yml
version: '2'
services:
  fluentd-recv:
    container_name: 'fluentd-recv'
    image: fluent/fluentd
    volumes:
      - ./conf:/fluentd/etc
    ports:
      - 24224:24224
### conf/fluent.conf
# Input 
<source>
  @type forward     # forward 프로토콜을 이용하여 전송받는다. (forward는 전송은 tcp로 하고, health check는 udp로 하는 방식)
  port 24224           # 24224 포트를 이용한한다.
</source>

# Output
<match **>     # 보내는 부분에서 tag를 지정하여, tag별로 설정 가능하다.
  @type file      # 받은 내용을 파일로 저장함
  path /fluentd/recv/*   # 이 경로에 저장함. (파일명을 명시할 수도 있는 것 같다.)
</match>


2. 클라 구성 (docker)

### docker-compose.yml
version: '2'
services:
  fluentd-send:
    container_name: 'fluentd-send'
    image: fluent/fluentd
    volumes:
      - ./conf:/fluentd/etc
### conf/fluent.conf
# Input
<source>
  @type tail     # 지정된 경로의 지정된 패턴에 해당하는 파일의 내용을 감시한다.
  path /fluentd/send/*.json     # 경로 지정 
  pos_file /fluentd/send/test_log.pos    # 파일의 position 관리 (이 설정이 없으면, 네트워크 이슈 발생 시 파일이 중복 전송되거나 잘려서 전송될 수 있으므로, 파일 내용의 정합성이 깨질 수 있다.)
  tag testlog    # 식별자 지정 (match에서 활용됨)
  format json  # 파일포맷 지정
  refresh_interval 5s      # 5초 주기로 감시한다.
</source>

# Output
<match testlog>   # tag가 testlog인 것만 아래 구문을 처리
  @type forward    # 전송 시 forward 프로토콜을 이용한다.
  flush_interval 5s # 5초 주기로 전송한다.
  <server>       # 전송할 서버 정보 입력
    host 192.168.0.10
    port 24224
  </server>
</match>

반응형
,
반응형

Ubuntu 환경에서 Package 설치를 기준으로 구성해볼 예정이다. (버전은 3.10)


1. 패키지 등록 및 설치

# apt-get source list 및 key 등록
$ echo "deb http://www.apache.org/dist/cassandra/debian 310x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
$ curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
$ apt-get update

# 설치
$ apt-get install -y cassandra


2. 설정

제대로된 운영을 하려면 시스템에 맞게 건드려줘야 되는 항목들이 많기 때문에 클러스터 구성에 대한 최소한의 설정만 설명할 예정이다.

기본적으로 Consist-Hashing 방식으로 노드를 분산하며, gossip protocol을 이용하여 서로 노드간 alive 체크를 하기 때문에,

별도의 마스터가 없다는게 카산드라 클러스터 구성의 컨셉이다.

### /etc/cassandra.yaml
cluster_name : test_cluster         # 클러스터명 (클러스터가 여러개로 구성된 경우에 식별자로 사용되는 듯)
seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: 192.168.0.10  # 최초 초기화 시 leader 역할을 할 노드의 ip를 적어준다. 
                                      # datacenter간에 cluster구성을 해야 하는 경우
                                      # HA효과를 보기위해 datacenter별로 최소 한대씩은 적어주는 것을 권장한다. (콤마 구분)
listen_address: 192.168.0.10     # 현재 노드의 ip 적어준다. (docker구성인 경우 docker의 가상 ip 입력)
broadcast_address: 192.168.0.10 # 현재 노드의 ip 적어준다. (docker구성인 경우 docker가 동작하는 host 머신의 ip 입력)
rpc_address: 0.0.0.0  # rpc 통신을 위해 0.0.0.0을 입력해준다.
broadcast_rpc_address: 192.168.0.10 # broadcast_address와 동일
endpoint_snitch: GossipingPropertyFileSnitch # 클러스터 간 근접도 판단 방법에 대한 옵션으로 
                                                                # 자세한건 http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureSnitchesAbout_c.html를 참조한다.                                                           


3. 실행

$ service cassandra start
반응형

'개발 > Cassandra' 카테고리의 다른 글

[Cassandra] 3.10 기준 rpc 설정하기  (0) 2017.05.10
[Cassandra] 3.10 기준 Cluster name 변경하기  (0) 2017.05.10
,
반응형

Kafka의 경우 Zookeeper가 클러스터의 역할을 대부분 수행(offset관리, failover)해주기 때문에,

Zookeeper 구성만 잘 되어 있다면 설정 레벨에서는 별로 신경쓸 것이 없다.


1. 설치

# download (다른 파일에 비해 압축파일 명이 좀 긴데 앞에 2.12가 scala버전이고 0.10.2가 kafka버전임)
$ wget http://apache.mirror.cdnetworks.com/kafka/0.10.2.1/kafka_2.12-0.10.2.1.tgz

# 압축 해제
$ tar -zxvf kafka_2.12-0.10.2.1.tgz

# 심볼릭 링크 설정 (선택)
$ ln -s kafka_2.12-0.10.2.1 kafka


2. 설정

config 폴더에 보면 정말 많은 properties 파일이 있는데, kafka 서버 구동을 위해 사용되는 설정은 server.properties라고 보면된다.

# server.properties
broker.id=0            # 클러스터 구성 시 각 노드에 id값을 주어, 각 노드를 식별하는 역할 (다른 노드와 중복되면 안됨)
listeners=PLAINTEXT://192.168.0.1:9092      # 현재 호스트 머신의 IP를 적어준다. 앞에 PLAINTEXT 부분은 kafka에서 지원하는 전송 프로토콜로, 자세한건 공식홈을 참조하는 것이 정확하다.
advertised.listeners=PLAINTEXT://192.168.0.1:9092   # 현재 호스트 머신의 IP를 적어준다. (Producer, Consumer가 참조하게 되는 IP)
...
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181    # kafka를 관리해줄 zookeeper목록을 적는다. (콤마 구분)
...


위에 설명한 정도만 수정했고, 나머지는 default로 두어도 무방하다. (대규모 서비스는 micro control이 필요할지도..)


3. 실행

bin 폴더에 친절하게도 여러가지 스크립트들이 제공되어 있다. (백그라운드 동작은 아니어서 nohup으로 띄워야 한다.)

만약 zookeeper를 별도로 세팅하지 않았더라도, 자체 제공하는 zookeeper가 있어서 사용은 가능하지만, 권장하진 않고 cluster 구성도 제대로 되지는 않는 것 같다.

단, single node로 kafka를 운영하고자 할 경우에는 embedded zookeeper도 나쁘진 않다.

$ nohup bin/kafka-server-start.sh config/server.properties &

다른 노드의 경우도 broker.id만 겹치지 않게 여러개 띄워주면 되고, client 쪽에서만 kafka 서버들의 목록을 잘 넣어주면 된다.

반응형
,
반응형