最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中使用ProxySql實現讀寫分離

 更新時間:2025年08月07日 09:48:31   作者:會飛的灰大狼  
ProxySQL是一款高性能、開源的MySQL數據庫中間件,通過安裝ProxySQL并配置主從服務器、用戶及路由規(guī)則,實現MySQL讀寫分離,提升負載均衡與高可用性,本文給大家介紹MySQL中使用ProxySql實現讀寫分離,感興趣的朋友一起看看吧

使用ProxySql實現MySQL的讀寫分離

前言

ProxySQL 是一款高性能、開源的 MySQL 數據庫中間件,主要作用是在應用程序與 MySQL 數據庫之間搭建一層代理,實現數據庫的負載均衡、讀寫分離、連接池管理、查詢路由、故障轉移等功能,從而提升數據庫集群的可用性、穩(wěn)定性和性能。

核心功能與作用

  1. 讀寫分離
    自動將 SQL 查詢請求分發(fā)到不同的數據庫節(jié)點:
    • 寫操作(如 INSERTUPDATE)路由到主庫(Master)。
    • 讀操作(如 SELECT)分發(fā)到從庫(Slave),減輕主庫壓力,提高查詢效率。
      支持自定義規(guī)則(如基于 SQL 語句、用戶、表名等)靈活分配請求。
  2. 負載均衡
    對于多個從庫(或主庫集群),ProxySQL 可通過輪詢、權重分配等策略,將讀請求均勻分發(fā)到各節(jié)點,避免單節(jié)點過載,提升集群整體吞吐量。
  3. 連接池管理
    數據庫連接的創(chuàng)建和銷毀成本較高,ProxySQL 維護一個連接池,復用已建立的連接,減少連接開銷,同時限制連接總數,防止數據庫被過多連接壓垮。
  4. 故障檢測與自動切換
    持續(xù)監(jiān)控數據庫節(jié)點的健康狀態(tài)(如通過心跳檢測),當主庫或從庫故障時,自動將請求切換到正常節(jié)點,減少人工干預,提高系統可用性。
  5. 查詢緩存與過濾
    緩存高頻查詢結果,減少重復計算;同時可過濾危險 SQL(如 DROPTRUNCATE),增強數據庫安全性。
  6. 動態(tài)配置與無感知重啟
    支持在線修改配置(如路由規(guī)則、節(jié)點權重),無需重啟服務,避免業(yè)務中斷,適合高可用場景。

適用場景

  • 中小型 MySQL 集群的讀寫分離和負載均衡。
  • 需要高可用、低延遲的在線業(yè)務(如電商、金融)。
  • 希望簡化數據庫集群管理,減少開發(fā)層對數據庫架構依賴的場景。

與同類工具對比

  • MySQL Router:官方工具,配置簡單,但功能較少(如無連接池、高級路由)。
  • MaxScale:功能豐富,但性能略遜于 ProxySQL,配置相對復雜。
  • MyCat:支持多數據庫類型,但更側重分庫分表,MySQL 適配性不如 ProxySQL。

ProxySQL 憑借輕量、高性能、靈活的特性,成為 MySQL 中間件的主流選擇之一。

安裝配置

安裝MySQL

懶得安裝 隨便寫了個腳本

mysql.sh

下載Proxysql包

https://github.com/sysown/proxysql/releases
#我使用的是Centos7系統 并且架構是x86虛擬機 可以通過uname -u 查看自己的系統架構根據自己的系統和版本適配下載

安裝Proxysql

安裝依賴環(huán)境

yum install perl-DBD-mysql perl-DBI mysql-community-libs-compat bzip2 -y
  • ??perl-DBD-mysql?:Perl Database Driver for MySQL,是 Perl 語言訪問 MySQL 數據庫的驅動程序,ProxySQL 安裝和運行過程中可能需要通過 Perl 腳本與 MySQL 進行交互
  • ??perl-DBI? :Database Interface(數據庫接口)模塊,為 Perl 程序提供了一個標準的數據庫訪問接口。ProxySQL 的部分功能可能依賴于 Perl 的 DBI 模塊來實現對數據庫的操作
  • ??mysql-community-libs-compat? :當使用 rpm 包方式安裝 ProxySQL 時,可能需要安裝mysql-community-libs-compat ,否則可能會報錯。它提供了與 MySQL 相關的兼容庫文件,確保 ProxySQL 與 MySQL 之間的兼容性
  • 此外,系統中還應確保安裝了bzip2 ,雖然它不是 ProxySQL 直接的功能依賴,但在處理一些壓縮文件等操作時可能會用到。同時,也需要安裝一個 MySQL 客戶端 ,方便后續(xù)連接 ProxySQL 進行配置和測試等操作
  • PS:安裝前創(chuàng)建一個Proxysql用戶和組

安裝Proxysql

rpm -ivh proxysql-2.6.3-1-centos7.x86_64.rpm

查看是否啟動

netstat -anput | grep proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      7698/proxysql       
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      7698/proxysql       

啟動proxysql服務并加入開機自啟

systemctl start proxysql
systemctl enable proxysql

二、連接 ProxySQL 管理界面

mysql -uadmin -padmin -h127.0.0.1 -P6032
  • 參數解釋
    • ?-uadmin:使用用戶名admin登錄
    • ?-padmin:密碼是admin?
    • ?-h127.0.0.1:連接本地服務器(ProxySQL 管理界面默認只允許本地訪問)
    • ?-P6032:連接 ProxySQL 的管理端口(6032 是 ProxySQL 管理界面的默認端口)
  • 作用:登錄到 ProxySQL 的管理界面,后續(xù)所有配置都在這里完成。

三、ProxySQL 管理員賬戶配置

1. 查看當前管理員賬戶

Admin> select @@admin-admin_credentials;
  • 作用:查看 ProxySQL 當前的管理員賬戶列表(默認只有admin:admin)。
2. 添加新管理員賬戶
Admin> set admin-admin_credentials='admin:admin;root:root123';
  • 作用:添加一個新的管理員賬戶root,密碼root123(分號分隔多個賬戶)。
  • 用途:默認賬戶只能本地登錄,新增賬戶可用于遠程管理(如用 Navicat 連接)。

3. 生效并保存管理員賬戶配置

Admin> load admin variables to runtime;  # 讓配置立即生效(臨時生效)
Admin> save admin variables to disk;   # 保存到磁盤(永久生效,重啟不丟失)
  • 作用:ProxySQL 的配置需要先加載到內存(runtime)才能生效,再保存到磁盤(disk)才能永久保留。

四、配置監(jiān)控賬號

1. 在 MySQL 主庫創(chuàng)建監(jiān)控用戶

CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
  • 作用:創(chuàng)建一個專門用于監(jiān)控的 MySQL 用戶monitor,權限限制為:
    • ?USAGE:允許登錄但無實際操作權限
    • ?REPLICATION CLIENT:允許查詢主從復制狀態(tài)(用于 ProxySQL 檢測主從是否正常)

2. 在 ProxySQL 中配置監(jiān)控用戶

UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
  • 作用:告訴 ProxySQL“用monitor這個用戶去監(jiān)控后端 MySQL 服務器的健康狀態(tài)”。

五、添加 MySQL 服務器到 ProxySQL

1. 注冊主從服務器

-- 添加主服務器(寫操作專用)
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,comment) VALUES (1,'192.168.8.100',3306,1,'Write group');

-- 添加從服務器(讀操作專用)
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,comment) VALUES (2,'192.168.8.101',3306,1,'Read group');
  • 參數解釋
    • ?hostgroup_id:服務器組 ID(1 = 寫組,2 = 讀組,用于區(qū)分主從)
    • ?hostname:MySQL 服務器的 IP 地址
    • ?port:MySQL 端口(默認 3306)
    • ?weight:權重(數值越大,分配的請求越多,默認 1 即可)
  • 作用:告訴 ProxySQL“有這兩臺 MySQL 服務器可用,1 號是主庫(寫),2 號是從庫(讀)”。

2. 生效并保存服務器配置

LOAD MYSQL SERVERS TO RUNTIME;  # 臨時生效
SAVE MYSQL SERVERS TO DISK;    # 永久保存
  • 作用:讓 ProxySQL 加載剛才添加的 MySQL 服務器信息。

六、配置數據庫訪問用戶

1. 在 MySQL 主從庫創(chuàng)建訪問用戶

-- 創(chuàng)建管理員用戶(有寫權限)
CREATE USER 'adm'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'adm'@'%';
-- 創(chuàng)建只讀用戶(只有讀權限)
CREATE USER 'read'@'%' IDENTIFIED BY '123456';
GRANT SELECT ON *.* TO 'read'@'%';
FLUSH PRIVILEGES;  # 刷新權限使配置生效
  • 作用:創(chuàng)建兩個用戶:
    • ?adm:有所有權限(用于執(zhí)行寫操作,如新增 / 修改數據)
    • ?read:只有查詢權限(用于執(zhí)行讀操作,如查詢數據)
  • 注意:主從庫都要創(chuàng)建這兩個用戶(因為 ProxySQL 可能會連接任意一臺)。

2. 在 ProxySQL 中注冊用戶

INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('adm','123456',1);  -- adm用戶默認用寫組(1)
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('read','123456',2);  -- read用戶默認用讀組(2)
  • 作用:告訴 ProxySQL“有這兩個用戶會通過你訪問 MySQL,adm默認走主庫,read默認走從庫”。

3. 生效并保存用戶配置

LOAD MYSQL USERS TO RUNTIME;  # 臨時生效
SAVE MYSQL USERS TO DISK;    # 永久保存
  • 作用:讓 ProxySQL 加載用戶信息,允許這些用戶通過 ProxySQL 訪問 MySQL。

七、配置讀寫分離規(guī)則

1. 添加路由規(guī)則

-- 規(guī)則1:特殊SELECT語句走主庫(例如包含UPDATE的查詢)
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FROM UPDATE$',1,1);
-- 規(guī)則2:普通SELECT語句走從庫
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (2,1,'^SELECT',2,1);
-- 規(guī)則3:SHOW語句走從庫
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (3,1,'^SHOW',2,1);
  • 參數解釋
    • ?rule_id:規(guī)則 ID(唯一,用于區(qū)分)
    • ?active=1:啟用該規(guī)則
    • ?match_digest:匹配 SQL 語句的正則表達式(^SELECT表示以 SELECT 開頭的語句)
    • ?destination_hostgroup:匹配后路由到的服務器組(1 = 主庫,2 = 從庫)
    • ?apply=1:匹配后立即應用,不再檢查后續(xù)規(guī)則
  • 作用:定義 “哪些 SQL 語句走主庫,哪些走從庫”,實現自動路由。

2. 生效并保存規(guī)則

LOAD MYSQL QUERY RULES TO RUNTIME;  # 臨時生效
SAVE MYSQL QUERY RULES TO DISK;    # 永久保存
  • 作用:讓 ProxySQL 加載剛才設置的路由規(guī)則。

八、測試讀寫分離

1. 測試讀操作(通過 read 用戶)

mysql -uread -p123456 -h 127.0.0.1 -P6033 -e "SELECT @@hostname,@@port"
  • 參數解釋
    • ?-uread:用只讀用戶read登錄
    • ?-P6033:連接 ProxySQL 的數據庫訪問端口(6033 是 ProxySQL 對外提供數據庫服務的端口)
    • ?-e:直接執(zhí)行后面的 SQL 語句(查詢當前連接的服務器主機名和端口)
  • 預期結果:返回從庫(192.168.8.101)的信息,說明讀操作走了從庫。

2. 測試寫操作(通過 adm 用戶)

mysql -uadm -p123456 -h 127.0.0.1 -P6033 -e "create database test2;"
  • 作用:創(chuàng)建一個數據庫(寫操作),預期會路由到主庫(192.168.8.100)。

3. 查看 ProxySQL 的路由記錄

mysql -uadmin -padmin -h127.0.0.1 -P6032  # 登錄管理界面
select hostgroup,digest_text from stats_mysql_query_digest\G;  # 查看SQL語句的路由記錄
  • 作用:檢查 ProxySQL 是否按規(guī)則路由:
    • ?hostgroup=1:表示語句走了主庫
    • ?hostgroup=2:表示語句走了從庫

九、保存所有配置(防止丟失)

-- 服務器配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
-- 查詢規(guī)則配置
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
-- 用戶配置
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
-- 變量配置
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
  • 作用:ProxySQL 的配置默認只在內存中,重啟后會丟失。這組命令用于將所有配置永久保存到磁盤,確保服務器重啟后配置仍然有效。

總結

整個流程的核心是:

  1. 安裝 ProxySQL 并啟動
  2. 告訴 ProxySQL“有哪些 MySQL 服務器(主從)”
  3. 告訴 ProxySQL “用什么用戶監(jiān)控這些服務器”
  4. 告訴 ProxySQL “允許哪些用戶通過你訪問 MySQL”
  5. 告訴 ProxySQL“哪些 SQL 語句走主庫,哪些走從庫”
  6. 測試并保存配置

通過這些步驟,ProxySQL 就能自動實現 “寫操作走主庫,讀操作走從庫” 的讀寫分離,減輕單臺數據庫的壓力。

到此這篇關于MySQL中使用ProxySql實現讀寫分離的文章就介紹到這了,更多相關ProxySql mysql讀寫分離內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL批量更新的四種方式總結

    MySQL批量更新的四種方式總結

    最近需要批量更新大量數據,習慣了寫sql,所以還是用sql來實現,下面這篇文章主要給大家總結介紹了關于MySQL批量更新的四種方式,需要的朋友可以參考下
    2023-01-01
  • SQL更新與刪除數據操作示例詳解

    SQL更新與刪除數據操作示例詳解

    如果要在程序運行過程中操作數據庫中的數據,那得先學會使用SQL語句,下面這篇文章主要給大家介紹了關于SQL查詢語句更新和刪除數據的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • mysql屬于關系型數據庫嗎

    mysql屬于關系型數據庫嗎

    在本篇文章里小編給大家分享的是一篇關于mysql是否屬于關系型數據庫的相關文章,有興趣的朋友們可以參考下。
    2020-06-06
  • MySQL高頻面試題完整版(由淺到深,面試必背)

    MySQL高頻面試題完整版(由淺到深,面試必背)

    MySQL作為目前最廣泛使用的關系型數據庫之一,許多互聯網大廠在招聘時都會重點考察應聘者對數據庫相關知識的掌握程度,這篇文章主要介紹了MySQL高頻面試題的相關資料,需要的朋友可以參考下
    2026-05-05
  • Mysql大數據量查詢優(yōu)化思路詳析

    Mysql大數據量查詢優(yōu)化思路詳析

    這篇文章主要介紹了Mysql大數據量查詢優(yōu)化思路,Mysql大表查詢優(yōu)化,理論上千萬級別以下的數據量Mysql單表查詢性能處理都是可以的。下文我們就來看看具體得思路解析
    2022-01-01
  • MySQL故障切換筆記之應用無感知設計詳解

    MySQL故障切換筆記之應用無感知設計詳解

    這篇文章主要給大家介紹了關于MySQL故障切換筆記之應用無感知設計的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Mysql查詢數據庫或數據表中的數據量以及數據大小

    Mysql查詢數據庫或數據表中的數據量以及數據大小

    許多數據庫的元數據都是存儲在mysql中的,本文主要介紹了Mysql查詢數據庫或數據表中的數據量以及數據大小,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • 使用MySQL Slow Log來解決MySQL CPU占用高的問題

    使用MySQL Slow Log來解決MySQL CPU占用高的問題

    在Linux VPS系統上有時候會發(fā)現MySQL占用CPU高,導致系統的負載比較高。這種情況很可能是某個SQL語句執(zhí)行的時間太長導致的。優(yōu)化一下這個SQL語句或者優(yōu)化一下這個SQL引用的某個表的索引一般能解決問題
    2013-03-03
  • Windows系統下MySQL忘記root密碼的2種解決辦法

    Windows系統下MySQL忘記root密碼的2種解決辦法

    這篇文章主要介紹了Windows系統下MySQL忘記root密碼的2種解決辦法,一種是通過啟動MySQL時跳過權限表驗證,然后重置密碼,另一種是創(chuàng)建一個包含新密碼的文本文件,并通過MySQL的--init-file選項來應用該文件中的密碼設置,需要的朋友可以參考下
    2024-11-11
  • 詳解Mysql之mysqlbackup備份與恢復實踐

    詳解Mysql之mysqlbackup備份與恢復實踐

    這篇文章主要介紹了詳解Mysql之mysqlbackup備份與恢復實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論

深水埗区| 乐业县| 扎兰屯市| 甘孜县| 黔东| 水富县| 平谷区| 天峨县| 荆州市| 天峻县| 宁南县| 沈丘县| 瑞金市| 桃源县| 张家界市| 施秉县| 方城县| 赤峰市| 隆德县| 确山县| 吐鲁番市| 周至县| 星子县| 怀来县| 大足县| 辽宁省| 濮阳县| 三台县| 从江县| 柞水县| 沧州市| 镇沅| 武乡县| 遂溪县| 聂荣县| 沐川县| 区。| 宁强县| 布拖县| 南雄市| 桐庐县|