MySQL-主從複製

来源:https://www.cnblogs.com/xsuid/archive/2018/08/08/9444436.html
-Advertisement-
Play Games

前言前篇說了作為運維在資料庫塊最起碼要會兩大技能,今天來說說第二技能--主從複製隨著業務的增長,一臺資料庫伺服器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從主伺服器只管寫,從伺服器管讀,從而提高效率減輕壓力。主從複製分類:主從同步:當用戶寫數據主伺服器必須和... ...



前言

前篇說了作為運維在資料庫塊最起碼要會兩大技能,今天來說說第二技能--主從複製

隨著業務的增長,一臺資料庫伺服器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從

主伺服器只管寫,從伺服器管讀,從而提高效率減輕壓力。

主從複製分類:

主從同步:當用戶寫數據主伺服器必須和從伺服器同步一致了才告訴用戶寫入成功,等待時間太長

主從非同步:只要用戶訪問寫數據主伺服器寫入立馬返回給用戶成功

主從半步同步:當用戶訪問寫數據主伺服器寫入並同步其中一個從伺服器就返回給用戶成功

備註:通常都是使用的主從非同步,根據環境需求來選擇,想要數據更安全選擇半步同步

主從複製註意事項

註意:selinux策略、防火牆

1、開啟二進位日誌

log_bin

2、設置二進位記錄格式為ROW(推薦)

3、設置唯一server-id

server_id=#

4、設置datadir中日誌名稱(可選)

log-basename=master

5、創建有複製許可權的用戶賬號

GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';

6、如果要啟用級聯複製,需要在從伺服器啟用

log_bin
log_slave_updates

7、限制從伺服器為只讀

read_only=ON

8、禁止主機名解析

skip_name_resolve = on

9、高可用從伺服器要加上

relay_log_purge=0 #不清除中繼日誌

10、如何保證主從複製的事務安全(根據需求添加)

1)在master節點啟用參數:

sync_binlog=1
# 每次寫後立即同步二進位日誌到磁碟,性能差

2)如果用到的為InnoDB存儲引擎:

innodb_flush_log_at_trx_commit=1 
# 每次事務提交立即同步日誌寫磁碟
innodb_support_xa=ON 
# 預設值,分散式事務MariaDB10.3.0廢除
sync_master_info=# 
# #次事件後master.info同步到磁碟

3)在slave節點啟用參數:

sync_relay_log=# 
# #次寫後同步relay log到磁碟
sync_relay_log_info=#
# #次事務後同步relay-log.info到磁碟

主從複製原理

如圖

clipboard

備註:

主從同步有延遲,為什麼?因為它時是單線程傳送日誌

實戰-實現主從複製+高可用

準備工作

準備4台主機67、17、37、57,分別充當角色為管理主機、主伺服器、2個從伺服器

安裝包:和主伺服器同版本的mysql資料庫包、和高可用安裝包

mha4mysql-manager

mha4mysql-node

比如主伺服器已經運行了1年了,發現滿足不了需求了,需要搭建從伺服器,我們先從搭建從伺服器開始

備註:首先確保主伺服器開啟了二進位日誌

確認二進位文件已啟動

MariaDB [(none)]> show variables like '%log_bin%'

確認server-id

MariaDB [(none)]> show variables like 'server%';

主伺服器設置

1、創建可用於複製的賬號

grant replication slave on *.* to repluser@'192.168.43.%' identified by 'centos';

2、完全備份數據(用於在從伺服器上來還原)

mysqldump -pcentos -A -F --single-transaction --master-data=1 >/data/all-`date +%F`.sql

備註:備份時的某表的狀態

image

為了下麵的實驗測試在這裡我們備份玩再增加一條記錄

insert hellodb.students (name,age)values('gaoda001',20);

image

3、傳送到從伺服器37、57上

scp…

37、57(從)伺服器設置

1、配置文件
vim /etc/my.cnf

1)開啟二進位日誌

log-bin=mysql-bin

2)設置server-id(要和主服務id區分開)

server-id=2

備註:57設置為3 只要他們不相同就可

3)從伺服器設置為只讀

read_only=on

4)禁止主機名解析

skip_name_resolve = on

5)數據和索引分開存放

innodb_file_per_table = on 
# 10版本以上預設開啟

6)重啟或啟動服務

備註:以防萬一可以查看下最重要的兩項開啟了沒有

mysql -e "show variables like 'log%'"
mysql -e "show variables like 'server%'"

2、實現複製

1)進入資料庫查找同步代碼

MariaDB [(none)]> help change
MariaDB [(none)]> help change master to 

image

2)根據情況編輯上圖上的信息

註:起始位置可以在完全備份文件里查看

兩種方式:

① 先還有完全備份數據再拿以上信息編輯下,在資料庫中執行

② 直接把上面的信息添加到完全備份文件里

下麵用第二種方式來操作如圖

image

3)37主機還原並查看

mysql < all-2018-08-08.sql

image

備註:以還原到備份時的狀態

           主伺服器備份完有用戶新加數據對吧,下麵開啟主從複製看看能不能複製過來最新的數據

4)查看複製狀態

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.43.17
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005  
          Read_Master_Log_Pos: 385       #從主伺服器讀取到的位置
               Relay_Log_File: centos7_05-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: No       #表示還沒開啟
            Slave_SQL_Running: No       #表示還沒開啟
              Replicate_Do_DB:  
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 385
              Relay_Log_Space: 256
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL   ##註意這個 表示同步時間差
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
1 row in set (0.03 sec)

5)開啟主從複製並查看狀態

start slave;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.17
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 608
               Relay_Log_File: centos7_05-relay-bin.000003
                Relay_Log_Pos: 778
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 608
              Relay_Log_Space: 1092
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)

6)查看表確認有沒有從主伺服器同步最新的數據

image

7)57(從伺服器同樣的設置)

備註:目前現實了非同步同步複製,下麵來看半同步設置

半同步設置

主伺服器設置

1、首先在主伺服器上安裝插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

備註:

show plugins; ##查看當前系統中的插件列表

UNINSTALL PLUGIN rpl_semi_sync_master;##卸載插件

2、查看插件狀態

SHOW GLOBAL VARIABLES LIKE '%semi%';

image

3、開啟

set global rpl_semi_sync_master_enabled=on;

備註:最好寫在配置文件中

image

4、查看插件變數狀態

SHOW GLOBAL STATUS LIKE '%semi%';

image

備註:這裡記錄有幾個半同步主機

從伺服器設置

1、安裝插件

INSTALL PLUGIN rpl_semi_sync_slave SONAME  'semisync_slave.so';

2、啟動插件

set global rpl_semi_sync_slave_enabled=on;

備註:同樣建議寫在配置文件中

image

3、從伺服器查看改插件是否開始工作

SHOW GLOBAL STATUS LIKE '%semi%';

image

為什麼沒有開始工作?

因為是先開啟的主從複製再安裝的次插件

所以這種情況下,先停止從伺服器的主從複製功能

1)停止:

stop slave;

2)再次開啟主從複製

start slave;

3)再去查看

image

備註:現在就啟用了半同步功能,下麵開始搭建高可用,實現主伺服器宕機自動提升從伺服器當主

MHA高性能

備註:四台主機之間必須是ssh基於key驗證登陸,所以要先實現ssh互相鏈接

步驟:

ssh-keygen

cd .ssh

ssh-copy-id 192.168.43.67

把.ssh目錄考到其他主機

1、在主伺服器上創建管理者賬號

grant all on *.* to mhauser@'192.168.43.%' identified by 'centos';

2、在67管理主機上安裝以下包

mha4mysql-manager 
mha4mysql-node

3、在17、37、57安裝如下包

mha4mysql-node

4、在管理主機創建管理節點

mkdir /etc/mastermha/
cd /etc/mastermha/
vim app1.cnf

根據上面創建的信息填寫

[server default]
user=mhauser
password=centos
manager_workdir=/app/mastermha/app1/
manager_log=/app/mastermha/app1/manager.log
remote_workdir=/app/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
##以上是全局設置

##以下是針對某一組集群設置
[server1]
hostname=192.168.43.17
candidate_master=1
[server2]
hostname=192.168.43.37
candidate_master=1
[server3]
hostname=192.168.43.57
candidate_master=1

備註:

candidate_master=1:是說主伺服器宕機了帶有這項的主機有機會當主

5、測試

1)ssh協議

/usr/bin/masterha_check_ssh --conf=/etc/mastermha/app1.cnf


2、檢查複製

masterha_check_repl --conf=/etc/mastermha/app1.cnf

3、啟動(預設前臺執行)

masterha_manager --conf=/etc/mastermha/app1.cnf

image

備註:如果你是編譯安裝在/etc/mastermha/app1.cnf配置文件中指定日誌路徑,最好主從伺服器資料庫設置的位置都是一致的。

image

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

-Advertisement-
Play Games
更多相關文章
  • 1、錯誤如下: HTTP 錯誤 500.22 - Internal Server Error 檢測到在集成的托管管道模式下不適用的 ASP.NET 設置。 解決的方法: 首先,找到本地appcmd.xml的這個文件,然後進行下麵的操作: (1)運行 cmd,進命令行模式,cd到你IIS Expres ...
  • 微信的出現給我們的生活帶來了很大的便利,讓人與人之間的距離縮短了不少,即使在天涯海角也可以通過這個軟體溝通。近兩年隨著微信功能的不斷增強,先後又增添了微信紅包等功能,而這也吸引了更多的人使用微信。可是也時常會有人在生活中抱怨我的微信密碼被破解了怎麼辦這個問題,在這裡就教給大家如何將微信密友找回。 微 ...
  • 使用Dnc.Api.Throttle可以使您輕鬆實現WebApi介面的限流管理。Dnc.Api.Throttle支持IP、用戶身份、Request Header、Request QueryString等多種限流策略,支持黑名單和白名單功能,支持全局攔截和單獨Api攔截。 ...
  •     對於Linux而言管理各類軟體,如安裝、卸載和升級等是常有的事情和必備的技能。以CentOS為例,常用的安裝包命令有 rpm 和 yum 。 RPM基礎     RPM(RedHat Package Manager)是一個系統軟體包,功能類似於Wind ...
  • 1. yum install gcc-c++ 2. yum install -y pcre pcre-devel 3. yum install -y zlib zlib-devel 4. yum install -y openssl openssl-devel 5. 通過工具FileZilla上傳n ...
  • [20180806]tune2fs調整保留塊百分比.txt--//生產系統一臺dg磁碟空間滿了.我前一陣子已經將*convert參數修改,增加磁碟,但是這個分區裡面的數據文件還可以增長,這樣依舊存--//在磁碟空間不足的情況,正常應該移動數據文件到別的分區,然後rename.突然想起建立分區時有一定 ...
  • 在Linux 中如何查看分區的文件系統類型,下麵總結幾種查看分區文件系統類型的方法。 1: df -T 命令查看 這個是最簡單的命令,文件系統類型在Type列輸出。只可以查看已經掛載的分區和文件系統類型。如下所示: [root@mylnx008 ~]# df -T /dev/sdbFilesyste... ...
  • 在Linux通用I/O模型中,I/O操作系列函數(系統調用)都是圍繞一個叫做文件描述符的整數展開。這不禁讓人產生疑問:這個整數代表什麼?一個數值代表一個文件嗎?隨便傳一個整數進去調用可以嗎? ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...