Scaling Web Apps & Database in the Cloud

안녕하세요 확장 성은 웹 응용 프로그램을 설계 할 때 중요한 부분입니다

Microsoft Azure와 같은 클라우드 공급자는 일부 서비스를 제공합니다 웹 응용 프로그램과 데이터베이스를 확장하는 데 도움이됩니다 프레젠테이션을 통해 스케일 업, 스케일 아웃, 로드 밸런서, 트래픽 매니저, CDN, 캐싱, 탄성 검색, 마이크로 서비스 등 데이터베이스를 확장하기 위해 Sharding과 같은 기술에 대해 논의 할 것입니다 파티셔닝, DDD, NoSQL 등 저는 Houssem Dellai, Microsoft MVP입니다 이 비디오에서 나와 함께하십시오

웹 응용 프로그램과 웹 응용 프로그램을 어떻게 확장 할 수 있는지 배우십시오 데이터베이스를 사용하여 수천 또는 수백만 명의 사용자를 지원할 수 있습니다 우리가 상상해 봅시다 처음에는 가상 머신에서 비즈니스 웹 애플리케이션을 호스팅해야합니다 웹 사이트는 초당 10,000 건의 요청을 처리하지만 예를 들어 모두가 사용하고자하는 새로운 멋진 제품 또는 서비스를 출시했습니다

서비스를 제공하므로 요청 수가 늘어나 가상 시스템이 모든로드를 취하고 특정 시점에 가상 시스템이 스택됩니다 처리 할 수있는 요청이나로드에 대한 제한이 있기 때문에 그래서 한계에 도달하면 가상 머신은 들어오는 요청은 귀하의 비즈니스에 나쁜 소식이므로 우리가 여기서해야 할 일 우리가 고려해야 할 더 큰 가상 머신으로 이동하는 것입니다 규모 응용 프로그램이 더 작은 가상 컴퓨터에서 가상 컴퓨터로 더 큰 가상 머신 큰 가상 머신이 의미하는 바는 더 많습니다 RAM 및 더 많은 CPU 그래서 여기에서 우리는 8에서 이동할 수 있습니다 기가 바이트 및 8 개의 CPU 가상 머신이 베거에 연결됨 예를 들어 500 기가 바이트의 RAM과 64 CPU를 예로 들어 보겠습니다

이것은 이동 또는 복사 만하면되기 때문에 쉽게 할 수있는 옵션입니다 더 작은 VM에서 더 큰 VM으로 어플리케이션을 옮길 수 있습니다 우리 웹 사이트가 다가 오면 응용 프로그램의 소스 코드를 변경해야합니다 사용자의 요청이 많아지면 하나의 단일 VM에서 처리 할 수 ​​없을 수도 있습니다 이 모든로드 및 스케일 업은이 경우 한계에 도달합니다

왜냐하면 결국 하나의 단일 VM에는 무제한의 RAM과 CPU가있을 수 없으므로 대신 내가 여러 VM을 잘 가질 수 있다면,이 솔루션은 스케일 아웃이라 불리는 Caleb에서 우리는 하나의 단일 VM을 더 크게 만드는 데 중점을 둡니다 수평 확장을 통해 여러 VM을 만들려고 시도하므로 여러 VM을 사용하여 nvm 예를 들어, VM 당 한 개의 좌석 당 CPU의 양과 RAM의 양이 있습니다 하나의 VM 대신 여러 VM을 사용한다는 것은 이제 여러 IP를 갖게된다는 것을 의미합니다 사용자에게 노출 된 주소이므로 여기에서 HTTP 요청이 오는 경우 사용자는 여기에서 VM1 또는 VM2 또는 VM3으로 이동합니다 메커니즘이 필요합니다 이러한 요청을 처리 할 수 ​​있으며 요청을 올바른 서버로 리디렉션 할 수 있습니다

이 기술을로드 밸런서 또는 트래픽 관리자로드라고합니다 밸런서 또는 윤리 관리자가 HTTP 요청을받습니다 사용자로부터 요청을 수신 한 다음 해당 요청을 VM 1로 리디렉션하도록 선택합니다 예를 들어 두 개 또는 세 개를 선택하면 응용 프로그램이 여전히 계속 실행되며 서버가 요청할 수있는 더 많은 요청을 처리 할 수 ​​있습니다 빠른 분석으로 증가하는 요청으로 인해 여전히 어려움을 겪고 있습니다

웹 응용 프로그램의 내용 중 정적 인 요소가 많다는 것을 알았습니다 콘텐츠 비디오 이미지 JavaScript 파일 정적 HTML을 변경하는 HTML 및 CSS 파일 콘텐츠는 디스크에 저장되며 하드 디스크에 많은 양이 소요된다는 것을 알고 있습니다 과도한 주문이 발생하는 요청에서 발생합니다 사용자는 이러한 리소스에 액세스하기 위해 오랜 시간이 걸립니다 CD 끝 세계 여러 곳에서 이유의 포인트라고하는 여러 위치에 있습니다

그래서 사용자 위치에 더 가까운 것을 얻을 수 있습니다 CDN이 디스크를 사용할 수 있도록 두 번째 서버가 디스크의 파일에 액세스하고 있습니다 HDD s DD SSD 또는 RAM의 조합을 사용하여 데이터 액세스 빈도 빈도 TTL을 캐시에 적용하여 특정 시간에 만료되어야한다고 말합니다 CDN 정적 콘텐츠 파일을 캐시하지만 동적 콘텐츠를 캐시에 저장하면됩니다 데이터 이것은 SQL 요청이로드 될 때 현금을 사용하여 해결할 수 있습니다

데이터베이스가 동일한 결과를 제공하면이 데이터를 메모리에 캐시하는 것이 더 좋습니다 빠른 데이터 액세스를 보장하고 데이터베이스의 부하를 줄입니다 case는 홈 페이지에 표시된 상위 10 개 제품입니다 4 사용자는 디스크가 아닌 RAM 메모리를 사용하므로 많은 데이터를 저장할 수 있습니다 RAM do 데이터는 캐시가 키 값 쌍으로 저장 될 수 있도록 저장됩니다 디스크 캐시마다 여러 지역에서 최대 530 기가 바이트를 절약 할 수 있습니다 memcache에 대한 서비스를 제공하지만 우리 모두는 여기에서 기본 인프라는 잠재적 인 데이터 손실이있을 수있는 문제입니다

그러나 캐시 감소는 데이터 지속성을위한 솔루션을 제공하지만 memcache는이를 해결합니다 사용자가 당사 웹 사이트의 특정 정보를 요청할 때 요청하지 않습니다 데이터베이스에서 해당 정보를 검색하기 위해 서버에 도달합니다 대부분의 요청은 비슷하므로 요청을 캐싱하지 않는 이유는 무엇입니까? 응답 데이터가 양호한 경우 탄력적 인 재생을위한 탄력적 인 검색어 검색은 이러한 방식으로 응답 데이터와 함께 부스트 요청을 캐시 할 수 있습니다 요청을 검색하기 위해 데이터베이스에 액세스 할 필요가 없습니다

데이터는 쿼리와 관련이 있지만 캐싱 시스템에서 검색 할 수 있습니다 데이터베이스 탄성 검색에 액세스하는 것보다 빠릅니다 또한 근처에 제공 할 수 있습니다 당신이 입력하는대로 실시간 검색은 Sinister가 데이터베이스의 부하를 줄입니다 이는 요청이 처리 될 때 서버 자체의 부하를 줄입니다 짧은 시간 안에 탄성 검색은 REST API를 통해 액세스 할 수 있으며 App Store의 코드를 변경하여 탄성 검색을 사용할 수도 있습니다 로그 분석 및 실시간 애플리케이션 모니터링을위한 또 다른 우수 사례 웹 응용 프로그램을 확장하는 것은 모 놀리 식 응용 프로그램을 분할하는 것입니다

처음 두 부분은 프런트 엔드 애플리케이션이고 두 번째 부분은 이 분할 웹 서비스가 포함 된 백엔드 애플리케이션 별도의 서버에 각 부분을 호스트 할 수 있으므로 사용중인 전리품의 양이 줄어 듭니다 각 서버는 내가 편리 할 때 응용 프로그램을 확장하는 데 도움이 될 것입니다 이 방법은 응용 프로그램의 소스 코드를 변경해야한다는 것입니다 여기서는 두 부분으로 나뉘어 서로 다른 서버로 분할되기 때문에 우리는 두 프론트 엔드와 백엔드에서 모 놀리 식 응용 프로그램을 분할했지만 우리는 여전히 사용자로부터 많은 요청을 받고 있으며 이러한 요청은 백 엔드 측에 부딪혀 백 엔드가 규모가 너무 커서 여기서 백엔드를 여기 여러 부분으로 나눌 수 있다면 어떨까요? 우리는 마이크로 서비스를 제공합니다 우리가 백엔드를 분석한다면 우리는 그것을 볼 수 있습니다

인증 모듈을위한 모듈을 찾을 수있는 다중 모듈의 복합체 권고 및 더 많은 것에 대한 지불을 위해 마이크로 서비스의 철학 우리가 왜 모든 모듈을 하나의 응용 프로그램으로 사용하는지 설명하는 것입니다 하나의 서버에 호스팅되는 이유는이 모노리딕을 분할하여 여러 개의 마이크로 응용 프로그램을 서로 연결하고 각각의 마이크로 응용 프로그램 또는 Mac 마이크로 서비스가 다른 서버에서 호스팅됩니다 그들에게 이런 식으로 컨테이너를 사용하면 우리는 윤리적 응용을 가능하게하지만 각 부분 또는 각 마이크로 서비스를 확장 할 수도 있습니다 다른 마이크로 서비스와 다르게 또는 독립적으로 지불 책임이있는 매크로 서비스가 마이크로보다 많이 사용됩니다 서비스는 ID 관리를 담당하므로이 방법으로 지불 모듈을 처리 할 두 개의 컨테이너와 가져올 컨테이너 하나만 인증에 대한 요청은 있지만 여기서부터는 모 놀리 식에서 마이크로 서비스에 이르기까지 애플리케이션 소스에 많은 변화가 필요합니다 전체 애플리케이션을 다시 작성해야하는 것은 드문 일이 아닙니다

스크래치 micro azure는 도커 컨테이너와 컨테이너도 지원합니다 kubernetes와 같은 오케스트레이션 서비스 패브릭 및 마이크로 서비스가있는 소용돌이 모 놀리 식 응용 프로그램은 비즈니스 도메인을 기반으로 작은 조각으로 분할됩니다 응용 프로그램을 작은 조각으로 분할하는 것보다 더 깊이 갈 수 있습니까? 잘 입대 애플 리케이션을 가능하게 자체 실버 패널 목록 애플 리케이션은 작은 조각이다 자체 인스턴스에서이 인스턴스가 관리되므로 응용 프로그램의 자동으로 확장 할 수있는 컨테이너 나 VM을 돌볼 필요가 없습니다 전리품에 따라 일반적으로 이미지의 크기를 변경하거나 처리하는 데 사용할 수 있습니다 데이터베이스 등에서 새 작업 시작하기

비즈니스 로직에 종속적이기 때문에 각 계층에서 여러 계층이 실행됩니다 하나는 다른 IP 주소에 클라이언트 응용 프로그램이 물어볼 것입니다 API 관리도 API 게이트웨이라고 부르는 곳에서 잘 돌아 간다 트래픽 관리자는 서로 다른 가상 머신간에로드를 분산시킬 수 있습니다 여기서 API 관리를 통해 우리는 다른 마이크로 서비스 또는 API 엔드 포인트 API 관리는 마이크로 서비스가 각 마이크로 서비스와 통신해야하는 각 마이크로 서비스에 부하 다른 사람들은 통신을 위해 나머지 웹 서비스를 사용할 수 있지만이 중 일부는 통신을 동 기적으로 실행할 필요가 없으므로 여전히 Pew가 대기열을 재생하기 위해 여기에있을 때 서버의 응답은 좋은 것입니다

우리가 필요로하는 편안한 서비스 때문에 비동기 작업을위한 솔루션 서버를 사용할 수 있어야하며 서버가 완료 될 때까지 기다려야합니다 대기열로 요청을 처리하므로 서버를 사용할 필요가 없습니다 요청을 처리 할 수 ​​있지만 요청을 대기열에 넣고 요청을 처리 할 수 ​​있습니다 나중에 서버를 처리 할 수있을 때까지 기다립니다 그래서 우리는 서버로부터의 응답을 기다리는 동안 그것을 막지 않을 것이다

이 접근법은 소프트웨어의 다른 부분을 분리하는 것을 도왔습니다 쉽게 확장 가능하고 탄력적으로 만듭니다 클라우드 서비스를 사용할 필요가없는 웹 애플리케이션을 확장 관행은 클라이언트 측과 같은 간단한 작업을 위해 작업을 푸시합니다 이미지 크기를 조정하면 클라이언트가 이미지 처리를 할 수 있으므로 왜 귀찮은가? 간단한 작업 중 일부가 포함 된 서버 서버를 귀찮게하지 않는 또 다른 좋은 해결책은 같은 HTTP를 보내지 않는 것입니다 우리가 여기에 똑같은 응답을 확실히받을 수 있는지를 요청하면 브라우저가 지능적인 브라우저 일 때까지 HTTP 요청 응답과 함께 요청을 캐시하기에 충분합니다

또한 캐시에 저장된 각 객체에 대해 TTL 지속 시간을 추가하여 우리는 개체가 저장되고 캐시는 3 일 동안 만 사용할 수 있다고 말할 수 있습니다 예를 들어 우리가 3 일을 넘으면 그 정보는 지금까지 우리는 다양한 옵션을 설명했다 웹 응용 프로그램을 확장하지만 대부분의 웹 응용 프로그램은 데이터베이스에 연결되므로 요청 수가 늘어 나면 요청도 발생합니다 Web Apps와 같은 데이터베이스는 데이터베이스에 무한한 양의 쿼리뿐만 아니라 데이터베이스도 가질 수 있거나 최대 값을 가질 수 있습니다 따라서 저장할 수있는 데이터의 양은 다음 단계에서 확장 할 필요가 있습니다

이 비디오에서 우리는 다양한 옵션을 논의 할 것입니다 데이터베이스는 데이터베이스 응답 유형을 향상시키는 가장 간단한 옵션입니다 정확히하기 위해 만들어진 내장 기능 여기서는 데이터 캐싱에 대해 설명합니다 SQL 데이터베이스에는 기본 제공 기능이 있습니다 가장 자주 발생하는 쿼리 캐싱을 돕는 버퍼 캐시 쿼리는 사용 가능한 메모리의 크기에 따라 제한되지만, 여기보다 테이블에서 데이터를 가져와야하는 쿼리의 수 여기서 큰 테이블에서 데이터를 검색하는 더 좋은 솔루션이 필요합니다

도움이 될 수 있고 싱은 우리가 테이블을 찾을 때 전체 테이블을 반복하지 않도록 도울 것입니다 인덱스를 사용하더라도 행의 특정 정보가 아래에있을 수 있습니다 필요한 응답 유형입니다 최적화되지 않은 SQL을 사용하기 때문일 수 있습니다 웹을 분석 할 필요가있는 쿼리 응용 프로그램 및 모든 SQL 쿼리와 함께 우리의 웹 애플 리케이션 안에있는 ORM을 사용하고있을 가능성이있는 소스 코드를 신속하게 분석합니다

SQL 쿼리를 생성하는 객체 관계형 매핑 또한 요청할 때마다 시도 할 것입니다 데이터베이스에 연결하면 두 개의 연결이 닫힙니다 ORM을 사용하는 대신에 시간이 오래 걸리는 추가 단계 우리는 저장 프로 시저에 사용할 수 있습니다 결국 우리는 저장 프로 시저와 ORM을 같은 것으로 혼합 할 수 있습니다 응용 프로그램에서 가장 간단한 쿼리를 사용하여이 ORM과 스토리지를 사용하여 쿼리를 최적화 할 수있는 정교한 쿼리 하나의 단일 데이터베이스의 한계가 비참한 경우 절차? 여러 인스턴스 작성하기 기준을 잘 읽거나 쓰기 작업에서 기본으로 시작합시다

SQL 쿼리는 여기에서 엔지니어가 읽거나 쓰는 데이터입니다 왜 데이터베이스에 쓰지 않고 다른 사람이이 방법으로 읽을 수 있는지 하나의 데이터베이스가 아닌 두 개의 데이터베이스에서 균형을 조정하여 상태에 대한 부하를 줄입니다 readwrite 데이터베이스는 read를 갱신 할 책임이 있습니다 데이터베이스를 사용하여 웹 응용 프로그램과 거의 동일한 정확한 데이터를 갖습니다 인스턴스를 복제하는 것보다 더 많은 것을 원했을 때 우리는 응용 프로그램과 두 개의 작은 구성 요소를 마이크로 서비스라고합니다

논리이지만 데이터베이스에 적용될 수있는 다른 기준 데이터베이스를 복제하는 것은 테이블 자체를 분할하는 것을 기반으로합니다 파티셔닝이나 샤딩이라고 불리는 것은 파티셔닝 파티셔닝으로 시작하겠습니다 분할이라고도 함 수직 분할은 표를 더 적은 수의 열을 가진 다중 테이블 20 열을 갖는 고객 테이블 두 개 이상의 테이블로 분할 될 첫 번째 테이블은 1에서 7 번째 칼럼니스트와 8 ~ 20 번째 칼럼니스트가있을 것입니다 테이블에는 두 테이블의 데이터를 조인하는 기본 키가 포함되어있어 유용합니다 일반적으로 처음 7 개의 열만 있으면되므로 시간이 많이 걸리지 않습니다

동일한 데이터베이스에 두 개의 테이블이있을 수있는 데이터가 적어 지므로 실행할 수 있습니다 또는 2 개의 분리 된 것으로 구성 될 수있다 SQL 데이터베이스는 기능을 제공하여이 사례를보고합니다 데이터를 가져올 파티션을 인식하지만 여기서주의해야합니다 수직 파티션은 신중하게 고려해야합니다

여러 파티션의 데이터에는 테이블을 조인하는 쿼리가 필요합니다 우리가 20 개의 모든 컬럼을 필요로하는 경우, 분할하여 테이블을 세로로 분할합니다 열은 도로를 기준으로 분할 할 수 있습니다 대학살 또는 수평 분할 차트 작성 또는 제공 테이블을 여러 개의 테이블로 나눕니다 각 테이블은 같은 번호를가집니다

예를 들어 고객 테이블을 파티셔닝 할 수있는 행은 적지 만 행은 적습니다 한 그룹의 고객을위한 대륙을 대표하는 다섯 개의 작은 테이블 고객 위치를 알고 있으면 리디렉션을 읽는 데 도움이됩니다 쿼리 – 오른쪽 파티션으로 오른쪽 – 더 작은 테이블을 처리 할 수있는 행을 줄입니다 동일한 SQL 인스턴스 또는 별도 인스턴스에서와 동일하게 살기 수평 및 수직 분할을 함께 분할 할 수 있습니다 하지만 우리는 테이블이 파티션을 분할해야한다는 것을 고수하지 않았습니다

가능하면 적은 수의 테이블을 참조합니다 그렇지 않으면 과도한 노동 조합 쿼리를 사용하여 쿼리 시간에 논리적으로 테이블을 병합하면 영향을 미칠 수 있음 성능 지금까지 우리는 열을 기반으로 분할 테이블을 보았다 또는 행을 만들지 만 테이블을 분할하고 테이블 그룹에 넣을 수 있습니다 도메인 구동 디자인이라고도 불리는 디 디 디 디를 보자 우리는 컨텍스트 또는 웹 사이트를 기반으로 웹을 더 작은 마이크로 서비스로 분할했습니다 도메인은 DDD를 사용하여 데이터베이스에 동일한 것을 적용 할 수 있습니다

도메인에는 다른 테이블 세트에 대한 지불을위한 자체 테이블 세트가 있습니다 명령 등을 위해 각 마이크로 서비스가 자체 도메인을 갖게됨을 상상해보십시오 같은 컨테이너에 살고있는 테이블들도 있지만 DDD의 목적은 데이터베이스의 크기를 조정하는 것이 아니라 응용 프로그램의 결과이며 그것은 프로젝트의 설계 단계에서 만들어지지 않습니다 여전히 우리의 애플 리케이션의 소스 코드에 대한 변화의 양은 SQL 데이터베이스는 NoSQL을 쓰지 않는 이유는 무엇입니까? SQL 데이터베이스는 테이블 간의 스키마 및 관계를 기반으로합니다 한계의 핵심은 다른 측면에서 무한 확장성에 도달하는 것 NoSQL 데이터베이스는 데이터를 키 값 쌍으로 저장하므로 스키마 필요 없음 그 이유에 대한 끔찍한 관계는 테이블을 수평으로 열심히 우리는 NoSQL이 테이블 그래서 당신은 아직 관계를 수립하기 위해 개조 할 수 있지만 그건 그렇지 않습니다

그래도 결정을 내릴 때 더 좋습니다 최종적으로 클라우드에서 애플리케이션을 확장해야하는지 여부는 건축가의 책임은 개발자가 생각할 것을 요구합니다 stateless 애스펙트에 대해 그리고 DBA는 데이터베이스 파티셔닝에 대해 생각합니다 이 작업은 처음 생각할 때 한 가지 중요한 메모로 끝내야합니다 측정 기준 및 분석을 확장 할 필요가 있는지 파악할 수 있기 때문에 특히 정확하게 스케일을 조정해야하는 동영상이 도움이되기를 바랍니다

너와 고마워