MySQL中間件之ProxySQL(10):讀寫分離方法論

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/07/16/9318558.html
-Advertisement-
Play Games

返回 "ProxySQL系列文章:http://www.cnblogs.com/f ck need u/p/7586194.html"   1.不同類型的讀寫分離 資料庫中間件最基本的功能就是實現讀寫分離,ProxySQL當然也支持。而且ProxySQL支持的路由規則非常靈活,不僅可以實現 ...


返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

 

1.不同類型的讀寫分離

資料庫中間件最基本的功能就是實現讀寫分離,ProxySQL當然也支持。而且ProxySQL支持的路由規則非常靈活,不僅可以實現最簡單的讀寫分離,還可以將讀/寫都分散到多個不同的組,以及實現分庫sharding(分表sharding的規則比較難寫,但也能實現)。

本文只描述通過規則制定的語句級讀寫分離,不討論通過 ip/port, client, username, schemaname 實現的讀寫分離。

下麵描述了ProxySQL能實現的常見讀寫分離類型。

1.1 最簡單的讀寫分離

如圖。

這種模式的讀寫分離,嚴格區分後端的master和slave節點,且slave節點必須設置選項read_only=1。在ProxySQL上,分兩個組,一個寫組HG=10,一個讀組HG=20。同時在ProxySQL上開啟monitor模塊的read_only監控功能,讓ProxySQL根據監控到的read_only值來自動調整節點放在HG=10(master會放進這個組)還是HG=20(slave會放進這個組)。

這種模式的讀寫分離是最簡單的,只需在mysql_users表中設置用戶的預設路由組為寫組HG=10,併在mysql_query_rules中加上兩條簡單的規則(一個select for update,一個select)即可。

例如,下麵實現的就是這種讀寫分離模式。

mysql_replication_hostgroups: 
+------------------+------------------+----------+
| writer_hostgroup | reader_hostgroup | comment  |
+------------------+------------------+----------+
| 10               | 20               | cluster1 |
+------------------+------------------+----------+

mysql_servers: 
+--------------+----------+------+--------+--------+
| hostgroup_id | hostname | port | status | weight |
+--------------+----------+------+--------+--------+
| 10           | master   | 3306 | ONLINE | 1      |
| 20           | slave1   | 3306 | ONLINE | 1      |
| 20           | slave2   | 3306 | ONLINE | 1      |
+--------------+----------+------+--------+--------+

mysql_users: 
+----------+-------------------+
| username | default_hostgroup |
+----------+-------------------+
| root     | 10                |
+----------+-------------------+

mysql_query_rules: 
+---------+-----------------------+----------------------+
| rule_id | destination_hostgroup | match_digest         |
+---------+-----------------------+----------------------+
| 1       | 10                    | ^SELECT.*FOR UPDATE$ |
| 2       | 20                    | ^SELECT              |
+---------+-----------------------+----------------------+

這種讀寫分離模式,在環境較小時能滿足絕大多數需求。但是需求複雜、環境較大時,這種模式就太過死板,因為一切都是monitor模塊控制的。

1.2 多個讀組或寫組的分離模式

前面那種讀寫分離模式,是通過monitor模塊監控read_only來調整的,所以每一個後端集群必須只能分為一個寫組,一個讀組。

但如果想要區分不同的select,並將不同的select路由到不同的節點上。例如有些查詢語句的開銷非常大,想讓它們獨占一個節點/組,其它查詢共用一個節點/組,怎麼實現?

例如,下麵這種模式。

看上去非常簡單。但是卻能適應各種需求。例如,後端做了分庫,對某庫的查詢要路由到特定的主機組(後文專門分析這種情況)。

至於各個組機組是同一個主從集群(下圖左邊),還是互相獨立的主從集群環境(下圖右邊),要看具體的需求,不過這種讀寫分離模式都能應付。

在實現這種模式時,前提是不能開啟monitor模塊的read_only監控功能,也不要設置 mysql_replication_hostgroup 表。

例如,下麵的配置實現的是上圖左邊的結構:寫請求路由給HG=10,對test1庫的select語句路由給HG=20,其它select路由給HG=30。

mysql_servers: 
+--------------+----------+------+--------+--------+
| hostgroup_id | hostname | port | status | weight |
+--------------+----------+------+--------+--------+
| 10           | host1    | 3306 | ONLINE | 1      |
| 20           | host2    | 3306 | ONLINE | 1      |
| 30           | host3    | 3306 | ONLINE | 1      |
+--------------+----------+------+--------+--------+

mysql_users: 
+----------+-------------------+
| username | default_hostgroup |
+----------+-------------------+
| root     | 10                |
+----------+-------------------+

mysql_query_rules: 
+---------+-----------------------+----------------------+
| rule_id | destination_hostgroup | match_digest         |
+---------+-----------------------+----------------------+
| 1       | 10                    | ^SELECT.*FOR UPDATE$ |
| 2       | 20                    | ^SELECT.*test1\..*   |
| 3       | 30                    | ^SELECT              |
+---------+-----------------------+----------------------+

1.3 sharding後的讀寫分離

ProxySQL對sharding的支持比較弱,要寫sharding的路由規則真心覺得有點繁瑣。但無論如何,ProxySQL通過定製路由規則是能實現簡單的sharding的。這也算是讀寫分離的一種情況。

如下圖,將課程所在庫分為三個庫:"MySQL"、"python"和"Linux"。當查詢條件中的篩選條件是MySQL時,就路由給MySQL庫所在的主機組HG=20,篩選條件是Python時,就路由給HG=10,同理HG=30。

關於ProxySQL如何實現sharding的具體細節,我後面的文章會介紹。

2.找出需要特殊對待的SQL語句

有些SQL語句執行次數較多、性能開銷較大、執行時間較長等等,這幾類語句都需要特殊對待。例如,將它們路由到獨立的節點/主機組,或者為它們開啟緩存功能。

詳細內容參見官方手冊里的一篇文章,我已經把它翻譯過了:ProxySQL Read Write Split (HOWTO)

本文通過sysbench來模擬,以便為官方手冊里的這篇文章提供測試環境。當然,如果您會sysbench或其它性能測試工具,可無視。

1.首先創建測試資料庫sbtest。這裡我直接連接到後端的MySQL節點創建庫和表

mysqladmin -h192.168.100.22 -uroot -pP@ssword1! -P3306 create sbtest;

2.準備測試表,假設以2張表為例,每個表中10W行數據。填充完後,兩張表表名為sbtest1和sbtest2

SYSBENCH=/usr/share/sysbench/
sysbench --mysql-host=192.168.100.22 \
         --mysql-port=3306 \
         --mysql-user=root \
         --mysql-password=P@ssword1! \
         $SYSBENCH/oltp_common.lua \
         --tables=1 \
         --table_size=100000 \
         prepare

3.sysbench連接到ProxySQL,做只讀測試。註意下麵的選項--db-ps-mode必須設置為disable,表示禁止ProxySQL使用prepare statement,目前ProxySQL還不支持對prepare語句的緩存。不過ProxySQL作者已經將此功能提上日程了

sysbench --threads=4 \
         --time=20 \
         --report-interval=5 \
         --mysql-host=127.0.0.1 \
         --mysql-port=6033 \
         --mysql-user=root \
         --mysql-password=P@ssword1! \
         --db-ps-mode=disable \
         $SYSBENCH/oltp_read_only.lua \
         --skip_trx=on \
         --tables=1 \
         --table_size=100000 \
         run

由於這時候還沒有設置sysbench的測試語句的路由,所以它們全都會路由到同一個主機組,例如預設的組。

4.查看stats_mysql_query_digest表,按照各種測試指標條件進行排序,例如按照總執行時間欄位sum_time降序以便找出最耗時的語句,按照count_star降序排序找出執行次數最多的語句,還可以按照平均執行時間降序等等。請參照上面列出的官方手冊文章

例如,此處按照sum_time降序排序:

Admin> SELECT count_star,sum_time,digest,digest_text 
       FROM stats_mysql_query_digest 
       ORDER BY sum_time DESC 
       LIMIT 4;
+------------+----------+--------------------+---------------------------------------------+
| count_star | sum_time | digest             | digest_text                                 |
+------------+----------+--------------------+---------------------------------------------+
| 72490      | 17732590 | 0x13781C1DBF001A0C | SELECT c FROM sbtest1 WHERE id=?            |
| 7249       | 9629225  | 0x704822A0F7D3CD60 | SELECT DISTINCT c FROM sbtest1 XXXXXXXXXXXX |
| 7249       | 6650716  | 0xADF3DDF2877EEAAF | SELECT c FROM sbtest1 WHERE id XXXXXXXXXXXX |
| 7249       | 3235986  | 0x7DD56217AF7A5197 | SELECT c FROM sbtest1 WHERE id yyyyyyyyyyyy |
+------------+----------+--------------------+---------------------------------------------+

5.對那些開銷大的語句,制定獨立的路由規則,並決定是否開啟查詢緩存以及緩存過期時長
6.寫好規則後進行測試


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

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://www.maomao365.com/?p=5416 摘要: order by 1,2 的含義是對錶的第一列 按照從小到大的順序進行排列 然後再對第二列按照從小到大的順序進行排列 order by 1,2 等同於 order by [第一列],[第二列] 詳見以下舉例說明 ...
  • 鎖的定義,游標的新建和應用,存儲過程的新建,查看,修改和刪除 ...
  • 當同時排序又分頁時,如果排序的欄位X不是唯一欄位,當多個記錄的X欄位有同一個值時順序是 隨機 的。 這個有可能造成分頁時數據重覆的問題。某一頁又把上一頁的數據查出來了,其實資料庫只有一條記錄。 解決辦法: 如果排序欄位不是唯一的,則增加個二級排序,二級排序的欄位要是 唯一 的(例如id)。 ...
  • 一.概述 與其它資料庫不同,mysql 可以運行不同的sql model 下, sql model 定義了mysql應用支持的sql語法,數據校驗等,這樣更容易在不同的環境中使用mysql。 sql model 常用來解決下麵幾類問題 (1) 通過設置sql mode, 可以完成不同嚴格程度的數據校 ...
  • 恢復內容開始 sqlcode sqlstate 說明000 00000 SQL語句成功完成01xxx SQL語句成功完成,但是有警告+012 01545 未限定的列名被解釋為一個有相互關係的引用+098 01568 動態SQL語句用分號結束+100 02000 沒有找到滿足SQL語句的行+110 0 ...
  • 1. 介紹 PostgreSQL提供了一個copy命令的便利數據載入工具,copy命令源於PostgreSQL資料庫,copy命令支持文件與表之間的數據載入和表對文件的數據卸載。pg_bulkload是一種用於PostgreSQL的高速數據載入工具,相比copy命令。最大的優勢就是速度。優勢在讓我們 ...
  • MongoDB 複製(副本集) MongoDB複製是將數據同步在多個伺服器的過程。 複製提供了數據的冗餘備份,併在多個伺服器上存儲數據副本,提高了數據的可用性, 並可以保證數據的安全性。 複製還允許您從硬體故障和服務中斷中恢複數據。 什麼是複製? 保障數據的安全性 數據高可用性 (24 7) 災難恢 ...
  • 最近公司做一個項目用到了mongodb,下麵來介紹一下MongoRepository介面。 大家可以類比Hibernate的jpa,MongoRepository是一個springdata提供的一個有增刪改查以及分頁等操作的基本介面。 我們在使用介面時,只需要定義一個dao層的介面,例如: inte ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...