Java용 인증서의 경우 .p12로 된 인증서를 만드는 방법을 소개합니다.


인증서 생성을 위해서 일단 Cert파일(aps_development.cer)과 개인키(mykey.p12) 두개 파일이 필요합니다.

1. 개발자센터에서 개발용 인증서파일을 다운로드 받습니다. 기본적으로 파일명은 aps_development.cer으로 생성됩니다.




2. 키체인 접근에서 개인용 인증서를 내보내기로 받습니다.

내보내실때 꼭 인증서 비번을 넣으셔야 생성이 가능하니 만들실때 비번을 넣어서 추출하시기 바랍니다~!



이제 바탕화면에 파일을 옮겨놓으시고 터미널을 엽니다.


4. 터미널에서 개발자센터에서 받은 aps_development.cer파일을 .pem파일로 변환합니다.

아래와 같이 openssl명령어를 입력하시면 developer_identity.pem파일이 생성되신것을 확인 하실 수 있습니다.

openssl x509 -in aps_development.cer -inform DER -out developer_identity.pem -outform PEM


5. 다음으로 개발자의 개인키 mykey.p12파일을 .pem으로 변환합니다.

변환하실때 비번입력을 3번 물어보게 되는데요 첫번째 입력에는 내보내기할 때 입력했던 비밀번호를 입력하시고 나머지 2번,3번째에는 .p12파일로 변환할때 사용할 비밀번호를 입력하시면 됩니다. 

openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem


6. 마지막으로 .pem로 변환한 인증서과 개인키를 .p12파일로 변환합니다.

변환할때 5번의 2,3번째 입력했던 비밀번호를 입력하시면 변환이 완료됩니다.

openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out dev_push_cert.p12


기존에는 간단하게 키체인 접근에서 cert파일과개인키를 .p12파일로 내보내기 해서 생성했던 방식에 비해 굉장히 번거롭고 어렵네요.


그럼 Java apns을 위한 인증서 생성방법을 맞치겠습니다.~


핵심부분만 설명을 해서 처음인증서를 생성하시려는 분들에게는 어려움이 있을것같아 레퍼런스URL을 알려드리겠습니다.

http://ddirty.tistory.com/50


-인증서 생성을 위해 참고했던 링크

http://stackoverflow.com/questions/20077626/whats-the-correct-format-for-java-apns-certificate

- java apns 오픈소스
- 예전방식으로는 이제 Push가 발송되지 않으니 참고바랍니다


'연구개발 > IOS' 카테고리의 다른 글

ios  (0) 2017.07.18
APNS 따라하기 시리즈 (인증서 만들기)  (0) 2016.03.21

  102  locale

  103  apt-get install lanuage-pack-ko

  104  apt-get update

  105  apt-get install language-pack-ko

  106  locale

  107  locale-gen ko_KR.UTF-8

  108  dpkg-reconfigure locales

  109  locale

  110  vi /etc/default/locale -> 


#LANG="en_US.UTF-8"


LANG="ko_KR.UTF-8"

LANGUAGE="ko_KR:ko:en_US:en"


  111  reboot




'연구개발 > Ubuntu' 카테고리의 다른 글

jenkins (젠킨스) 설치  (0) 2017.07.06
우분투 계정 관리  (0) 2017.06.13
[Ubuntu] 시간 동기화 - ntpdate  (0) 2014.12.12
ubuntu mysql 삭제  (0) 2014.10.27
Ubuntu 12.04에서 chkconfig 사용  (0) 2014.10.01

ImportError: libSM.so.6: cannot open shared object file: No such file or directory


apt-get install -y python-qt4


'Program > Python' 카테고리의 다른 글

Python SQL Injection 피하기  (0) 2016.09.28
mysqldb  (0) 2016.09.28
MIT 6.00 컴퓨터 공학과 프로그래밍(Python) 오픈 코스  (0) 2016.05.15
python mysql mssql  (0) 2016.05.13
파이썬 라이브러리를 활용한 데이터 분석  (0) 2016.05.09

- AWS에서 우분투 돌려서 공부용으로 사용하고 있는데 한글 입력이 안된다. 문제의 원인은 시스템 locale이 미국 영어로 되어있기 때문인데, 이것을 변경해주면 한글을 사용할 수 있다.

- 일단 locale을 확인해본다. 아마 미국 영어로 되어 있을 것이다.

    $ locale

- 우선 첫번째 할 일은 한글 입력 패키지를 다운받아 설치해야한다. apt-get으로 간단히 설치할 수 있는데, 문제는 어떤 패키지가 있는지 알기 힘들다는것... 구글링 결과 여러가지 썰이 있었는데 아래의 것을 설치하면 된다.

    $ sudo apt-get install language-pack-ko

- 다음으로 시스템 전체의 locale을 변경한 후 설정한다.

    $ sudo locale-gen ko_KR.UTF-8

    $ sudo dpkg-reconfigure locales


- 그리고 다음번 부팅할 때도 기본적으로 한글을 사용하기 위해 /etc/default/locale 파일을 아래와 같이 변경해준다.

    LANG="ko_KR.UTF-8"
    LANGUAGE="ko_KR:ko:en_US:en"

- 이제 다시 접속할 때마다 자동으로 한글을 사용할 수 있다.

- 단! 이렇게 했음에도 한글이 제대로 표시/입력되지 않을 수 있는데 그건 사용하는 터미널 프로그램의 설정이 잘못되어있기 때문이다. 아마존 클라우드는 SSH를 사용하고, 아무래도 많이 사용하는 프로그램이 putty 일테니 putty 기준으로 설명하면(사실 본인이 putty를 쓰기 때문), putty 설정창의 Window->Translation 항목을 보면 Remote character set이 있다. 이게 기본값이 Use font encoding으로 되어 있는데 이걸 UTF-8으로 바꾸면 정상적으로 한글을 사용할 수 있다.

'연구개발 > AWS' 카테고리의 다른 글

[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
centos lrzsz  (0) 2017.06.12
aws. instance. clone. 복제  (0) 2016.02.19
리눅스 시간 동기화  (0) 2015.11.06
[AWS]EC2 centOS 인스턴스 스토리지 확장하기  (0) 2015.11.06


MIT 공대에서 컴퓨터 공학과 프로그래밍 소개에 관한 강의가 유튜브에 올라왔다. 최근에 업로드된 강의가 있음에도 이 강의들을 정리한 이유는 아무래도 한글 자막이 잘 되어 있기 때문이다.

출처 : MIT OpenCourseWare YouTube

교수 : Eric Grimson, John Guttag

제 01강 - 연산이란 - 데이터 타입, 연산자 및 변수 소개

제 02강 - 연산자와 피연산자 - 분기문, 조건문 그리고 반복문

제 03강 - 공통 코드 패턴, 반복 프로그램

제 04강 - 기능을 통한 분해 및 추상화, 재귀 소개

제 05강 - 부동 소수점, 계통적 명세화, 루트 찾기

제 06강 - 이분법, 뉴턴/랩슨, 그리고 리스트 소개

제 07강 - 리스트와 가변성, 딕셔너리, 의사코드, 그리고 효율성 소개

제 08강 - 복잡성 - 로그, 선형, 이차 방정식, 지수 연산 알고리즘

제 09강 - 이진 탐색, 버블 그리고 분류 선택

제 10강 - 분할 정복 방법, 합병 정렬, 예외

제 11강 - 테스트와 디버깅

제 12강 - 디버깅 추가 강의, 배낭 문제, 동적 프로그래밍 소개

제 13강 - 동적 프로그래밍 - Overlapping subproblems, Optimal substructure

제 14강 - 배낭 문제 분석, 객체 지향 프로그래밍 소개

제 15강 - 추상 데이터 타입, 클래스와 메소드

제 16강 - 캡슐화, 상속, 쉐도잉

제 17강 - 연산 모델 - 랜덤워크 시뮬레이션

제 18강 - 시물레이션 결과 제시, Pylab, Plotting

제 19강 - 편향된 랜덤워크, 배포

제 20강 - 몬테카를로(Monte Carlo) 시뮬레이션, 추정 파이

제 21강 - 시뮬레이션 결과 검증, 곡선 적합, 선형 회귀

제 22강 - 일반, 균등 그리고 지수 분포 - 통계의 오류

제 23강 - 주식 시장 시뮬레이션

제 24강 - 과정 개요 - 컴퓨터 과학자들은 무엇을 하나요?


'Program > Python' 카테고리의 다른 글

mysqldb  (0) 2016.09.28
libSM.so.6  (0) 2016.05.22
python mysql mssql  (0) 2016.05.13
파이썬 라이브러리를 활용한 데이터 분석  (0) 2016.05.09
ipython ubuntu Anaconda  (0) 2016.05.03



apt-get install python-pip


pip

pip --upgrade

apt-get update

apt-get install python-pip

pip show MySQL-python

pip install MySQL-python

pip install --upgrade

pip install --upgrade pip

pip install MySQL-python

apt-get install libmysqlclient-dev python-dev

pip install MySQL-python


apt-get purge python-pymssql

apt-get install freetds-dev

pip install pymssql



'Program > Python' 카테고리의 다른 글

libSM.so.6  (0) 2016.05.22
MIT 6.00 컴퓨터 공학과 프로그래밍(Python) 오픈 코스  (0) 2016.05.15
파이썬 라이브러리를 활용한 데이터 분석  (0) 2016.05.09
ipython ubuntu Anaconda  (0) 2016.05.03
[python] MySQL 연결  (0) 2014.11.05

CHAPTER 1 시작하기 전에
1.1 이 책은?
1.2 왜 데이터 분석을 위한 파이썬인가?
1.2.1 접착제처럼 사용하는 파이썬
1.2.2 한 가지 언어만 사용
1.2.3 파이썬을 사용하면 안 되는 경우
1.3 필수 파이썬 라이브러리
1.3.1 NumPy
1.3.2 pandas
1.3.3 matplotlib
1.3.4 IPython
1.3.5 SciPy
1.4 설치와 설정
1.4.1 윈도우
1.4.2 애플 OS X
1.4.3 리눅스
1.4.4 파이썬 2.x와 파이썬 3.x
1.4.5 통합 개발 환경
1.5 커뮤니티와 컨퍼런스
1.6 이 책을 살펴보는 방법
1.6.1 예제 코드
1.6.2 예제에 사용된 데이터
1.6.3 import 컨벤션
1.6.4 용어
1.7 감사의 말

CHAPTER 2 사례 소개
2.1 bit.ly의 1.usa.gov 데이터
2.1.1 순수 파이썬으로 표준시간대 세어보기
2.1.2 pandas로 표준시간대 세어보기
2.2 MovieLens의 영화 평점 데이터
2.2.1 평점 차이 구하기
2.3 신생아 이름
2.3.1 이름 유행 분석
2.4 맺음말

CHAPTER 3 IPython 소개
3.1 IPython 기본
3.1.1 탭 자동 완성
3.1.2 자기관찰
3.1.3 %run 명령어
3.1.4 클립보드에 있는 코드 실행하기
3.1.5 키보드 단축키
3.1.6 예외와 트레이스백
3.1.7 매직 명령어
3.1.8 Qt 기반의 GUI 콘솔
3.1.9 Pylab 모드와 Matplolib 통합
3.2 명령어 히스토리 사용하기
3.2.1 명령어 검색과 재사용
3.2.2 입middot;출력 변수
3.2.3 입middot;출력 기록하기
3.3 운영체제와 함께 사용하기
3.3.1 셸 명령어와 별칭
3.3.2 디렉터리 북마크 시스템
3.4 소프트웨어 개발 도구
3.4.1 인터랙티브 디버거
3.4.2 코드 시간 측정: %time과 %timeit
3.4.3 기본적인 프로파일링: %prun과 %run -p
3.4.4 함수의 각 줄마다 프로파일링하기
3.5 IPython HTML 노트북
3.6 IPython을 사용한 제품 개발을 위한 팁
3.6.1 모듈 의존성 리로딩하기
3.6.2 코드 설계 팁
3.7 IPython 고급 기능
3.7.1 IPython 친화적인 클래스 만들기
3.7.2 프로파일과 설정
3.8 감사의 글

CHAPTER 4 NumPy 기본: 배열과 벡터 계산
4.1 NumPy ndarray: 다차원 배열 객체
4.1.1 ndarray 생성
4.1.2 ndarray의 자료형
4.1.3 배열과 스칼라 간의 연산
4.1.4 색인과 슬라이싱 기초
4.1.5 불리언 색인
4.1.6 팬시 색인
4.1.7 배열 전치와 축 바꾸기
4.2 유니버설 함수
4.3 배열을 사용한 데이터 처리
4.3.1 배열연산으로 조건절 표현하기
4.3.2 수학 메서드와 통계 메서드
4.3.3 불리언 배열을 위한 메서드
4.3.4 정렬
4.3.5 집합 함수
4.4 배열의 파일 입middot;출력
4.4.1 배열을 바이너리 형식으로 디스크에 저장하기
4.4.2 텍스트 파일 불러오기와 저장하기
4.5 선형대수
4.6 난수 생성
4.7 계단 오르내리기 예제
4.7.1 한 번에 계단 오르내리기 시뮬레이션하기

CHAPTER 5 pandas 시작하기
5.1 pandas 자료 구조 소개
5.1.1 Series
5.1.2 DataFrame
5.1.3 색인 객체
5.2 핵심 기능
5.2.1 재색인
5.2.2 하나의 로우 또는 칼럼 삭제하기
5.2.3 색인하기, 선택하기, 거르기
5.2.4 산술연산과 데이터 정렬
5.2.5 함수 적용과 매핑
5.2.6 정렬과 순위
5.2.7 중복 색인
5.3 기술통계 계산과 요약
5.3.1 상관관계와 공분산
5.3.2 유일 값, 값 세기, 멤버십
5.4 누락된 데이터 처리하기
5.4.1 누락된 데이터 골라내기
5.4.2 누락된 값 채우기
5.5 계층적 색인
5.5.1 계층 순서 바꾸고 정렬하기
5.5.2 단계별 요약통계
5.5.3 DataFrame의 칼럼 사용하기
5.6 pandas와 관련된 기타 주제
5.6.1 정수 색인
5.6.2 Panel 데이터

CHAPTER 6 데이터 로딩, 저장, 파일 형식
6.1 텍스트 파일 이용하는 방법
6.1.1 텍스트 파일 조금씩 읽어오기
6.1.2 데이터를 텍스트 형식으로 기록하기
6.1.3 수동으로 구분 형식 처리하기
6.1.4 JSON 데이터
6.1.5 XML과 HTML: 웹 내용 긁어오기
6.2 이진 데이터 형식
6.2.1 HDF5 형식 사용하기
6.2.2 마이크로소프트 엑셀 파일에서 데이터 읽어오기
6.3 HTML, 웹 API와 함께 사용하기
6.4 데이터베이스와 함께 사용하기
6.4.1 MongoDB에 데이터 저장하고 불러오기

CHAPTER 7 데이터 준비하기: 다듬기, 변형, 병합
7.1 데이터 합치기
7.1.1 데이터베이스 스타일로 DataFrame 합치기
7.1.2 색인 머지하기
7.1.3 축 따라 이어붙이기
7.1.4 겹치는 데이터 합치기
7.2 재형성과 피벗
7.2.1 계층적 색인으로 재형성하기
7.2.2 피버팅으로 데이터 나열 방식 바꾸기
7.3 데이터 변형
7.3.1 중복 제거하기
7.3.2 함수나 매핑 이용해 데이터 변형하기
7.3.3 값 치환하기
7.3.4 축 색인 이름 바꾸기
7.3.5 개별화와 양자화
7.3.6 특이값 찾아내고 제외하기
7.3.7 치환과 임의 샘플링
7.3.8 표시자/더미 변수
7.4 문자열 다루기
7.4.1 문자열 객체 메서드
7.4.2 정규표현식
7.4.3 pandas의 벡터화된 문자열 함수
7.5 예제: 미국 농무부 음식 데이터베이스

CHAPTER 8 도식화와 시각화
8.1 matplotlib API 간략하게 살펴보기
8.1.1 Figure와 서브플롯
8.1.2 색상, 마커, 선 스타일
8.1.3 눈금, 라벨, 범례
8.1.4 주석과 그림 추가
8.1.5 그래프를 파일로 저장
8.1.6 matplotlib 설정
8.2 pandas에서 그래프 그리기
8.2.1 선 그래프
8.2.2 막대 그래프
8.2.3 히스토그램과 밀도 그래프
8.2.4 산포도
8.3 지도 그리기: 아이티 지진 데이터 시각화하기
8.4 파이썬 시각화 도구 생태계
8.4.1 Chaco
8.4.2 mayavi
8.4.3 기타 패키지
8.4.4 시각화 도구의 미래

CHAPTER 9 데이터 수집과 그룹 연산
9.1 GroupBy 메카닉
9.1.1 그룹 간 순회하기
9.1.2 칼럼 또는 칼럼의 일부만 선택하기
9.1.3 사전과 Series에서 묶기
9.1.4 함수로 묶기
9.1.5 색인 단계로 묶기
9.2 데이터 수집
9.2.1 칼럼에 여러 가지 함수 적용하기
9.2.2 색인되지 않은 형태로 집계된 데이터 반환하기
9.3 그룹별 연산과 변형
9.3.1 apply: 분리-적용-병합
9.3.2 변위치 분석과 버킷 분석
9.3.3 예제: 그룹에 국한된 값으로 누락된 값 채우기
9.3.4 예제: 랜덤 표본과 순열
9.3.5 예제: 그룹 가중 평균과 상관관계
9.3.6 예제: 그룹 상의 선형 회귀
9.4 피벗 테이블과 교차일람표
9.4.1 교차일람표
9.5 예제: 2012년 연방 선거관리위원회 데이터베이스
9.5.1 직장 및 피고용별 기부 통계
9.5.2 기부금액
9.5.3 주별 기부 통계

CHAPTER 10 시계열
10.1 날짜, 시간 자료형, 도구
10.1.1 문자열을 datetime으로 변환하기
10.2 시계열 기초
10.2.1 인덱싱, 선택, 부분 선택
10.2.2 중복된 색인을 갖는 시계열
10.3 날짜 범위, 빈도, 이동
10.3.1 날짜 범위 생성하기
10.3.2 빈도와 날짜 오프셋
10.3.3 데이터 시프트
10.4 시간대 다루기
10.4.1 지역화와 변환
10.4.2 시간대 고려해 Timestamp 객체 다루기
10.4.3 다른 시간대 간의 연산
10.5 기간과 기간 연산
10.5.1 Period의 빈도 변환
10.5.2 분기 빈도
10.5.3 타임스탬프와 기간 서로 변환하기
10.5.4 배열을 이용해 PeriodIndex 생성하기
10.6 리샘플링과 빈도 변환
10.6.1 다운샘플링
10.6.2 업샘플링과 보간
10.6.3 기간 리샘플링
10.7 시계열 그래프
10.8 이동창 기능
10.8.1 지수 가중 함수
10.8.2 이진 이동창 함수
10.8.3 사용자 정의 이동창 함수
10.9 성능과 메모리 사용량에 대한 노트

CHAPTER 11 금융, 경제 데이터 애플리케이션
11.1 데이터 준비
11.1.1 시계열과 크로스 섹션 정렬
11.1.2 다른 빈도를 가지는 시계열 연산
11.1.3 일별 시간과 현재 최신 데이터 선택하기
11.1.4 데이터와 함께 나누기
11.1.5 수익 지수와 누적 수익
11.2 그룹 변환과 분석
11.2.1 그룹 요인 밝히기
11.2.2 십분위와 사분위 분석
11.3 추가 예제 애플리케이션
11.3.1 신호 경계 분석
11.3.2 선물 계약 롤링
11.3.3 롤링 상관관계와 선형 회귀

CHAPTER 12 고급 NumPy
12.1 ndarray 객체 내부 알아보기
12.1.1 NumPy dtype 구조
12.2 고급 배열 조작 기법
12.2.1 배열 재형성하기
12.2.2 C와 포트란 순서
12.2.3 배열 이어붙이고 나누기
12.2.4 원소 반복시키기: repeat과 tile
12.2.5 팬시 색인: take와 put
12.3 브로드캐스팅
12.3.1 다른 축에 대해 브로드캐스팅하기
12.3.2 브로드캐스팅 이용해 배열에 값 대입하기
12.4 고급 ufunc 사용법
12.4.1 ufunc 인스턴스 메서드
12.4.2 사용자 ufunc
12.5 구조화된 배열과 레코드 배열
12.5.1 중첩된 dtype과 다차원 필드
12.5.2 구조화된 배열을 사용해야 하는 이유
12.5.3 구조화된 배열 다루기: numpy.lib.recfunctions
12.6 정렬에 관하여
12.6.1 간접 정렬: argsort와 lexsort
12.6.2 다른 정렬 알고리즘
12.6.3 numpy.searchsorted: 정렬된 배열에서 원소 찾기
12.7 NumPy matrix 클래스
12.8 고급 배열 입middot;출력
12.8.1 메모리 맵 파일
12.8.2 HDF5 및 기타 배열 저장 옵션
12.9 성능 팁
12.9.1 인접 메모리의 중요성
12.9.2 기타 성능 옵션: Cython, f2py, C

부록 파이썬 언어의 기본
A.1 파이썬 인터프리터
A.2 파이썬 기초
A.2.1 시멘틱
A.2.2 스칼라형
A.2.3 흐름 제어
A.3 자료 구조와 순차 자료형
A.3.1 튜플
A.3.2 리스트
A.3.3 내장 순차 자료형 함수
A.3.4 사전
A.3.5 세트
A.3.6 리스트 내포, 사전 내포, 세트 내포
A.4 함수
A.4.1 네임스페이스, 스코프, 지역 함수
A.4.2 여러 값 반환하기
A.4.3 함수도 객체다
A.4.4 익명 함수
A.4.5 클로저: 함수를 반환하는 함수
A.4.6 *args와 **kwargs를 사용해서 호출 문법 확장하기
A.4.7 커링: 일부 인자만 취하기
A.4.8 제너레이터
A.5 파일과 운영체제

'Program > Python' 카테고리의 다른 글

MIT 6.00 컴퓨터 공학과 프로그래밍(Python) 오픈 코스  (0) 2016.05.15
python mysql mssql  (0) 2016.05.13
ipython ubuntu Anaconda  (0) 2016.05.03
[python] MySQL 연결  (0) 2014.11.05
python - mysql MySQLdb  (0) 2014.11.05

R3-EERM-DWN7-GFWT-ZA47-RD2P

'연구개발 > Etc..' 카테고리의 다른 글

운영체제 개론  (0) 2017.05.29
지표 관련 용어  (0) 2016.08.22
RAID 1+0 과 0+1의 차이점  (0) 2011.07.11
윈도우 보안취약점 보완 강화  (0) 2011.05.04
페이스북 소셜 앱 개발 가이드 2011  (0) 2011.03.28

Updates:
7th January, 2016 - changes made according to new Anaconda distribution (v2.4.1) which contains Jupyter Notebook.
Note: The update to the video tutorial is still in progress so please don't refer it for now. Once, I have updated it, I'll remove this note from here.


I hope everyone is familiar with the AWS (Amazon Web Services) and how to use iPython (Now Jupyter) Notebooks. If you are not familiar with Jupyter Notebook and you work with Python, then you are definitely missing a very important tool in you work. Please go through this video which is a short tutorial on iPython (Jupyter) Notebook.

OK, to begin with, I'll list all the steps to create an Jupyter Notebook Server on an EC2 Instance in a step-wise fashion. I have also created a Youtube Video for this post, which you can check it out here.(update in progress to the video. please don't refer it for now)

The reason for deploying Jupyter Notebook Server on AWS is to access all my Notebooks from anywhere in the World, just using my browser and also be able to work with them.

Enough of talking, let's begin:

1. Login to your Amazon Management Console. If you don't have an account yet, you can create one for it. You get 1 yr of free access to some of the services, which you can check out at this link

2. Create a new EC2 Instance with Ubuntu. If you are not familiar with how to create an EC2 instance, you can check out the video of this blog, in which I go through the steps from the beginning.

3. The important thing to remember while creating the instance is to assign the security group settings as mentioned in the image below


4. Launch your instance and ssh into it to perform the following operations
  • First of all we are going to use Anaconda Python Distribution for installing all the required Python libraries. This is a free distribution and we are going to use the Linux version of it. Remember to verify the latest version of the distribution from the site. This blog is updated to reflect the changes in the latest Anaconda distribution - 2.4.1.
    $ wget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda2-2.4.1-Linux-x86_64.sh
       
  • Next we will bash to run this .sh file. You need to accept the license terms and set the installation directory for the anaconda distribution. I use the default one only, which is "/home/ubuntu/anaconda2/". Also, it asks you to add the default path of anaconda python to your .bashrc profile. You can accept to do it or add it manually.
    $ bash Anaconda2-2.4.1-Linux-x86_64.sh
       
  • Now you need to check, which python version you are using, just to confirm if we are using the one from Anaconda Distribution or not. You can do this by using
    $ which python
       
    This will list the python your system is currently using. If it does not mentions the one from ".../anaconda2/..." folder, then you can use the following command to re-load your.bashrc, so as to set the correct python
    $ source .bashrc
       
  • Open the iPython Terminal to get an encrypted password so as to use it for logging into our iPython Notebook Server. Remember to copy and save the output of this command, which will be an encrypted password, something like "sha1..."
    $ ipython
    In [1]:from IPython.lib import passwd
    In [2]:passwd()
    and exit out of ipython terminal using "exit" command. [ I'm not gonna use this password(shown in the pic below), so don't waste your time trying to copy and use it. ;) ]
  • Now we're going to create the configuration profile for our Jupyter Notebook server
    $ jupyter notebook --generate-config
       
  • The next thing is going to be to create a self-signed certificate for accessing our Notebooks through HTTPS
    $ mkdir certs
    $ cd certs
    $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
       
    it will ask some questions, please answer them to the best of your knowledge as some of them are required to successfully create the certificate.

  • It's time to change the config settings of our server
    $ cd ~/.jupyter/
    $ vi jupyter_notebook_config.py
       
    You will see a long list of configuration settings. You can go through each one of them and uncomment them as you like, but for me I know what I want, so I'll add the following settings to the top of the file and leave the rest commented as it is.
    c = get_config()
    
    # Kernel config
    c.IPKernelApp.pylab = 'inline'  # if you want plotting support always in your notebook
    
    # Notebook config
    c.NotebookApp.certfile = u'/home/ubuntu/certs/mycert.pem' #location of your certificate file
    c.NotebookApp.ip = '*'
    c.NotebookApp.open_browser = False  #so that the ipython notebook does not opens up a browser by default
    c.NotebookApp.password = u'sha1:68c136a5b064...'  #the encrypted password we generated above
    # It is a good idea to put it on a known, fixed port
    c.NotebookApp.port = 8888
       
  • We are almost done. Now its time to start our Jupyter notebook server. For this, first I'll create a new folder which will store all my notebooks
    $ cd ~
    $ mkdir Notebooks
    $ cd Notebooks
       
    and now I'll start my notebook server
    $ jupyter notebook
       
5. And that is all. Now you can access your Notebook from anywhere through your browser. Just navigate to the DNS name, or Public IP of your instance, along with the port number. (By default, the browser adds "http" to the url. Please remember to update it to "https")
You will be asked by your browser to trust the certificate, as we have signed it on our own, so we know we can trust it. See images for reference below:





6. Login, using the password you specified when you used the iPython Terminal to create an encrypted version of it and you are good to go.


7. One thing to note is that if you close the ssh access to your instance, your notebook server will not work. To keep it working, even when you close the ssh access to the server you can use the following command
$ nohup jupyter notebook
  

This will put your server process as no-hangup and will keep it running even if you close the ssh access to the instance 

8. Later, if you decide you want to stop this process, you have to find the PID of this process. you can do so by going into your notebooks folder and using the command
$ lsof nohup.out
  

which will list the PID of the nohup process which is running(if any). 
Then you can use the kill command to kill this process and stop your ipython notebook server. 

$ kill -9 "PID"
  

replace "PID" with the ID of the process you get from the "lsof" command. 

So, that is all you need to run an iPython Notebook on AWS EC2 instance. Please leave your comments about this blog post and do remember to check out its video.(update in progress to the video. please don't refer it for now)

Until next time... :)

응용 프로그램별 권한 설정에서 CLSID가 
{806835AE-FD04-4870-A1E8-D65535358293}
이고 APPID가 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}인 COM 서버 응용 프로그램에 대한 로컬 활성화 사용 권한을
응용 프로그램 컨테이너 사용할 수 없음 SID(사용할 수 없음)에서 실행 중인 주소 LocalHost(LRPC 사용)의 
사용자 NT SERVICE\SQLSERVERAGENT SID(S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430)에게 부여하지 않았습니다. 
구성 요소 서비스 관리 도구를 사용하여 이 보안 권한을 수정할 수 있습니다.

(영문)

The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID 
{806835AE-FD04-4870-A1E8-D65535358293}
 and APPID 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}
 to the user MyDomain\MyLogin SID (S-1-5-21-1688516961-3049443350-111816674-1126) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.





구성요소 서비스 -> 컴퓨터 -> 내컴퓨터 -> DCOM구성에서 Microsoft SQL Server Integration Services 12.0를 찾습니다.

응용 프로그램 ID가 {EE4171E6-C37E-4D04-AF4C-8617BC7D4914} 인지 확인합니다.

속성 -> 보안 -> 시작 및 활성화 권한에서 편집 버튼을 클릭합니다.

추가버튼을 클릭하고 계정을 추가합니다.

위 오류에서 보면 계정은 NT SERVICE\SQLSERVERAGENT가 되어야 겠네요.

로컬 시작과 로컬 활성화 권한을 부여합니다.

확인 버튼을 클릭하고 마무리 합니다.



NT SERVICE\SQLSERVERAGENT 계정 입력방법은 처음 답변했던 내용 대로입니다.

선택할 개체이름을 입력하세요 부분에서 NT SERVICE\SQLSERVERAGENT를 직접 입력해주시면 됩니다.

고급 버튼을 눌러서 검색해봐도 NT SERVICE\SQLSERVERAGENT 계정이 나오지 않습니다. 직접 입력해야 합니다.



'연구개발 > DBA' 카테고리의 다른 글

oracle mssql linked server  (0) 2018.04.17
select 처리순서  (0) 2017.08.02
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16

APNS 포스팅 개요

1년만에 다시 푸쉬서비스를 만들려고 하니 기억도 안나고 검색해서 찾아보니 너무 옛날 데이터들이라 헷갈리기도 해서 “이참에 좀 자세하게 기록해놓자!!” 하는 마음에 포스팅을 했습니다. 총 3단계로 나누어 인증서 설치, 서버단에서 푸시 보내기, 앱단에서 푸시 처리하기로 해서 포스팅을 시작하고자 합니다.
APNS란 용어는 애플 개발자 레퍼런스에도 너무 자세하게 나와있고 검색해도 수도 없이 나오기때문에 생략하고 철저하게 개발 적용에만 촛점을 맞추도록 하겠습니다.

 

APNS 인증서 발급 조건

  • 발급일 2013년 7월경
  • Mac OS  X 버전 10.8.4 (산사자)
  • Xcode 버전 4.6.3
  • iOS7이 베타3까지 출시

 

APNS 인증서 발급을 위한 개인 인증서 만들기

우선 애플(Apple) 사이트에서 Notification 인증서를 만들기 위해서는 아래와 같이 키체인을 이용해
CertificateSigningRequest.certSigningRequest 라는 인증서를 만들어야 합니다.

이 인증서는 Notification 인증서를 발급받을 때 반드시 필요하니 우선 따라서 만들어 봅시다.
키체인(Keychain)을 실행한 후 다음과 같이 따라 해보세요!



키체인을 실행한 후 키체인접근> 인증서지원 > 인증 기관에서 인증서 요청을 누릅니다.

 



디스크저장됨을 선택하고 본인이 키 쌍 정보 저장을 체크하세요! 특히 이메일은 개발하는 애플 개발자 아이디를 넣어주시기 바랍니다.





그림과 같이 설정하시고 다음으로 넘어가세요!



인증서 서명을 하기 위한 요청 파일이 완성되었습니다.

이렇게 작업을 완료하시고 Finder에서 보기를 눌러 보시면 다음과 같은 파일이 만들어집니다.

CertificateSigningRequest.certSigningRequest

 

 

APNS 인증서 발급받기

반드시 애플 개발자 계정을 가지고 계셔야 접근하실 수 있습니다. 일반 애플 계정과는 다르니 안되시는 분은 개발자 등록부터 해주시기 바랍니다.

이제 개인 인증서를 만들었으니 애플 개발자 사이트로 이동합니다.
개발자 사이트에 접속하시면 상단에 Member Center라는 곳이 있습니다.
접속하시면 바로 아래의 이미지와 같은 화면을 보실 수 있습니다. 그림을 보시면서 순서대로 따라하시면 금방 APNS용 인증서를 발급받을 수 있습니다.
그럼, 멤버센터에서 Certificates, Identifiers & Profiles > Identifiers > APP ID’s 메뉴로 이동하세요!

 



멤버센터 메인 화면에서 빨간 박스의 Certificates, Identifiers & Profiles를 클릭하세요!



APP IDs 메뉴를 눌러 들어온 화면입니다. 자신이 만들어놓은 앱아이디를 한눈에 보실 수 있습니다. 그럼, 노티를 원하는 앱아이디를 선택하세요!



선택하시면 해당 앱에서 무슨 서비스가 연동되고 사용되는지 한눈에 보실 수 있습니다. 그중 Push Notification 서비스가 Enable 되어있는지 확인하고 Disable 되어있으면 하단의 Edit 버튼을 누릅니다.



저는 이미 만들어 놓아 인증서 내역이 보이지만 몇개고 만들 수 있습니다. 개발용과 배포용으로 만들 수 있으며 우선 개발용으로 해보겠습니다. 자 그럼, Create Certificate를 눌러주세요!



이과정은 아까 맥에서 만들었던 인증서를 만드는 방법에 대해서 안내해주는 화면입니다. 우린 이미 만들었으니 다음 단계로 넘어가시죠!



아까 만들었던 인증서를 업로드해야 합니다. Choose File을 눌러 CertificateSigningRequest.certSigningRequest 파일을 연결해주세요!



자! 그럼 Generate를 눌러 APNS 인증서를 발급받아보세요!



드디어 인증서가 만들어졌습니다. 다운로드를 눌러주세요!



인증서가 이제 다운되었습니다. 다음은 인증서를 클릭해 실행해주세요! 그럼 키체인에 인증서가 추가됩니다.

 

이렇게 해서 인증서 발급을 과정을 마쳤습니다. 생각보다 어렵지 않습니다.
자 그럼, 이제부터가 중요한데요! 서버에 직접 설치할 인증서를 만들어 보겠습니다.

 

APNS 서버인증서 만들기

서버인증서를 만드는 작업을 하기전에 우선 키체인을 열어 방금 설치한 Apple Development(or Production) iOS Push Services: kr.co.godo.godo 인증서를 찾아서 Export(내보내기)를 해서 .p12 파일로 만들어줘야 합니다.
다음의 그림을 보면서 따라하시면 되겠습니다. 그림과 같이 인증서 옆에 화살표 아이콘이 있고 그걸 누르면 개인키가 나타나오니 참고하시면서 작업하시기 바랍니다.



저는 개발과 출시용 Push Service 인증서를 둘다 설치해서 2개가 나타나며 원하는 것을 선택해서 만들어주시면 됩니다.



우선 그림과 같이 마우스 오른쪽을 눌러 보내기 메뉴를 눌러주세요!



그럼 이러한 창이 뜰 것이고 별도저장(Save as)에 cert라고 넣어주세요!



저장을 누르면 패스워드를 넣으라는 창이 나타납니다. 이곳에 원하는 패스워드를 넣고 승인을 눌러주세요!



다음은 개인키입니다. 그림과 같이 열쇠모양의 개인키를 선택해 오른쪽 마우스 눌러 보내기를 클릭합니다.



별도저장(Save as)에 key라고 입력하고 저장을 눌러줍니다.



외우기 쉽도록 cert에서 만든 패스워드를 동일하게 넣어주세요!

 

이작업을 하시면 바탕화면(여러분이 지정한 경로)에 cert.p12와 key.p12 파일들이 만들어집니다.
이제부터 중요합니다. 인증서 형식을 변환하기 위한 작업으로 Terminal에서 작업을 할 것 입니다.
딱 4가지 명령만 실행하시면 됩니다.  ———- 이걸로 표시된 부분은 결과값을 보여주려고 나타낸 것이니 터미널에서는 입력하지 말아주세요!

다음과 같이 입력하고 엔터를 치면 비밀번호를 물어봅니다.
이 비밀번호는 아까 cert.p12 만들때 작성하신 패스워드를 넣어주시면 됩니다.
이렇게 하고 나면 해당 경로에 cert.pem 이라는 파일이 생깁니다.

 

위 코드는 key.p12를 key.pem으로 만들어주는 작업입니다.
바로 윗부분에 cert.pem 만드는 작업과 동일하지만 마지막에 패스워드를 생성하는 작업을 해주셔야 합니다.

 

위에서 만들어진 key.pem을 가지고 key.unencrypted.pem을 만드는 코드입니다.
하단의 출력결과에도 써있다 시피 윗단계에서 새로 생성한 패스워드를 입력하시면 됩니다.
이제 마지막 하나가 남았습니다.

 

마지막부분에 apns.pem이라고 적어놓은 부분은 여러분이 만들고 싶은 이름으로 변경해서 작성해주시면 됩니다.
이렇게 마무리 하시면 작업하신 해당 경로에 아래리스트와 같이 6개의 파일들이 생성되어 있을 것이니 꼭 확인해주시기 바랍니다.

  • cert.p12
  • key.p12
  • cert.pem
  • key.pem
  • key.unencrypted.pem
  • apns.pem

 

윗 단계를 하나의 이미지로 보면 다음과 같습니다.



총 6개의 파일이 생성되며 터미널 안에 보시면 타이핑한 내역이 그대로 있습니다.

 

이제 모든 것이 끝났습니다. 결국 apns.pem 이 파일 하나 만들고자 이짓을 했던 것 입니다.
푸시서버로 구성할 곳으로 apns.pem 파일을 업로드 해주시면 됩니다.
위치는 아무곳에나 하셔도 상관없지만 경로만 알면 다운로드가 가능한 웹루트는 피하시기 바랍니다.

이렇게 만들어진 인증서를 이용해 SSL Connect의 연결을 유지한 상태에서 Push메시지를 발송하면 됩니다.
개발에 관련된 부분은 다음 스텝에서 안내해드리겠습니다.

 

http://qnibus.com/blog/how-to-make-certification-for-apns/

'연구개발 > IOS' 카테고리의 다른 글

ios  (0) 2017.07.18
java apns용 인증서(.p12)생성법  (0) 2016.07.14

USE [master]

GO

CREATE LOGIN [GulsAdmin] WITH PASSWORD=N'!@#dpaqhTld04', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Game]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GameInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GameInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Guild]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Guild]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GuildInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GuildInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Log]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Log]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Login]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Login]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [LoginInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [LoginInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Rank]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Rank]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Tool]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Tool]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'





USE [master]

GO

CREATE LOGIN [GulsWeb] WITH PASSWORD=N'qordjqvlftn$#@!', DEFAULT_DATABASE=[Guild], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Game]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GameInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GameInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Guild]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Guild]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GuildInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GuildInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Log]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Log]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Login]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Login]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [LoginInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [LoginInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Rank]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Rank]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Tool]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Tool]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;

'연구개발 > DBA' 카테고리의 다른 글

select 처리순서  (0) 2017.08.02
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04

USE master

GO

--1. tempdb의논리파일이름확인

SELECT name, physical_name, state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO


--2. ALTER DATABASE 사용하여파일위치변경

ALTER DATABASE tempdb

MODIFY FILE(NAME = tempdev, FILENAME = 'C:\TempDB\tempdb.mdf')

ALTER DATABASE tempdb

MODIFY FILE(NAME = templog, FILENAME = 'C:\TempDB\templog.ldf')

GO


--3. Processor만큼파일분할및사이즈변경및파일사이즈, 증가옵션설정

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'C:\TempDB\tempdev2.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'C:\TempDB\tempdev3.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'C:\TempDB\tempdev4.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev5', FILENAME = N'C:\TempDB\tempdev5.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev6', FILENAME = N'C:\TempDB\tempdev6.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev7', FILENAME = N'C:\TempDB\tempdev7.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev8', FILENAME = N'C:\TempDB\tempdev8.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', SIZE = 163840KB )

GO

--4.SQL Server 서비스 재시작.

 


--5.SQL Server 서비스가 시작된것을확인후 정사 이동 확인 

SELECT name, physical_name, state_desc 

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO



'연구개발 > DBA' 카테고리의 다른 글

Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
리소스 잠금 및 리소스 확인  (0) 2015.09.07

ubuntu 방화벽 설정


ufw enable 활성화

ufw disable 비활성화


ufw status 상태확인


ufw allow 22/tcp 허용


ufw deny 80/tcp 거부


ufw status verbose 확인

'연구개발 > Linux' 카테고리의 다른 글

VirtualEnv Wrapper를 이용한 파이썬 가상환경 설정  (0) 2017.04.05
centos fdisk  (0) 2017.03.30
zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
zabbix 3.0 설치  (0) 2016.02.23


http://www.tecmint.com/configure-zabbix-to-send-email-alerts-to-gmail/


This tutorial will briefly discuss you on how to setup Zabbix server to send mail reports to a Gmailaddress by using SSMTP program, without the need to install and configure any local MTA daemon, such as PostfixExim etc.

Requirements

  1. Install Zabbix Monitoring Server

Step 1: Install and Configure SSMTP

1. SSMTP is a small software, which does not fulfill any of the functionality of a mail server, but only delivers emails from a local machine to an external email address on a mailhub.

To install SSMTP program alongside with mailutils package that you will use it to send mails, issue the following command on your RedHat and Debian like server:

# yum install ssmtp mailx                    [On RHEL/CentOS 7] 
$ sudo apt-get install ssmtp mailutils       [On Debian 8]

2. After the packages are installed on the system, configure SSMTP program to send local emails to your Gmail account by opening the main configuration file for editing with your favorite text editor and root privileges and use the following parameter settings:

# vi /etc/ssmtp/ssmtp.conf                   [On RHEL/CentOS 7]
$ sudo nano /etc/ssmtp/ssmtp.conf            [On Debian 8]

SSMTP settings for GMAIL account

root=gmail-username@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=your_local_domain
hostname=your_local_FQDN
UseTLS=Yes
UseSTARTTLS=Yes
AuthUser=Gmail_username
AuthPass=Gmail_password
FromLineOverride=YES
Configure Zabbix Email Alerts

Configure Zabbix Email Alerts

Step 2: Gmail Tests for Zabbix Email Alerts

3. On the next step it’s time to send a local generated email to Gmail account by issuing the below command.

# echo "Body test email from 'hostname -f' "| mail -s "subject here" gmail_user@gmail.com
Gmail Tests

Gmail Tests

4. Normally, Gmail prevents different types of authentications to their servers from your account, so, in case you get the error “mail: cannot send message: Process exited with non-zero status”, then login to your Gmail account from browser and navigate to the following linkhttps://www.google.com/settings/security/lesssecureapps in order to allow access for less secure apps as in the following screen.

Manage Secure Gmail Apps

Manage Secure Gmail Apps

5. After you have turned on Less Secure Apps feature on your Gmail account, run the above mail command again and verify your Inbox after a few seconds to check if the locally generated email has been successfully delivered – you should normally see the email has incoming from Gmail.

Mail Delivery Confirm

Mail Delivery Confirm

Step 3: Configure Zabbix Sendmail Script

6. Further, based on the $(which mail) command create the following Bash script to Zabbixalertscripts directory with the following content and give it execute permissions:

# vi /usr/local/share/zabbix/alertscripts/zabbix-sendmail            [On RHEL/CentOS 7]
$ sudo nano /usr/local/share/zabbix/alertscripts/zabbix-sendmail     [On Debian 8]

Script content:

#!/bin/bash
echo "$3" | /usr/bin/mail -s "$2" $1
Configure Sendmail Zabbix

Configure Sendmail Zabbix

Next, set the execute permission on the script file.

# chmod +x /usr/local/share/zabbix/alertscripts/zabbix-sendmail

7. Next, as previously, test the script functionality by sending a local email to Gmail account. The way to run the script with positional parameters is explained above:

# /usr/local/share/zabbix/alertscripts/zabbix-sendmail gmail_username@gmail.com "Subject here" "Body of the message here"
Send Mail to Gmail Account from Linux

Send Mail to Gmail Account

Afterwards, verify Gmail Inbox and check if the new local message has arrived.

Verify Mail Delivery

Verify Mail Delivery

Step 4: Configure Zabbix to Send Alerts to Gmail

8. If the tests so far were successful, then you can move to next step and setup Zabbix to send generated email alerts to Gmail. First, login to Zabbix web interface and navigate to the following menu: Administration -> Media types -> Create media type.

Zabbix Administration

Zabbix Administration

9. On the next screen enter an arbitrary Name to uniquely identify for the script in the Zabbixconfigurations (in this example Send-Email-Script is used), choose Script as Type from the list and enter the name of the Bash script created earlier (zabbix-sendmail used in this tutorial) to send email from command line (don’t use the path for the script, only the script name). When you’re done, hit the Add button below to reflect changes.

Create Zabbix Email Alerts

Create Zabbix Email Alerts

10. Further, let’s configure an email address to which you will send Zabbix alerts. Go to Profile ->Media -> Add and a new pop-up window should appear.

Here, select the name of the script that you have earlier named (in this example Send-Email-Scriptis used) for Type, enter the Gmail address to which you will send emails, choose the time period (week, hours) when email reports should be active for sending, choose the severity of the messages that you want to receive on your Gmail address, select Enabled as Status and hit the Addbutton to add the media. Finally hit the Update button to apply configuration.

Configure Zabbix Mail Address

Configure Zabbix Mail Address

Zabbix Update Configuration

Zabbix Update Configuration

11. On the next step, enable the defult zabbix alerts by navigating to Configuration -> Actions, select as the Event Source – > Triggers from the right menu and hit on Disabled Status in order to enable it. Repeat the step for Event Source – > Internal or other custom created Actions and you’re done.

Enable Default Zabbix Mail Alert

Enable Default Zabbix Mail Alert

Zabbix Enabled Actions

Zabbix Enabled Actions

Wait for a while for Zabbix to start gather information and generate some reports, then verify yourGmail Inbox and you should see some Zabbix alerts submitted so far.

Zabbix Monitoring Mail Alerts

Zabbix Monitoring Mail Alerts

That’s all! Although this guide was mainly focused on sending Zabbix alerts to a Gmail account using Gmail SMTP server as a mailhub, using the same configuration you can, also, push zabbix email alerts further to other valid internet email accounts by relying on Gmail to route your emails through SMTP servers.

'연구개발 > Linux' 카테고리의 다른 글

centos fdisk  (0) 2017.03.30
ubuntu 방화벽  (0) 2016.03.14
swap  (0) 2016.03.02
zabbix 3.0 설치  (0) 2016.02.23
zabbix 설치  (0) 2015.11.17

http://banasun.tistory.com/91

composer를 update 중에 composer가 뻗어버리는 일이 발생하였습니다. 개발용으로 Virtual server를 이용하고 있는데, 아무래도 메모리가 적어서 그런 것 같습니다.

구글링을 해보니, swap 설정을 해주어야 한다고 하니 오늘은 이 척박한(!) 서버에 스왑으로 일단 돌아가게는 해놔야 하겠습니다.


1. 일단 free 명령으로 swap 파일이 있는지 확인부터 해줍니다. :

sudo free -m


위와 같이 swap이 0 0 이 나옵니다. 


2. 그러면 일단, 스왑 파일을 생성하겠습니다. 아래와 같이 해주면 4기가 크기의 파일이 생성됩니다:

sudo fallocate -4G /swapfile

이렇게 해주면 /swapfile 이라는 4G짜리 파일이 만들어지겠지요.


3. 이제 이 파일을 swap으로 이용하도록 설정하겠습니다. 그 전에 안전을 위해서 생성한 파일의 permission을 root만 읽고 쓸 수 있게 변경하겠습니다:

sudo chmod 600 /swapfile


4. 이제 이 파일을 swap 파일로 인식하게 해주면 되겠습니다.

sudo mkswap /swapfile

이러면 아래와 같이 반응이 옵니다.




5. 이제 swapon으로 스왑 파일을 활성화시키면 됩니다.

sudo swapon /swapfile

-s 옵션을 주면 이제 스왑이 실행되고 있는지 확인 가능합니다.

sudo swapon -s


vi /etc/fstab

/swapfile    none    swap    defaults    0 0

출처: http://boricha.springnote.com/pages/7091447

https://help.ubuntu.com/community/SwapFaq

영어 잘하는 사람은 링크를 보는게 훨씬 낫다.

 

  • swap 필요한 이유
  • Memory consuming programs. 많은 메모리를 필요로 하는 프로그램
  • Hibernation (suspend-to-disk). 절전모드 진입시 메모리(RAM)를 디스크로 저장.
  • Unforeseeable Circumstances. 예측하지 못한 이벤트발생시 문제를 해결하거나 작업을 저장할 수 있는 시간 확보.
  • Optimizing memory usage. 빠른 응답속도를 위한 cached memory. 그 확장을 더 효율적으로 하기 위함.. (???)
  • Optimizing Swap performance. 시스템영역과 스왑영역을 같은 디스크에 두면 성능에 좋지않다.. 이건 스왑이 필요한 이유가 아닌데...?

 

  • swap 용량을 얼마나 잡아야 하는가?
  • 최소한, 물리적으로 장작된 RAM 용량과 같을 것을 매우 권장(highly recommended) 한다.
  • 물리적으로 장착된 RAM 용량의 두배정도를 걍 권장(Also, it's recommended) 한다.
    옛날 메모리가 넘 비쌀때... 그런 권장사항이 생겼단다
  • 근데 예를 든 경우를 보니까 2G RAM 에 30G disk 인 경우 1G 쯤 잡아도 되나보다.
    그러니까..... 디스크용량이 메모리에 비해 너무 적은 경우에는 별수 없다..쯤 될까...아씨..;;;
  • 그냥.. 메모리 2G 쯤 되면 자기 메모리 만큼만 잡으면 되지 않을까 싶다. 아, 이건 만고 내생각.

 

  • 어떻게 swap 을 추가할 수 있나?
    - 대부분, OS설치시 스왑파티션을 만들지만 이미 설치된 시스템에서 추가하는 경우를 말한다.
    - 적용된 후에는 free 명령으로 확인 가능하다.
  1. Creating a file the size you want.

    • sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512

  2. Formatting that file to create a swapping device.

    • sudo mkswap /mnt/512Mb.swap

  3. Adding the swap to the running system.

    • sudo swapon /mnt/512Mb.swap

  4. Making the change permanent.

    • gksudo gedit /etc/fstab

    • Add this line at the end of the file:
      /mnt/512Mb.swap  none  swap  sw  0 0

 

  • swappiness 변경 방법
    - 커널이 프로세스를 메모리영역에서 스왑영역으로 이동시키는 정도를 설정하는 파라미터값.
    - 0 에서 100 사이 (우분투 기본값 60). 0 에 가까울 수록 사용정도가 적어진다.
  1. 현재 값 체크 (To check the swappiness value)

    • cat /proc/sys/vm/swappiness

  2. 현재 시스템에 변경값 바로 적용 - 재부팅시 반영안됨.  (To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with)

    • sudo sysctl vm.swappiness=10

  3. 부팅시마다 적용하기 위해 설정파일 수정 (To make a change permanent, edit the configuration file with your favorite editor:)

    • gksudo gedit /etc/sysctl.conf

  4. vm.swappiness 항목을 찾아서 수정하거나, 없다면 추가한다. (Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:)

    • vm.swappiness=10

  5. 저장 후 재부팅. (Save the file and reboot.)





Ubuntu swap를 사용하지 않는 방법입니다.
저는 메모리가 많이 남아서 swap를 사용안하다가 최대 절전모드를 사용하지 않기에 swap를 제거하려고 합니다.
최대 절전모드를 사용할려면 swap 이 꼭 필요합니다. 용량은 메모리 크기만큼만 잡아주셔도 문제가 없습니다.

명령어에서 아래의 명령어를 입력합니다. swapon 명령어를 통해 swap 를 다시 사용 할 수도 있습니다.

명령어는 sudo swapoff -a 를 해주면 됩니다.
그외 명령은 아래 사진을 참고하시면 됩니다.

디스크를 로드하지 않아야 완전히 사용하지 않는 것이라고 생각됩니다. 그리고 그 swap 공간을 다른 디스크로 활용도 가능하구요. 

터미널 명령어에
  sudo vi /etc/fstab 을 입력하시거나 vi 편집기가 익숙하지 않으시다면 sudo gedit /etc/fstab 을 사용하셔도 됩니다.
 그리고 아래 화면에서 # swap was on ........ 의 내용 아래에 UUID 앞에 #을 붙여넣으시면 됩니다.

위의 명령어로 swap 사용을 하지 않고, auto mount도 해제됩니다. 이제 이 swap를 가지고 다른 백업폴더나 리눅스 디스크로 사용하지면 됩니다.

http://thdev.net/127



'연구개발 > Linux' 카테고리의 다른 글

ubuntu 방화벽  (0) 2016.03.14
zabbix mail setting  (0) 2016.03.03
zabbix 3.0 설치  (0) 2016.02.23
zabbix 설치  (0) 2015.11.17
리눅스 하드디스크 추가하기  (0) 2015.04.09


https://www.fl-ops.com/mori-dojo/archives/92





Zabbix 코라 보 기획 「제 2 탄 Redmine과 함께하자 !! ~ Part1 ~ "

https://www.fl-ops.com/mori-dojo/archives/62




 "제목"는 "이벤트 ID"와 "호스트 이름"을 등록합니다. 

 "내용"은 "트리거의 이름"을 등록합니다.










Alexei Vladishev - Opening Speech

http://www.slideshare.net/Zabbix/alexei-vladishev-opening-speech



출처 : http://blog.naver.com/junix/220610357399


'연구개발 > Linux' 카테고리의 다른 글

zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
zabbix 설치  (0) 2015.11.17
리눅스 하드디스크 추가하기  (0) 2015.04.09
CentOS 7.0에서 네트워크 설정  (0) 2015.03.19

http://stonerain.tistory.com/118



* aws 에 서로다른 2개의 계정을 가지고 있고,

a 계정의 instance 를 복제해서, b 계정으로 가져오고 싶은 경우


* b 계정에 로그인한다.

계정정보 > Security Credentials > Account Identifiers 에 들어가서

AWS Account ID 를 알아낸다

(0000-0000-0000-0000 이런 형태임)


* a 계정에 로그인한다.


INSTANCES > Instances > Actions > Image > Create Image 한다.

IMAGES > AMIs 에 들어가서

이미지가 완성될때까지 기다린다.


* 만약 a계정과 b계정의 리전이 다르다면

a 계정에서 만들어진 이미지 Actions > Copy AMI 하여

b 계정의 리전과 동일한 곳으로 복사한다.


* a 계정에서 만들어진 이미지 Actions > Modify Image Permissions

private으로 놓고, AWS Account Number 에 b계정의 AWS Account ID 를 넣는다

(아까 b계정에서 알아낸 id)

Add create volume permissions... 에 체크한다.


* 잠시후, b계정으로 들어가서

IMAGES > AMIs > Private images 에 보면

a계정에서 공유해준 이미지가 보인다.

Actions > Launch 해서, 새로운 instance를 만든다.

(Volume 도 자동으로 만들어 진다)


* ELASTIC BLOCK STORE > Volumes > Actions > Create Snapshot 한다.

* ELASTIC BLOCK STORE > Snapshots > Actions > Create Image 한다.

* 끝

* a 계정으로 들어가서, 아까 공유한 것을 지워도 된다.

http://blog.naver.com/ateon1/120202184897


출처 : http://blog.naver.com/blackfrost/40134487471

http://phpexcel.codeplex.com/

https://code.google.com/p/php-excel-reader/

 

2번째 방법은 아래의 링크이다. 

 

http://phpexcel.codeplex.com/

 

들어가서 해당CLASS를 다운 받고 쓰면 될것이다. 상당히 방대한 용량의 클래스인만큼, 거기에 나와 있는 40가지의 예제들처럼 엄청난 활용이 가능하다. 다만 PHP 5.2이상 버전인 환경에서만 사용되니 알아두기 바란다.

 

3번재 방법은 정말 간단하면서 깔끔하다.

 

http://code.google.com/p/php-excel-reader/

 

들어가보면 보이는 그림만으로 뭔지 눈치 챌것이다 위 CLASS처럼 여러가지상황에 맞춰 여러가지를 해줄수 있는것도 좋지만, 이건 정말 딱 엑셀을 업로드하면 엑셀을 정확히 읽어서 웹에 표시해준다. 간단하면서도 보통 필요한게 이런것이 아닐까 싶다.

 

필자는 1번째를 먼저 접하는 바람에 1번째 방법으로 삽질좀 했지만, 다른 분들은 상황에 맞게 2,3번째 방법으로 깔끔한 처리를 하기 바라는 의미에서 이 포스팅을 써본다.

 

http://spac.tistory.com/176

 

기존 엑셀 2003까지 버전은 확장자가 xls 로 생성되며 한시트에 최대 65,535 라인까지 처리할 수 있다.

그 이상의 행을 처리하려면 엑셀 2007 이상의 버전에서 xlsx 파일로 생성해야 한다. (100만 라인까지 가능)

 

기본 65,535라인을 넘는 데이터를 처리해야 할 경우 PHPExcel 클래스를 이용해 간단히 처리할 수 있다.

참고로 서버에 zip 라이브러리가 설치되어 있어야 한다.

 

먼저 PHPExcel 클래스를 다운로드 받자

http://www.codeplex.com/PHPExcel 에 방문하여 최신 버전을 내려받는다.

 

현재 기준으로 1.7.9 버전이 최신이다.

파일을 내려 받으면 PHPExcel_1.7.9_doc.zip 라는 파일이 받아진다.

압축을 풀어 서버에 업로드 한다. 

 

나의 경우에는 서버 계정의 _lib 디렉토리에 업로드 하고 디렉토리명을 PHPExcel 로 설정했다.

 

POST로 엑셀파일을 업로드 하는 폼 페이지는 생략 하겠다.

아래는 폼 페이지에서 파일을 업로드 하면 실행하는 파일이다.

(POST 로 날라오는 파일 폼 이름이  "upfile" 이라 정하면)

 

<?php

include $_SERVER["DOCUMENT_ROOT"]."/_lib/PHPExcel/Classes/PHPExcel.php"; 

$UpFile = $_FILES["upfile"];

$UpFileName = $UpFile["name"];


$UpFilePathInfo = pathinfo($UpFileName);
$UpFileExt = strtolower($UpFilePathInfo["extension"]);

if($UpFileExt != "xls" && $UpFileExt != "xlsx") {
echo "엑셀파일만 업로드 가능합니다. (xls, xlsx 확장자의 파일포멧)";
exit;
}

//-- 읽을 범위 필터 설정 (아래는 A열만 읽어오도록 설정함  => 속도를 중가시키기 위해)
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// Read rows 1 to 7 and columns A to E only
if (in_array($column,range('A','A'))) {
return true;
}
return false;
}
}
$filterSubset = new MyReadFilter();

//업로드된 엑셀파일을 서버의 지정된 곳에 옮기기 위해 경로 적절히 설정
$upload_path = $_SERVER["DOCUMENT_ROOT"]."/Uploads/Excel_".date("Ymd");
$upfile_path = $upload_path."/".date("Ymd_His")."_".$UpFileName;
if(is_uploaded_file($UpFile["tmp_name"])) {

if(!move_uploaded_file($UpFile["tmp_name"],$upfile_path)) {
echo "업로드된 파일을 옮기는 중 에러가 발생했습니다.";
exit;
}

//파일 타입 설정 (확자자에 따른 구분)
$inputFileType = 'Excel2007';
if($UpFileExt == "xls") {
$inputFileType = 'Excel5';
}

//엑셀리더 초기화
$objReader = PHPExcel_IOFactory::createReader($inputFileType);

//데이터만 읽기(서식을 모두 무시해서 속도 증가 시킴)
$objReader->setReadDataOnly(true);

//범위 지정(위에 작성한 범위필터 적용)
$objReader->setReadFilter($filterSubset);

//업로드된 엑셀 파일 읽기
$objPHPExcel = $objReader->load($upfile_path);

//첫번째 시트로 고정
$objPHPExcel->setActiveSheetIndex(0);

//고정된 시트 로드
$objWorksheet = $objPHPExcel->getActiveSheet();

  //시트의 지정된 범위 데이터를 모두 읽어 배열로 저장
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
$total_rows = count($sheetData);

foreach($sheetData as $rows) {

$fieldData = $rows["A"]; //A열값을 가져온다.
    /* 데이터 처리 */

}

}
.
.
?>

 

너무 큰 파일을 읽을 경우 메모리 제한을 풀어줘야 한다.

http://jmnote.com/wiki/PHP_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%B6%80%EC%A1%B1

ini_set('memory_limit','-1');


http://forum.falinux.com/zbxe/index.php?document_srl=578422&mid=lecture_tip


PHPExcel를 사용해서 내용을 간단하게 입력해보고 다운로드 받을 수 있도록 테스트해볼 예정입니다.

 

1. 환경 설정

 

리눅스에서 Apache, PHP 가 설치되어 있어야합니다.

Ubuntu 에서는 apt-get 으로 apache2 와 php5 를 설치하면 됩니다.

 

윈도우에서는 apmsetup 을 설치하시면 간단합니다.

APMSETUP 홈페이지 주소는 아래와 같습니다.

 

홈페이지 주소 : http://www.apmsetup.com

 

리눅스 apache2 의 경우, 기본 홈 디렉토리가 /var/www/ 이며

윈도우에서 apmsetup 을 설치했을 경우, 기본 홈 디렉토리가 C:\APM_Setup\htdocs 입니다.

 

강좌는 윈도우에서 php_sample.php 라는 파일을 만들고 진행하였습니다.

 

 

2. 샘플 파일

 

PHPExcel 사이트에 받은 PHPExcel_1.7.8-with_documentation-msoffice_format.zip 파일의 압축을 풀고 html 기본 홈 디렉토리에 넣어줍니다.

 

윈도우에서 진행했으니, C:\APM_Setup\htdocs 안에 PHPExcel 폴더를 복사해줍니다.

 

아래는 미리 만들어진 기본 소스 입니다.

 

<?php
    require_once 'PHPExcel/Classes/PHPExcel.php';
    $objPHPExcel = new PHPExcel();
 
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename=sample.xls');
    header('Cache-Control: max-age=0');
 
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
 
    exit;
?>

 

require_once : PHPExcel 관련 PHP 파일을 포함시켜줘야합니다. PHPExcel 안에 Classes/PHPExcel.php 파일의 경로를 적어줍니다.

 

그 다음 header 에는 PHPExcel의 샘플 내용대로 엑셀 파일을 다운로드 받을 수 있도록 파일명을 정해줍니다.

 

위의 내용대로 만든 다음, 웹 브라우저에서 주소를 입력해서 테스트를 해보도록 합니다.

 

주소를 입력하면 아래 그림과 같이 sample.xls 파일을 다운로드 됩니다.

 



 

 

3. 기본 설정 추가

 

엑셀 파일이 다운로드 되는 것을 확인했으니, 이제 엑셀 파일의 내용을 넣어줄 차례입니다.

 

PHPExcel을 새로 만들어준다음,

 

$objPHPExcel = new PHPExcel();

 

사용이 가능하도록 시트를 설정해줍니다.

 

$sheet      = $objPHPExcel->getActiveSheet();

 

엑셀의 기본 글꼴을 정해주지 않으면, 영문쪽 글꼴로 선택됩니다. 윈도우 기본 폰트인 '맑은 고딕' 으로 설정해주기 위해서 아래와 같이 설정해 줍니다.

 

$sheet->getDefaultStyle()->getFont()->setName('맑은 고딕');

 

폰트 크기를 정하고 싶다면 뒤에 ->setSize를 넣어주면 됩니다.

 

$sheet->getDefaultStyle()->getFont()->setName('맑은 고딕')->setSize(10);

 

 

4. 내용 추가

 

간단하게 아래와 같이 내용을 추가해주기 위해서 PHP 소스를 추가하도록 하겠습니다.

 



 

처음에는 사용하게 될 시트를 선택해줘야 합니다.

아래 명령처럼 제일 첫 번째 시트를 선택하도록 합니다.

 

$sheetIndex = $objPHPExcel->setActiveSheetIndex(0);

 

$sheetIndex 에 내용을 추가하면 됩니다.

위의 '제목' 처럼 입력하면 아래와 같이 적어줍니다.

 

A1 셀에 내용을 '제 목' 이라고 입력해줍니다.

 

$sheetIndex->setCellValue('A1','제 목');

 

A1 ~ D1 셀 내용을 합쳐줍니다.

 

$sheetIndex->mergeCells('A1:D1');

 

A1 셀의 폰트와 스타일을 정해줍니다. 폰트 크기는 20으로 하고 두껍게 표시하도록 하였습니다.

 

$sheetIndex->getStyle('A1')->getFont()->setSize(20)->setBold(true);

 

A1 셀 내용이 중앙 정렬되도록 아래와 같이 입력해줍니다.

 

$sheetIndex->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

 

위의 내용을 추가하고 웹 브라우저에서 주소를 입력하면 '제 목'을 볼 수 있습니다.

 

그 다음 내용을 추가해줄 차례입니다.

아래와 같이 셀주소와 내용을 입력해주면 됩니다.

 

$sheetIndex ->setCellValue('A2', '하나')
                ->setCellValue('B2', '둘')
                ->setCellValue('C2', '셋')
                ->setCellValue('D2', '넷');

 

위와 같이 작성한 후에 웹 브라우저에서 입력을 하면 아래 그림과 같은 화면을 볼 수 있습니다.

 



 

간단한 내용을 출력하는거지만, 생각외로 정해줄게 많은거 같습니다.

 

 

5. 전체 소스

 

<?php
    require_once 'PHPExcel/Classes/PHPExcel.php';
    $objPHPExcel = new PHPExcel();

    $sheet      = $objPHPExcel->getActiveSheet();

    // 글꼴
    $sheet->getDefaultStyle()->getFont()->setName('맑은 고딕');

    $sheetIndex = $objPHPExcel->setActiveSheetIndex(0);

    // 제목
    $sheetIndex->setCellValue('A1','제 목');
    $sheetIndex->mergeCells('A1:D1');
    $sheetIndex->getStyle('A1')->getFont()->setSize(20)->setBold(true);
    $sheetIndex->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

    // 내용
    $sheetIndex ->setCellValue('A2', '하나')
                ->setCellValue('B2', '둘')
                ->setCellValue('C2', '셋')
                ->setCellValue('D2', '넷');

    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename=sample.xls');
    header('Cache-Control: max-age=0');
 
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
 
    exit;
?>

 

참고용으로 좋음.

http://gyuha.tistory.com/454


'Program > PHP' 카테고리의 다른 글

PHP7 에서 PHP5.6 사용하기  (0) 2016.11.11
SQL Relay php connection  (0) 2016.07.17
ubuntu php에서 redis사용하기 - Predis  (0) 2015.05.28
php 기본 내용  (0) 2015.05.27
PHP PDO 예제  (0) 2015.05.08

http://moss.tistory.com/150

들어가며

Redis 서버 설정을 위해서 작성하는 redis.conf 파일에 대해서 정리한다.
오역 및 잘못된 내용이 있을 수 있습니다. 참고 용로도만 사용해 주세요.
대상 파일: https://raw.github.com/antirez/redis/2.4.15/redis.conf

요약

기본설정

  1. daemonize (daemon으로 실행 여부 설정)
  2. pidfile (daemon 실행시 pid가 저장될 파일 경로)
  3. port (접근을 허용할 port 설정)
  4. bind (요청을 대기할 interface[랜카드] 설정)
  5. unixsocket, unixsocketperm (요청을 대기할 unix 소켓 설정)
  6. timeout (client와 connection을 끓을 idle 시간 설정)
  7. loglevel (loglevel 설정)
  8. logfile (log 파일 경로 설정)
  9. syslog-enabled (system logger 사용 여부 설정)
  10. syslog-ident (syslog에서의 identity 설정)
  11. syslog-facility (syslog facility 설정)
  12. databases (database 수 설정)

REPLICATION

  1. slaveof (master server 설정)
  2. masterauth (master server 접근 비밀번호 설정)
  3. slave-server-stale-data (master와 connection이 끊긴 경우 행동 설정)
  4. repl-ping-slave-perid (미리 정의된 서버로 PING을 날릴 주기 설정)
  5. repl-timeout (reply timeout 설정)

SECURITY

  1. requirepass (server 접근 비밀번호 설정)
  2. rename-command (command 이름 변경)

LIMITS

  1. maxclients (최대 client 허용 수 설정)
  2. maxmemory (최대 사용가능 메모리 크기 설정)
  3. maxmemory-policy (maxmemory 도달 시 행동 설정)
  4. maxmemory-samples (LRU 또는 mnimal TTL 알고리즘 샘플 수 설정)

APPEND ONLY MODE

  1. appendonly (AOF 사용여부 설정)
  2. appendfilename (AOF 파일명 설정)
  3. appendsync (fsync() 호출 모드 설정)
  4. no-appendfsync-on-rewrite (background saving 작업시 fsync() 호출 여부 설정)
  5. auto-aof-rewrite-percentage, auto-aof-rewrite-min-size (AOF file rewrite 기준 설정)

SLOW LOG

  1. slowlog-log-slower-than (slow execution 기준 설정)
  2. slowlog-max-len (최대 저장 slow log 수 설정)

VIRTUAL MEMORY

  1. vm-enabled (vm 모드 사용여부 설정)

ADVANCED CONFIG

  1. hash-max-zipmap-entries, hash-max-zipmap-value (hash encode 사용 기준 설정)
  2. list-max-ziplist-entries, list-max-ziplist-value (list encode 사용 기준 설정)
  3. set-max-intset-entries (set encode 사용 기준 설정)
  4. zset-max-ziplist-entries, zset-max-ziplist-value (sorted set encode 사용 기준 설정)
  5. activerehashing (자동 rehashing 사용 여부 설정)

기본설정

daemonize [boolean] (기본값: no)

Redis는 기본적으로 daemon으로 실행하지 않는다. 만약 Daemon으로 실행하고 싶다면 'yes'를 사용해라.
Redis는 daemon으로 실행될 때 '/var/run/redis.pid' 파일에 pid를 기록할 것이다.

예) daemonize no

pidfile [file path] (기본값: /var/run/redis.pid)

daemon으로 실행 시 pid가 기록될 파일 위치를 설정한다. 값이 설정되지 않으면 '/var/run/redis.pid'에 pid를 기록한다.

예) pidfile /ver/run/redis.pid

port [number] (기본값: 6379)

Connection을 허용할 Port를 지정한다. 기본값은 6379이다.
만약 port 값을 0으로 지정하면, Redis는 어떤 TCP socket에 대해서도 listen하지 않을 것이다.

예) port 6379

bind [ip] (기본값: 모든 인터페이스)

Redis를 bind 할 특정 interface(랜카드)를 지정할 수 있다. 만약 명시하지 않으면, 모든 interface로부터 들어오는 요청들을 listen할 것이다.

예) bind 127.0.0.1

unixsocket [path], unixsocketperm [number] (기본값: 없음)

들어오는 요청을 listen할 unix socket의 결로를 지정한다. 이 설정에는 기본 값이 없다. 따라서 값이 지정되지 않으면 unix socket에 대해서는 listen하지 않을 것이다.

예) unixscoket /tmp/redis.sock
예) unixsocketperm 755

timeout [second]

client의 idle이 N 초 동안 지속되면 connection이 닫힌다. (0으로 지정하면 connection이 계속 유지된다.)

예) timeout 0

loglevel [level]

logl evel 을 지정한다. Log level 에는 아래 4가지 중 하나를 지정할 수 있다.

loglevel설 명
debug엄청나게 많은 정보를 기록한다. 개발과 테스테 시 유용하다.
verbose유용하지 않은 많은 양의 정보를 기록한다. 하지만 'debug level'만큼 많지는 않다.
notice제품을 운영하기에 적당한 양의 로그가 남는다.
warning매우 중요하거나 심각한 내용만 남는다.

예) loglevel verbose

logfile [file path]

로그 파일을 명시한다.'stdout'로 Redis가 the standard output에 로그를 기록하도록 할 수 있다. 만약 'stdout'를 명시했으나 Redis가 daemon으로 동작한다면 로그는 /dev/null logfile stdout 로 보내질 것이다. 따라서 로그가 남지 않을 것이다.

예) logfile stdout

syslog-enabled [boolean]

system logger를 사용해서 logging 할 수 있게 한다. 단지 'yes'로 설정하고 추가적 설정을 위해서 다른 syslog parameter들을 설정할 수 있다.

예) syslog-enabled no

syslog-ident [identity]

syslog identity를 지정한다.

예) syslog-ident redis

syslog-facility [facility]

syslog facility(시설)을 지정한다. 반드시 USER 또는 LOCAL0 - LOCAL7 사이 값이 사용되어야 한다.

예) syslog-facility local0

databases [size]

dababase들의 숫자를 설정한다. 기본 dababase는 DB 0이다. 물론 connecton당 'SELECT <dbid>' 사용해서 다른 database를 선택할 수 있다. dbid는 0 과 'database 수 - 1'사이의 수이다.

예) databases 16

SNAPSHOTTING (RDB 지속성 설정)

save [seconds] [changes]

disk에 DB를 저장한다. DB에서 주어진 값인 seconds와 changes를 모두 만족시키면 DB를 저장 할 것이다.
이 설정은 여러번 설정할 수 있다.

아래는 예제를 설명한 것이다.
900초(15)분 동안에 1개 이상의 key 변경이 발생했다면 DB를 저장한다.
300초(5)분 동안에 10개 이상의 key 변경이 발생했다면 DB를 저장한다.
60초(1)분 동안에 10000개 이상의 key 변경이 발생했다면 DB를 저장한다.
실제 서비스에서는 너무 자주 동기화가 일어나게 설정하면 안된다.

주목: DB를 저장하고 싶지 않으면 모든 save 라인들을 주석 처리한다.

예) save 900 1
예) save 300 10
예) save 60 10000

rdbcompression [boolean] (기본값: yes)

.rbd database를 덤플 할 때 LZF를 사용해서 문자열 부분을 압축할지 설정한다.
압축하는 것은 대부분의 경우 좋기 때문에 기본값은 'yes'이다.
만약 child set을 저장할 때 CPU 사용을 절약하고 싶다면 'no'로 설정한다. 하지만 values 또는 keys가 압축이 가능했다면, dataset은 보다 커질 것이다.

예) rdbcompression yes

dbfilename [file path]

DB가 dump될 파일을 설정한다.

예) dbfilename dump.rdb

dir [directory path]

DB가 기록될 디렉토리를 설정한다. DB dump파일은 위의 dbfilename과 함께 최종적으로 파일이 기록될 곳이 지정된다.
Append Only File 또한 이 디렉토리에 파일을 생성할 것이다.
반드시 여기에 디렉토리를 설정해야 한다. file name에 설정하면 안 된다.

예) dir ./

REPLICATION (복제 셋 구성 설정)

slaveof [masterip] [masterport]

Master-Slave replication을 구성하기 위해서 slaveof를 사용한다. 이것은 Redis instance가 다른 Redis server의 복사본이 되게 한다.
slave에 대한 설정은 local에 위치한다. 따라서 slave에서는 내부적으로 따로 DB를 저장 하거나, 다른 port를 listen하는 등 slave만의 설정이 가능하다.

예) slaveof 127.0.0.1 6379

masterauth [master-password]

만약 master에 password가 설정되어 있다면 replication synchronization(복제 동기화) 과정이 시작되기 전에 slave의 인증이 가능하다. (이것은 "requirepass" 설정으로 가능하다). 만약 password가 틀리다면 slave의 요청은 거절될 것이다.

예) masterauth password1234 

slave-server-stale-data [boolean] (기본값: yes)

만약 slave가 master와의 connection이 끊어 졌거나, replication이 진행 중일 때는 아래의 2가지 행동을 취할 수 있다.

  1. 'yes(기본값)'로 설정한 경우, 유효하지 않은 data로 client의 요청에 계속 응답할 것이다. 만약 첫번째 동기화 중이였다면 data는 단순히 empty로 설정될 것이다.
  2. 'no'로 설정한 경우, INFO와 SLAVEOF commad(명령)을 제외한 모든 command들에 대해서 "SYNC with master in progress" error로 응답할 것이다.

예) slave-server-stale-data yes

repl-ping-slave-perid [seconds] (기본값: 10)

Salve가 내부적으로 미리 정의된 server로 지정된 시간마다 PING을 보내도록 설정한다.

예) repl-ping-slave-perid 10

repl-timeout [seconds] (기본값: 60)

'bulk transfer I/O(대량 전송 I/O) timeout'과 'master에 대한 data또는 ping response timeout'을 설정한다.

이 값은 'repl-ping-slave-period' 값 보다 항상 크도록 설정되어야 한다. 그렇지 않으면 master와 slave간 작은 traffic이 발생할 때 마다 timeout이 인지될 것이다.

예) repl-timeout 60

SECURITY (보안 설정)

requirepass [password]

client에게 다른 command들을 수행하기 전에 password를 요구하도록 설정한다. 이것은 redis-server에 접근하는 client들을 믿을 수 없는 환경일 때 유용한다.

반대로 개방적으로 사용하기 위해서는 주석 처리 되어야 한다. 왜냐하면 대부분의 사람들은 auth가 필요하지 않기 때문이다.

주의: Redis는 매우 빠르기 때문엔 좋은 환경에서는 외부 사용자가 1초 당 15만개의 password를 시도할 수 있다. 따라서 매우 강력한 password를 설정해야 한다.

예) requirepass foobared

rename-command [target-command] [new-command]

Commnad renaming

공유되는 환경에서는 위험한 command들의 이름을 변경할 수 있다. 예를 들어서 CONFIG command를 추측하기 어려운 다른 값으로 변경할 수 있다. 물론 internal-use tool로는 해당 명령어가 사용하지만, 일반적인 외부 client들에 대해서는 불가능하다.

예) rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

또한 command를 공백으로 rename해서 완전히 사용 불가능하게 할 수도 있다.

예) rename-command CONFIG ""

LIMITS (접속 및 메모리 설정)

maxclients [size] (기본값: 제한 없음)

한번에 연결될 수 있는 최대 client 수를 설정한다. 기본값은 제한이 없으나, Redis process의 file descriptor의 숫자만큼 연결가능하다. 특별히 '0' 값은 제한 없음을 의미한다.
limit에 도달했을 때 새로운 connection들에 대해서는 'max number of clients reached' error를 전송한고 connection을 close 한다.

예) maxclients 128

maxmemory [bytes]

명시한 bytes의 양보다 많은 메모리를 사용하지 말아라.
memory가 limit에 도달했을 때 Redis는 선택된 eviction policy(제거 정책)(maxmemory-policy)에 따라서 key들을 제거할 것이다.

만약 Redis가 eviction policy에 의해서 key를 제거하지 못하거나 polict가 'noeviction'으로 설정되어 있다면, SET, LPUSH와 같이 메모리를 사용하는 command들에 대ㅐ서는 error를 반환하고, 오직 GET 같은 read-only command들에 대해서만 응답할 것이다.

주의: maxmoery 설정 된 instance에 slave가 존재 할 때, slave에게 data를 제공하기위해서 사용되는 output buffer의 size는  used memory count에서 제외된다. 왜냐하면 network 문제나 재동기화가 keys들이 제거된 loop에 대한 trigger를 발생시키지 않게 하기 위해서이다. loop가 발생하면 slave의 output buffer가 제거된 key들의 DEL 명령으로 가득 찰 것이다. 그리고 이것은 database가 완전히 빌 때 까지 지속된다. (좀 더 정확히 알아볼 필요가 있다. 확실히 이해가 안 됨)

간단히 말하면, 만약 slave를 가진다면, slave output buffer를 위해서 system에 약간의 free RAM이 존재시키기 위해서, maxmoery에 약간 낮은 limit를 설정하는 것이 추천된다. (하지만 policy가 'noeviction'이면 필요하지 않다.)

큰 메모리를 표시하기 위해서 아래와 같이 표기가 가능하다.

1k1,000 bytes
1kb1024 bytes
1m1,000,000 bytes
1mb1024*1024 bytes
1g1,000,000,000 bytes
1gb1012*1024*1024 bytes

예) maxmoery 1000

maxmemory-policy [policy] (기본값: volatile-lru)

MAXMEMORY POLICY: maxmemory에 도달했을 때 무엇을 삭제 할 것인지 설정한다. 아래 5개 옵션 중 하나를 선택할 수 있다.

옵션설 명
volatile-lruexpire가 설정된 key 들 중 LRU algorithm에 의해서 선택된 key를 제거한다.
allkeys-lru모든 key 들 중 LRU algorithm에 의해서 선택된 key를 제거한다.
volatile-randomexpire가 설정된 key 들 중 임의의 key를 제거한다.
allkeys-random모든 key 들 중 인의의 key를 제거한다.
volatile-ttlexpire time이 가장 적게 남은 key를 제거한다. (minor TTL)
noeviction어떤 key도 제거하지 않는다. 단지 쓰기 동작에 대해서 error를 반환한다.

예) maxmemory-policy volatile-lru

maxmemory-samples [size] (기본값: 3)

LRU와 minimal TTL algorithms(알고리즘)은 정확한(최적) 알고리즘들은 아니다. 하지만 거의 최적에 가깝다. 따라서 (메모리를 절약하기 위해서) 검사를 위한 샘플의 크기를 선택할 수 있다. 예를 들어, Redis는 기본적으로 3개의 key들은 검사하고 최근에 가장 적게 사용된 key를 선택할 것이다. 하지만 아래 예와 같이 샘플의 크기를 변경할 수 있다.

예) maxmoery-samples 3

APPEND ONLY MODE (AOF 지속성 설정)

appendonly [boolean] (기본값: no)

Redis는 기본적으로 비동기로 disk에 dataset의 dump를 남긴다. 이 방법은 crash가 발생했을 때 최근의 record를 손실되어도 문제가 없을 때 좋은 방법이다. 하지만 하나의 record도 유실되지 않기를 원한다면 append only mode를 활성화 시키는 것이 좋을 것이다.: 이 mode가 활성화 되면, Redis는 요청받는 모든 write operation들을 appendonly.aof 파일에 기록할 것이다. Redis가 재 시작될 때 memory에 dataset를 rebuild하기 위해서 이 파일을 읽을 것이다.

주목: 원한다면 async dumps와 asppend only file을 동시에 사용할 수 있다. 만약 append only mode가 활성화 되어 있다면, startup 때 dataset의 rebuild를 위해서 append only mode의 log file을 사용하고, dump.rdb 파일은 무시할 것이다.

중요: 순간적으로 write operation이 많을 때 background에서 어떻게 append log file을 rewirte 하는 방법을 확인하기 위해서 BGREWRITEAOF를 확인해라.

예) appendonly no

appendfilename [file name] (기본값: appenonly.aof)

append only file의 이름을 설정한다.
파일이 저장되는 디렉토리는 SNAPSHOTTING의 dir 속성을 사용한다.

예) appendfilename appendonly.aof

appendsync [option]

fsync() call 은 Operating System(운영체제)에게 output buffer 내에 보다 많은 데이터들을 기다리지 않고, disk에 실제로 data를 작성하라고 말한다. 어떤 OS 는 실제로 disk에 data를 기록할 것이고, 어떤 OS들은 가능한 빨리 data를 기록하려고 시도할 것이다.

Redis는 3가지의 다른 mode들을 지원한다.

옵션설 명
nofsync()를 호출하지 않는다. data의 flush를 OS에 맡긴다. 빠르다.
alwaysappend only log에 wrtie 할 때 마다 fsync()를 호출한다. 느리다, 안전하다.
everysec매 초 마다 fsync()를 호출한다. 절충안

기본값인 'everysec'은 일반적으로 속도와 데이터 안정성 사이에서 적절한 절충안이다. 이것은 당신의 관대함(?)에 달려있다. 만약 'no'로 설정한다면 OS는 적절한 타이밍에 output buffer를 flush하고 보다 좋은 성능을 낼 것이다. (그러나 만약 data loss가 발생해도 문제가 없다면 기본 persistence(영속성) mode는 snapshotting일 것이다.) 반면에 "always"를 사용하면 매우 느릴 것이다. 하지만 'everysec'보다 조금 더 안전할 것이다.

만약 확실하지않다면 'everysec'를 사용해라.

예) appendfasync everysec

no-appendfsync-on-rewrite [boolean]

AOF fsync policy를 always 또는 everysec로 설정했다면, background saving process(background 저장 또는 AOF log backgournd rewriting)은 disk에 대해서 매우 많은 I/O를 발생시킬 것이다. 따라서 어떤 Linux에서 fsync() call은 매우 긴 block를 발생시킬수도 있다.

주목: 현재 이것에 대한 fix(수정)은 없다. 다른 thread에서 fsync를 수행하더라도 동시에 발생하는 wirte call(2)이 block 될 것이다.

이 문제를 완화 시키기 위해서 BGSAVE 또는 BGREWRITEAOF가 수행중인 동안에 메인 process에서 fsync()가 호출되는 것을 막을 수 있는 no-appendfsync-on-rewirte option을 사용하는 것이 가능하다.

이것은 Redis의 영속성을 저장하는 동안에 다른 자식은 "appendfsync none"으로 설정한 것과 동일하다. 쉽게 말하면, (Linux의 기본 설정에 의해서) 최악의 경우 30초 가량의 log가 손실될 수 있다는 것이다. (이해가 잘 안됨)

이로 인해서 잠재적 문제가 있다면 이 옵션을 'yes'로 설정해라. 하지만 다른 경우에는 'no'로 남겨두는 것이 영속성의 view(?)부터 가장 안전한 선택이다.

예) no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage [percente], auto-aof-rewrite-min-size [bytes]

Append only file의 Automatic rewrite(자동 재 작성)
Redis는 AOF log의크기가 명시된 퍼센트를 넘어갔을 때, 자동적으로 BGREWRITEAOF를 호출함으로서 log file를 재작성 하는 것이 가능하다. (비교 대상이 무엇인지 모르겠다.해당 Drive의 전체 크기인가?)

작동법: Redis는 최근 rewirte후에 AOF file의 크기( 또는 restart이후  rewirte가 발생하지 않았다면, startup 때 사용된 AOF의 크기)를 기억하고 있다.

이 기본 크기는 현재 크기와 비교되어진다. 만약 현재 크기가 설정된 퍼센트보다 크다면, rewrite가 동작하게된다. 또한 rewritten(재작성되는) AOF 파일의 최소 크기를 지정해 주어야 한다. 이것은 비록 퍼센트 증가가 설정 값에 도달하더라도 여전히 작은 크기일 때 AOF file이 rewriting되는 것은 피하는데 유용하다.

Automatic AOF rewirte을 비활성화 시키기 위해서는 percentage값을 0으로 설정해라.

예) auto-aof-rewrite-percentage 100
예) auto-aof-rewrite-min-size 64mb

SLOW LOG

Redis Slow Log는 설정된 실행 시간을 초과한 쿼리들의 로그를 남기는 시스템이다. 실행 시간은 talking with the client, sending the reply와 같은 I/O operation들은 포함되지 않는다. 단지 command를 수행하는데 필요한 시간(command 실행을 위해서 threaad가 block되어서 다른 request를 처리할 수 없는 시간)만이 측정된다.

2개의 parameter들를 통해서 slow log를 설정할 수 있다. : 첫번째 parameter는 Redis가 slow log를 기록하기 위해서  어떤 execution time이 느린 것인지 알려주기 위해서 microsencond로 설정한다. 두번째 parameter는 기록될 수 있는 slow log의 길이이다. 새로운 command가 log 되었을 때, 가장 오래전에 기록된 log가 제거된다. FIFO 형태인 것이다.

slowlog-log-slower-than [microseconds]

microsencod값으로 slow execution time를 설정한다. 1000000은 1초와 같다.

주의: 음수를 설정한 경우 slow log를 비활성화 시킨다. 0으로 설정한 경우 모든 command에 대해서 logging 수행된다.

예) slowlog-log-slower-than 10000

slowlog-max-len

길이에는 제한이 없다. 단지 이것은 memory를 소모하는 것은 인지하고 있어야 한다.
SLOWLOG RESET 명령으로 slow log에 의해서 사용된 memory를 반환 시킬 수 있다.

예) slowlog-max-len 128

VIRTUAL MEMORY

vm-enabled

Virtual Memory는 Redis 2.4에서 제거되었다. vm-enabled no로 설정해서 사용하지 않는다.

예) vm-enabled no

ADVANCED CONFIG

hash-max-zipmap-entries, hash-max-zipmap-value

hash들은 elements의 숫자가 설정된 entries(개수)에 도달하고 가장 큰 element가 설정된 threshold(기준치)를 초과하지 않으면 특별한 방법으로(보다 효과적인 메모리 사용법으로) encoded(인코딩)되어진다.

특별한 방법: hashtable 또는 zipmap

예) hash-max-zipmap-entries 512
예) hash-max-zipmap-value 64

list-max-ziplist-entries, list-max-ziplist-value

hash와 비슷하게 작은 list도 공간을 절약하기 위해서 특별한 방법으로 encode되어진다. 오직 설정된 값 보다 아래에 있을 때 특별한 방법이 사용되어진다.

특별한 방법: linkedlist 또는 ziplist

예) list-max-ziplist-entries 512
예) list-max-ziplist-value 64

set-max-intset-entries

Set은 오직 한 가지 경우에만 특별한 방법으로 encoded 되어진다. Set이 오직 string(문자열)로만 구성되었을 때, 64bit signed integer 범위의 radix 10의 integer로 변환된다.
아래 설정은 특별한 메모리 저장 인코딩을 사용하기 위해서 set 의 크기 제한을 설정한다. (정확한 확인 필요, 아마도 아래보다 크지 않을 때 사용하지 않을까 싶다.)

예) set-max-intset-entries 512

zset-max-ziplist-entries, zset-max-ziplist-value

hash 및 list와 비슷하게, sorted set도 많은 공간을 절약하기 위해서 특별하게 encoded되어진다. 이 Encoding은 sorted set의 element와 length가 설정치를 초과하지 않을 때 사용되어 진다.

예) zset-max-ziplist-entries 128
예) zset-max-ziplist-value 64

activerehashing

rehashing을 활성화 하면 main Redis has table(최상위 key-value hash table)을 rehashing하는 것을 돕기 위해서 CPU time의 매 100 millisecond 마다 1 millisencond를 사용한다. redis가 사용하는 hash table 구현은 lazy rehashing으로 동작한다. rehashing이 수행되는 hash table에서 많은 operation을 수행 할 수록, 보다 많은 rehashing 'steps'이 수행된다. 따라서 server가 idle 상태이면 rehashing은 결코 완료되지 않고, 약간의 메모리가 hash table에 의해서 사용되어진다.

기본값은 가능할 메모라는 free하게 만들기 위해서, main dictionary들의 rehashing을 active하는데 매 초마다 10 millisecond를 사용하는 것이다.

만약 힘든 잠재적 요구사항이나 당신의 환경에 적합하지 않아서 확신이 들지 않는다면 'activerehashing no'를 사용해라. 이 설정으로 인해서 Redis가 request들에 대해서 reply하는데 2 milliseoncds의 delay(지연)가 발생할 것이다.

만약 어려운 환경이 아니고 가장한 빠르게 메모리는 free하게 하고 싶다면 'activerehashing yes'를 사용해라.

예) activerehashing yes

'연구개발 > Redis' 카테고리의 다른 글

NoSQL - Redis 통계정보, 성능 측정  (0) 2015.12.31
redis sorted_set 사용한 실시간 순위 구하기  (0) 2014.10.27
Redis 모니터링 - Redmon  (0) 2014.03.24
[Redis Monitoring] redis-stat  (0) 2014.03.24
Redis 설치  (0) 2013.04.29

# 레디스 통계 정보


redis-cli
redis client 문서 : http://redis.io/clients

> info 명령
* Server : 실행 중인 레디스 서버의 실행 정보
* Clients : 서버와 연결된 클라이언트들의 통계 정보
* Memory : 메모리 사용 정보 및 메모리 통계 정보
* Persistence : 영구 저장소와 관련된 저장 정보
* Stats : 명령 수행과 저장된 키에 대한 통계 정보
* Replication : 현재 동작 중인 복제 정보
* CPU : CPU 사용률 통계 정보
* Keyspace : 데이터베이스별로 저장된 키 정보

1) redis_version : 실행 중인 레디스 서버의 버전 정보
2) arch_bits :  실행 중인 레디스 서버의 아키텍처 비트
3) process_id :  실행 중인 레디스 서버의 시스템 프로세스 ID
4) connected_clients :  현재 연결되어 있는 클라이언트의 커넥션 수
5) connected_slaves :  복제를 위해서 연결되는 슬레이브 노드 수
6) used_memory : 레디스 서버가 사용하는 메모리의 양(바이트 단위)
7) used_memory_human : used_memory를 사람이 읽기 쉽도록 메가바이트 또는 기가바이트 단위로 표현
8) used_memory_peak :  레디스 서버가 최대로 사용했던 메모리 크기(바이트 단위)
9) used_memory_peak_human : used_memory_peak을 사람이 읽기 쉽도록 메가바이트 또는 기가바디트 단위로 표현
10) mem_fragmentation_ratio : 레디스 서버에 저장된 데이터 중에 연속되지 않은 메모리 공간에 저장되어 있는 비율
11) role:master : 마스터-슬레이브 복제 모드에서 동작하는 모드, 단일모드로 동작할 때도 마스터로 표시된다.


[redis@sunshiny ~]$ redis-cli 
127.0.0.1:6379> info
# Server
(1)redis_version:2.8.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7b76b17a256ab168
redis_mode:standalone
os:Linux 2.6.32-431.el6.x86_64 x86_64
(2)arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
(3)process_id:5565
run_id:f479ec44fb3ad6f4b31d182d8db4731ee6f606d4
tcp_port:6379
uptime_in_seconds:23
uptime_in_days:0
hz:10
lru_clock:4513140
config_file:

# Clients
(4)connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:1450856
used_memory_human:1.38M
used_memory_rss:7897088
used_memory_peak:1450856
used_memory_peak_human:1.38M
used_memory_lua:33792
mem_fragmentation_ratio:5.44
mem_allocator:jemalloc-3.2.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1397022045
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:1
total_commands_processed:0
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0

# Replication
role:master
(5)connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.03
used_cpu_user:0.04
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Keyspace
db0:keys=3,expires=0,avg_ttl=0



# 레디스 성능 측정

benchmark 문서 : http://redis.io/topics/benchmarks

> 레디스 성능 측정 도구 옵션

Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]

 -h <hostname>      Server hostname (default 127.0.0.1)
 -p <port>          Server port (default 6379)
 -s <socket>        Server socket (overrides host and port)
 -c <clients>       Number of parallel connections (default 50)
 -n <requests>      Total number of requests (default 10000)
 -d <size>          Data size of SET/GET value in bytes (default 2)
 -k <boolean>       1=keep alive 0=reconnect (default 1)
 -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
  Using this option the benchmark will get/set keys
  in the form mykey_rand:000000012456 instead of constant
  keys, the <keyspacelen> argument determines the max
  number of values for the random number. For instance
  if set to 10 only rand:000000000000 - rand:000000000009
  range will be allowed.
 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).
 -q                 Quiet. Just show query/sec values
 --csv              Output in CSV format
 -l                 Loop. Run the tests forever
 -t <tests>         Only run the comma separated list of tests. The test
                    names are the same as the ones produced as output.
 -I                 Idle mode. Just open N idle connections and wait.

> redis-benchmark 명령 실행

[redis@sunshiny src]$ redis-benchmark 
====== PING_INLINE ======
> 10000만 개의 명령을 처리하는 데 걸린 시간 0.13초
  10000 requests completed in 0.14 seconds
> 50개의 클라이언트 동시 연결
  50 parallel clients
> 저장 데이터의 크기 3바이트
  3 bytes payload
> 클라이언트 연결 유지 상태 정보
  keep alive: 1

89.20% <= 1 milliseconds
99.51% <= 2 milliseconds
99.78% <= 3 milliseconds
99.92% <= 4 milliseconds
99.95% <= 5 milliseconds
100.00% <= 5 milliseconds
> 초당 처리된 명령 수
70921.98 requests per second

====== PING_BULK ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.88% <= 1 milliseconds
99.51% <= 2 milliseconds
100.00% <= 2 milliseconds
87719.30 requests per second

====== SET ======
  10000 requests completed in 0.12 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

96.21% <= 1 milliseconds
100.00% <= 1 milliseconds
82644.62 requests per second

====== GET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.20% <= 1 milliseconds
100.00% <= 1 milliseconds
91743.12 requests per second

====== INCR ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

95.78% <= 1 milliseconds
100.00% <= 1 milliseconds
90909.09 requests per second

====== LPUSH ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

96.20% <= 1 milliseconds
100.00% <= 1 milliseconds
93457.95 requests per second

====== LPOP ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.42% <= 1 milliseconds
100.00% <= 1 milliseconds
92592.59 requests per second

====== SADD ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

92.88% <= 1 milliseconds
99.51% <= 2 milliseconds
100.00% <= 2 milliseconds
89285.71 requests per second

====== SPOP ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.83% <= 1 milliseconds
99.52% <= 2 milliseconds
100.00% <= 2 milliseconds
92592.59 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  10000 requests completed in 0.12 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

92.21% <= 1 milliseconds
100.00% <= 1 milliseconds
86956.52 requests per second

====== LRANGE_100 (first 100 elements) ======
  10000 requests completed in 0.28 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

80.39% <= 1 milliseconds
99.51% <= 2 milliseconds
100.00% <= 2 milliseconds
35587.19 requests per second

====== LRANGE_300 (first 300 elements) ======
  10000 requests completed in 0.63 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

2.17% <= 1 milliseconds
75.25% <= 2 milliseconds
99.69% <= 3 milliseconds
100.00% <= 3 milliseconds
15974.44 requests per second

====== LRANGE_500 (first 450 elements) ======
  10000 requests completed in 0.86 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.03% <= 1 milliseconds
28.05% <= 2 milliseconds
86.40% <= 3 milliseconds
99.00% <= 4 milliseconds
100.00% <= 4 milliseconds
11668.61 requests per second

====== LRANGE_600 (first 600 elements) ======
  10000 requests completed in 1.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.26% <= 1 milliseconds
5.61% <= 2 milliseconds
57.59% <= 3 milliseconds
86.37% <= 4 milliseconds
98.13% <= 5 milliseconds
99.91% <= 6 milliseconds
100.00% <= 6 milliseconds
9057.97 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.20 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

59.19% <= 1 milliseconds
100.00% <= 1 milliseconds
49019.61 requests per second


> 50바이트의 데이터를 문자열, 리스트, 셋 데이터형으로 저장하고 읽는 시간 측정

[redis@sunshiny redis-2.6.17]$ redis-benchmark -d 50 -q -t get,set,lpush,lpop,sadd,spop
SET: 52083.33 requests per second
GET: 91743.12 requests per second
LPUSH: 86956.52 requests per second
LPOP: 87719.30 requests per second
SADD: 92592.59 requests per second
SPOP: 92592.59 requests per second


> 1024바이트의 데이터를 문자열, 리스트, 셋 데이터형으로 저장하고 읽는 시간 측정

[redis@sunshiny redis-2.6.17]$ redis-benchmark -d 1024 -q -t get,set,lpush,lpop,sadd,spop
SET: 80000.00 requests per second
GET: 90909.09 requests per second
LPUSH: 96153.84 requests per second
LPOP: 81300.81 requests per second
SADD: 89285.71 requests per second
SPOP: 94339.62 requests per second


[redis@sunshiny redis-2.6.17]$ src/redis-benchmark -d 102400 -q -t get,set,lpush,lpop,sadd,spop
SET: 12919.90 requests per second
GET: 11273.96 requests per second
LPUSH: 6793.48 requests per second
LPOP: 9149.13 requests per second
SADD: 101010.10 requests per second
SPOP: 94339.62 requests per second


> 백만 개의 키를 문자열 데이터로 추가

[redis@sunshiny redis-2.6.17]$ src/redis-benchmark -t set -n 1000000 -r 100000000
====== SET ======
  1000000 requests completed in 12.41 seconds  -- 백만개의 데이터를 입력하는 데 약 13초가 소요
  50 parallel clients  -- 50개의 클라이언트 동시 연결
  3 bytes payload  -- 저장된 데이터의 크기 3바이트
  keep alive: 1  -- 클라이언트 연결 유지 상태 정보

90.42% <= 1 milliseconds
99.64% <= 2 milliseconds
99.77% <= 3 milliseconds
99.79% <= 4 milliseconds
99.83% <= 5 milliseconds
99.91% <= 6 milliseconds
99.95% <= 7 milliseconds
99.96% <= 8 milliseconds
99.97% <= 14 milliseconds
99.97% <= 20 milliseconds
99.97% <= 21 milliseconds
99.98% <= 24 milliseconds
99.98% <= 25 milliseconds
99.98% <= 26 milliseconds
99.99% <= 27 milliseconds
99.99% <= 28 milliseconds
99.99% <= 29 milliseconds
100.00% <= 34 milliseconds
100.00% <= 35 milliseconds
100.00% <= 35 milliseconds
80580.18 requests per second  -- 초당 8만개 이상의 데이터 저장

[redis@sunshiny redis-2.6.17]$


# 응답시간 측정

운영 중인 레디스가 정상적으로 작동하는지, 얼마나 빨리 응답하는지 확인하는 방법이다.
latency 옵션은 명령이 서버로 전달되고 나서부터 응답이 돌아오기까지의 시간을 측정하는 데 사용한다.
이 옵션은 사용자의 종료 명령(ctrl-c)을 전달받기 전까지 계속 실행된다.

[redis@sunshiny redis-2.6.17]$ redis-cli --latency
min: 0, max: 2, avg: 0.27 (2703 samples)^C

[redis@sunshiny redis-2.6.17]$ redis-cli --latency
min: 0, max: 7, avg: 0.26 (3680 samples)


# 주기적인 통계 정보 조회

메모리 상태, 저장된 키의 개수와 같은 서버의 통계 정보를 주기적으로 확인해야 한다면 별도의 프로그램을 개발하기보다는 간단한 리눅스 셸명령과 크론탭을 사용하는 편이 낫다.

> info 명령의 인자 목록
server : 레디스 서버의 기초적인 정보, 프로세스 ID, 포트 등을 출력
clients : 접속된 클라이언트 정보 및 통계를 출력한다.
memory :  메모리 사용량 통계 정보를 출력한다.
persistence :  영구 저장소 상태 및 통계 정보를 출력한다.
stats : 키 사용률, 명령 개수에 대한 통계 정보를 출력한다.
replication :  복제에 대한 통계 정보를 출력한다.
cpu :  CPU의 사용 정보에 대한 통계 정보를 출력한다.
keyspace :  저장된 키의 개수 정보를 출력한다.


[redis@sunshiny redis-2.6.17]$ src/redis-cli info server
# Server
redis_version:2.6.17
redis_git_sha1:00000000
redis_git_dirty:0
redis_mode:standalone
os:Linux 2.6.32-431.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:3049
run_id:0da45a1adc86febf9b0b3ab8dc6c578c03ceb89d
tcp_port:6379
uptime_in_seconds:1470
uptime_in_days:0
hz:10
lru_clock:1299884

[redis@sunshiny redis-2.6.17]$ src/redis-cli info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

[redis@sunshiny redis-2.6.17]$ src/redis-cli info memory
# Memory
used_memory:105421192
used_memory_human:100.54M
used_memory_rss:116494336
used_memory_peak:107854824
used_memory_peak_human:102.86M
used_memory_lua:31744
mem_fragmentation_ratio:1.11
mem_allocator:jemalloc-3.2.0

[redis@sunshiny redis-2.6.17]$ src/redis-cli info persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1397118519
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok

[redis@sunshiny redis-2.6.17]$ src/redis-cli info stats
# Stats
total_connections_received:65
total_commands_processed:1006273
instantaneous_ops_per_sec:0
rejected_connections:0
expired_keys:0
evicted_keys:0
keyspace_hits:9
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1500

[redis@sunshiny redis-2.6.17]$ src/redis-cli info replication
# Replication
role:master
connected_slaves:0

[redis@sunshiny redis-2.6.17]$ src/redis-cli info cpu
# CPU
used_cpu_sys:5.13
used_cpu_user:3.47
used_cpu_sys_children:0.05
used_cpu_user_children:0.47

[redis@sunshiny redis-2.6.17]$ src/redis-cli info keyspace
# Keyspace
db0:keys=994951,expires=0,avg_ttl=0


'연구개발 > Redis' 카테고리의 다른 글

Redis 서버 설정 정리  (0) 2016.01.07
redis sorted_set 사용한 실시간 순위 구하기  (0) 2014.10.27
Redis 모니터링 - Redmon  (0) 2014.03.24
[Redis Monitoring] redis-stat  (0) 2014.03.24
Redis 설치  (0) 2013.04.29

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:lE9TM7sHONclMNYVtHrwfefdIV3lsn88ZJLuWYc6Rz8.
Please contact your system administrator.
Add correct host key in /Users/md/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/md/.ssh/known_hosts:1
RSA host key for XXX.XXX.XXX.XXX has changed and you have requested strict checking.
Host key verification failed.

원인은 재설치한 Centos에 ssh을 접속하였기 때문이라고 한다.
이전에 접속한 RSA 키 값으로 자꾸 접속하려니까 맞지 않았던 것이라고..
결론은 지우면 된다는거.

ssh-keygen -R [ IP or DomainName]


상단의 내용을 치니, 다음과 같이 나온다.
# Host XXX.XXX.XXX.XXX found: line 1
/Users/md/.ssh/known_hosts updated.
Original contents retained as /Users/md/.ssh/known_hosts.old

이렇게 뜬다면 성공한 것이다.

♬ 하드 디스크 병목 현상

-LogicalDisk\% Free Space 

-PhysicalDisk\% Idle Time

-PhysicalDisk\Avg. Disk Sec/Read

-PhysicalDisk\Avg. Disk Sec/Write

-PhysicalDisk\Avg. Disk Queue Length

-Memory\Cache Bytes

 메모리 병목 현상

-Memory\% Committed Bytes in Use

-Memory\% Available Mbytes

-Memory\Free System Page Table Entries

-Memory\Pool Non-Paged Bytes

-Memory\Pool Paged Bytes

-Memory\Pages per Second

 프로세서 병목 현상

-Processor\% Processor Time

-Processor\% User Time

-Processor\% Interrupt Time

-System\Processor Queue Length

 네트워크 병목 현상

-Network Interface\Bytes Total/Sec

-Network Interface\Output Queue Length

 프로세스 병목 현상

-Process\Handle Count 

-Process\Thread Count

-Process\Private Bytes 




https://technet.microsoft.com/ko-kr/magazine/2008.08.pulse.aspx

'연구개발 > DBA' 카테고리의 다른 글

mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
성능 관련 기초 이론  (0) 2015.11.04
리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
mysql-connector-odbc-5.2.6-winx64.msi

mysql 사이트에가서 다운받는다.

odbc 설치.




cursor/resuts 에서 return matched rows instated of affected rows 는 꼭 체크 한다.. openquery update linked Server 공급자 : Microsoft OLE DB Provider for ODBC Drivers 제품이름 : MySQL 데이터원본 : GA (시스템DNS) 공급자 문자열 : DRIVER[MYSQL ODBC 5.2 Unicode Driver];SERVER=xxx.xxx.xxx.xxx;PORT=3306 카탈로그 : db선택 보안 : 다음보안 컨텍스트트를 이용하여 연결 --시스템 DNS 에 설정한 아이디 비번 서버옵션 데이터엑스스 , RPC, RPC내보내기 , 언격 데이터 정렬 사용 ==> TRUE openquery 사용 select * from openquery(GA, 'select * from mysql_table') insert into openquery(GA, 'select seq from tb_xxxx') values (1) insert into openquery(GA, 'select seq from tb_xxxx') select seq from dbo.mssql_table delete openquery(GA, 'select seq from tb_xxxx') where seq > 0 update xx set xx.col = zz.col from openquery(GA, 'select seq, col from tb_xxxx') xx inner join mssql_table zz on xx.seq=zz.seq;


Ubuntu 12.04 Zabbix 설치


https://www.digitalocean.com/community/tutorials/how-to-install-zabbix-on-ubuntu-configure-it-to-monitor-multiple-vps-servers

위에 홈페이지 설명대로 설치


추가 사항

vi /etc/apache2/apache2.conf

AddType application/x-httpd-php .php .html .htm .inc


vi /etc/php5/apache2/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Seoul


php 관련 추가 설치

apt-get install php5 libapache2-mod-php5 php5-mcrypt php5-mysql

[출처] Ubuntu 12.04 Zabbix 설치|작성자 천지


'연구개발 > Linux' 카테고리의 다른 글

swap  (0) 2016.03.02
zabbix 3.0 설치  (0) 2016.02.23
리눅스 하드디스크 추가하기  (0) 2015.04.09
CentOS 7.0에서 네트워크 설정  (0) 2015.03.19
유닉스 파일 디스크립터 : > /dev/null 2>&1  (0) 2015.01.07

어떤 걸 설치하다보니 갑자기 mysql 이 시작되지 않고 

/usr/bin/mysqld_safe 이런 메시지가 뜨거나 

/var/log 어쩌구 샬라샬라 할 때가 있다.

그럼 100% 이전 my.cnf 를 찾고 있는거다.


find / -name my.cnf 

해서 찾아서 필요없는 건 지워라..-_-;

리눅스 시간 동기화

아마존 서비스가 글로벌 서비스이다보니 date 명령어를 사용했을 때 UTC 시간을 사용한다.

하지만 국내용 서비스를 하기 위해서는 아무래도 KST 시간으로 설정하는 것이 좋을 것이다.

 

구글링을 해보면 몇 가지 방법을 찾을 수 있는데,  그중 한가지가 다음과 같은 명령어를 사용하는 방법이다.

 

# tzselect 

위 명령어를 입력하면 간단하게 몇 가지 물음으로 KST 설정 방법에 대해서 나온다.

하지만 tzselect에서 마지막 알려주는 설정 방식으로 .profile 설정을 알려주는데, 그렇게 하면 현재 유저(ec2-user)에만 이가 적용된다.

(sudo date 명령어를 입력해보면 그대로 UTC이다.)

 

전체 서버에서, 다시 말해 모든 사용자가 KST를 사용하기 위해서는 아래 명령어가 필요하다

 

# sudo mv /etc/localtime /etc/localtime.old

# sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime 

1. 기존 /etc/localtime 백업

2. Asia/Seoul 파일을 /etc/localtime으로 연결

아마존에서 특별한 설정변경없이 EC2 인스턴스를 생성하면 기본적으로 8G의 디스크용량을 가지게 된다. 이렇게 사용하다가 용량이 부족하다 싶으면 사용하던 데이터를 손대지 않고 스토리지의 공간을 확장할 수 있다.

기본적인 개념은 아래와 같다.





  1. EC2를 정지시킨다.
  2. 연결되어 있는 EBS를 detach 시킨다.
  3. detach 된 EBS volume의 snapshot을 생성한다.
  4. 생성된 snapshot으로 새로운 EBS volume을 생성한다. 이때 생성되는 EBS volume의 크기를 원하는 사이즈로 지정한다.
  5. EC2에 새로 생성된 EBS volume을 attach 한다.
  6. EC2 인스턴스에 접속해서 디스크크기를 재설정한다.


대략 위와 같은 과정이라고 보면 된다.

쉽게 설명하면 서버에서 기존의 저장장치를 때어내고 새로만든 큰 저장장치를 붙이는 과정이다. 이과정에서 새로만든 저장장치에 기존 데이터가 그대로 들어있도록 만드는 것이 포인트라고 할 수 있다.


아마존 웹 서비스 콘솔에서 위와 같은 과정으로 EC2 인스턴스의 스토리지를 확장할 수 있다. 

위 그림만 이해하면 콘솔의 메뉴를 열어 보고 어렵지 않게 진행할 수 있다. 이럴 경우 6번 과정만 주의 해서 봐도 된다. 처음에 5번까지만 하고 인스턴스 공간이이 확장이 안되어 있어서 해맸었다.


설치된 OS: centOS 6.5


상세과정을 살펴보자.



1. EC2를 정지시킨다.

아마존 EC2콘솔 INSTANCES -> instances 메뉴에서 실행하려는 인스턴스 선택후 마우스오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 뜬다.

여기서 Stop을 실행한다.





2. 연결되어 있는 EBS를 detach 시킨다.

아마존 EC2콘솔 ELASTIC BLOCK STORE -> Volumes 메뉴에서 정지시킨 인스턴스의 볼륨을 찾아서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.

여기서 Detach Volume을 선택한다. 참고로 볼륨의 상태가 in-use  상태여야만 Detach Volume을 실행할 수 있다.





만약 확장하려는 인스턴스가 사용중인 볼륨이 어떤것인지 확인하려면 Volume 목록에서 Attachement Information 항목을 보면 된다. 이곳에 인스턴스의 이름과 Id가 표시된다.



그리고 위 그림의 오른쪽 끝에 적힌 /dev/sda1.. 과 같은 경로를 기억해두거나 적어둔다. 새로 Attach할때 이 경로를 입력해야 한다.




3. detach 된 EBS volume의 snapshot을 생성한다.

정지된 볼륨에서 다시 마우스 오른쪽 버튼을 눌려서 아래와 같이 Create Snapshot을 선택한다.

(인스턴스 실행중에도 스냅샷을 만들 수 잇으나 disk IO가 있는중일 수 있기때문에 문제가 될 수 있을 것으로 판단하고 인트턴스 정지후에 스냅샷을 생성하였다.)





4. 생성된 snapshot으로 새로운 EBS volume을 생성한다. 이때 생성되는 EBS volume의 크기를 원하는 사이즈로 지정한다.

아마존 EC2콘솔 ELASTIC BLOCK STORE -> Snapshots 메뉴에서 방금 생성한 스냅샵을 찾아서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.

여기서 Create Volume을 선택한다.



다음으로 볼륨 생성팝업차이 뜨는데 이때 아래와 같이 Size를 확장하려는 사이즈로 지정해준다. 기본값이 현재 사이즈 이므로 방심하면 그냥 넘어가서 크기가 같은 볼륨을 생성해버리게 되니 주의






5. EC2에 새로 생성된 EBS volume을 attach 한다.

새로 생성된 볼륨은 상태가 available 상태로 되어 있다. 여기서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.

여기서 Attach Volume을 선택한다.





다음으로 나오는 어태치 팝업에서 아래와 같이 instance를 지정해준다. 최초에 stop 시킨 인스턴스의 아이디나 이름 등을 입력하면 된다.

그리고 Device에서 원래의 볼륨이 마운트되어 있던 경로를 똑같이 적는다. 2번과정에서 /dev/sda1 경로 였다.




6. EC2 인스턴스에 접속해서 디스크크기를 재설정한다.

기본적으로 EC2와 연결된 EBS Volume의 용량을 늘려주면 스토리지 확장이 된다고 하는데 여기까지 진행하고 인스턴스를 재시작한후

막상 디스크 용량을 확인해보면 전혀 늘어나지 않았다.


 

아래와 같이 command 처리로 늘어난 EBS 스토리지 공간을 OS에서 인식 할 수 있게 되었다.




위와 같이 처음에 df -h 로 디스크 공간을 확인해보면 7.9G만 잡혀있는 상태이다.

그러나 fdisk -l로 확인해보면 /dev/xvde 디스크용량이 107.4G 인것이 확인된다.

이상태에서 resize2fs /dev/xvde 명령을 실행해서 파일시스템을 재구축해야 한다. (오래 걸림)

다시 df -h 로 용량을 확인해보면 전체 디스크 용량이 모두 사용가능한 공간이 되었음을 확인 할 수 있다.


저 명령실행전에 몽고 디비가 실행중이었는데 용량 제산정 과정이나 진행후에 프로세스에 전혀 지장이 없었다.

파일 시스템 재구축 작업은 서비스 운영중에도 사용할 수 있을 것으로 판단된다.




스토리지 확장관련 아마존 레퍼런스 문서: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html#d0e52667

아마존의 위 문서에서 스토리지 확장하는 방법이 자세하게 나와 있다. (영어)


출처 : http://adrenal.tistory.com/11


'연구개발 > AWS' 카테고리의 다른 글

[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
centos lrzsz  (0) 2017.06.12
아마존 클라우드 Ubuntu에서 한글 사용  (0) 2016.05.18
aws. instance. clone. 복제  (0) 2016.02.19
리눅스 시간 동기화  (0) 2015.11.06

성능 관련 기초 이론
※ 모델링 - 시스템에 영향을 미칠 수 있는 요소들을 추출하여 이들의 연관관계를 도식화하는 것
- Queuing Network Model(QNM)
  : 1976년 Jeffrey P. Buzen이 제안, 1978년 Peter J.Denning&Jeffrey P. Buzen에 의해 확장
  : 컴퓨터 시스템의 대기 행렬을 의미하는 큐들의 네트워크
  : 다중 서버에 대한 모델링이 가능
  : 'Operational Law'에 의해 분석

- 단일 서버 QNM
  : 서버가 하나인 경우 사용(2Tier)
  : 사용자가 서버에 Request하는 경우, Queue를 거쳐 서비스 요청
  : Parameters - 부하 강도(사용자의 호출 빈도), 서비스 요구량(사용자 요청을 처리하는 데 소요되는 시간)
  : Operation Law
    → 이용률(Utilization): 전체 측정 시간 대비 서비스 시간의 비율
    → 응답시간(Response Time): 사용자가 서버에서 머물렀던 평균 시간(서비스 시간+대기 시간)
    → 큐 길이(Queue Length): 서버에 머무르고 있는 총 사용자 수(서비스 + 대기)
    → 처리량(Throughtput): 서버가 서비스 처리 종료 후 서버를 출발하는 비율
  : Operation Law의 의미
    → 이용률(Utilization): 대상 서버에 대한 가용 자원 대비에 현재 이용되고 있는 정도
                            0≤이용률≤1, 1이 되면 서버에 병목현상 발생, 부하강도가 증가하면 이용률도 증가
    → 응답시간(Response Time): 사용자가 서비스를 요청하고 받을 때까지 걸리는 시간
                                이용률(부하강도)의 증가에 따라 기하급수적으로 증가
    → 큐 길이(Queue Length): 큐를 점유하고 있는 사용자 수
                              이용률(부하강도)의 증가에 따라 기하급수적으로 증가
    → 처리량(Throughtput): 대상 서버에서 요청 건수의 대비 처리량
                            이용률의 증가에 따라 같이 증가, 이용률이 1이 되면 일정 수준 유지

- 다중 서버 QNM
  : 서버가 여러 개일 경우 사용(3Tier over)
  : 사용자가 서버에 Request하는 경우, Web Server → WAS → DB 서버 등을 거쳐 서비스 요청 및 처리
  : Parameters - 부하 강도(사용자의 호출 빈도), 실행 시간(각 개별 서버 별 요청 처리에 소요되는 시간)
                 ※ 부하 강도는 시스템의 종류에 따라 각각 다르게 정의될 수 있음
                    (ex. TP-Monitor: 요청건수, Batch: 동시 사용자, 웹 기반, C/S 시스템: 동시 사용자 수&평균 Think time 등)
  : Operation Law는 단일 서버 QNM과 유사

- Operation Law
  : QNM에서 서버의 여러 특성들을 파라미터화하여 주요 평가 항목들을 추출할 때 사용하는 주요 공식의 기반
  : 파라미터화 된 기본 항목들은 측정 도구에 의해 측정 가능

  ※ 기본 항목
    → T: 대상 시스템을 모니터링한 총 소요 시간(초)
       A: T시간 동안 시스템에 요청된 총 요청 건수(건)
       C: T시간 동안 시스템에서 처리된 총 처리 건수(건)
       B: 시스템이 요청을 처리하기 위해 사용된 총 서비스 시간(Bysu Time, 초)
       W: 시스템이 요청을 처리하기 위해 사용된 총 응답 시간(서비스 시간 + 대기 시간)
       Z: 사용자가 다음 요청을 준비하기 위해 소요된 Think time(초)
       N: T시간 동안 시스템을 사용하고 있는 사용자 수(명)

  ※ 도출되는 성능 수치 항목
    → 호출비율(Arrival Rate): 단위 시간당 시스템으로 들어오고 있는 건수(λ=A/T)
    → 처리량(Throughtput): 단위 시간당 시스템에서 처리 되고 있는 건수(X=C/T)
    → 이용률(Utilization): 총 소요 시간 대비의 총 서비스 시간 비율(U=B/T)
    → 평균 서비스 시간(Service Time): 요청을 처리하기 위해 소요된 평균 서비스 시간(S=B/C)
    → 응답 시간(Response Time): 요청을 처리하기 위해 소요된 평균 응답 시간(R=W/C)


- Utilization Law
  : U=B/T=(B/C)*(C/T)=S*X
  : 총 소요 시간 대비의 총 서비스 시간 비율 = 단위 시간당 시스템의 처리 건수 * 처리 건당 소요되는 평균 서비스 시간

- Little's Law
  : 서버상의 큐 길이를 설정할 때 참조할 수 있는 공식
  : Q(큐의 길이) = W/T = (W/C)*(C/T) = R*X

- Response Time's Law
  : X(처리량) = 총 호출 건수/총 소요 시간 = N*(T*(R+Z))/T = N*(R+Z)

- Forced-Flow Law
  : 개별 리소스와 전체 시스템 사이의 상관 관계를 보여주는 공식
  : C - 전체 시스템에 대한 처리 건수
    Ck- 개별 리소스에 대한 처리 건수(k번째 리소스)
    Vk- 개별 리소스에 대한 Visit Ratio(k번째 리소스)
    Dk- 개별 리소스에 대한 서비스 요구량(k번째 리소스)

    Vk = Ck/C(k번째 리소스)
    Xk = Vk*X (k번째 리소스에 대한 처리량)
    Uk = Xk*Sk (k번째 리소스에 대한 사용율)
       = X*Vk*Sk
       = X*Dk

- 처리량 상관관계
  : Forced-Flow Law에 의해 도출된 각 리소스에 대한 처리량을 통해 전체 시스템의 처리량을 정의할 수 있음
  : 전체 시스템을 구성하는 n개의 독립 서버의 각 처리량을 Tn이라할 때, 다음과 같이 처리량을 도출할 수 있음
  ※ 전체 Throughput(단, 각각의 서버가 동일한 리소스에 의해 병목을 직면하고 있는 경우)
    T = 1/(1/T1+1/T2+1/T3+1/T4+1/T5+....+1/Tn) = 1/(∑(1/Tn))
  ※ Throughput of Block A&B = 1/(1/a+1/b)

- 병목 지점 분석
  : 임계 지점 부근의 처리량(X)과 응답 시간(R)의 상관 관계
    → X(N)≤min{1/Dmax, N/(D+Z)}
       R(N)≥max{D, NDmax-Z}
       where Dmax: 병목 지점의 서비스 시간
             D=∑Dn
       전제조건: 어떠한 리소스라도 이용률은 1이하이다.
                 N명의 사용자를 처리하고 있는 시스템의 응답 시간은 1명의 사용자를 처리하는 시스템보다 더 빠를 수 없다

  : 처리량의 경우 입계 사용자 수 근방까지 시스템의 용청을 원할하게 처리, 포화 지점 이후 병목 발생 수평을 유지
  : 임계 사용자 수 지점의 처리량은 해당 시스템의 최대 처리량 or 임계 처리량
  : 응답 시간은 임계점 이전은 일정하게 유지, 포화 지점 이후 병목 발생으로 응답시간 증가

===================================================================================================================

 

각종 공식들에 눈돌아가네요...@_@;

DB와는 직접적인 관련이 없습니다만... 알아두시면 좋으실 듯 해서 두번째 정리본 올립니당~^^ㅋ


출처 : http://cafe.naver.com/prodba/3664

'연구개발 > DBA' 카테고리의 다른 글

tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
tempdb 대량 I/O 발생시키는 쿼리 확인  (0) 2015.09.01

ERROR: child process failed, exited with error number 100 가 나타난다면

설치 시 잘못해서 그런거다.. 중복 실행을 했거나...


이럴 때 설치하는 data 폴더를 찾아가서

rm mongod.lock 

으로 mongod.lock 파일을 살포시 날려준다.


또는 

[root@server ]# mongod --smallfiles

한 후

conf 디렉토리에서

nojournal = true 를 해주고

service mongo restart 해주면 정상적으로 데몬이 뜬다.

+ Recent posts