6,802.40
전일대비 14.11 ( -0.21% )
23,007.69
전일대비 49.72 ( -0.22% )
48,394.30
전일대비 22.26 ( -0.05% )
용어 | 설명 |
조인포인트 (Join Point) |
|
포인트컷 (Point Cut) |
|
타켓 (Target) |
|
어드바이스 (Advice) |
|
에스펙트 (Aspect) |
|
위빙 (Weaving) |
|
회사에서 담당하고 있는 서비스가 K8S 에서 운영하다 보니 기본적인 용어정리의 필요성을 느꼈다. (당장 깊게 살펴보는 건 아니더라도...)
실제로 업무중에 많이 들어본 오브젝트를 위주로 정리하였다.

Node
클러스터에 속하는 VM 이거나 물리 머신.
노드는 Pod 들을 구동하기 위해 필요한 서비스들을 가진다.
Cluster
Node 라고 불리는 머신들의 집합.
Pod
최소단위의 쿠버네티스 객체.
클러스터 상에서 동작하는 컨테이너 집합.
Service
Pod 집합과 같은 애플리케이션들에 접근하는 방법을 기술하는 오브젝트
Container
경량, 포터블 실행가능한 이미지
소프트웨어와 그에 필요한 의존성 모듈들을 포함함.
컨테이너는 하부의 호스트 인프라스트럭처로부터 애플리케이션을 분리함으로써 다른 OS 환경에 배포하거나 스케일링하는 것을 간편하게 해준다.
Deployment
최소 단위인 Pod 에 대한 기준 spec 을 정의한 오브젝트
지정한 Replica 의 숫자만큼 Pod 수를 생성/ 유지
ReplicaSet
특정 수의 pod 레플리카들이 동시에 구동되도록 하는 오브젝트
Namespace
동일한 물리 클러스터에서 여러 가상 클러스터를 지원하기 위해 쿠버네티스가 사용하는 추상화
네임스페이스는 클러스터 내의 객체들을 묶음지을 때, 사용
클러스터 내 리소스들을 구분하는 방법이 된다/
리소스 이름은 하나의 네임스페이스 내에서 유일해야 한다.
단계 1) 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MariaDB 서버가 이해할 수 있는 수준으로 분리 (파스 트리) 한다. - SQL 파싱 (Parsing)
단계 2) SQL 의 파싱 정보 (파싱트리) 를 확인하면서, 어떤 테이블부터 읽고 어떤 인덱스를 읽을지 선택한다. - 옵티마이져
불필요한 조건의 제거 및 복잡한 연산의 단순화
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
각 테이블에 사용된 조건과 인덱스의 통계 정보를 이용해 사용할 인덱스를 결정
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
단계 3) 두번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고 MariaDB 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업진행.
데이터베이스를 이용한 session 처리 핸들러 예제입니다. (* SessionHandlerInterface 인터페이스 구현체,)
아래와 같이 open, close, read, write. destroy, gc 를 구현하면 DB 를 통해서도 세션관리가 가능합니다.
(일반적으로는 프레임워크에서 세션처리 구현이 되어있기 때문에 아래와 같이 작업할 일이 없음)
테이블
소스
<?php
date_default_timezone_set('Asia/Seoul');
/**
* Session Handler Interface
*/
class DatabaseSessionHandler implements SessionHandlerInterface
{
private PDO $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
public function open($path, $name)
{
return true;
}
public function read($id)
{
$sth = $this->pdo->prepare('SELECT * FROM sessions WHERE `id` = :id');
if ($sth->execute([':id' => $id])) {
if ($sth->rowCount()>0) {
$payload = $sth->fetchObject()->payload();
} else {
$sth = $this->pdo->prepare('INSERT INTO sessions(`id`) VALUES(:id)');
$sth->execute([':id' => $id]);
}
}
return $payload ?? '';
}
public function close()
{
return true;
}
public function destroy($id)
{
$this->pdo
->prepare('DELETE FROM sessions WHERE `id` = :id')
->execute([':id' => $id])
;
}
public function gc($max_lifetime)
{
$sth = $this->pdo->prepare('SELECT * FROM sessions');
if ($sth->execute()) {
while ($row = $sth->fetchObject()) {
$timestamp = strtotime($row->created_at);
if (time() - $timestamp > $max_lifetime) {
$this->destroy($row->id);
}
}
return true;
}
return false;
}
public function write($id, $data)
{
return $this->
pdo->prepare('UPDATE sessions SET `payload` = :payload WHERE `id` = :id')
->execute([':payload' => $data, ':id' =>$id]);
}
}
// 세션 핸들러 등록
session_set_save_handler(new DatabaseSessionHandler(new PDO('mysql:dbname=test;host=127.0.0.1;', 'root', 'root')));
session_start();
$_SESSION['message'] = 'Hello world';
$_SESSION['foo'] = new stdClass();
session_gc(); // 세션 정리