Zookeeper 분산 배치 PHP 프로그램 사용 하기

Zookper 는 분포 식,오픈 소스,분포 식 응용 에 사용 되 는 협력 서비스 입 니 다.이 는 간단 한 조작 을 제공 하여 분포 식 응용 이 이러한 인 터 페 이 스 를 바탕 으로 동기 화,유지,분 집 군 또는 이름 을 가 진 서 비 스 를 실현 할 수 있 도록 한다.Zookper 는 파일 트 리 구조 와 비슷 한 데이터 모델 을 사용 하여 쉽게 프로 그래 밍 하여 접속 할 수 있 습 니 다.
ZooKeeper 는 자바 애플 리 케 이 션 이지 만 C 도 사용 할 수 있다.여기에 PHP 확장 이 있 습 니 다.PECL 에서 다운로드 하거나 GitHub 에서 PHP-ZooKeeper 를 직접 가 져 올 수 있 습 니 다.
이 확장 자 를 사용 하려 면 먼저 ZooKeeper 를 설치 해 야 합 니 다.공식 홈 페이지 에서 다운로드 할 수 있 습 니 다.

$ tar zxfv zookeeper-3.4.5.tar.gz
$ cd zookeeper-3.4.5/src/c
$ ./configure --prefix=/usr/
$ make
$ sudo make install
이렇게 하면 ZooKeeper 의 라 이브 러 리 와 헤더 파일 이 설 치 됩 니 다.현재 PHP 확장 자 를 컴 파일 하려 고 합 니 다.

$ git clone https://github.com/andreiz/php-zookeeper.git
$ cd php-zookeeper
$ phpize
$ ./configure
$ make
$ sudo make install
"zookeeper.so"를 PHP 설정 에 추가 합 니 다.

$ vim /etc/php5/cli/conf.d/20-zookeeper.ini
웹 서비스 환경 에서 실행 할 필요 가 없 기 때문에 CLI 설정 만 편집 하 였 습 니 다.아래 줄 을 ini 파일 에 복사 합 니 다.

extension=zookeeper.so
확장 이 작 동 했 는 지 확인 하려 면 다음 명령 을 사용 하 십시오.

$ php -m | grep zookeeper
zookeeper
이제 ZooKeeper 를 실행 할 때 가 되 었 습 니 다.아직 유일 하 게 하지 않 은 것 은 설정 입 니 다.모든 서비스 데 이 터 를 저장 할 디 렉 터 리 를 만 듭 니 다.

$ mkdir /home/you-account/zoo
$ cd
$ cd zookeeper-3.4.5/
$ cp conf/zoo_sample.cfg conf/zoo.cfg
$ vim conf/zoo.cfg
"dataDir"라 는 속성 을 찾 아"/home/you-acount/zoo"디 렉 터 리 를 가리 킵 니 다.

$ bin/zkServer.sh start
$ bin/zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1
Created /test
[zk: 127.0.0.1:2181(CONNECTED) 19] ls /
[test, zookeeper]
이 때,당신 은 ZooKeeper 에 성공 적 으로 연결 되 었 고,"/test"라 는 znode 를 만 들 었 습 니 다.(잠시 후에 사용 할 것 입 니 다.)ZooKeeper 는 트 리 구조 로 데 이 터 를 저장 합 니 다.이것 은 파일 시스템 과 유사 하지만'폴 더'(번역자 주:맨 밑 에 있 지 않 은 노드 를 가리 키 는 말)는 파일 과 매우 비슷 하 다.zno de 는 ZooKeeper 가 저장 한 실체 입 니 다.Node(노드)의 표현 은 헷 갈 리 기 쉬 우 므 로 헷 갈 리 지 않도록 zno de 를 사 용 했 습 니 다.
우 리 는 잠시 후에 다시 사용 할 것 이기 때문에 클 라 이언 트 에 게 연결 상 태 를 유지 하도록 합 니 다.새 창 을 열 고 zookeeperdemo 1.phop 파일 을 만 듭 니 다.

<?php
class ZookeeperDemo extends Zookeeper {
 public function watcher( $i, $type, $key ) {
  echo "Insider Watcher
"; // Watcher gets consumed so we need to set a new one $this->get( '/test', array($this, 'watcher' ) ); } } $zoo = new ZookeeperDemo('127.0.0.1:2181'); $zoo->get( '/test', array($zoo, 'watcher' ) ); while( true ) { echo '.'; sleep(2); }
이 스 크 립 트 를 실행 합 니 다.

$ php zookeeperdemo1.php
2 초 간격 으로 점 이 생 길 겁 니 다.현재 ZooKeeper 클 라 이언 트 로 전환 하고'/test'값 을 업데이트 합 니 다.

[zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo
그러면 PHP 스 크 립 트 의'Insider Watcher'메 시 지 를 조용히 터치 합 니 다.어떻게 이 럴 수가 있어?
ZooKeeper 는 znode 에 연결 할 수 있 는 모니터 를 제공 합 니 다.모니터 가 znode 에 변화 가 있 는 것 을 발견 하면 이 서 비 스 는 관련 클 라 이언 트 에 게 즉시 알려 줍 니 다.이것 이 바로 PHP 스 크 립 트 가 변 화 를 어떻게 알 았 는 지 입 니 다.Zookeeper:get 방법의 두 번 째 매개 변 수 는 리 셋 함수 입 니 다.트리거 이벤트 가 발생 하면 모니터 가 소비 되 기 때문에 리 셋 함수 에 모니터 를 다시 설정 해 야 합 니 다.
이제 분포 식 프로그램 을 만 들 준 비 를 할 수 있 습 니 다.그 중의 도전 은 이러한 독립 된 프로그램 으로 하여 금 어느(leader)가 그들의 업 무 를 조율 하고 어떤(worker)가 실행 해 야 하 는 지 를 결정 하 게 하 는 것 이다.이 처리 과정 은 leader 선거 라 고 하 는데 ZooKeeper Recipes and Solutions 에서 관련 실현 방법 을 볼 수 있 습 니 다.
쉽게 말 하면 모든 처리(또는 서버)가 인접 한 처리(또는 서버)를 주시 하고 있다 는 것 이다.감시 되 어 있 는 처리(즉 Leader)가 종료 되 거나 무 너 지면 감시 프로그램 은 인접(이때 가장 오래된)처 리 를 Leader 로 찾 습 니 다.
실제 응용 프로그램 에서 leader 는 워 커 에 게 작업 을 할당 하고 프로 세 스 를 감시 하 며 결 과 를 저장 합 니 다.여기 서 간소화 하기 위해 서 나 는 이 부분 들 을 뛰 어 넘 었 다.
worker.php 라 는 새 PHP 파일 을 만 듭 니 다.

<?php
class Worker extends Zookeeper {
 const CONTAINER = '/cluster';
 protected $acl = array(
          array(
           'perms' => Zookeeper::PERM_ALL,
           'scheme' => 'world',
           'id' => 'anyone' ) );
 private $isLeader = false;
 private $znode;
 public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000 ) {
  parent::__construct( $host, $watcher_cb, $recv_timeout );
 }
 public function register() {
  if( ! $this->exists( self::CONTAINER ) ) {
   $this->create( self::CONTAINER, null, $this->acl );
  }
  $this->znode = $this->create( self::CONTAINER . '/w-',
                 null,
                 $this->acl,
                 Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );
  $this->znode = str_replace( self::CONTAINER .'/', '', $this->znode );
  printf( "I'm registred as: %s
", $this->znode ); $watching = $this->watchPrevious(); if( $watching == $this->znode ) { printf( "Nobody here, I'm the leader
" ); $this->setLeader( true ); } else { printf( "I'm watching %s
", $watching ); } } public function watchPrevious() { $workers = $this->getChildren( self::CONTAINER ); sort( $workers ); $size = sizeof( $workers ); for( $i = 0 ; $i < $size ; $i++ ) { if( $this->znode == $workers[ $i ] ) { if( $i > 0 ) { $this->get( self::CONTAINER . '/' . $workers[ $i - 1 ], array( $this, 'watchNode' ) ); return $workers[ $i - 1 ]; } return $workers[ $i ]; } } throw new Exception( sprintf( "Something went very wrong! I can't find myself: %s/%s", self::CONTAINER, $this->znode ) ); } public function watchNode( $i, $type, $name ) { $watching = $this->watchPrevious(); if( $watching == $this->znode ) { printf( "I'm the new leader!
" ); $this->setLeader( true ); } else { printf( "Now I'm watching %s
", $watching ); } } public function isLeader() { return $this->isLeader; } public function setLeader($flag) { $this->isLeader = $flag; } public function run() { $this->register(); while( true ) { if( $this->isLeader() ) { $this->doLeaderJob(); } else { $this->doWorkerJob(); } sleep( 2 ); } } public function doLeaderJob() { echo "Leading
"; } public function doWorkerJob() { echo "Working
"; } } $worker = new Worker( '127.0.0.1:2181' ); $worker->run();
최소 3 개의 터미널 을 열 고 각 터미널 에서 다음 스 크 립 트 를 실행 합 니 다.

# term1
$ php worker.php
I'm registred as: w-0000000001
Nobody here, I'm the leader
Leading
# term2
$ php worker.php
I'm registred as: w-0000000002
I'm watching w-0000000001
Working
# term3
$ php worker.php
I'm registred as: w-0000000003
I'm watching w-0000000002
Working
리더 가 무 너 지 는 상황 을 모 의 하고 있 습 니 다.Ctrl+c 또는 다른 방법 으로 첫 번 째 스 크 립 트 를 종료 합 니 다.처음에는 아무런 변화 가 없 었 고 워 커 는 계속 일 할 수 있 었 다.나중에 주 키 퍼 는 시간 을 초과 한 것 을 발견 하고 새로운 리 더 를 선출 할 것 이다.
이 스 크 립 트 들 은 쉽게 이해 할 수 있 지만 사용 한 Zookeeper 로고 에 대한 설명 이 필요 합 니 다.

$this->znode = $this->create( self::CONTAINER . '/w-',
               null,
               $this->acl,
               Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );
모든 znode 는 EPHEMERAL 과 SEQUENCE 의 것 이다.
EPHEMRAL 은 클 라 이언 트 가 연결 을 잃 었 을 때 이 znode 를 제거 합 니 다.이것 이 바로 PHP 스 크 립 트 가 시간 초 과 를 알 게 되 는 이유 입 니 다.SEQUENCE 대 표 는 각 znode 이름 뒤에 순서 표 지 를 추가 합 니 다.우 리 는 이 유일한 표 지 를 통 해 워 커 를 표시 합 니 다.
PHP 부분 에 서 는 아직 주의해 야 할 문제 가 있 습 니 다.이 확장 자 는 아직 베타 버 전 입 니 다.잘못 사용 하면 segmentation fault 가 발생 하기 쉽 습 니 다.예 를 들 어 일반 함수 에 들 어 갈 수 없 으 며,들 어 오 는 것 은 반드시 방법 이 어야 한다.나 는 더 많은 PHP 커 뮤 니 티 의 동료 들 이 Apache ZooKeeper 가 좋 고 이 확장 도 더 많은 지 지 를 받 을 수 있 기 를 바란다.
ZooKeeper 는 간결 하고 간단 한 API 를 가 진 강력 한 소프트웨어 입 니 다.문서 와 예제 가 잘 되 어 있 기 때문에 누구나 분포 식 소프트웨어 를 쉽게 만 들 수 있 습 니 다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

좋은 웹페이지 즐겨찾기