istio란 무엇인가

https://www.meetup.com/OracleDeveloperKR/events/245519511/ 에서 참석해서 들은 istio에 관한 간단한 정리이다.

istio란 무엇인가?

* 우리가 서비스 중인 spring-cloud-netflix 와의 비교

  • 코드상에 @EnableEurekaClient @EnableSideCar 등의 코드 추가 없이 pod 만으로 적용이 가능하다.
  • Java 이외에도 사용이 가능하다 (우리팀의 현재 큰 이슈 중 하나)

* 모듈

  • Pilot : istio의 master와 같은 역할을 한다. 사용자에게 명령을 받아서 Envoy Process 명령을 전달한다. k8s의 apiserver와 비슷하다
  • Mixer : metric, quota 관리등을 한다.
  • Envoy : L7 프록시이면서, 커뮤니케이션 버스인 Envoy를 좀 더 확장된 버전을 사용한다https://www.envoyproxy.io/docs/envoy/latest/intro/what_is_envoy
  • 서비스 디스커버리, 로드 밸런싱, HTTP2/gRPC, 서킷 브레이커, 헬스 체크등의 기능을 가진다.

* 장점

* 단점

  • 현재 우리 IDC 상황에서는 사용 불가/ (그래서 구현 중…)
  • 개념은 좋으나 아직은 불안함 (현재 0.4이고, 최초 버전인 0.1은 2017/5이니 6개월밖에 안되었다)

* 동작 방식

* 확인이 필요한 내용

  • pilot이 이중화가 되는가?
  • pilot이 k8s의 master node에 뜨는가? 아니면 어디에 뜨는가?

스위프트 프로그래밍을 읽었다.

책 정보 (링크)

 

맥북과 아이폰을 사용하는 개발자임에도 불구하고 오브젝트C의 허들과 무관심함 때문에 App 개발을 할까 생각해본적은 없었다.
하지만 WWDC에서 Swift가 등장하고, 현업에서 많이 쓰이고 있는 Java, Scala, Javascrip를 쓰고 있는 내가 큰 어려움없이 진입할 수 있다는 것을 알게 되어, 야곰님의 iOS8 핵심노트라는 책과 함께 아이폰 개발에 입문 하게 되었다.

애플 개발자 사이트에 Swift에 대해서 설명이 잘 되어 있다고는 하지만, 한글로 된 책이 이해하기 쉽고, 개인적인 선호도도 높았기에, 꽤 많은 책을 보았다.
하지만 거의 모든 책이 ‘Swift 책’ 이라고 하기보다 ‘Swift로 개발하는 아이폰’ 책이라고 부르는게 맞을 정도로 많은 내용을 다루었다.

보통은 맥에서의 환경설정, Xcode의 사용법, 스토리보드, UIkit을 이용한 화면 디자인으로 앞의 절반을 차지하였고, 마지막의 또 20프로는 하나의 튜토리얼 앱을 만드는 걸로 끝났으니, 실제로 Swift는 문법 정도만 설명하고 끝나는 경우가 대부분 이었다. 정작 중요한 개념등은 세미나나 구글링을 통해 많이 접했던 것 같다.

우선 이 책은 그런면에서 다르다.
책 앞부분 약간의 Playground 설명을 빼면 450페이지 전체를 순수하게 Swift에 대해서 설명해준다.
특히나 api documentation 수준이 아닌 내용도 실려 있어서 도움이 되었다. (#16모나드, #25패턴, #27ARC)

그리고 Swift가 1.2 이후로 많은 변화(또는 자주변화) 되었는데 그에 대한 정리 부분도 다시한번 Swift를 되돌아 볼 수 있는 기회가 된것 같다.

최근에는 Swift가 오픈소스화 되어서 다양한 부분에서 언급되거나 시험받고 있다.
불확실 & 출처가 신뢰할 수는 없지만 https://thenextweb.com/dd/2016/04/07/google-facebook-uber-swift/#.tnw_6TnXLjYe 이러한 얘기도 있고
https://github.com/PerfectlySoft/Perfect 와 같은 server-side 영역으로 넘어오고 있는데, 이러한 영역의 확장이 기대되고 있다.
최근에 직장과 사는 곳을 옮기면서 시간이 부족해졌다.
iOS, Swift 에 대한 것도 소홀히 했었는데 다시한번 Swift를 되돌아 볼 수 있는 기회가 된것 같다.

intellij 에서 react class code snippet 사용하기

시간이 남아서 Redux 강좌를 보는중… https://www.youtube.com/watch?v=GEoNiUcVwjE&list=PL9FpF_z-xR_GMujql3S_XGV2SpdfDBkeC

React Class의 코드 스니펫을 atom editor에서 사용하는 방법이 나온다. 개인적으로는 atom 보단 intellij 가 편하므로… intellij 에서도 동일한 코드 스니펫을 셋팅해 보았다.

  1. Preferences – Live Templates 에서 적당한 탭을 찾는다.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-02-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-29-24
  2. 우측에서 + 버튼을 눌러 Live template을 선택한다.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-02-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-29-32
  3. 단축키워드와 코드 내용을 작성해서 넣는다. 그리고 사용 범위를 Javascript로 선택한다.
    코드내용은 제일 아래에 있으니 복붙
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-02-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-29-56
  4. 스크립트 파일에서 Abbreviation으로 선언한 키워드를 입력하면 노출 되는 것을 확인 할 수 있다.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-02-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-30-04
  5. 이후 키워드 포커싱은 $CLASSNAME$에 위치하므로, 적당한 클래스 명을 입력하면 된다.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-02-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-30-15

코드 내용


import React, { Component, PropTypes } from ‘react’;
  const propTypes = {
};

const defaultProps = {
};

class $CLASSNAME$ extends Component {
    constructor(props) {
    super(props);
  }
  render() {
    return(
      $CLASSNAME$
    );
  }
}
$CLASSNAME$.propTypes = propTypes;
$CLASSNAME$.defaultProps = defaultProps;

export default $CLASSNAME$;

Firebase Analytics + BigQuery

조대협님의 https://www.youtube.com/watch?v=Wi4mFICwoBE 를 보고 시작
%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-53-24

1.https://firebase.google.com 으로 접속한 후 프로젝트를 하나 생성한다 보이다시피 앱이름은 [BistrosAppTest]로 정했다. 이후 다음과 같은 초기화면을 볼 수 있다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-10-59-432.  이후 iOS 앱으로 진행 할 예정이므로 iOS앱에 Firebase추가를 누르면 아래 화면을 볼 수 있다. X-code에서 테스트 프로젝트를 만들고 General 탱베서 bundle ID를 카피해와서 붙여넣으면 된다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-00-34

3.앱 추가를 누르면 Info.plist 파일이 자동으로 다운로 되는데, 파일을 Project Folder로 Copy하자.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-02-204. Pods를 설정하기 위해 터미널로 프로젝트 폴더로 이동한다. 이후 Pod를 생성 및 편집한뒤 [ pod install ] 을 수행한다. 이후 workspace 파일을 열면 된다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-04-085. Swift을 사용할 예정이다. AppDelegate.swift을 연다음   [ import  Firebase ] [ FIRApp.configure() ] 2줄을 각자 위치에 입력한다.

6. 여기까지 성공하였다면 다음  화면을 볼 것이다. 이제 BigQuery를  셋팅하기 위해 [프로젝트 설정 -> 계정 연결 ]로 이동하여 그 밑의 화면을 봐야한다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-04-27%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-10-15

7. BigQuery 사용에 관련해 셋팅을 하고 나면 아래처럼 BigQuery- 연결된 앱 정보를 확인 할 수 있다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-10-28%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-16-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-11-10-58

 

윗 부분은 설정, 아래 부분은 실제 사용했을 경우에 대한 이야기이다.

 

실제로 위 처럼 따라해보면 Pod에 의해 설치된 프레임웍들은

Using Firebase (3.6.0)
Using FirebaseAnalytics (3.4.2)
Using FirebaseInstanceID (1.0.8)

이지만, API documentation과 실제 사용법은 다르다.  Doc이 업데이트가 안된듯하다.
( https://firebase.google.com/docs/reference/ios/firebaseanalytics/api/reference/Classes/FIRAnalytics )
차라리 sample project를 보는것을 추천한다.
https://github.com/firebase/quickstart-ios/blob/master/analytics/AnalyticsExampleSwift/PatternTabBarController.swift

// [START custom_event_swift]
FIRAnalytics.logEvent(withName: “share_image”, parameters: [ “name”: name as NSObject, “full_text”: text as NSObject ])
// [END custom_event_swift]

이후 BigQuery쪽에는 자동으로  dataset, table이 생성되고, 약 하루 정도 지나면 firebase 대쉬보드에서도 해당 내용을 확 인 할 수 있다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-17-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-1-39-50%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-17-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-1-41-08

android libraries

* UI

* Network , Image

  • Retrofit
    : http://square.github.io/retrofit/
    : 어노테이션을 이용하여 RestAPI사용을 쉽게 함, RxJava 지원
  • OkHttp
    : https://github.com/square/okhttp
    : Retrofit와 함께 사용할 수 있는 네트워크 라이브러리 (retrofit2는 안에 네트웍 부분이 분리되어져 나옴)
  • Glide
    : https://github.com/bumptech/glide
    : 이미지 다운로드 및 표시를 위한 라이브러리로 Gif, 비디오를 지원
    : Java로 구현, 고화질 이미지나 대용량은 성능이 떨어지므로 정적 이미지만 쓸꺼라면 피카소를 고려해볼것
  •  Fresco
    : http://frescolib.org/
    : Java가 아닌 JNI 사용해서 성능은 좋지만 바이너리 크기가 많이 증가한다
    : Glide에 비해 좀 더 사용이 복잡하고 ImageView가 아닌 DraweeView는 자체뷰를 사용해야한다.

AMP


GDG DevFest Seoul 발표 동영상을 보고 간략히 정리

AMP ( Accellerated Mobile Pages By Google )
웹페이지(특히 정적페이지)를 더 빠르게 랜더링 하기 위한 방법으로, 퍼포먼스 향상을 위한 구글의 경험과 베스트 플랙티스의 구현체

* AMP는 일반적인 웹페이지 일뿐이다. 단
1. AMP HTML : 일반 HTML에서 좀 더 확장이 된 것이지만, <img><video>등은 사용이 불가능하다 대체 방법을 써야한다.
2. amp.js : 웹페이지의 퍼포먼스 향상을 위한 베스트 플랙티스의 구현체
– 외부JS를 허용하지 않는다. 쓰고 싶으면 sandbox iframe에서 가능하다.
– AMP 페이지와 리소스 라이프사이클 및 랜더링 타임을 제어한다.
3. AMP STYLE = CSS
– 외부 스타일, 엘리먼트 인라인 스타일 허용안하고 문서에 삽입하는 형태로만 허용한다.
– 최대50kb를 허용한다.
4. AMP Cache
– AMP 페이지가 발견되면 구글 CDN Cache에 등록이 된다.
– URL 이 구글CDN의 url로 변경되어 identity가 저하되는 단점이 있다.

* 어떻게 만드는가?
– 일반 웹페이지를 만들고, 동일하게 AMP 페이지를 만든다.
– 현재로서는 구글 검색과, wechat(메신저 / 아직 예정)에서 AMP page를 사용한다.
* Example
– html page 최상단에 amp 를 붙이고 js를 async로 로딩한다
https://www.ampproject.org/docs/get_started/create/basic_markup
– amp-img등은 기본으로 제공하고, 이 외 youtube와 같은 확장 컴포넌트들을 제공한다
https://www.ampproject.org/docs/reference/components
ex page) http://1boon.kakao.com/tlxpass/bandworkout/amp
* AMP 가 사용한 베스트 플랙티스
– 비동기스크립트만 허용한다.
: 페이지 랜더링을 차단하는 자바스크립트를 방지한다.
: 그러기 위해 AMP JS를 제외한 다른 외부 스크립트는 허용하지 않는다.
: 확장 컴포넌트들도 JS 로딩때문에 랜더링이 차단되지 않도록 한다
– 모든 리소스 사이즈를 지정한다
: 리소스 다운로드 없이 사이즈 위치 계산과, 레이아웃을 지정하기 위해서 필수 지정한다
– CSS 는 내부 스타일 시트만 허용하고 크기를 제한한다.
: 외부 CSS 허용안하고, 내부 CSS는 50KB로 제한다
– 웹폰트의 효율적 다운로드
: 웹폰트를 다운로드 할때 차단되는 구간이 있기 때문에 제일 앞단에서 폰트를 다운로드 받게함
– 스타일 재계산을 최소화
– GPU 가속 애니메이션만 실행
페이지 레이아웃이 발생하지 않는 transform, opacity
– 리소스 로딩 순서를 제어
– 페이지를 즉시 로드
미리 가져올 페이지를 뷰포트만큼만 가져온다 (preconnect API)

* AMP internal
https://www.w3.org/TR/custom-elements/
– FSM을 이용 http://d2.naver.com/helloworld/6856597
– Single Pass Process
수행할 작업을 Pass에 등록한다.
– Promise pattern
– reflow를 최적화 함
: reflow는 repaint를 발생하므로 가능한한 안 일어나는게 좋다.
: js 최적화보다 reflow 1번 안 읽어나는게 중요하다.
: Vsync라는 클래스를 제공해서 reflow작업을 최적화 할 수 있게 한다.
* reference
https://www.ampproject.org/docs/get_started/create
http://d2.naver.com/helloworld/6856597
https://www.youtube.com/watch?v=e6slMlFgdCQ

git rebase에 대한 실습

회사에서는 Git enterprise를 사용하고 있고, 기본적인 정책은 git-flow , github-flow를  프로젝트에 맞게 사용한다. 대신 공통적인 가이드는  master를 service branch로 사용하고 PR로 적용한다는 것

rebase에 대한 개념만 얼핏알고 실제에서는 거의 쓸일이 없기에, 다음의 링크를 이해하는 의미로 따라해보았다.

참고링크는 http://blueasa.tistory.com/1731

  • 준비 C1 ~ C8의 branch와 commit 을 작업하였다.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-32-30
  • 1단계 git checkout iss1 , git rebase master : master는 기존과 동일하게 C4에 위치하고, HEAD는 C2에 위치됨을 확인
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-33-12
  • 2단계git checkout master , git merge iss1 : master 와 head가 제일 앞쪽으로 위치
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-33-44
  • 3단계 git checkout iss2 & git rebase master, git checkout master, git merge issue2
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-34-18%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-34-34
  • 4단계 : 마지막으로 issue3도 동일한 방법으로 진행해보자.
    %e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-34-55%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-03-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-35-08

akka에 대한 복습.

쓰기만 했지, 코어를 본적은 없어서… 한번 볼까 라고 생각한지 3개월이 넘은듯하다. 3개월째 서브라임에 있는 내용을 우선 여기에 올리는걸로 다시 시작을 해볼까

 

[provider의 종류]
actor.provider 는 LocalActorRefProvider 이다
akka-remote를 임베드 한다면 RemoteActorRefProvider 를 사용할 수 있다.
akka-cluster를 임베드하면 ClusterActorRefProvider 를 사용할 수 있다.

[ mailbox ]
http://doc.akka.io/docs/akka/current/scala/mailboxes.html
– default 는 akka-actor reference.conf를 보면 확인 가능한데 default-mailbox.mailbox-type = “akka.dispatch.UnboundedMailbox” , queue는 ConcurrentLinkedQueue를 사용한다.
– unbounded는 queue limit 이 없고 queue add handle 처럼 그냥 추가한다.
– bounded type은 mailbox-capacity 설정 값을 사용하고 default 는 1000 이다(추가로 mailbox-push-timeout-time 도 사용)
capacity가 넘을때는 LinkedBlockingQueue의 구현에 의지하는데 내부적으로는 putLock.newCondition().waiting한다

[stop & graceful stop]
– PoisonPill case class는 mailbox의 메시지가 다 처리되고 난후,
– 얘는 GracefulStopSupport 라는 package class안에서 gracefulStop def를 추가로 확인하자.
– Kill은 ActorKilledException을 발생
– stop은 현재 메시지를 처리하고 난 후 바로 처리됨 (나머지는 discard)
– 잘 정리 https://petabridge.com/blog/how-to-stop-an-actor-akkadotnet/
1.RemoteActor의 경우에는 RemoteSettings.scala를 보면 대충 설정 처리를 확인 할 수 있다.

ZOOKEEPER #3 (기본과 주의)

[단어 정의]
– 앙상블(Ensemble) : 서버의 집합
– 쿼럼(Quorum) :
설명1) 주키퍼가 올바르게 동작하는데 필요한 주키퍼의 최소 숫자
설명2) 앙상블이 요청을 처리하기에 충분한 주키퍼 서버를 가지고 있을 때 이 집합
ex) 5대의 앙상블/ 3대의 쿼럼
– 스플릿브레인
시스템이 두 부분 이상이 독립적으로 진행되어 시스템이 일관되지 않게 동작하는것
– 주키퍼핸들 : 주키퍼 세션을 의미한다 세션이 살아있는 동안 핸들은 유효하며,
핸들이 종료되면 주키퍼 클라이언트 라이브러리는 세션을 종료하기 위해 주키퍼 서버들에게 알린다
Zookeeper(String connectString, int sessionTimeout, Watch watcher)로 핸들을 생성한다.
ex) 5대에 쿼럼이 2대일 경우 2대는 /z를 알지만 3대는 /z를 모를경우?

[요청의 종류]
– 읽기요청 (exists, getData, getChildren) 은 요청을 받은 주키퍼에서 직접 처리
– 변경요청 (create, delete, setData)는 리더로 전달하고,
리더는 ‘트랜잭션’이라 부르는 상태 변경 사항을 생성해 요청을 처리
ex) /z setData요청 에서 트랜잭션은 ‘/z의 새로운 데이터 와 /z의 새로운 버전 총 2가지’
이 2가지는 항상 원자적으로 수행되어야 하며, 아닐 경우 문제 발생

[트랜잭션]
– 리더가 트랜잭션을 생성할때 트랜잭션ID(zxid)라는 식별자를 부여한다.
– 하나의 zxid에는 에퍽(epoch), 카운터(counter) 각각 32bit 씩 long(64bit)로 이루어진다.

[리더의 선출]
https://issues.apache.org/jira/browse/ZOOKEEPER-1153
– Election 인터페이스의 구현체 3개 중 2개 LeaderElection , AuthFastLeaderElection가 3.4.0에서 deprecated
– 현재 보는 버전(3.4.8)에서는 FastLeaderElection 사용중

– 앙상블에 의해 선출되고, 하나의 리더는 장애가 나기전까지 계속 리더이다.
– 서버의 최초 상태는 LOOKING (새로운 리더를 선출하거나, 이미 존재하는 리더는 찾는 상태)
– QuorumPeer.run 에서 시작한하고, LOOKING 일때 startLeaderElection 를 호출하는걸 확인 할 수 있다.
– LEADING : 투표에 의해 리더가 되면 이 상태로 진행하고, 나머지는 FOLLOWING 상태로 진입한다.

[특별한 데이터 노드 /zookeepr]
– 어플리케이션은 /zookeeper을 쓰면 안된다. 주키퍼의 사용이 예약된 곳이다.
– /zookeeper/quota

[주키퍼의인증 ACL]
– 중요!!! : 부모노드의 권한 정보를 자식이 상속받지 않는다. 그래서 znode를 생성할 때마다 접근권한을 설정해야한다.
– 주키퍼는 각 znode접근에 대해 클라이언트에서 전달된 권한 정보를 확인함으로써 보안을 수행한다.
– 인증 추가 addAuthInfo(String schema, byte[] auth) 를 수행한다.
– 언제든지 인증을 추가할 수 있지만 ‘일반적으로’ 주키퍼 핸들을 생성한 직후에 추가한다.
– 종류1) OPEN_ACL_UNSAFE ; ‘anyone’을 권한 정보
종류2) ‘super’ DigestAuthenticationProvider에 보면 new Id(“super”)를 확인 할 수 있다. SHA1에 의해 digest생성
종류3) digest
종류4) passwd_digest
– kerberos 사용가능
– 커스텀 가능 AuthenticationProvider 를 구현하고 zookeeper.authProvider 설정을 수정하면된다
[세션의 만료]
– 일반적으로 세션의 만료는 클라이언트가 요청한 작업에 장애가 발생했을 경우이다 하지만 그 뿐 아니라
– GC, 네트워크 문제등의 이슈로 발생할 수 있다.
– 중요!!! : 세션 만료의 경우 클라이언트는 주키퍼의 상태가 처음과 다르게 변할 수 있다는 점과, 요청 일부는 수행이 안될 수도 있다는 점을 꼭 기억해야한다.
[ znode의 버전 ]
– 재생성 되면 버전은 초기화 된다! znode의 버전을 중요하게 사용하는 경우라면 항상 기억할 이슈이다.

[연결이 끊어졌을 때 ]
– 세션이 살아 있는 동안에는 작업 순서에 대해 순서를 보장하지만, 장애상태에서는 달라 질 수 있다.
– 미처리된 요청은 취소함 동기호출은 예외 발생, 비동기는 콜백을 호출
– 취소됨을 알려만 주지 재처리 안하기 때문에 취소된 작업은 클라이언트에서 반드시 처리애햐한다. (다시할지 안할지)
– 절대로! 주키퍼가 뭘 해주지는 않는다.
– 중요! 취소되었다고 재요청을 할경우 무한 요청에 빠질수 있다. 재시도 횟수를 두거나, 핸들을 닫던가 해야한다.

[데이터의 제한]
– Znode의 데이터 제한은 1mb
– 옵션에 의해 수정가능하지만 별로…

[애플리케이션의 주키퍼 서버 임베딩]
– 주키퍼는 고가용성을 보장하지만, 애플리케이션에 임배딩하는것은 이 장점을 버리는 것과 같다. 하나가 죽으면 같이 죽을 확률이 높기 때문이다.
– App안에서 주키퍼 서버 자체를 만드는 것은 비추천하지만, 만약 필요로 하다면 주키퍼 테스트를 참고하라

ZOOKEEPER #2 (설정과 운영)

[기본적인 설정]

* clientPort
– default 2181, 클라이언트가 서버로 연결하기 위해 사용하는 TCP port
– clientPort보다 clientPortAddress 가 우선한다.
* dataDir
– 만약 앙상블이라면 여기에 id 파일이 존재하게 된다 (name:myid)
QuorumPeerConfig 에서 File myIdFile = new File(dataDir, “myid”) 확인할 수 있다.
– 스냅샷(데이터 트리의 복사본)이 완료될때 까지 디스크와 동기화 되지 않는다.

* dataLogDir
– default dataDir 값을 사용
– 트랜잭션 로그를 쓰기 때문에 많이 사용된다.

* tickTime
– default 3000, tick은 주키퍼가 사용하는 ‘시간의 기본 단위’
– 가장 짧은 클라이언트 세션 타임아웃 = 2 tick
* snapCount
– default 100000, 스냅샷들 사이에 트랜잭션 개수(zookeeper.snapCount)
– 주키퍼 재시작 -> 스냅샷을 읽는다 -> 스냅샷 이후 트랜잭션을 적용한다

* fsync.warningthresholdms
– default 1000 저장소 동기화 시간이 이 보다 길면 경고 발생한다. (FileTxtLog 의 commit() 참고 )

* globalOutstandingLimit
– default 1000 수정할 일은 ‘거의’ 없을 것이다.
– 주키퍼 서버가 요청을 처리하는 것보다 클라이언트들은 request를 더 할수 있는데 globalOutstandingLimit 에 근접하면 요청을 안받음
– NettyServerCnxn.disableRecvNoWait 을 보면 ‘Throttling – disabling recv…’ 로그를 생성하는걸 볼 수 있다.(여기 맞나?)

* autopurge.snapRetainCount
– 데이터를 제거할 때 유지해야하는 스냅샷의 갯수와 트랜잭션 로그 갯수
– 주키퍼는 주기적으로 GC가 일어난다. 이 때 유지해야하는 스냅샷의 갯수를 말한다. 기본은 3

* autopurge.purgeInterval
– GC(퍼징)이 발생하는 시간의 간격. 0이 아닌 숫자로 설정하면 GC의 주기를 뜻한다.
– 0 이면 GC는 자동적으로 수행되는 않고, zkCleanup.sh을 통해 수동으로 실행 가능

[클러스터 설정]
ㅁ 앙상블에 속하는 모든 주키퍼 서버들은 동일한 변수.값을 가지고 있어야 한다.

* initLimit
– default 환경에 따라 다 달라서 기본값이 없다
– 팔로워가 리더와 초기에 연결하는 시간에 대한 타임아웃, 틱 갯수
– 팔로워가 훨씬 뒤쳐진 경우 처음 연결할때 많은 양의 데이터 전송이 발생할 수 있다. (이땐 좀 늘여야한다)
– ex) 데이터 양의 크거나, 네트워크 속도가 느릴 경우
* syncLimit
– default 기본값 없고, 바드시 설정해야하는 값이다.
– 팔로워가 리더와 동기화 하는데에 대한 타임아웃 틱갯수로 설정
– 이 틱 시간 안에 팔로워가 리더와 동기화가 되지 않는다면 제거된다.
– 데이터의 양은 상관없다. 네트워크 속도 & 처리량에 따라 설정해야한다.
* leaderServers
– default yes
– 리더가 클라에게 서비스를 할것인가?
* server.x=[hostname]:n:n[:observer]
– x : 서버의 ID (data/myId 파일 내용에서 이 x를 읽고 server.x를 찾아 적용한다)
– n : 첫번째 : 트랜잭션 송신, 두번째 : 리더선출 (일반적으로 2888:3888)
– observer : 있으면 해당 서버는 옵저버를 나타낸다.
* electionAlg
– 리더 선출 알고리즘. 이지만 3.4.0 이후로 1개만 남는다
– QuorumPeer.createElectionAlgorithm()를 확인 ( code : new FastLeaderElection(this, qcm) )
– 참고doc : https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html
[로깅]
ㅁ SLF4J 와 Log4j를 사용한다. log4j.properties를 classpath에 포함시키면 된다.

[동적 설정 변경 or 무중단 설정 변경]
ㅁ 이 기능은 trunk 에만 존재하며 3.5.0알파 이후에 추가되었다.
ㅁ 이전버전에서 가장 안전한 방법은 ‘한번에 하나의 변경 사항만 만들고 매 변경 사항마다 앙상블을 올렸다가(리더 설정까지) 내리는 것’
ㅁ dynamicConfigFile 파라미터

[클라이언트의 연결 문자열 관리]
ㅁ host:port,host:port,host:port 의 사용법은 제한적이다. 추가/제거가 어렵다.
ㅁ DNS 리졸브.. (하지만 쓸일 없을듯)
[트랜잭션, 스냅샷 로그, 에퍽 파일 보기]
ㅁ 트랜잭션로그 보기 : java -cp zookeeper-3.4.8.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter z1/data/version-2/log.300000001
—-
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
16. 8. 8 오후 6시 13분 12초 session 0x356696bfcf20000 cxid 0x0 zxid 0x300000001 closeSession null
16. 8. 8 오후 6시 13분 12초 session 0x256696d24480000 cxid 0x0 zxid 0x300000002 createSession 15000
—-

ㅁ 스냅샷로그 보기 : java -cp zookeeper-3.4.8.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter z1/data/version-2/snapshot.300000000
—-
/assign/worker1.example.com/task-00000000
cZxid = 0x00000100000017
ctime = Mon Aug 08 17:19:04 KST 2016
mZxid = 0x00000100000017
mtime = Mon Aug 08 17:19:04 KST 2016
pZxid = 0x00000100000017
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
—-
스냅샷로그에는 데이터와 ACL은 출력되지 않는다. 그래서 어떤 시점의 무슨일이 일어났는지를 보려면 2개 다 확인해야 한다.

ㅁ epoch file : acceptedEpoch, currentEpoch 파일은 주키퍼가 보고, 참여하는 에퍽 번호를 반영. 데이터의 일관성을 위해 반드시 필요한 파일( 즉 백업할때 데이터와 함께 해야한다)

[시스템의 캡처]
앙살블의 트랜잭션 로그, 스냅샷 파일을 랩탑의 주키퍼에 복사하면 동일한 서버 상태를 재현 할 수 있다.
이 것은 파일의 복사만으로 쉽게 백업할 수 있다는걸 뜻한다. 앙상블중 1대만 복사하면된다(주키퍼는 복제 서비스이다)

[포 레터 단어 for letter word]
ㅁ 원래 의미 4글자로 구성된 비속어를 뜻한다.
ㅁ 주요 목적은 telnet/nc 같은 간단한 툴로 시스템의 상태를 쉽게 체크할 수 있는 방법을 제공하는 것이다. 그래서 output은 사람이 읽을수 있는 형태이다.
ㅁ ruok, stat, srvr, dump 등등
ㅁ 하지만 주키퍼는 기본적으로 Dcom.sun.management.jmxremote 옵션이 있으므로 jconsole등으로 jmx를 보는게 더 유용하다.

스크린샷 2016-08-13 오후 12.19.32