이 글은 아래의 포스트를 번역한 글입니다.(오역이 있을수 있습니다.)
Content
- Intro
- Client-server model
- Network Protocols
- Storage
- Latency and Throughput
- Availability
- Cache
- Proxy
- Load Balancer
- Hashing
- Database
- Key-value store
- Specialized storage paradigms
- Replication and sharding
- Leader Election
- Peer to Peer
- Polling and Streaming
- Configuration
- Rate limiting
- Logging
- Pub/sub pattern -- Stream
- MapReduce
- Security
- Conclusion
- Learn More
Intro
이 글은 Frontend Interview Cheatsheet의 후속편입니다. 만약 아직 보지않았다면 먼저 읽어보세요👇
여기에 나와있는 것들은 당신이 master해야할 시스템 디자인 면접 개념에 도움이 될만한 것들을 줄것입니다.
재밋게 읽고 나서 medium and twitter 에서 팔로우 하는것을 잊지 말아주세요
만약에 1000개의 👏, 박수를 받게된다면 인터뷰 준비에 도움을 줄 System Design Interview Template을 포스트 할게요
Client-server model
- DNS — Domain Name System은 IP 주소를 domain 이름으로 redirect 시켜줍니다. client는 DNS에 쿼리를 날리고 IP 주소를 전달받습니다.
- IP address — 각각의 기기가 인터넷에 연결된 숫자로 된 주소입니다. a.b.c.d(0 - 255). 192.0.0.1 - localhost.192.169.c.d
- Port — 복수의 프로세스가 충돌없이 동작하기 위한 것 0-65525. 2^16. 0-1023 포트 들은 시스템에서 관리합니다. (22: Secure Shell, 53: DNS lookup, 80: HTTP, 443: HTTPS)
Network Protocols
- IP — 인터넷 프로토콜 -- IP 패킷을 이용해서 인터넷 상에서 기기간에 통신하기 위한 규칙
- TCP — 패킷들은 순서대로 전달되는것을 보장하고, 오류가 발생했는지 여부를 알수 있습니다. 추가적인 TCP 헤더(전달 순서에 관한 정보)를 가지고 IP 전달과정의 위에 존재하게 됩니다.
- IP Packet — 기기간에 통신을 위한 가장 작은 데이터 단위 입니다. 헤더(source, recipient, size of the packet, version of protocol IPv4)와 페이로드로 구성되어있습니다. 패킷의 크기는 ²¹⁶ bytes 입니다. 모든 패킷이 전달되었는지 보장할수 없고 순서는 HTTP -> TCP -> IP 순으로 전달됩니다.
Storage
- Database — 데이터를 디스크 혹은 메모리에 저장하는 서버 입니다. Record and query
- Disk — 프로세스가 죽으면 데이터를 저장하고 유지합니다. HDD는 느리지만 비싸지 않습니다. SSD는 빠르지만 더 비싸고 비휘발성 입니다.
- Memory — RAM, 프로세스가 죽으면 데이터를 지우고 빠른접근이 가능하고 휘발성 입니다.
- Persistent data — 프로세스가 죽으면 데이터를 유지합니다.
Latency and Throughput
- Latency — 작업을 완료하는데 소요되는 시간(ms) :
1) RAM 으로부터 1 Mb를 읽는데 - 0.25 ms;
2) SSD 로 부터 1Mb를 읽는데 - 1ms;
3) 네트워크(1 Gb/s)를 통해 1Mb를 전송하는데 - 10ms;
4) HDD로부터 1Mb를 읽는데 - 20ms;
5) 대륙간에 1Mb를 전송하는데 - 150ms
- Throughput — 1초 단위로 수행할 수 있는 연산 동작의 수 (RPS, QPS)
Availability — reliability
- Availability — 1년 단위로 서비스에 접근할수 있는 시간 1) 99% (87.8 hours); 2) 99.9% (8.8 hours); 3) 99.99% (52.6 min) 4) 99.999% (5.3 min) (5 nines);
- Redundancy — availability를 증가하기 위한 시스템의 복제 (단일 실패 지점이 없는지 확인 - 이중화 사용) Passive redundancy (2개의 기기중 하나가 죽으면 다른 하나가 동작), active redundancy (만약 하나가 죽으면 다른 하나가 기능을 수행한다.)
- SLA (service — level — agreement) 복수개의 SLO로 구성되어있고 서비스의 실행을 보장해준다.
- SLO (service — level — objective) 서비스의 실행을 보장 (availability)
Cache
- What can be cached — Client, Server, In Between(서버-데이터베이스), API, 하드웨어(CPU), 자주 사용되는 연산들, 무거운 동작들과 계산들
- Cache — 빠르게 제공하기 위한 데이터를 가지고 있는 하드웨어 혹은 소프트웨어(무거운 계산의 결과, API 반응들, API 요청들)
- Write through cache — 캐시와 메모리에서 동시에 캐시가 업데이트 될때 프로세스가 죽으면 데이터를 복구합니다. 장점 -- 간단하고 신뢰할 수 있습니다. 단점 -- 캐시가 자주 write되지 않을때 수월하게 동작합니다.
- Write back cache — 캐시와 메모리에 있는 캐시가 동시에 업데이트 될때(캐시만 먼저 업데이트 되고 나중에 메모리에 있는 정보가 업데이트 되는 방식)
- 만약 캐시 데이터의 지속성을 신경써야 한다면 -> local 캐시를 사용합니다. 만약 정확성이 중요하다면(views, likes) - 서드파티 캐시를 사용합니다(Redis)
- Cache Hit— 캐시에서 요청된 데이터를 찾는 것
- Cache miss — 설계로 인하여 저장된 캐시를 찾지 못하는것
- Cache eviction policy — 캐시가 제거되는 규칙(LRU (recent), LFU(frequent), FIFO(queue))
- Content Delivery Network (CDN) — 지역에 따라 서버를 캐시해주는 third party 서비스, 대기시간이 더 짧아진다. PoP (Point of Presence). Cloudflare, Google Cloud CDN.
Proxy — security, reliability
- Forward proxy — client-side (hide IP) VPN; (클라이언트를 숨기는 것)
- Reverse proxy — server interceptor (load balancing, leader election) (logging, caching, filter requests, load balancing, security shield); (서버를 숨기는 것)
- Proxy tool — Nginx;
Load Balancer — security, reliability, performance
- 서버들간에 트래픽을 분배해주는것. 서로 다른 선택 전략을 가진 여러가지의 로드밸런서 들이 있습니다.
- Server selection strategy — (weight-if some servers more powerful) round-robin, random selection, performance-based, IP based, API path based; (라운드 로빈, 랜덤 선택, 퍼포먼스 기반, Ip 기반, API 경로 기반)
- Hot-spot — 하나의 기기에 너무 많이 몰린 트래픽을 분산 시켜주는것, reason suboptimal sharding key/hashing function
- LB Library — Nginx;
Hashing
- Hashing — 데이터를 해시로 바꿔주는 것 -- 보통 interger로
- Consistent hashing — 해시 테이블이 resize 되어져야 할때 재위치되어야 할 key들의 숫자를 최소화 하는 것 (load balancer during adding or removing server) (Rendezvous — highest random hash);
- SHA — secure hash algorithm, hash 함수들을 모아둔 것. Popular SHA-3.
Database
- ACID — database (of database transaction):
ATOMICITY(원자성) — 트랜잭션의 모든 연산들은 실패하거나 성공한다. 중간상태를 가지지 않는다.
CONSISTENCY(일관성) — 각각의 트랜잭션은 데이터가 최신화된 상태임을 보장한다. (strong consistency), (eventual consistency) will be updated after some time;
ISOLATION(독립성) — 여러 트랜잭션들의 실행은 그들이 연속적으로 실행되는 것과 같다. (서로 관련되어 있지 않아야 한다 라는 뜻으로 이해)
DURABILITY(지속성) — 트랜잭션들은 비휘발성 상태를 가지며 서로 충돌할 수 없다. - Relational database — 테이블, 열, 행으로 구성된 데이터 베이스, 그들간에 관계성을 가진다
- Nonrelational database — 표 형식이 아닌 특정한 목적을 위해 구성되어 있다.
- SQL — structured query language;
- SQL database — SQL을 지원하는 관계형 데이터 베이스;
- NoSQL — SQL을 지원하지 않는 데이터 베이스
- Database index — 데이터 검색을 빠르게 해주고 데이터 write를 느리게 하는(columns들의 인덱스를 생성해야 하기 때문) 데이터 구조
- Strong consistency — ACID와 연관된(모든 연산들은 최신의 데이터를 보장해야 한다) -- PostgreeSQL
- Eventual consistency — 트랜잭션은 나중에 최신화된 데이터를 가지게 된다. (transaction will eventually (later) know the updated data); (미국에서 좋아요가 100개인 상품을 누르면 101개가 됨, 한국에서 같은 상품을 확인했을때 좋아요는 100개로 노출됨);
Key-value store
- NoSQL 데이터베이스가 캐싱과 동적 환경설정을 위해 사용한다. (Etcd — strong consistency, used for leader election), (Redis — caching, rate limiter), Zookeeper (strong consistency, leader election, highly available);
Specialized storage paradigms
- Blob Storage — Blob(binary large object)로 구성된 key-value 저장소이다. 보통 media: 이미지, 오디오, 비디오에 사용한다.(Google Cloud Storage, Amazon S3)
- Time Series Database — 시간 인덱스를 가진 데이터를 분석하고 저장할때, 연속적으로 생성되어야 할때(logging, internet of things, stocks ): Prometheus, InfluxDB, Graphite;
- Graph Database — 데이터가 복잡한 관계 형성을 하고 있을때 (social network) (Neo4j)
- Cypher — graph query language created by Neo4j, simpler than SQL
- Spatial database — 위치, 지도, 빠른 쿼리를 위해 quadtree를 사용함 (the region/location); (hotel, map)
Replication and sharding
- Replication — 한 서버에서 다른 서버로 데이터를 복제하는 것(단일 실패 지점을 줄이고 대기시간을 줄인다), 주 데이터베이스와 복제가 업데이트 되어 진다(sync, async)
- Sharding — 데이터 분할(데이터베이스가 거대할때), 처리량을 늘리기 위해 데이터 베이스를 파편(shard)으로 분리한다. (based on client region, based on the type of data (payment), based on the hash of column). 차선의 sharding 전략이 있다면 Hot Spot을 가질수 있다.
Leader Election — reliability
- 주요 연산을 수행할때 서버들 중에 리더를 뽑는 과정(system important operations). And other nodes know who is the leader also after reelection;
- Consensus algorithms — 리더를 뽑고 모든 서버간에 동기화를 한다. Paxos, Raft. Etcd and Zookeeper — key-value databases that implement leader election
Peer to Peer
- 기기들이 시스템 처리량을 올리기 위해 작업량을 나누는 것(file distribution)
- Gossip Protocol — 업무량을 기기들간에 나누기 위해 소통하는 과정. 파일을 데이터 덩어리로 나누고 누가 어느 덩어리를 소유할지 알려주는 hash map을 만든다. Distributed Hash Table. Kraken
Polling and Streaming
Configuration
- JSON or YAML
- Can be static — 일정하다, 장점 -- 일정하다, 단점 -- rebuiling을 요구한다
- Dynamic (stored in KeyValue — Redis) 장점 - 유연하다, 적용하기 쉽다. 단점 -- 테스트가 없으면 시스템을 망가뜨리기 쉽다
Rate limiting — security, reliability
- 스팸 시스템을 줄인다. Dos와 DDos(Distributed Denial of Service attack)을 피할수 있다.
- 캐시에 의해 수행되어진다. 로드밸런서가 어떻게 redirect 해야할지 알지 못하기 때문에 서버캐시를 사용하기 어렵다.
- reverse proxy(Load Balancer)에서 key-value 데이터베이스를 사용한다(Redis)
- Rate limiting 시스템에 따라 규칙은 단순하거나 더 복잡해질수 있다
Logging — reliability, growing
- Logging — 이벤트들의 정보를 수집한다. 모든 이벤트들은 STDOUT, STDERR에서 기록된다. 시간연속성 데이터 베이스에 그것들을 저장한다.InfluxDB, Prometheus
- Monitor — Grafana로 시각화 한 것;
- Alert — 모니터링 하고 있는 시스템에 이벤트가 발생하면 alert를 생성한다. 예를 들면 slack의 post와 같이
- 시스템의 성장에 있어서 logging은 중요하다.(에러 잡을때 무조건 필수)
Pub/sub pattern — Stream
- Pub/Sub model; (하나를 구독하고 이벤트가 발생하면 캐치하는 모델)
- Use cases: 채팅 메시지, 뉴스 피드, 주식 정보, 알림
- Guarantees: at-least-one-delivery, persistent storage, ordering, replayability;(적어도 하나의 배달, 영구 저장소, 순서보장, 재실행성)
- Publisher Server (P) — Topic Channel (T) — Message — Subscriber (P) -> (T) — m1 — m2 -> (S)
- Idempotent operation — 몇번 호출되었나 상관없이 같은 결과를 가진다
- Apache Kafka — 링크드인, 구글 클라우드 pub/sub과 같은 스트리밍 시스템은 적어도 하나의 전달을 보장한다.
MapReduce — Scalability Big Data
- File System — 데이터의 구조를 추상화 하는 것(hierarchy, tree — Unix file system).
Distributed File System — 기기간에도 데이터를 분리하는 것 — Google File System, Hadoop Distributed File System; - MapReduce — 데이터 분배: 빠르고, 효율성 있고, 실패에 관대한; 데이터셋은 복수개의 기기로 분리되고 -> (Map) 각각의 덩어리들이 key:value로 구성됨 -> (Shuffle) 재구성되고 -> (Reduce) 의미있는 데이터 들로 변환 된다.
- Prerequisite — 우리는 파일 분배 시스템을 가지고 있다. 데이터셋을 덩어리로 분리하고, 여러 기기들간에 나누어 주며 중앙(map/reduce 워커들간에 어떻게 소통해야 하고 오고가야하는 지를 알고 있는)에서 관리하게 됩니다. 서버들은 매핑된 데이터를 보냅니다.
- 만약 실패가 발생하고 중앙제어가 map/reduce를 다시 실행합니다.(같은 연산 결과)
Security
- Man in the middle attack — 클라이언트에서 서버로 개인 IP 패킷을 가로채고 변경합니다. 암호화하고 HTTPS를 사용해야함
- Symmetric Encryption — 데이터를 암호화 하고 복호화 하기 위해 하나의 키를 사용합니다. 비대칭키 방식보다 빠릅니다. Advanced Encryption Standard (AES)중의 알고리즘들을 사용합니다;
- Advanced Encryption Standard — 표준 대칭키 암호화 방식 알고리즘 들(AES — 128, AES — 192, AES — 256);
- Asymmetric Encryption — 암호화, 복호화를 위해 공용키와 개인키를 사용합니다. 데이터는 공용키로 암호화 되고 개인키로만 복호화를 합니다(안전하게 보호되어 있어야 함). 대칭키 방식보다 느립니다;
- HTTPS — 안전한 연결. 서버는 SSL 인증서를 가지고 있어야 하고 서버와 클라이언트 간에 통신을 위해 TLS를 사용해야 합니다.
- TLS — TCP의 위에 설계된 transport layer security 프로토콜;
- SSL Certificate — 서버는 Certificate Authority로부터 전자 인증서를 부여 받습니다. TLS handshake 와 HTTPS connection 을 수행하기 위해 서버는 공용키를 가지고 있습니다.
- Certificate Authority — 공용키의 인증된 출처를 확인해줌
- TLS Handshake — 클라이언트와 서버간에 보장된 연결을 수행해줌.
클라이언트는 random bytes를 전달하고(client hello) ->
서버는 또 다른 random bytes(server hello) + 공용키와 함께 SSL 인증서를 보냅니다. ->
클라이언트는 인증서를 Certificate Authority와 함게 확인하고 공용키로 암호화된 premaster secret을 보냅니다. ->
클라이언트와 서버는 client hello와 server hello, premaster secret을 세션키를 생성하기위해 사용합니다. (대칭키 방식을 사용하여), 그리고 통신간에 모든 데이터들을 암호화 합니다.
Conclusion
기초들을 refresh하는 것은 시스템 디자인 인터뷰 준비를 위한 첫번째 단계일 뿐입니다. The next is to learn a System Design Interview Template, which I am going to share if you share a little bit of your love ❤️ that looks like 1000 👏 claps.
'Frontend > Javascript' 카테고리의 다른 글
innerHTML, insertAdjacentHTML, textContent, innerText (0) | 2022.03.01 |
---|---|
🔥Javascript questions (0) | 2022.02.28 |
js + cypress (0) | 2022.02.23 |
Frontend Interview Cheatsheet (0) | 2022.02.15 |
var, let, const (0) | 2021.11.10 |