정리가 더 필요하지만 메모 목적으로 우선 블로그에 저장


elasticsearch 설치

#유저홈 밑의 apps 디렉토리에 설치하며 1개 물리서버에 인스턴스를 2개띄움
cd ~/apps

wget 'https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.1/elasticsearch-2.3.1.tar.gz'
tar -xzf elasticsearch-2.3.1.tar.gz
rm elasticsearch-2.3.1.tar.gz

#2개 인스턴스를 띄울예정
mv elasticsearch-2.3.1 elasticsearch-2.3.1-node-01
ln -s elasticsearch-2.3.1-node-01 elasticsearch-01

#설정 수정
vi ~/apps/elasticsearch-01/config/elasticsearch.yml

#아래 Elasticsearch Plugin 설치완료 후에 복사해서 node-02생성
cp -R ~/apps/elasticsearch-2.3.1-node-01 ~/apps/elasticsearch-2.3.1-node-02
ln -s elasticsearch-2.3.1-node-02 elasticsearch-02
vi ~/apps/elasticsearch-02/config/elasticsearch.yml


Elasticsearch  Plguin 설치

cd ~/apps/elasticsearch-01/bin

-- HQ(head 플러그인보다 비쥬얼적으로 좋음)
./plugin install royrusso/elasticsearch-HQ
접속URL : http://elasticsearch도메인/_plugin/HQ/

-- SQL로 조회하는 Plugin (https://github.com/NLPchina/elasticsearch-sql)
접속URL : http://elasticsearch도메인/_plugin/sql/  

-- 은전한닢 es plugin(한글 형태소 분석기)
./plugin install org.bitbucket.eunjeon/elasticsearch-analysis-seunjeon/2.3.1.0

한글 형태소분석기 은전한닢 설치(은전한닢 설치 : http://guruble.com/?p=416)

[사전작업]
vi ~/.bashrc 후 아래내용 추가(미 추가시 mecab엔진을 제대로 설치 못하거나 logstash로 집계할 때 elastic search가 죽음)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

1. mecab-ko 형태소 분석기 엔진 설치

cd {다운로드할 경로}
wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz -O mecab-0.996-ko-0.9.2.tar.gz
tar -xvzf mecab-0.996-ko-0.9.2.tar.gz
cd mecab-0.996-ko-0.9.2
./configure
make
make check
sudo make install

아래 명령어로 정상 설치여부 확인
mecab --version


2. mecab-ko-dic 사전(dictionary)파일 설치

cd {다운로드할 경로}
wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.0.1-20150920.tar.gz -O mecab-ko-dic-2.0.1-20150920.tar.gz
tar -xvzf ./mecab-ko-dic-2.0.1-20150920.tar.gz
cd mecab-ko-dic-2.0.1-20150920
./autogen.sh
./configure
make
sudo make install

아래 명령어로 정상 설치여부 확인
mecab -d /usr/local/lib/mecab/dic/mecab-ko-dic
# 나는 당신을 사랑합니다.


3. libMeCab.so, MeCab.jar 라이브러리 설치

wget https://mecab.googlecode.com/files/mecab-java-0.996.tar.gz -O mecab-java-0.996.tar.gz
tar -xvzf mecab-java-0.996.tar.gz
cd mecab-java-0.996
Makefile을 열어서
vi Makefile

# Java Home 설정
# 참고. Mac OSX 에서 JAVA HOME 은 /usr/libexec/java_home 명령어로 확인할 수 있습니다.
INCLUDE={your java home path}/include

#  optimize level 을 -O1 로 변경
$(CXX) -O1 -c -fpic $(TARGET)_wrap.cxx $(INC)

# javac 와 test.java 사이에 -cp . 추가
$(JAVAC) -cp . test.java
컴파일 후 복사, 권한 변경

make
sudo cp libMeCab.so /usr/local/lib
sudo cp MeCab.jar /usr/local/lib
sudo chown -R {your user}:{your group} /usr/local/lib/libMeCab.so
sudo chown -R {your user}:{your group} /usr/local/lib/MeCab.jar
sudo chown -R {your user}:{your group} /usr/local/lib/*mecab*

vi ~/.bashrc 후 아래내용 추가(미 추가시 logstash로 집계할 때 elastic search가 죽음)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/




4. mecab-ko Elasticsearch plugin 설치

cd {Elastic 디렉토링}
./bin/plugin install https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/downloads/elasticsearch-analysis-mecab-ko-2.2.0.0.zip




logstash 설치
all plugin 포함 버전오로 설치

wget 'https://download.elastic.co/logstash/logstash/logstash-all-plugins-2.3.1.tar.gz' -O ~/apps/logstash-all-plugins-2.3.1.tar.gz

tar -xzf ~/apps/logstash-all-plugins-2.3.1.tar.gz
rm ~/apps/logstash-all-plugins-2.3.1.tar.gz
ln -s ~/apps/logstash-2.3.1 logstash

#logstash mysql-jdbc plugin 설치(jdbc는 인터넷에서 다운로드 가능
mkdir -p ~/apps/logstash/lib/jdbc
다운파일 복사

실행
~/apps/kibana/bin/kibana >> /dev/null &


kibana 설치(필요시)
wget 'https://download.elastic.co/kibana/kibana/kibana-4.5.0-linux-x64.tar.gz' -O ~/apps/kibana-4.5.0-linux-x64.tar.gz
tar -xzf ~/apps/kibana-4.5.0-linux-x64.tar.gz
rm ~/apps/kibana-4.5.0-linux-x64.tar.gz
ln -s ~/apps/kibana-4.5.0-linux-x64 kibana

설정값 수정
vi ~/apps/kibana/config/kibana.yml



방화벽오픈(root권한 필요)

sudo vi /etc/sysconfig/iptables 후 내용 추가하고 sudo service iptables restart

#elastic
-A INPUT -m state --state NEW -m tcp -p tcp -s IP주소 --dport 29200:29201 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -s IP주소 --dport 9300:9301 -j ACCEPT

#logstash listen topbeat
-A INPUT -m state --state NEW -m tcp -p tcp -s IP주소 --dport 5044:5045 -j ACCEPT

#logstash listen packetbeat
-A INPUT -m state --state NEW -m tcp -p tcp -s IP주소 --dport 6044:6045 -j ACCEPT

#kibana
-A INPUT -m state --state NEW -m tcp -p tcp -s IP주소 --dport 5601 -j ACCEPT





포트 스캔 후 서버 공격이 들어오는 패턴이 많다.

그렇기에 가능하면 ping 응답은 막아두자..


방법

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

(vim으로는 안됨)




AWS ELB를 이용해서 로드밸런싱을 하는데 주기적으로 응답이 느려지는 현상(몇초마다 응답이 10초가 넘어감)이 발생했다.

어플리케이션 문제인가 싶어서 소거법으로 하나하나 테스트를 해봤는데 아니었다.


1. 테스트환경을 구축 후 반복해서 URL을 호출

  watch --interval=1 time curl "검증 URL" > /dev/null


2. ELB 모니터링 및 DNS도 확인




결론은, ELB를 새로 띄우니 감쪽같이 해결되었다.

아직 한국 리전에서 불안전한 케이스가 있는게 아닌가 싶다..(AWS 사용자 사이에서 몇가지 카더라도 있고..)




할때마다 잊어버려서 메모



1) EC2 Role에 CloudWatch FullAccess 권한 부여

2) 필요 Libray 설치

- Centos (RedHat)
$ sudo yum install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA unzip -y

- Amazon Linux AMI
$ sudo yum install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https

3) EC2 메모리 및 디스크 Matrix 모니터링 스크립트 설치

sudo su
cd /root
unzip CloudWatchMonitoringScripts-1.2.1.zip
rm -rf CloudWatchMonitoringScripts-1.2.1.zip
cd aws-scripts-mon/

4) Test
./mon-put-instance-data.pl --mem-util --verify --verbose

5) CloudWatch에 전송 테스트
./mon-put-instance-data.pl --mem-util --mem-used --mem-avail

6) crontab 등록(disk 체크는 /data 디렉토리만하는 예)
* * * * * $HOME/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --disk-path=/data --disk-space-util --disk-space-used --disk-space-avail --swap-used --from-cron

7) AutoScaling Group에 데이터 수집
./mon-put-instance-data.pl --mem-util --mem-used --mem-avail --auto-scaling=only


8) 참고


코딩하다가보면 가끔 특정 코드 블럭에는 formatter를 적용 안해야하는 부분이 있음.(가독성을 위해서)
그럴 때 사용하는 방법

  1. Enable tag


  2. 소스에 적용 샘플
   // @formatter:off
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       
        /** 인터셉터 */
        registry.addInterceptor(getAccessInterceptor())
            .addPathPatterns( "/**")
                .excludePathPatterns( "/")
                .excludePathPatterns( "/favicon.ico")
                .excludePathPatterns( "/resources/**")
                .excludePathPatterns( "/error/**");
       
        super.addInterceptors(registry );
    }
    // @formatter:on


  1. 현상
    1. 기존 설치형톰캣 + Spring 3.2 기반의 프로젝트를 Spring boot 1.3.5와 임베디드 톰캣으로 변경하였는데 일정 주기마다 응답이 느려지는 현상이 발생(약, 2~3초)
    2. 다른 프로젝트도 Spring boot로 서비스 중이지만 동일현상이 발생하지 않았음
  2. 의심사항 리스트업
    1. 일정주기 -> ehcache 캐쉬 리로드 타임
    2. 로그백 캐쉬 리로드
    3. 기타 여러가지
  3. 디버깅
    1. 테스트용 URL을 만들어서 call 찍어봄
    2. Spring boot tomcat access로그를 남겨서 응답시간을 남겨봄
    3. 어플리케이션 로그를 DEBUG레벨로 남겨봄
  4. 디버깅을 통한 의심사항 확인
    1. 응답이 느려질 때 어플리케이션 로그에 아래와 같은 딜레이가 발생됨을 확인(3초 가량의 딜레이)
    2. 2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [semicolon] has value [-1]
      2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [enc] has value [utf-8]
      2016-07-03 12:22:07 [DEBUG] o.a.c.a.AuthenticatorBase:180 - Security checking request POST 요청URL 블라블라
    3. 해당 시점에 jvm gc를 확인해보니 young gc가 발생 -> GC시점에 느려짐?? -> FULL GC도 아닌데 왜 느려짐? -> 임베디드톰캣 설정이 문제인가??
      1. jstat -gcutil -h10 프로세스ID 1s
      2. 재 확인해보니 꼭 GC발생시점에 느려지지는 않음









파일업로드 Rest full 기능 샘플 소스



@RestController
@RequestMapping ("/file")
public class FileuploadController {

     @Autowired
     private ServletContext context;

     /**
      * 파일 멀티파트 업로드 Rest full
      *
      * @param inputFile
      * @return
      */
     @RequestMapping(value = "/upload", headers = ("content-type=multipart/*" ), method = RequestMethod.POST )
     public ResponseEntity<FileInfo> upload(@RequestParam ("file") MultipartFile inputFile) {

          FileInfo fileInfo = new FileInfo();
          HttpHeaders headers = new HttpHeaders();
           if (!inputFile .isEmpty()) {

               try {

                   String oriFileNm = inputFile.getOriginalFilename();
                   File destinationFile = new File(context.getRealPath("/WEB-INF/uploaded" ) + File.separator + oriFileNm);
                    inputFile.transferTo(destinationFile );
                    headers.add("File Uploaded Successfully - ", oriFileNm);

                    fileInfo.setFileName(destinationFile .getPath());
                    fileInfo.setFileSize(inputFile .getSize());
                    return new ResponseEntity<FileInfo>(fileInfo , headers, HttpStatus.OK );

              } catch (Exception e ) {
                    return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
              }
          } else {
               return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
          }
     }
}




/**
 * 파일정보 VO
 *
 * @author 엄승하
 */
@Data
public class FileInfo {

     private String fileName;
     private long fileSize ;

}





준비물
 
  1. Centos 다운로드(6.7ver 64bit)
  2. CentOS 다운로드 7 Ver
    1. https://mirror.kakao.com/centos/7.9.2009/isos/x86_64/
  3. Virtual box 다운로드(Windows용)
  4. putty(SSH 접속을 위해 사용)
  5. FilezZila(FTP)
 
 

Virtualbox에 CentOS 설치
  1. Virtualbox를 다운받아서 설치 : https://www.virtualbox.org/
  2. 환경설정
    • 파일->환경설정->입력->호스트 키 조합에서 F12입력


  3. Virutalbox에 CentOS설치
    • 종류는 Linux, 버전은 Red Hat 64-bit로 선택(64bit가 선택항목에 없다면, 바이오스에서 CPU 설정 부분에 있는 인텔 가상화 모드가 꺼져있어서 발생한거니 켜주세요)







    • 가상이미지 삽입하여 설치








    • biz라는 계정 생성 후 암호 설정(앞으로 모든 예제는 biz 계정을 예로 작성)


    • root 계정으로 네트워크 설정을 해주세요
      • 재 부팅시 자동으로 ifup되도록 설정
        • vi /etc/sysconfig/network-scripts/ifcfg-eth0 후 ONBOOT=no를 yes로 수정
 
 
 

외부 SSH 접속을 위한 Virtualbox  설정
 
 

 
 




  1. Putty로 접속성공


  2. SFTP로 접속 성공
 
 
 

 

+ Recent posts