2015년 2월 26일 목요일

쉘스크립트 에러 처리

쉘스크립트 에러 처리 

main.sh
#!/bin/bash

check_errs()
{
  # Function. Parameter 1 is the return code
  # Para. 2 is text to display host.
  if [ "${1}" -ne "0" ]; then
    echo "ERROR # ${1} : ${2}"
    #mail -s "subject here" email@address.com <<< "ERROR # ${1} : ${2}"
    exit ${1}
  fi
}

. ./exit.sh
check_errs $? $host_name
#!/bin/bash
host_name="test_lb_com"
aa
결과
ERROR # 127 : test_lb_com
./exit.sh: line 3: aa: command not found

Process finished with exit code 127

쉘 스크립트끼리 변수 공유하기

쉘 스크립트끼리 변수 공유하기

  • a.sh
    #a.sh
    #!/bin/sh
    MESSAGE="hello"
    export MESSAGE
    ./b.sh
    
  • b.sh
    #!/bin/sh
    echo "The message is: $MESSAGE"
    
  • 하게 되면 환경변수가 복사되어 자식 프로세스에서 “The message is: hello” 가 나온다.
  • 하지만 거꾸로 하게 되면 나오지 않는다
    #a.sh
    #!/bin/sh
    echo "The message is: $MESSAGE"
    ./b.sh
    
  • b.sh
    #!/bin/sh
    MESSAGE="hello"
    export MESSAGE
    
  • 하게 되면 “The message is: “ 가 나온다.
  • 왜? 그럴까? 부모가 자식을 호출하게 되면 환경변수를 복사해가서 생성 한다.
    그후 어떤 방법으로도 부모의 환경변수에 접근 할수 없다.
    부모와 자식은 서로 다른 프로세스 임으로 최초 복사를 제외 하고는 환경 변수를 공유 할수 없다.
    또한 쉘프로그램이 종료되면 그 쉘에 만들어 졌던 모든 쉘 변수들을 없어진다.

쉘의 서브 스크립트는 어떻게 작동할까?

  1. 동일 프로세스에서 뛰우기
     . ./b.sh
     (soruce) /path/to/script
    
    모두 부모 프로세스에서 차례 차례 실행됨으로 변수와 함수가 공유 가능하다.
    • a.sh
      #!/bin/sh
      a="1"
      . ./b.sh
      
    • b.sh
      #!/bin/sh
      echo "The message is: $a"
      
    • 결과 The message is: 1
  2. 다른 프로세스로 뛰우기
     ./b.sh
     /bin/bash /path/to/script
    
    • 다른 프로세스로 뛰우기 때문에 서로 변수와 함수를 공유 할수 없다.

참고

2015년 2월 25일 수요일

mongodb replication v2.6

         
1.디렉토리를 만든다.
   mkdir rs0
mkdir rs0/server1
mkdir rs0/server2
mkdir rs0/server3      
         
  1. cd /
  2. chown mkdir /test/
  3. sudo chown 유저이름 /test/
  4. mkdir rs0

2.몽고 디비를 뛰운다.
  1. mongod --port 27001 --dbpath /test/ --replSet 'rs0'


   port는 27001 로 생성될  디비의 경로는 /test/ 밑으로 레플리케이션 이름은 'rs0'으로

linux 에 git 인스톨하기


linux 에 git 인스톨하기

  1. rpm 저장소 update
    sudo rpm -i 'http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm'
    sudo yum update git –enablerepo=rpmforge-extras
    
  2. 깃인스톨
    sudo yum install git
    
  3. 깃 연결
    • git ssh연결하려면 다른 서버에서 개인키 복사해오던가 아니면 아래 방식으로 생성
      cd ~
      mkdir ./ssh
      cd ssh
      ssh-keygen -t rsa -C "유저이메일주소"
      
    • 만든 후 아래에 추가해서 넣어야함
      https://help.github.com/articles/generating-ssh-keys/
    • 다른서버에서 복사
      scp id_rsa.pub id@ip:~/.ssh
      
  4. 깃복사
    git clone git@github.com:userid/projectname.git

2015년 2월 16일 월요일

몽고 레플리케이션 싱크에러


몽고에러

레플리케이션이나 샤딩에러


싱크 에러

  1. 몽고에 에러가 발생했을 경우 마스터 서버로 간다.
몽고가 있는 서버로 가서
ps -ax | grep mongo
 8373 ?        Sl   608:30 /usr/bin/mongod -f /etc/mongod.conf
 8465 ?        Sl   768:49 /usr/bin/mongod -f /etc/mongod-config-server.conf
11927 pts/2    S+     0:00 grep mongo
26213 ?        Sl   852:33 /usr/bin/mongos -f /opt/thirdparty/mongos_test.conf
  1. 컨피그를 확인해서 몽고스를 통하지 않고 직접 마스터의 포트로 접속
    ps -ax | grep mongo
     port = 숫자
    
  2. 마스터에서 레플 또는 샤딩 상태를 확인
    -인증을 받고
    use admin
    db.auth(id,pw)
    rs.status()
shard-a:PRIMARY> rs.status()
{
    "set" : "shard-a",
    "date" : ISODate(""),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "ip1,
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 9658337,
            "optime" : Timestamp(),
            "optimeDate" : ISODate(""),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ip2",
            "health" : 1,
            "state" : 3,
            "stateStr" : "RECOVERING",
            "uptime" : 720382,
            "optime" : Timestamp(),
            "optimeDate" : ISODate(""),
            "lastHeartbeat" : ISODate(""),
            "lastHeartbeatRecv" : ISODate(""),
            "pingMs" : 0,
            "lastHeartbeatMessage" : "still syncing, not yet to minValid optime 54e1c1a7:34",
            "syncingTo" : "ip1"
        },
        {
            "_id" : 2,
            "name" : "ip3",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 720395,
            "lastHeartbeat" : ISODate(""),
            "lastHeartbeatRecv" : ISODate(""),
            "pingMs" : 0
        }
    ],
    "ok" : 1
}
  1. 문제가 있다면
  • 위의 경우는 레플리케이션에서 싱크가 되어있지 않다.
  • 해당 레플리케이션 서버로 이동
  • 1, 2번 을 적용해서 로깅 위치 확인
  • 로깅으로 가서 해당 날짜 사유 확인
  1. 싱크관련 에러
    [rsBackgroundSync] replSet syncing to: masterIP
    [rsBackgroundSync] replSet error RS102 too stale to catch up, at least from masterIP
    [rsBackgroundSync] replSet our last optime : 
    [rsBackgroundSync] replSet oldest at masterIP :
    [rsBackgroundSync] replSet See http://dochub.mongodb.org/core/resyncingaverystalereplicasetmember
    [rsBackgroundSync] replSet error RS102 too stale to catch up
    [rsBackgroundSync] replSet RECOVERING
    
  • oplog 의 사이즈를 넘어가면 위와 같은 에러가 발생한다 디폴트 사이즈는?
    디폴트 크기는 사용가능 한 디스크의 5%를 몽고 디비가 설정한다.
    권장사항은 최소 디비에 적일 양의 24시간을 버틸 정도로 설정해야 한다.
    실 어드민은 가능한 최대한 많이를 추천한다.(capped collection 이기 때문에 덥어쓰면 복구가 안되기 때문이다.)
  • 그렇다면 어디서 로그 크기를 확인하는가?
    버전 2.4 db.printSlaveReplicationInfo()
    버전 2.6 rs.printReplicationInfo()

  • 최초에 바꾸기
    replication.oplogSizeMB
  • 나중에 바꾸기
    The way the sync works is secondary notes a place in the oplog on the
    primary, then starts copying all the data over.
    http://docs.mongodb.org/manual/tutorial/change-oplog-size/
    db.runCommand( { create: “oplog.rs”, capped: true, size: (2 1024 1024 * 1024) } )

시간 에러

  1. 서버 시간이 다를 경우 mongos 에서 connection 접속시 에러가 발생할수 있다.
    ntp 를 사용해서 서버끼리 시간을 동기화 해주고 cron에 추가해서 배치잡으로 돌리자.

2015년 2월 12일 목요일

logstash vs flume vs fluentd

중앙 집중 로깅 시스템

방법론

  • 스크립트로 중앙 서버로 복사하는것
    단순 중앙 저장, 네트워크 에러등 에러 처리 힘듬
  • syslog
    message generation client, message storage system, message report and analysis
    • implementation
    • syslog-ng
    • rsyslog
  • 데이터 량이 많아지고 여러 요구 조건이 나오면서 새로운 디자인이 나옴
    • 이벤트 스트림에 특화됨
    1. 각서버당 로깅 클라이언트를 뛰움
    2. 클라이언트에서 중앙 서버(클러스터 or 어그리게이터)로 로깅을 쏨
    3. 모은 후 분산 그리고 확장 가능한 저장소에 저장(하둡 등)
    • 수평적으로 분산 처리가 되어야함

Apache Flume

  • 언어 : java
  • Run : JVM
하둡을 주 타겟으로 만듬
소스 -> 채널 -> 싱크
  1. 소스
    로깅을 만들어내는주체
  2. 채널(큐)
    로깅을 보내는 곳(버퍼 등의역활)
  3. 저장소(싱크)
    채널에 쌓여 있는 로깅데이터를 순서대로 원하는 저장소에 저

지원하는 소스

  • Avro Source.
  • Thrift Source.
  • Exec Source.
  • NetCat Source.
  • Syslog Sources.

지원하는 싱크

  • HDFS Sink.
  • Logger Sink.
  • Avro Sink.
  • Thrift Sink.
  • File Roll Sink.
  • HBase Sink.
  • ElasticSearch Sink.

장점

  • guarantees data delivery
  • scales horizontally
  • high throughput
  • fault tolerance

Log stash

  • 언어 : JRuby
  • Run : JVM
로그전달자(lumberjack) -> Broker(redis) -> LogStash(indexer) -> Search & Storage
  • 로그전달자
    각 클라이언트에서 생성되는 로그를 중앙 서버로 전송
  • Broker
    중간 또는 분산 처리된 레디스 서버에 로그를 저장
  • LogStash
    Broker 에 싸인 데이터를 처리 해서 처리 후 저장 또는 걍 저장
  • search & storage ( Elasticsearch & Kibana)
    자동화된 툴을 사용해 로그 모니터링 등 (단 다른 애들도 뒤에 붙여 쓸수 있음)

Fluentd

  • 언어 : CRuby
  • Run : vanilla(ruby)
Fluentd(클라이언트) -> Fluentd(컬랙터) -> Storage
  • Fluentd(클라이언트)
    각 클라이언트에서 생성되는 로그를 중앙 서버로 전송
  • Fluentd(컬랙터)
    중간 또는 분산 해서 저장
  • Storage
    컬랙터에서 S3등에 저장

참고

2015년 2월 8일 일요일

mongodb Array in array query

mongodb Array in array query

array 안에 array 가 있고 그안의 객체에 array 가 있고 거기에 val 쿼리하기
doc = {
    array1 :[
        [
            {
                array2:[{ key:'val'},{ key:'val'}]
            },
            {}    
        ],
        []
    ]
}

db.doc.find({'array1':{$elemMatch:{$elemMatch:{array2:{$elemMatch:{'key':'val'}}}}}})

#서버 시간 동기화

서버 시간 동기화


Network Time Protocol 을 사용해서 시간을 1회 동기화한다.
크론 탭등을 써서 사용하는거 같다
주소
표준시간을 주는 서버를 지정한다.
사용방법
sudo yum install ntpdate
sudo ntpdate time2.kriss.re.kr

2015년 2월 7일 토요일

Page rank 머냐 이거 먹는거냐! (1화)

Page rank 머냐 이거 먹는거냐! (1화)


목표

각각의 웹페이지에 점수를 매겨서
검색 사이트에서 특정 단어에 대한 검색을 할 경우 웹페이지의 점수가 높은 애부터 나열하자
ex) 네이버에서 검색을 하면 신뢰성있고 연관성있는 결과물이 상위에 노출된다.

기본 아이디어

  • 모든 웹페이지는 링크로 연결되어 있다고 가정할수있다.
  • 링크는 들어오는 링크(in link) 와 나가는 링크로(out link) 분리할수있다.
  • 더 중요한 페이지는 많은 웹페이지가 가리키고 있을것이다.
    alt text
    위 그림(1)을 보면 각각의 페이지들 있고 페이지들은 링크로 연결되어있다.
  • 총 페이지 점수의 합은 100이다.
  • 많은 링크를 받을 수록 높은 점수를 같는다.
  • 높은 점수의 페이지가 가리키는 페이지는 높은 점수를 같는다.
    C는 한개의 in link를 가지고 있지만 B가 점수가 높기 때문에 높은 점수를 같는다.

점수를 어떻게 계산해야 할까?(재귀식)

alt text
위 그림(2)을 보면 j 페이지의 점수를 계산하는 방법이 나와있다
  1. j 페이지는 i, k 페이지에서 링크를 받고 있고 두개의 페이지 점수/out link수 를 기반으로 매겨진다.
  2. j 페이지는 3개의 out link를 가지고 있고 각각의 링크의 점수는 j/3 이다.
위의 식을 보면 재귀적으로 각 페이지의 점수가 매겨지는걸 알수있다.
공식으로 하면 아래와 같다.
r_j = \frac{r_i}{3} + \frac{r_k}{4}
i 페이지는 3개의 out link를 가지고 있다.
k 페이지는 4개의 out link를 가지고 있다.
위식을 좀더 추상화하면 아래의 식을 얻을수있다.
r_j = \sum_{i \to j} \frac{r_i}{d_i}
1번식
j 페이지의 점수는 j로 들어오는 out link 들의 합이다.
out link 점수는 원페이지(i) 점수 / 원페이지의 out link 수

흐르는 모델 (Flow model)

  • 중요한 페이지의 out link 점수는 더 높다.
  • 그러므로 중요한 페이지에게 out link 를 받은 페이지의 점수는 높다
alt text
위 그림(3) 을 보자
위그림의 우측 상단의 그림은 웹이 3개의 사이트로 이루어져 있다고 가정한다.
그럼 실제로 페이지 랭크를 구해보자!
1번 식을 적용하면 아래의 점수를 구할수 있다.
r_y = r_y/2 + r_a/3
r_a = r_y/2 + r_m
r_m = r_a/2
우리는 3개의 미지수와 3개의 공식있다. 풀면된다.
하지만 비례식이므로 답이 여러개다 그러니
r_y + r_a + r_m = 1
아래의 조건을 추가하자
그럼 답은
r_y = 2/5
r_a = 2/5
r_m = 1/5
과 같다

page rank 2화 실적에 적용해 볼까나?


R 기본 그래프

Base Plotting System

Plotting System

  • base
    헌번에 한개씩 점진적으로 만들어나간다
  • lattice
    자동화가 되어 있어 한번의 펑션콜로 만들어진다
  • ggplot2
    위 두개의 중간 버전 정도 라고 생각하면된다.
  • 3개 중 하나만 골라써야한다.

Base Graphics

  • 플랏을 만들고
  • 이미 존재하는 플랏에 필요한부분을 추가한다.
ex)
plot(x, y)
hist(x)
파라미터가 많고 파라미터의 도움말은 ?파라미터명 으로 볼수있다.

Histogram

library(datasets)
hist(airquality$Ozone)

Scatterplot

library(datasets)
with(airquality, plot(Wind, Ozone))

Boxplot

library(datasets)
#airquality <- transform(airquality, Month = factor(Month))
boxplot(Ozone ~ Month, airquality, xlab = "Month", ylab = "Ozone (ppb)")

중요한 파라미터들

  • par()
    그래픽에 전채적으로 적용되는 파라미터에 대한 설명
    par(“lty”) $ solid
    par(“col”) $ 5.1, 4.1, 4.1, 2.1
    par(“pch”) $11
  • pch
    심볼(기본은 열린 원)
  • lty
    라인 종류(기본 긴줄) etc 점줄 등
  • col
    심볼 색갈 color()를 하면 색 백터를 돌려줌
  • xlab
    x 레이블
  • ylab
    y 레이블
  • las
    레이블들의 방향
  • bg
    배경색깔
  • mar
    마진사이즈
  • oma
    바깥 마진 사이즈(outer margin size) (기본 : 0)
  • mfrow
    number of plots per row, column (plots are filled row-wise)
    multiple plot 을 로우 먼저 채워라
  • mfcol
    number of plots per row, column (plots are filled column-wise)
    multiple plot 을 컬 먼저 채워라

기본 Plotting functions

  • plot
    make scatterplot or other type of plot
  • lines
    n의 점을 잊는 라인을 그린다.
  • points
    플랏에 포인트를 더한다.
  • text
    특정 x,y 좌표에 텍스트를 더한다.(inside plot)
  • title
    x,y labels, title, subtitle, outer margin 등에 주석을 더한다.(out side plot)
  • mtext
    margins(outer or inner)에 쪽에 텍스트를 더한다.
  • axis
    axis 에 ticks/labels 을 더한다.
library(datasets)
with(airquality, plot(Wind, Ozone))
title(main = "Ozone and Wind in New York City")

with(airquality, plot(Wind, Ozone, main = "Ozone and Wind in New York City"))
#add point at above plot
with(subset(airquality, Month == 5), points(Wind, Ozone, col = "blue"))
library(datasets)
#type = n 데이터를 plot에 그리지 말아라
with(airquality, plot(Wind, Ozone, main = "Ozone and Wind in New York City", type = "n"))
with(subset(airquality, Month == 5), points(Wind, Ozone, col = "blue"))
with(subset(airquality, Month != 5), points(Wind, Ozone, col = "red"))
legend("topright", pch = 1, col = c("blue", "red"), legend = c("May", "Other Months"))

기본 선형 회귀 함수 그리기

library(datasets)
with(airquality, plot(Wind, Ozone, main = "Ozone and Wind in New York City", pch = 20))
model <- lm(Ozone ~ Wind, airquality)
#abline 회귀 라인의 슬로프를 보고 펑션에 그린다. lwd 라인 두께
abline(model, lwd = 2)

여러 plot 한번에 뛰우기

library(datasets)
#mflow = multi plot row
par(mfrow = c(1,2))
with(airquality, {
    plot(Wind, Ozone, main = "Ozone and Wind")
    plot(Solar.R, Ozone, main = "Ozone and Solar Radiation")
})
library(datasets)
#mar = margin oma = outer margin
par(mfrow = c(1,3), mar = c (4,4,2,1), oma = c(0, 0, 2, 0))
with(airquality, {
    plot(Wind, Ozone, main = "Ozone and Wind")
    plot(Solar.R, Ozone, main = "Ozone and Solar Radiation")
    plot(Temp, Ozone, main = "Ozone and Temperature")
    #add text at the margin space
    mtext("Ozone And Weather in New York City", outer = TRUE)
})

정리

  • 일단 플랏을 뛰운다.
  • 필요한 요소를 추가한다.
  • 자유롭기는 하지만 설정할게 너무 많다.