雲上RDS架構

来源:https://www.cnblogs.com/cchust/archive/2019/08/18/11366175.html
-Advertisement-
Play Games

概述 越來越多的企業選擇上雲,最基礎的雲服務就是IaaS(Infrastructure as a Service)服務,直觀理解就是虛擬主機,用戶不用再自建機房,自己購買伺服器,而是直接向雲廠商購買虛擬主機服務ECS(Elastic Compute Service),按時按量付費。對於資料庫而言,將 ...


概述

越來越多的企業選擇上雲,最基礎的雲服務就是IaaS(Infrastructure as a Service)服務,直觀理解就是虛擬主機,用戶不用再自建機房,自己購買伺服器,而是直接向雲廠商購買虛擬主機服務ECS(Elastic Compute Service),按時按量付費。對於資料庫而言,將資料庫能力集成進來,就是DaaS(Database as a Service)服務,我這裡主要討論RDS(Relational Database Service)。因為目前主流雲廠商在資料庫領域,除了基礎的RDS服務,還有新型分散式資料庫服務,比如Amazon的Aurora,阿裡雲的PolarDB等。所以對於用戶而言,他們選擇在雲上使用數據有兩種方式,一種是自己買ECS,自己搭建資料庫服務;另外一種方式是,直接購買RDS服務。本文主要討論RDS的鏈路,RDS鏈路中的核心組件SLB轉發模式,以及RDS中proxy的作用,最後還會提到RDS的高可用解決方案。

RDS鏈路

1. app+ECS(DB)自建

2. app+lvs+DB

 

簡單說明下,雲上並不提供單獨買一個RDS的服務,因為這種場景無法提供高可用能力,所以一般購買資料庫服務時,會同時帶上SLB作為一套整體解決方案。SLB本質就是基於LVS的改進,LVS工作在IOS七層網路模型的TCP/IP層,屬於4層負載均衡。利用IP,Port映射轉發能力,提供高可用,負載均衡等能力,RDS正是藉助SLB來實現RDS的高可用和負載均衡等能力。LVS主要有幾種工作模式,DR模式,NAT模式,FULL-NAT模式,IP-TUN模式以及我們阿裡雲優化的ENAT模式。

2.1 DR模式(Direct Routing)

核心邏輯:本質是2層轉發,SLB-Server與RDS共用一個IP,經過SLB-Server時,SLB-Server將mac地址改為目標RDS的mac地址,將請求包轉給真實的RDS;回包時不用經過SLB-Server,DR模式要求SLB和RDS需要配置相同的VIP地址。

2.2 NAT模式(Network Address Translation)

核心邏輯:client端不感知RDS真實地址;發包經過SLB時,dip(dest_ip)會被替換成RDS的ip,請求包返回經過SLB時,再將回包源地址改為vip。對比DR模式,請求和回報都需要經過SLB-Server,RDS的ip不再需要是公網地址;與DR模式相同的是,SLB和RDS需要在同一個區域網內。

2.3 FULL NAT模式

 

核心邏輯:本質是4層轉發,請求經過LVS時,LVS請求的(IP,Port)替換成真實RDS的(IP,Port),回包時,再經過LVS,將回包的源地址改為LVS的(IP,Port),LVS與RDS不再要求在同一個區域網內。所有請求的來回都要經過LVS,效率比較低。

2.4 ENAT模式(Enhance NAT,三角模式)

核心邏輯:ENAT模式解決了來回包都要經過LVS問題,具體而言,LVS接收請求後,修改包地址時,會將用戶的CIP地址冗餘在網路包中,回包時,將包改為(vip,cip),這樣就不用再經過LVS了。

3. app+lvs+proxy+DB

通過引入SLB,RDS已經具備了高可用的能力,但由於SLB是工作在4層負載均衡,對於應用層協議無法感知,所以當發生主備切換時,所有已經連接在old-master的連接都需要被斷掉,對用戶來說,就是連接發生了閃斷,對於沒有重連機制的業務簡直就是災難。引入proxy後,則能有效解決這種問題。切換過程中,對於old-master會等待事務完成,而新的請求則會路由到new-Master。

核心邏輯:本質是7層轉發,proxy模擬實現MySQL協議,應用實際是連接proxy,proxy再連接RDS,轉發SQL給RDS,並將結果集轉發回傳給應用。

4.主要優缺點對比

RDS鏈路類型

優勢

缺陷

App+ECS(DB)自建

成本低

用戶個人負責資料庫的容災、備份、恢復、監控、遷移

App+lvs+DB

無需經過proxy轉發,RT短,具備高可用能力

無法解決閃斷問題,也不容易實現讀寫分離等高級功能

App+lvs+Proxy+DB

功能豐富,包括防SQL註入,讀寫分離,連接池等。

多一跳proxy,增加RT。

Proxy中間件 VS TDDL 中間件

proxy中間件引入使得RDS除了具備必要的高可用能力,還能實現更多的高級功能,包括讀寫分離,連接池,防SQL註入,防閃斷等,這部分能力的獲取是通過犧牲一定RT來獲得的。實際上,中間件有兩種模式,一種是client模式,一種是server模式,集團的TDDL和雲上的Proxy就是兩種典型代表。client模式要求與語言強綁定,比如TDDL中間件以jar包的模式打進用戶的應用,只支持JAVA語言,這對於雲上業務肯定是不可行的,畢竟現在用PHP,Python寫後端的應用也非常多。另外一點是,client模式會導致連接數隨著client的個數同比例增加,這帶來的影響是到後端DB的連接數增加,client模式的好處是不用經過proxy這一跳,RT更好;而server模式則能有效控制到後端DB的連接數,但是整個鏈路增加了一層,也就增加了一層風險,Proxy自身的高可用也需要嚴格保證,確保整個鏈路的可用性。至於功能層面的,比如讀寫分離,連接池,防SQL註入等功能,兩種都是可以實現的。

RDS高可用

雲上售賣的資料庫都是傳統的資料庫包括MySQL,PostgreSQL,SQLServer等都是單機資料庫,所以資料庫的高可用還需要依賴於外部的HA組件。

參考文檔

https://my.oschina.net/yunqi/blog/3069510


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 人用紙和筆來做運算,都是用十進位,直接用十進位和我們最熟悉的符號不是最簡單麽? 為什麼電腦里我們最終要選擇二進位呢? 來看看,電腦在硬體層面究竟是怎麼表示二進位的,你就會明白,為什麼電腦會選擇二進位。 1 怎麼做到“千里傳書” 馬拉松的故事相信你聽說過。公元前490年,在雅典附近的馬拉松海邊, ...
  • 1.設置管理員root密碼為123 開啟MySQL服務後 再次登錄不輸入密碼,出現一下結果。 2.更改密碼 3.忘記密碼 3.1關閉MySQL伺服器 3.2跳過授權表 3.3再次登錄時無需輸入密碼 3.4更改密碼為'abc' 3.5刷新許可權後退出 3.6關閉mysql進程 3.7再次開啟服務,使用新 ...
  • 程式 = 演算法 + 數據結構 對應到電腦的組成原理(硬體層面) 演算法 各種電腦指令 數據結構 二進位數據 電腦用0/1組成的二進位,來表示所有信息 程式指令用到的機器碼,是使用二進位表示的 存儲在記憶體裡面的字元串、整數、浮點數也都是用二進位表示的 萬物在電腦里都是0和1,搞清楚各種數據在二進 ...
  • cdh6.3企業級大數據視頻教程 鏈接:https://pan.baidu.com/s/1NSAWV4qD-mLN-jWNg8UUlA 提取碼:plnt 系統和軟體版本1,操作系統:Centos7.62,Cloudera Manager : 6.3 下載地址:https://archive.clou ...
  • 前言: 前面幾篇文章為大家介紹了DML以及DDL語句的使用方法,本篇文章將主要講述常用的查詢語法。其實MySQL官網給出了多個示例資料庫供大家實用查詢,下麵我們以最常用的員工示例資料庫為準,詳細介紹各自常用的查詢語法。 1.員工示例資料庫導入 官方文檔員工示例資料庫介紹及下載鏈接: "https:/ ...
  • 前言: 在上篇文章中,主要為大家介紹的是DDL語句的用法,可能細心的同學已經發現了。本篇文章將主要聚焦於DML語句,為大家講解表數據相關操作。 這裡說明下DDL與DML語句的分類,可能有的同學還不太清楚。 DDL(Data Definition Language):數據定義語言,用於創建、刪除、修改 ...
  • 刷新許可權,將某些許可權從硬碟刷新到記憶體中(修改root密碼自帶隱式刷新許可權操作) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> 查看服務埠 mysql> show variables like 'port';... ...
  • MySQL管理——操作和查看資料庫的命令 摘要:本文主要學習了操作和查詢資料庫的常用命令。 查看資料庫的基本信息 查詢所有的資料庫 語法: 示例: 指定要使用的資料庫 語法: 示例: 查詢指定資料庫所有的表 語法: 示例: 查詢指定表的欄位 語法: 示例: 查詢指定表的索引 語法: 示例: ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...