python 및 머신러닝 교육, 슬로우캠퍼스



nginx 설정 설명


server {
    listen  80;
    server_name demo.abc.com;
    charset utf-8;

    access_log /home/ubuntu/app/log/nginx/demo_abc_com_access.log;
    error_log /home/ubuntu/app/log/nginx/demo_abc_com_error.log;

    location / {
            proxy_pass                          http://127.0.0.1:8000;
            proxy_set_header X-Forwarded-Host   $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    }
}



location block의 모습

location optional_modifier location_match {

    . . .

}

 

location을 match할때는 다음 순서로 이루어진다.

  1. URL의 prefix가 일치하는지 먼저 검사하여, 일치하는 것이 발견되면 기억해 놓고, 다음 location match를 수행한다. 즉 멈추지 않는다.
  2. regular expression과 일치하는 것이 있는 검사한다.
  3. 최종적으로 일치하는 regular expression이 있으면 그것을 선택하고, 없으면 1번에서 발견한 prefix 일치하였던 것을 리턴한다.
  4. prefix match 중에 '=', '^~' 로 수식된 것에서 prefix 일치가 발견되면 regular expression 비교 수행하지 않고 바로 리턴한다. (1번의 예외상황)

 


location block에서 optional_modifier 의미

  • = 는 exact match를 의미.  RE 진행하지 않음
  • / 및 /abc 는 prefix를 의미 
  • ~는 regular expression(대소문자 구분함)을 의미.  ~*는 대소문자 구분없는 RE(regular expression)
  • ^~는 match된 경우에 RE 진행하지 않음 이라는 의미.


location = / {    
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

nginx 설정

 

/etc/nginx/sites-available 아래에 파일을 생성하고,  

/etc/nginx/sites-enabled 에서 링크를 연결한다 (ln -s /etc/nginx/sites-available/xyz . ) 


참고 - https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms



WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스

속도의 심리학


정확히 말하면 응답 시간(response time)을 사용자가 얼마만큼 인내할 수 있는가?

어디에서 bottleneck 이 생기면, 어떻게 해결할 것인가? 

등을 소개하고 있다.


UX를 표현하는 front단, 서버단 등을 다룸.


http://html.nhncorp.com/2012_openworkshop/pt/05.pdf


WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스

웹서버  

tornado server를 웹서버로 사용

mongoDB를 db로 사용

(chat server 는 따로 mongoDB 사용. 서로 분리됨)

tornado sever 사용


서버기동확인 방법:

# ps -ef | grep py



# python chatdemo.py --port=8100


홈피 수정

# /home/tornado_demos/chat/templates/index.html 수정해보기 바람



현재 /tmp/chat/  에서  8000 포트로 기동한 상태.


서버확인:

브라우저에서


http://weechat.kr:8000



twitter 서버 연동 - oauth

oauth 연동 샘플 사이트

Twitter OAuth Demo


이 사이트의 소스

https://github.com/tav/tweetapp


twitter API용 python lib tweepy


# pip install tweepy




OAuth settings

Your application's OAuth settings. Keep the "Consumer secret" a secret. This key should never be human-readable in your application.

Access level

Read-only

About the application permission model

Consumer key

lj1tenUgCtXJUnfmvN7PWA

Consumer secret

DBYk5Qdnew9nnye9JFD5KlI4cCbueunRPzJBo

Request token URL

https://api.twitter.com/oauth/request_token

Authorize URL

https://api.twitter.com/oauth/authorize

Access token URL

https://api.twitter.com/oauth/access_token

Callback URL

http://weechat.kr/twt_oauth_callback

Your access token

Use the access token string as your "oauth_token" and the access token secret as your "oauth_token_secret" to sign requests with your own Twitter account. Do not share youroauth_token_secret with anyone.

Access token

102303698-vdawrDimKPI4w3IGWWse3pnQQym9OA8RftjCd5wx

Access token secret

WZ5Xv7W3hXKBGyqq7BYeQNjDjqq6Op79VnUpvtbLg

Access level

Read-only









oauth동작 과정


http://twitteroauth.appspot.com/oauth/twitter/login  에 접속하면

http://twitter.com/oauth/authorize 로 redirect 됨


# wget -d -o aa -O aaa http://twitteroauth.appspot.com/oauth/twitter/login



--2011-08-07 14:13:59--  http://twitteroauth.appspot.com/oauth/twitter/login

Resolving twitteroauth.appspot.com... 64.233.183.141

Connecting to twitteroauth.appspot.com|64.233.183.141|:80... connected.

HTTP request sent, awaiting response... 302 Found

Location: http://twitter.com/oauth/authorize?oauth_nonce=12747081930362030444&oauth_timestamp=1312694038&oauth_consumer_key=cZy7GCndV0v6xrfVSirG2g&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=bZQppJGeif5Xz3CzUe6HsGrS3Cc2JI33AgdP6PMSI&oauth_signature=moJc6hA9nWl3nl23qd2OyPeOWDY%3D [following]

--2011-08-07 14:14:00--  http://twitter.com/oauth/authorize?oauth_nonce=12747081930362030444&oauth_timestamp=1312694038&oauth_consumer_key=cZy7GCndV0v6xrfVSirG2g&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=bZQppJGeif5Xz3CzUe6HsGrS3Cc2JI33AgdP6PMSI&oauth_signature=moJc6hA9nWl3nl23qd2OyPeOWDY%3D

Resolving twitter.com... 199.59.148.10, 199.59.148.82, 199.59.149.230

Connecting to twitter.com|199.59.148.10|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 7585 (7.4K) [text/html]

Saving to: `aaa'


    0K .......                                               100% 42.4K=0.2s


2011-08-07 14:14:00 (42.4 KB/s) - `aaa' saved [7585/7585]








---


GET /twt_oauth_callback?oauth_token=8SCjZmZtbaSyMqnOBqbMAiK5310mmnhXuNMWd2OoYc&oauth_verifier=8X2zECUz9HZqfHLTvaP7MdIpdTCA6uItzGyG9Tu5w (61.43.139.4) 0.74ms




Tweepy

twitter api 사용




<tweepy.models.User object at 0x2b7041979190>

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_api', 'contributors_enabled', 'created_at', 'default_profile', 'default_profile_image', 'description', 'favourites_count', 'follow', 'follow_request_sent', 'followers', 'followers_count', 'followers_ids', 'following', 'friends', 'friends_count', 'geo_enabled', 'id', 'id_str', 'is_translator', 'lang', 'listed_count', 'lists', 'lists_memberships', 'lists_subscriptions', 'location', 'name', 'notifications', 'parse', 'parse_list', 'profile_background_color', 'profile_background_image_url', 'profile_background_image_url_https', 'profile_background_tile', 'profile_image_url', 'profile_image_url_https', 'profile_link_color', 'profile_sidebar_border_color', 'profile_sidebar_fill_color', 'profile_text_color', 'profile_use_background_image', 'protected', 'screen_name', 'show_all_inline_media', 'status', 'statuses_count', 'time_zone', 'timeline', 'unfollow', 'url', 'utc_offset', 'verified']



======= Direct Mesg

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_api', 'created_at', 'destroy', 'id', 'id_str', 'parse', 'parse_list', 'recipient', 'recipient_id', 'recipient_screen_name', 'sender', 'sender_id', 'sender_screen_name', 'text']



======= User Timeline

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_api', 'author', 'contributors', 'coordinates', 'created_at', 'destroy', 'favorite', 'favorited', 'geo', 'id', 'id_str', 'in_reply_to_screen_name', 'in_reply_to_status_id', 'in_reply_to_status_id_str', 'in_reply_to_user_id', 'in_reply_to_user_id_str', 'parse', 'parse_list', 'place', 'retweet', 'retweet_count', 'retweeted', 'retweets', 'source', 'source_url', 'text', 'truncated', 'user']


======= Mentions

16

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_api', 'author', 'contributors', 'coordinates', 'created_at', 'destroy', 'favorite', 'favorited', 'geo', 'id', 'id_str', 'in_reply_to_screen_name', 'in_reply_to_status_id', 'in_reply_to_status_id_str', 'in_reply_to_user_id', 'in_reply_to_user_id_str', 'parse', 'parse_list', 'place', 'retweet', 'retweet_count', 'retweeted', 'retweets', 'source', 'text', 'truncated', 'user']

'Cloud Computing > NoSQL, DB' 카테고리의 다른 글

pymongo, mongoDB, twitter 연동 tweepy  (0) 2013.07.25

WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스



2011년 8월 2일 회의



 Weechat(가칭)서비스 사용자 시나리오

내부 동작 시나리오

 내가 Twitter.com 의 ID로 weechat 사이트에 로그인한다.

 나의 follower, following 들이 화면에 social graph형태 (node, link)로 출련된다.


 Q) Social Graph 가 어떻게 출력 되는것이 좋을까?

      1. Fill Color

      2. Circle Size

      3. Line Color

      4. Line Thickness

      5. Line Length

http://apps.facebook.com/socgraph/

http://www.touchgraph.com/navigator


  oauth연동 twitter연동

  twitter상의 관계정보를 flock DB 저장

  HTML5를 이용한 그래프 출력

( (social graph방식 - 친밀도에 따라 사진을 더 크게 출력

  또는  qwiki.com의 이미지 구성 방식)


  

 graph에서 특정 node를 클릭하면 그사람과의

  채팅창이 생성되고, 대화를 시작할 수 있다.


 사용자간의 친밀도에 따라 node사인의 거리 또는 node의 크기가 달라질 수 있다. (필수아님) -


 Q) 채팅창이 어떻게 생성되는 것이 좋을까?

      1. Facebook, Google Chat

      2. New chatting window


→    new chat window 가 좋을 것 같음. PC에서는.

   일단 PC용으로 구현. 폰에서는 어떻게 보이는지 추후 확인. -

  채팅서버 동작,

  대화내역은 memcached 서버에 저장

  대화진행중일때는 채팅서버내에 메모리에 대화 저장.

  대화가 새로 개시될때는 cache서버에서 다시 읽어온다.

  cache서버에 있는 대화를 disk에 백업하는 서버 모듈도 별도로 실행되고 있다.

(mongoDB ? redis ?)

  

 채팅창에 들어간다.

 기존 대화 내역이 화면에 보인다. (100줄)

 

  Q) 채팅에서 지원되는 기능은 어디까지 구현?

  1. 문자

  2. 사진

  3. 파일

  4. 음성

.

 채팅기능 websocket기반 구현

 IE브라우저는 flash 기반




Design 시안

1. Main Page


       


2. User Page






  • 카톡: app기반, 비실시간

  • weechat:

    • web기반(websocket, HTML5)

    • 실시간 (TCP connection이 계속 붙어 있음) -- PC메신저

    • not p2p, server가 중계하는 모델임 (switch역할) → 그룹채팅 가능



우리시스템구성

HAProxy, apache,

memcached,

flockDB,

mongoDB


google File system -- Hadoop FS

bigtable -- Hbase









20110802 박정민:

채팅창 생성 방법: 기본적으로 페이지 내부 채팅 창이 있고, 버튼을 누르면 새로운 창으로 띄울 수도 있도록 하는 것이 좋을 것 같습니다.


Social graph 출력은 다른 사이트에서 그대로 벤치마킹하는 것이 좋을 것 같습니다.

그리고 사람을 찾기 편하도록 그래프 위에 검색 기능을 넣는 것이 좋아보입니다.

(구글에서 검색어를 입력하면 실시간으로 검색되는 것 처럼 검색창에 검색어를 입력하면 graph가 움직이면서 제일 가까운 결과를 찾고, 그 옆에 검색 결과를 리스트 형태로도 같이 보여주는 것도 좋을 것 같습니다.

검색시 그래프가 움직이면서 검색하는 것은 만들기 어려울 것 같기도 한데, 만약 힘들다면 검색 결과에 따라 유사도가 높은 결과 순으로 색을 사용해 표시하는 것도 좋을 것 같습니다.


채팅에서 지원되는 기능 구현: 일단 문자와 사진까지는 구현하는 것이 좋을 것 같고, 파일과 음성은 제일 나중에 시간이 남을 경우 하는 것이 좋을 것 같습니다. 사진 공유 기능을 구현하면 파일 공유 기능을 만드는 것도 어렵지는 않겠지만 음성은 좀 힘들어 보입니다.




20110804 서보경:


채팅창 생성 방법: 기본적으로 페이지 내부 채팅 창이 있고, 버튼을 누르면 새로운 창으로 띄울 수도 있도록 하는 것이 좋을 것 같습니다.


Social graph 출력은 다른 사이트에서 그대로 벤치마킹하는 것이 좋을 것 같습니다.

그리고 사람을 찾기 편하도록 그래프 위에 검색 기능을 넣는 것이 좋아보입니다.

(구글에서 검색어를 입력하면 실시간으로 검색되는 것 처럼 검색창에 검색어를 입력하면 graph가 움직이면서 제일 가까운 결과를 찾고, 그 옆에 검색 결과를 리스트 형태로도 같이 보여주는 것도 좋을 것 같습니다.

검색시 그래프가 움직이면서 검색하는 것은 만들기 어려울 것 같기도 한데, 만약 힘들다면 검색 결과에 따라 유사도가 높은 결과 순으로 색을 사용해 표시하는 것도 좋을 것 같습니다.



채팅에서 지원되는 기능 구현: 일단 문자와 사진까지는 구현하는 것이 좋을 것 같고, 파일과 음성은 제일 나중에 시간이 남을 경우 하는 것이 좋을 것 같습니다. 사진 공유 기능을 구현하면 파일 공유 기능을 만드는 것도 어렵지는 않겠지만 음성은 좀 힘들어 보입니다.


20110805 ~~~ :


Webpage Overall Architecture :


Contact to us (contactus.html)

-datail : Show in all web pages, when users click this icon or hyperlink, they can email to us.

Contents frame

1. login_page (login.html)

   Before log in, login_page will show you in this frame.


2. user_page (user.html)

   After log on, user_page will show up in this area.

Information bar (information.html)

-detail : Show in all web pages, Include information about us like what we use open source library like twitter


                                  - weechat web page architecture and components-


20110805 ~~~~~:

파일은 사용자가 컴퓨터에 저장하지만 사진은 채팅 화면에 바로 표시된다는 점이 다른데,

생각해보니 그냥 파일 전송 기능만 만들고 전송한 파일이 사진일 경우에 따로 처리하는 것이 낫겠네요.



monggo DB

mongo db 서버 기동 여부 확인

# ps -ef | grep mongo


python에서

import pymongo


http://api.mongodb.org/python/1.11/



mongo db 테스트


>>> import pymongo

>>> from pymongo import Connection

>>> connection = Connection()

>>> db = connection.xxxx

print db.hello

table = db.hello

print table


table.insert({"name":"han", "age":10})


table.find_one()

table.find_one({"name": "han"})

c=table.find({"age": 10})

for cc in c:

print cc


table.find_one({“name”:”bokyung”})








tweepy (twitter API, python)

tweepy 테스트

#  python tweepy_test.py


http://twitter.com/oauth/authorize?oauth_token=YddUEeNouPkXXcwlfc2QmHgE501aGvXUbyqiQpA






tweepy_test2.py

29         CONSUMER_KEY = "lj1tenUgCtXJUnfmvN7PWA"

30         CONSUMER_SECRET = "DBYk5Qdnew9nnye9JFD5KlI4cCbueunRPzJBo"

31

32         auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

33         aurl = auth.get_authorization_url()

34         print aurl

35

36         #auth.get_access_token(verifier)

37         key = "102303698-y239qrJn6EJ8RrTw9fBJfUXuXJslpB3tizolftPM"

38         secret = "t7du471eI75nxMlwn5idZ14yihCF8zNt9mNhijep8"

39         auth.set_access_token(key, secret)

40

41         api = tweepy.API(auth)

42         api.update_status(u"a tweet by tweepy module")




http://answers.oreilly.com/topic/2605-how-to-capture-tweets-in-real-time-with-twitters-streaming-api/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oreilly%2Fnews+%28O%27Reilly+News+and+Commentary%29




dev.twitter.com











--------------

weechat 서버의 mongDB table 정의


db.weechat.users = {

‘id’: 123456

‘screen_name’: ‘twitter_name(xxxx)’,

‘name’: ‘이름’,

‘imgurl’: ‘http://a0.twimg.com/profile_images/772043698/SKT______normal.jpg’

}


table = db.weechat.users

table.insert({‘id’: 123456, ‘screen_name’: ‘xxxx’})


db.weechat.relations =

                            {

                               "id":me.id,

                               "flist": flist

                               "updated_at": int(time.time())

                               }


table = db.weechat.followers

print table


# 각 유저의 Twitter친구 목록:

# 본인 id,  [ (친구 id , 친구 screen_name, 친구와 친밀도]



table.insert({"id":123456, "flist":[(100001, 10), (100002, 20)]})

c=table.find({"id":"123456})


# 각 유저의 자기가 속한 방들의 목록

# 방의 id는 room token

table = db.weechat.myrooms

print table

table.insert(

{“uid”=12345,

“ismine”=1,    # 1 or 0.  yes/no

“roomid”=”ddcddsd”

)


# 각 방의 정보


table = db.weechat.roominfos

print table

{

                       "creator": uid, # twitter user id

                       "roomid": roomid,

                       "title": title,

                       "created_at": created_at,

                       "members": members,  [ id1, id2, id3]  # twitter user ids


}


--

db.weechat 대신에

db.weechat2 라고 만들어서..

특히 twitter id는 int

twitter screen_name 은 string








-----

javascript json rpc:: http://easyxdm.net/wp/



Weechat2


1) users

id : Int

screen_name : String

name : String

100001

Mungqoo

yyyy

100002

Lullujune

xxxx

100003

xxxx

zzzz

100004

merong

LeeBado


2) followers

ID: Int

Flist:Dictionary list

100003

"flist":[(100001, ‘yyyy’, 10), (100002, ‘xxxx’ ,20),(100004,’LeeBado’, 30)]


3) myrooms



4) roominfos

roomid: String

title: String

createtime: String

creator: Int

guests: Int list

“akdptmxmfh”

project1

2011-08-02 14:30

100001

[100002,100003 ]

“dkskaxkdnj”

project2

2011-08-02 15:03

100004

[]




== 친밀도 계산

tweepy이용

나자신 me = api.me()

me.id


msgs = api.mentions()

dmesgs = api.direct_messages()


mention 중에 내가 보낸 것은 1점 // 구해지지 않음. 제외

mention 중에 내가 받은 것은 2점

DM 중에 내가 보낸 것은 2점 // 구해지지 않음. 제외

DM 중에 내가 받은 것은 4점


mention의 author.id == me.id 이면 내가 보낸 것


== 웹페이지 넘겨주기

[ (id, score, s_name, name,  img_url)]


---\

import json

from pymongo import json_util


allusers=json.dumps(users, default=json_util.default)

usersjson=eval('('+allusers+')')

print usersjson


flist= json.dumps(my_flist,default=json_util.default)

flistjson = eval('('+flist+')')

print flist


               self.render("user_socialgraph.html", userjson=usersjson, flistjson=flistjson)


==


채팅 서버 경로: /home/pjm0616/chat/a.py

테스트용 클라이언트: /home/pjm0616/chat/web/


REQ: chat.weechat.kr/create


JSON = { “roomid”: “fsdfdsfckckmd”, “token”: “fdsdlkkcds”}


chat.weechat.kr/adduser?roomid=xxxx&token=yyyy

JSON = {“token”:”fdfdsfdsf”}


REQ: chat.weechat.kr/chat?roomid


REQ: chat.weechat.kr/chat?roomid








{‘cmd’:’id’, ‘uid’:”uno4vuasorcuos”, ‘roomid’:’asp9umf9er’}

{‘cmd’:’msg’, ‘msg’: “메시지”, ‘from’:’’}

{cmd’:’join’, ‘who’:’awceacr’}

{‘cmd’:’leave’, ‘who’:’asiuc3ac’}





------- 8/23 최종 설계  (graph 화면, weechat 서버, chat 서버 연동 방법)




weechat.kr 의 user_graph 화면에서 친구들 중에서 대화할 사용자 클릭

weechat.kr/create?partner=상대방사용자id   로 새로운 채팅 창이 뜸

weechat.kr/create?partner=상대방사용자id&title=hihi


  



위 페이지에서 chat.weechat.kr:19999/p/create 에 접속하여 방을 만든 후

사용자를 weechat.kr/chat?room=방ID

로 이동시킴


-->

self.render("chat.html", roomid=roomid, twt_uid=twt_uid)


weechat.kr/chat?room=12321312 에서는 자바스크립트를 사용하여

chat.weechat.kr:19999/ws/chat 으로 웹소켓 연결 후 채팅

웹 소켓 연결시는 방id와 유저id(트위터상의 숫자로 된유저id가 필요)


웹 소켓 연결 후 새로운 사용자가 채팅에 참여하면

그 사용자의 유저id를 weechat.kr/getuserinfo?id=유저ID 와 같은 식으로 접속하여 AJAX로

해당 유저id에 대한 정보(닉네임 등)을 받아옴



---------





'Cloud Computing > NoSQL, DB' 카테고리의 다른 글

tornado, tweepy, twitter API  (0) 2013.07.25

WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스


http://charsyam.wordpress.com/  -- cloud 관련 전문 개발자 블로그


AWS 장애로 부터 Netflix 가 배운 교훈(201207-06)

http://techblog.netflix.com/2012/07/lessons-netflix-learned-from-aws-storm.html



http://www.ddaily.co.kr/news/news_view.php?uid=92003


2012.6 정전발생 (North Vignia) → Heroku, Pinterst  등 8시간 장애

http://aws.amazon.com/message/67457/


2011.9  아일랜드 더블린, 번개로 인한 서비스 장애

2011.4  미국 동부지역, 데이터 복제 문제 발생 (EBS)

다양한 해외 의견들을 첨부합니다.

http://blog.cloudharmony.com/2011/04/unofficial-ec2-outage-postmortem-sky-is.html

http://justinsb.posterous.com/aws-down-why-the-sky-is-falling

http://status.heroku.com/incident/151


→ 서비스 인프라를

여러 곳에 분산시키는 멀티-클라우드 전략이 필요하다고 지적하고 있다



만약 퍼블릭 클라우드 환경에서 서버를 구축할 예정인 분들께서는 사전에 아래의 여섯 가지를 꼭 확인하고 고려하셔야 합니다.


1. 클라우드는 기존의 호스팅 환경보다는 상대적으로 안전하지만 대신 문제가 생기면 오히려 복구는 더 어렵고 오랜 시간이 필요하다.


2. 클라우드 장애에 대비해 물리적으로 복수의 장소에 다중화를 해둬야 한다.


3. 복수의 서버중 어느 한 곳이 죽더라도 시스템 자체가 죽지 않도록 설계한다.


4. 물리적으로 별개의 장소에 수시로 백업을 하도록 정책을 세워야 한다.


5. 문제가 생기면 최대한 빨리 다른 클라우드나 다른 서버로 라우팅을 돌릴 수 있도록 준비해두어야 한다.


6. 일단 사고가 나더라도 대부분의 경우 데이터는 안전하게 남거나 복구 가능하니 너무 패닉에 빠지지 않는다.



WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스


CPU, core 정보를 구할 때는 아래 명령어를 이용하자.


/usr/bin/kstat -m cpu_info


/usr/sbin/psrinfo --> CPU 정보 (solaris)



/usr/sbin/prtdiag --> HW 정보 (solaris)



그외 시스템 정보 및 상태 확인할 때는  psrinfo, prtconf, dmesg, format, netstat, uname 등을 이용 가능하다. 




아래는 CPU 개수를 편하게 확인할 수 있는 script이다.








http://technopark02.blogspot.kr/2011/04/solaris-show-me-cpu-vcpu-core-counts.html


#!/bin/bash

# original

/usr/bin/kstat -m cpu_info | egrep "chip_id|core_id|module: cpu_info" > /var/tmp/cpu_info.log

# solaris 10에서는 pkg_core_id, core_id 둘다 존재하는데, pkg_core_id만 grep 하면 된다

/usr/bin/kstat -m cpu_info | egrep "chip_id|pkg_core_id|module: cpu_info" > /var/tmp/cpu_info.log


nproc=`(grep chip_id /var/tmp/cpu_info.log | awk '{ print $2 }' | sort -u | wc -l | tr -d ' ')`
ncore=`(grep core_id /var/tmp/cpu_info.log | awk '{ print $2 }' | sort -u | wc -l | tr -d ' ')`
vproc=`(grep 'module: cpu_info' /var/tmp/cpu_info.log | awk '{ print $4 }' | sort -u | wc -l | tr -d ' ')`

nstrandspercore=$(($vproc/$ncore))
ncoresperproc=$(($ncore/$nproc))

speedinmhz=`(/usr/bin/kstat -m cpu_info | grep clock_MHz | awk '{ print $2 }' | sort -u)`
speedinghz=`echo "scale=2; $speedinmhz/1000" | bc`

echo "Total number of physical processors: $nproc"
echo "Number of virtual processors: $vproc"
echo "Total number of cores: $ncore"
echo "Number of cores per physical processor: $ncoresperproc"
echo "Number of hardware threads (strands or vCPUs) per core: $nstrandspercore"
echo "Processor speed: $speedinmhz MHz ($speedinghz GHz)"

# now derive the vcpu-to-core mapping based on above information #

echo -e "\n** Socket-Core-vCPU mapping **"
let linenum=2

for ((i = 1; i <= ${nproc}; ++i ))
do
        chipid=`sed -n ${linenum}p /var/tmp/cpu_info.log | awk '{ print $2 }'`
        echo -e "\nPhysical Processor $i (chip id: $chipid):"

        for ((j = 1; j <= ${ncoresperproc}; ++j ))
        do
                let linenum=($linenum + 1)
                coreid=`sed -n ${linenum}p /var/tmp/cpu_info.log | awk '{ print $2 }'`
                echo -e "\tCore $j (core id: $coreid):"

                let linenum=($linenum - 2)
                vcpustart=`sed -n ${linenum}p /var/tmp/cpu_info.log | awk '{ print $4 }'`

                let linenum=(3 * $nstrandspercore + $linenum - 3)
                vcpuend=`sed -n ${linenum}p /var/tmp/cpu_info.log | awk '{ print $4 }'`

                echo -e "\t\tvCPU ids: $vcpustart - $vcpuend"
                let linenum=($linenum + 4)
        done
done
 

rm /var/tmp/cpu_info.log




실행 결과 예시)

 $ bash showcpucount.sh


Total number of physical processors: 1

Number of virtual processors: 8

Total number of cores: 4

Number of cores per physical processor: 4

Number of hardware threads (strands or vCPUs) per core: 2

Processor speed: 2400 MHz (2.40 GHz)


** Socket-Core-vCPU mapping **


Physical Processor 1 (chip id: 0):

        Core 1 (core id: 0):

                vCPU ids: 0 - 1

        Core 2 (core id: 9):

                vCPU ids: 2 - 3

        Core 3 (core id: 0):

                vCPU ids: 4 - 5

        Core 4 (core id: 9):

                vCPU ids: 6 - 7




WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스



C10K problem은 10여년 전의 도전과제였다. thread 및 process 기반의 방식 (예, Apache )에서 event-driven 방식으로 (예, nginx, node.js ) 변화하면서 C10K 문제를 풀 수 있었다.


아래의 글은 C10M problem을 풀기 위해서는 unix 에게 맡겨온 thread관리, IO관리, memory 접근관리를 application에서 직접 해야 한다는 요지이다.


우리가 배운 Richard Stevens의 책은 unix에 대한 내용 및 의존성이 높아서, 'network programming'을 배운 것이 아니라, unix를 배운 것이라는 코멘트가 와 닿는다.


C10M problem을 위해 device driver도 개발 필요하다고 하니, 거의 전용 OS를 만드는 수준으로 보인다. 60년도 넘은 unix를 대체할 새로운 도약이 필요하다는 댓글도 보인다.


http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html

'Cloud Computing > Architecture' 카테고리의 다른 글

아마존 AWS 장애 사례  (0) 2013.07.25
유명 회사의 대용량 처리 서버 기술 스택  (0) 2013.04.17

WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스

-- from xguru (http://xguru.net/1268)


'Cloud Computing > Architecture' 카테고리의 다른 글

아마존 AWS 장애 사례  (0) 2013.07.25
C10M connection problem - 1천만 동접 처리하기  (0) 2013.05.20

WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스



node.js 코딩 스타일 



WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,

python 및 머신러닝 교육, 슬로우캠퍼스



HAProxy, Nginx, node.js 조합으로 SSL websocket 구성하기

http://www.exratione.com/2012/12/websockets-over-ssl-haproxy-nodejs-nginx/



  • HAProxy를 맨 앞에 세우고, 뒤에 node.js (HTTPServer)와 nginx(static file 및 non-node.js 페이지 처리)
  • HAProxy가 SSL 트래픽의 암호화를 풀어서 node.js 와 nginx 에 트래픽을 분배하여 전달한다.


Scaling node.js 

http://cjihrig.com/blog/scaling-node-js-applications/


3 가지 접근 방법이 있다.

  1. 'cluster'라는 기본 모듈을 이용하여 하나의 서버 상에 process를 여러개 fork 한다.  http://nodejs.org/api/cluster.html
  2. 'http-proxy'라는 추가 모듈을 이용하여 여러 서버 상에 load balance 할 수 있다. 이 모듈로 간단한 nginx 역할을 할 수가 있다. npm install http-proxy
  3. nginx 라는 'reverse proxy' 도구를 설치하여 여러 서버 상에 load balance 할 수 있다.


'Cloud Computing' 카테고리의 다른 글

UX- 속도의 심리학  (0) 2013.08.07
node.js 입문 메모  (0) 2013.04.12
Redis fork 성능 문제  (0) 2013.03.19
대용량 처리 서버 솔루션 (G-WAN, NXWEB)  (0) 2013.03.15
C10K Problem (kegel.com 원본 보관용)  (0) 2013.03.15

WRITTEN BY
manager@
Data Analysis, Text/Knowledge Mining, Python, Cloud Computing, Platform

,