운영체제 16장 - Distributed Processing, Client/Server, and Clusters


편리한 인터페이스를 end user에게 제공하는것을 client machines라고 함


server는 여러사람이 공유하는 서비스를 클라이언트에게 제공하는것
database를 갖고있고, 많은 클라이언트들이 접근해서 공유할수 있는 방식


네트워크를 통해서 클라이언트와 서버를 연결함으로서 이루어진다
기반이 되는 시설이 네트워크 시설


사용자에게 친숙한 애플리케이션이 실행될수 있는 안정적인 환경을 제공
데이터베이스에 집중된 서비스 제공
사용자에게 commitment한 문제가 발생하지 않도록 제공
네트워킹을 통해서 서비스를 제공


계층구조


분산환경에서 애플리케이션이 가장 중요한 역할
서버와 클라이언트의 차이는 communication protocols을 통해서 맞춰주게 된다




애플리케이션에 따라서는 데이터베이스의 로직을 담고 서버의 로직과 직접적으로 통신하는 방법도 있다


클라이언트는 sql을 이용해서 쿼리를 요청
서버는 그에 대한 대답을 한다
그것을 가지고 실행을 해서 사용자에게 보여준다


대표적인 실수가 쿼리를 보내서 일을 많이 시켜서 데이터베이스에 결과를 가져오는것
데이터베이스에 부하가 걸려서 문제발생
join연산에 많은 자원 소모, 어떻게 설계하고 어떻게 쿼리를 사용할지가 중요


이렇게 분산되서 서비스를 만드는 경우
호스트에 부하를 많이 걸지
서버에 부하를 많이 걸지
서로 협동할지
클라이언트에 기반해서 프로세스를 만들것인지 
4가지로 나누어진다


host-based processing
클라이언트는 거의 일을 하지 않고
서버에서 모든일을 한다
클라이언트는 presentation logic에서 만드는것만 화면에 보여주는 역할
x window 시스템이 예시


server-based processing
presentation logic을 클라이언트가 가지고 있고
서버는 나머지를 갖는다
사용자는 GUI만 제공


client-based processing
서버는 database logic만 나머지는 client에서 처리


cooperative processing
application logic만 서로 갖고있고
표현해주는 로직은 클라이언트가, 데이터베이스 로직은 서버가 갖고있는것
부하가 균등하게 나누어지므로, 많은 프로그램들이 이런 방식으로 구성됨
  

client-server architecture로 보통 three tier 구조 사용
클라이언트와 서버 사이 계층, application server가 있어서 그 사이에서 처리
 

우리가 네트워크를 사용해서 파일을 접근하면
그 파일에 대한 캐쉬를 유지하게 된다
이 캐쉬는 네트워크를 통해서 다시 데이터를 가져오게 되지 않도록 하므로, 로컬에 있는 네트워크를 통해서 서비스를 할수 있게 하므로 성능에 큰 영향

 
이러한 환경에서 프로그램 할때, 공통적으로 필요한 툴을 모아놓고 미들웨어라고 한다
프로그래머가 애플리케이션을 쉽게 만들 수 있도록 함


미들웨어의 위치는 communication software의 위
 



최근 인터넷 서비스들은 SOA로 만들어짐
마이크로서비스로 시스템을 구성하는 방법
애플리케이션을 모듈들로 나누어서 비즈니스를 만들어냄
  
서비스들의 집합으로 구성이 되고 클라이언트들을 다양하게 만들어서 서비스를 제공
xml, html로 인터페이스를만들어서 웹서비스라고 불리고 있음


서비스 중심의 아키텍쳐는
서비스를 리퀘스트하는 클라이언트와 
서비스를 제공하는 서버간의 바인딩을 해서 서비스를 요청하고 그 서비스를 받게 되는데
그때 이러한 서비스의 리스트를 갖고 있는 브로커가 있어서
클라이언트는 그걸 찾고, 서버는 제공하는 것을 알려주고






이러한 SOA구조를 만들기 위해서는 클라이언트와 서버가 통신해야 하는데
미들웨어를 사용하는 방법이 있고

 
메시지 패싱을 통해 구현


메시지 전달 방법에는
신뢰성 있는 방법과 비신뢰적인 방법이 있다
신뢰성 있는 - 실패시 알려줘서 처리할수 있게함





기본적인 메시지 전달을 위해서 remote procedure call이 구현됨
원격 서비스를 사용하기 위해 제공됨, api라고 부르고 표준화 되어있다


클라이언트는 마치 로컬에 있는 api를 쓰는것처럼 요청하면
그것이 원격지에 가서 처리가 되어 결과가 돌아와서 사용할수 있도록 하는 방법


이때 파라미터를 어떻게 전달할것인가?
call by value로 전달
reference로 전달하면, 대상이 되는 객체가 구현되어 있어야 하고 그것은 원격지에 객체를 가져가서 만들어야하는 문제가 있다


클라이언트- 서버 연결 방법에는
지속적, 비지속적 연결 방법이 있다
지속적 - 한번 remote procedure call을 하면 그 다음부터 발생하는 call에도 기록이 남아서 그 연결을 사용, 일정시간이 지나면 연결을 끊게 되고, 일종의 쿠키를 가지고 연결을 지속적이게 함

비지속적 - 한번 요청하면 그 다음 요청엔 새로운 요청을 하는것


remote procedure call을 할때
synchronous하게 할지 asynchronous 하게 할지도 문제

 
asynchronous는 블로킹이 안됨 병렬처리 할수있다, 프로그램 하기 어렵


SOA는 서비스 브로커가 있다
객체지향적으로 전체 서비스를 클라이언트에게 제공하는 object broker가 일반적으로 제공됨
전체 서비스를 쉽게 확장할수 있다


브로커가 중간에 클라이언트와 서버를 연결해준다
일종의 검색엔진 역할을 하게 됨
서로 연결하여 서비스를 주고 받게 된다


비싼 SMP머신을 사용하는 대신
값싼 리눅스 머신을 엮어서 하나의 컴퓨터처럼 사용자에게 보이도록 하는것을 cluster라고 함


장점은
리눅스 서버를 붙여서 점점 확장할수 있고
SMP에 비해 점진적으로 scalable하다
전체중 일부가 죽어도 나머지가 동작하는 가용성
가성비


각각의 머신을 high-speed 네트워킹을 해서 전체 서비스를 제공하거나
raid나 디스크sharing을 해서 서비스를 제공하는 방법이 있다
raid를 연결하는 네트워크를 Storage Area Network라고 함


클러스터 기술은 다음과 같은 형태의 기술을 요구
failure management - 부분적으로 고장나도 서비스 제공

두 방법이 존재하는데
highly available cluster을 제공하거나
- 컴퓨터 시스템이 일부 죽더라도, 없어진 쿼리가 다시 실행될때 다른 컴퓨터에 의해 처리되도록 하는 방법
운영체제가 부분적으로 실행되는 transaction에 대한 책임지지는 않음
failure가 생기면 쿼리는 잊어버림

fault-tolerant clusters를 제공
 - redundant한 디스크나, redundant한 리소스에 의해 문제가 생기는것을 해결
transaction에 대해 항상 실행이 보장되는 방법


고장났을때 다른 리소스에 의해 대체되는걸 failover
고장났을때 시스템을 복구하는걸 failback


Load balancing
클러스터에 의해서 전체 시스템이 구성되면, 각 컴퓨터들이 부하가 균등하게 나누어져야 한다
그래야 사용자가 볼때 빠르게 반응하는 컴퓨터 시스템을 쓸수 있다

새 컴퓨터가 클러스터에 추가될때, 로드밸런싱에 의해 전체 시스템의 성능이 올라가길 기대함
그리고 미들웨어의 브로커에 의해 새로운 서비스가 등록되어 클러스터를 사용할수 있도록 한다


이 클러스터를 사용해서 고속으로 데이터를 처리하길 원하는데
컴파일러를 사용하여 자동화 - 어렵
애플리케이션을 사용, 사용자에 의해 병렬화





클러스터와 SMP를 비교
둘다 병렬처리기를 제공하는 방법

SMP - 전체크기 작고, 사용하기 쉬운 반면 가성비 떨어짐
클러스터 - 확장성, 가용성 좋다


윈도우 시스템으로 클러스터를 구성할수 있다


리눅스에는 Beowulf가 있다