實現MySQL高可用性:從原理到實踐

目錄

一、概述

1.什么是MySQL高可用

2.方案組成

3.優勢

二、資源清單

三、案例實施

1.修改主機名

2.安裝MySQL數據庫(Master1、Master2)

3.配置mysql雙主復制

4.安裝haproxy(keepalived1、keepalived2)

5.安裝keepalived(keepalived1、keepalived2)

6.測試故障轉移


一、概述

1.什么是MySQL高可用

MySQL高可用是指通過冗余設計,確保數據庫服務在單點故障、網絡中斷或硬件隨換等異常情況下,仍能持續對外提供服務,同時保證數據一致性。其核心目標實現‘零停機、零數據丟失’的業務連續性

2.方案組成

  • MySQL主主復制:兩臺Mysql實例互為主從,雙向同步數據,均支持同步數據,均支持讀寫操作,提供冗余和擴展能力
  • Keepalivend:通過VRRP協議管理虛擬IP(VIP),監控MySQL狀態,故障時自動將VIP漂移至存活節點,確保服務地址不變
  • HAProxy:作為反向代理和負載均衡器,將流量分發至MySQL節點,支持監控檢查,讀寫分離和故障節點自動刪除

3.優勢

  • 高可用性:Keeplived實現秒級故障切換,HAProxy健康檢查確保流量路由到正常節點,避免單點故障
  • 讀寫擴展:主主架構支持雙節點并發寫入,提高寫入性能;HAProxy可配置讀寫分離,利用備份節點分擔讀壓力
  • 靈活擴展:可橫向擴展HAProxy和MySQL節點,支持動態調整負載均衡策略(如權重、輪詢)

二、資源清單

主機

操作系統

IP地址

應用

Master1

OpenEuler 24.03

192.168.16.142

Mysql8

Master2

OpenEuler 24.03

192.168.16.143

Mysql8

Keepalived1

OpenEuler 24.03

192.168.16.144

Keepalived、haproxy

Keepalived2

OpenEuler 24.03

192.168.16.145

Keepalived、haproxy

三、案例實施

1.修改主機名

hostnamectl set-hostname master1
hostnamectl set-hostname master2
hostnamectl set-hostname Keepalived1
hostnamectl set-hostname Keepalived2

2.安裝MySQL數據庫(Master1、Master2)

dnf install -y tartar zxf autoinstall-mysql.tar.gzcd autoinstall-mysql./start.shcd
source /etc/profile
mysql -uroot -p'臨時密碼'
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
mysql -uroot -p123456

3.配置mysql雙主復制

  • 二進制日志配置
    • Master1
      vi /etc/my.cnf[mysqld]
      log-bin=master1-bin    #啟用二進制日志并指定其存儲路徑
      binlog_format = MIXED    #定義二進制日志的記錄格式為混合模式
      server-id=1    #為mysql實例分配一個唯一的服務器標識符
    • Master2
      vi /etc/my.cnf[mysqld]
      log-bin=master2-bin    #啟用二進制日志并指定其存儲路徑
      binlog_format = MIXED    #定義二進制日志的記錄格式為混合模式
      server-id=2   #為mysql實例分配一個唯一的服務器標識符
  • 重啟服務(Master1、Master2)
    systemctl restart mysqld
  • 登錄mysql程序,給從服務器授權(Master1、Master2)
    mysql -uroot -p123456#創建用戶
    CREATE USER 'myslave'@'%' IDENTIFIED BY '123456';
    #授權同步給所有用戶
    GRANT REPLICATION SLAVE ON  *.* TO 'myslave'@'%';
    #修改密碼
    ALTER USER 'myslave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    #刷新配置
    FLUSH PRIVILEGES;
    #查看狀態 
    show master status;
    #Master1
    +--------------------+----------+--------------+------------------+-------------------+
    | File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +--------------------+----------+--------------+------------------+-------------------+
    | master1-bin.000001 |     1147 |              |                  |                   |
    +--------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)#Master2
    +--------------------+----------+--------------+------------------+-------------------+
    | File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +--------------------+----------+--------------+------------------+-------------------+
    | master2-bin.000001 |     1150 |              |                  |                   |
    +--------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
  • 登錄mysql,配置同步
    • Master1
      mysql -uroot -p123456
      #連接主節點
      change master to master_host='192.168.16.143', master_user='myslave', master_password='123456',master_log_file='master2-bin.000001',master_log_pos=1150;
      #開啟同步
      start slave;
      #查看狀態
      show slave status\G#查看出來顯示#            Slave_IO_Running: Yes#           Slave_SQL_Running: Yes
    • Master2
      mysql -uroot -p123456
      #連接主節點
      change master to master_host='192.168.16.142', master_user='myslave', master_password='123456',master_log_file='master1-bin.000001',master_log_pos=1147;
      #開啟同步
      start slave;
      #查看狀態
      show slave status\G#查看出來顯示#            Slave_IO_Running: Yes#           Slave_SQL_Running: Yes

4.安裝haproxy(keepalived1、keepalived2)

  • 安裝haproxy
    dnf install  -y haproxy
  • 編輯haproxy配置文件
    vi /etc/haproxy/haproxy.cfg globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.piduser        haproxygroup       haproxydaemonmaxconn     4000defaultsmode                    tcplog                     globaloption                  tcplogoption                  dontlognullretries                 3timeout http-request    5stimeout queue           1mtimeout connect         5stimeout client          1mtimeout server          1mtimeout http-keep-alive 5stimeout check           5smaxconn                 3000listen mysqlbind 0.0.0.0:3306          # 顯式指定監聽地址和端口balance leastconn           # 負載均衡算法server mysql1 192.168.16.142:3306 check port 3306 maxconn 300server mysql2 192.168.16.143:3306 check port 3306 maxconn 300#mode tcp:表示tcp代理
    #listen mysql 0.0.0.0:3306:創建一個名為mysql的監聽服務
    #bind 0.0.0.0:3306:綁定到所有網卡的3306端口,作為流量入口
    #balance leastcnn:指定使用最少連接數分配在請求,將新連接導向當前活躍最少的后端服務器,避免單點過載
    #Server聲明兩個MySqL服務器節點mysql1和mysql2,分別指192.168.16.142:3306和192.168.16.143:3306
    #check prot 3306:通過檢查節點的3306端口是否響應,判斷存活狀態
    #maxconn 300 :限制每個后端節點的最大并發連接數300
    
  • 檢查配置文件并啟動服務
    haproxy -c -f /etc/haproxy/haproxy.cfg 
    systemctl start haproxy
    systemctl enable haproxy
    ss -nlpt | grep 3306
  • 測試
    [root@master1 ~]# mysql -umyslave -p123456 -h192.168.16.144 -P3306
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> exit

5.安裝keepalived(keepalived1、keepalived2)

  • 安裝keepalived
    dnf install -y keepalived
  • 編輯keepalived配置文件
    • keepalived1配置
      vi /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id r1
      }vrrp_script chk_haproxy {script "/etc/keepalived/chk.sh"interval 2
      }vrrp_instance VI_1 {state BACKUPnopreemptinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.16.100}track_script {chk_haproxy}notify_backup "/etc/init.d/haproxy restart"notify_fault "/etc/init.d/haproxy stop"
      }
    • 添加監控腳本并啟動keepailved
      vi /etc/keepalived/chk.sh
      #!/bin/bash
      #
      if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then/etc/init.d/keepalived stop
      fichmod +x /etc/keepalived/chk.sh 
      systemctl start keepalived
      systemctl enable keepalived
    • keepalived2配置
      vi /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id r2
      }vrrp_script chk_haproxy {script "/etc/keepalived/chk.sh"interval 2
      }vrrp_instance VI_1 {state BACKUPnopreemptinterface ens33virtual_router_id 51priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.16.100}track_script {chk_haproxy}notify_backup "/etc/init.d/haproxy restart"notify_fault "/etc/init.d/haproxy stop"
      }
    • 添加監控腳本并啟動keepailved
      vi /etc/keepalived/chk.sh
      #!/bin/bash
      #
      if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then/etc/init.d/keepalived stop
      fichmod +x /etc/keepalived/chk.sh 
      systemctl start keepalived
      systemctl enable keepalived
  • keepalived1上查看VIP
    ip a#inet 192.168.16.100/32 scope global ens33#valid_lft forever preferred_lft forever
  • 使用VIP連接Mysql(Master1)
    [root@master1 ~]# mysql -umyslave -p123456 -P3306 -h192.168.16.100
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

6.測試故障轉移

  • 關閉master1主機,測試使用vip能否正常訪問mysql數據庫(Master2)
    ping 192.168.16.142[root@master1 ~]# mysql -umyslave -p123456 -P3306 -h192.168.16.100
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
  • 關閉keeplived1,測試使用vip能否正常訪問mysql數據庫(Master2)
    ping 192.168.16.142[root@master1 ~]# mysql -umyslave -p123456 -P3306 -h192.168.16.100
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903532.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS學習筆記8——表格

一、表格 1-1、創建表格 在Word文檔中,如果要創建表格,只需插入表格,然后設定相應的行數和列數即可。然而在HTML網頁中,所有的元素都是通過標簽定義的,要想創建表格,就需要使用與表格相關的標簽。使用標簽…

爬蟲學習筆記(一)

目的 通過編寫程序爬取互聯網上的優質資源 爬蟲必須要使用python嗎 非也~ 編程語言知識工具,抓取到數據才是目的,而大多數爬蟲采用python語言編寫的原因是python的語法比較簡單,python寫爬蟲比較簡單!好用!而且pyt…

大廠面試:MySQL篇

前言 本章內容來自B站黑馬程序員java大廠面試題和小林coding 博主學習筆記,如果有不對的地方,海涵。 如果這篇文章對你有幫助,可以點點關注,點點贊,謝謝你! 1.MySQL優化 1.1 定位慢查詢 定位 一個SQL…

C++_數據結構_詳解紅黑樹

?? 歡迎大家來到小傘的大講堂?? 🎈🎈養成好習慣,先贊后看哦~🎈🎈 所屬專欄:C學習 小傘的主頁:xiaosan_blog 制作不易!點個贊吧!!謝謝喵!&…

DNA復制過程3D動畫教學工具

DNA復制過程3D動畫教學工具 訪問工具頁面: DNA復制動畫演示 工具介紹 我開發了一個交互式的DNA復制過程3D動畫演示工具,用于分子生物學教學。這個工具直觀展示了: DNA雙螺旋結構的解旋過程堿基互補配對原理半保留復制機制完整的復制周期動畫 主要特點…

使用阿里云 CDN 保護網站真實 IP:完整配置指南

使用阿里云 CDN 保護網站真實 IP:完整配置指南 一、寶塔面板準備工作1. 確認網站部署狀態2. 寶塔中檢查網站配置 二、配置阿里云 CDN1. 添加域名到 CDN2. 配置 DNS 解析3. 配置成功確認 三、寶塔面板安全加固(隱藏 IP 的關鍵步驟)1. 禁止通過…

PHP經驗筆記

isset — 檢測變量是否設置,并且不是NULL; 若變量存在且值不為NULL,則返回 TURE 若變量存在且其值為NULL或變量不存在,則返回 FALSE 結論 1. 當變量為空字符串、數值0和布爾值false時,isset全部返回true 2. 當變量不存在和變量存在且值為NULL…

Linux——安裝NVM

1. 安裝命令 官方地址:https://github.com/nvm-sh/nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash2. 安裝完成后執行命令 source ~/.bashrc3. 驗證 nvm -v

CentOS 7 磁盤陣列搭建與管理全攻略

CentOS 7 磁盤陣列搭建與管理全攻略 在數據存儲需求日益增長的今天,磁盤陣列(RAID)憑借其卓越的性能、數據安全性和可靠性,成為企業級服務器和數據中心的核心存儲解決方案。CentOS 7 作為一款穩定且功能強大的 Linux 操作系統&am…

C++每日訓練 Day 18:構建響應式表單與數據驗證(初學者友好)

📘 本篇目標:在前幾日協程與事件驅動機制基礎上,構建一個響應式表單系統,實現用戶輸入的異步驗證與反饋。通過協程掛起/恢復機制,簡化異步邏輯,提升代碼可讀性。 🔁 回顧 Day 17:響應…

Vue初步總結-摘自 黑馬程序員

本文摘自 bilibili 前端最新Vue2Vue3基礎入門到實戰項目全套教程,自學前端vue就選黑馬程序員,一套全通關! 更多詳情可參考: https://www.yuque.com/u26161316/pic6n4/heyv8nv8ubfk3fhe?singleDoc# 《Vue》

【基于Qt的QQ音樂播放器開發實戰:從0到1打造全功能音樂播放應用】

🌹 作者: 云小逸 🤟 個人主頁: 云小逸的主頁 🤟 motto: 要敢于一個人默默的面對自己,強大自己才是核心。不要等到什么都沒有了,才下定決心去做。種一顆樹,最好的時間是十年前,其次就是現在&…

線程池(二):深入剖析synchronized關鍵字的底層原理

線程池(二):深入剖析synchronized關鍵字的底層原理 線程池(二):深入剖析synchronized關鍵字的底層原理一、基本使用1.1 修飾實例方法1.2 修飾靜態方法1.3 修飾代碼塊 二、Monitor2.1 Monitor的概念2.2 Moni…

Linux CentOS 7 安裝Apache 部署html頁面

*、使用yum包管理器安裝Apache。運行以下命令: sudo yum install httpd *、啟動Apache服務 sudo systemctl start httpd *、設置Apache服務開機自啟 # 啟用開機自啟動 sudo systemctl enable httpd# 禁用開機自啟動 sudo systemctl disable httpd *、驗證Apac…

前端設置三行文本省略號,失效為什么?

實際效果:第三行出現省略號,但是第四行依舊顯示了部分文字 這個問題通常是由于 CSS 多行文本截斷(-webkit-line-clamp)的計算方式或布局沖突導致的。以下是完整解決方案,確保三行文本截斷正確顯示省略號,并…

git學習之git常用命令

1. 初始化倉庫 git init初始化一個新的 Git 倉庫。 2. 克隆遠程倉庫 git clone <repository-url>從遠程服務器克隆一個已有倉庫到本地。 3. 配置用戶名和郵箱 git config --global user.name "Your Name" git config --global user.email "youexampl…

【Spring Boot】深入解析:#{} 和 ${}

1.#{} 和 ${}的使用 1.1數據準備 1.1.1.MySQL數據準備 &#xff08;1&#xff09;創建數據庫&#xff1a; CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;&#xff08;2&#xff09;使用數據庫 -- 使?數據數據 USE mybatis_study;&#xff08;3&#xff…

Poco C++全面開發指南:日期和時間

時間戳 時間戳是指格林威治時間1970年01月01日00時00分00秒&#xff08;北京時間1970年01月01日08時00分00秒&#xff09;起至現在的總秒數。在poco中可以可以使用Timestamp類獲取。 #include <Poco/Timestamp.h> #include <iostream>int main() {Poco::Timestam…

水利三維可視化平臺怎么做?快速上手的3步指南

分享大綱&#xff1a; 1、了解水利三維可視化平臺 2、選擇合適的開發平臺 3、快速搭建水利三維可視化平臺 第一步&#xff1a;了解水利三維可視化平臺 水利三維可視化平臺是利用大數據、物聯網、數字孿生等技術&#xff0c;將物理實體數字化建模&#xff0c;并通過三維可視化技…

高級前端面試題:基于2025年最新技術體系

高級前端面試題:基于2025年最新技術體系 引言 隨著前端技術的不斷發展,2025年的前端面試題也呈現出新的特點和趨勢。本報告基于最新的前端技術體系,收集了當前熱門的面試題,旨在幫助準備高級前端工程師面試的候選人全面了解面試考察點。報告內容涵蓋HTML5 Canvas、WebGL、…