MySql主從復(fù)制實現(xiàn)原理及配置
數(shù)據(jù)庫讀寫分離對于大型系統(tǒng)或者訪問量很高的互聯(lián)網(wǎng)應(yīng)用來說,是必不可少的一個重要功能。對于MySQL來說,標準的讀寫分離是主從模式,一個寫節(jié)點Master后面跟著多個讀節(jié)點,讀節(jié)點的數(shù)量取決于系統(tǒng)的壓力,通常是1-3個讀節(jié)點的配置。而一般的讀寫分離中間件,例如Mycat的讀寫分離和自動切換機制,需要mysql的主從復(fù)制機制配合。
主從配置需要注意的地方
1、主DB server和從DB server數(shù)據(jù)庫的版本一致
2、主DB server和從DB server數(shù)據(jù)庫數(shù)據(jù)名稱一致
3、主DB server開啟二進制日志,主DB server和從DB server的server_id都必須唯一MySQL主服務(wù)器配置
第一步:修改my.conf文件:
在[mysqld]段下添加:
binlog-ignore-db=mysql #啟用二進制日志 log-bin=mysql-bin //二進制日志的格式,有三種:statement/row/mixed binlog_format=row #主服務(wù)器唯一ID,一般取IP最后一段 server-id=82
第二步:重啟mysql服務(wù)
service mysql restart
第三步:建立帳戶并授權(quán)slave
mysql>GRANT FILE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepw';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'slave'@'%' identified by 'slavepw';
一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全。
刷新權(quán)限
mysql> FLUSH PRIVILEGES;
第四步:查詢master的狀態(tài)
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 881 | | mysql | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
MySQL從服務(wù)器配置
第一步:修改my.conf文件
[mysqld]#從服務(wù)器唯一ID,一般取IP最后一段server-id=83
第二步:配置從服務(wù)器
mysql>change master to master_host='192.168.11.82',master_port=3306,master_user='slave',master_password='slavepw',master_log_file='mysql-bin.000001',master_log_pos=881;
注意語句中間不要斷開,master_port為mysql服務(wù)器端口號(無引號),master_user為執(zhí)行同步操作的數(shù)據(jù)庫賬戶,“881”無單引號(此處的881就是show master status 中看到的position的值,這里的mysql-bin.000001就是file對應(yīng)的值)。
第三步:啟動從服務(wù)器復(fù)制功能
mysql>start slave;
第四步:檢查從服務(wù)器復(fù)制功能狀態(tài):
mysql> show slave status;
Slave_IO_Running: Yes //此狀態(tài)必須YES
Slave_SQL_Running: Yes //此狀態(tài)必須YES
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態(tài),否則都是錯誤的狀態(tài)(如:其中一個NO均屬錯誤)。
進行驗證
在主節(jié)點上創(chuàng)建表、插入數(shù)據(jù),發(fā)現(xiàn)從節(jié)點也創(chuàng)建表并插入數(shù)據(jù)。
MySQL 主從復(fù)制原理的是啥?
主庫將變更寫入 binlog 日志,然后從庫連接到主庫之后,從庫有一個 IO 線程,將主庫的 binlog 日志拷貝到自己本地,寫入一個 relay 中繼日志中。接著從庫中有一個 SQL 線程會從中繼日志讀取 binlog,然后執(zhí)行 binlog 日志中的內(nèi)容,也就是在自己本地再次執(zhí)行一遍 SQL,這樣就可以保證自己跟主庫的數(shù)據(jù)是一樣的。
這里有一個非常重要的一點,就是從庫同步主庫數(shù)據(jù)的過程是串行化的,也就是說主庫上并行的操作,在從庫上會串行執(zhí)行。所以這就是一個非常重要的點了,由于從庫從主庫拷貝日志以及串行執(zhí)行 SQL 的特點,在高并發(fā)場景下,從庫的數(shù)據(jù)一定會比主庫慢一些,是有延時的。所以經(jīng)常出現(xiàn),剛寫入主庫的數(shù)據(jù)可能是讀不到的,要過幾十毫秒,甚至幾百毫秒才能讀取到。
而且這里還有另外一個問題,就是如果主庫突然宕機,然后恰好數(shù)據(jù)還沒同步到從庫,那么有些數(shù)據(jù)可能在從庫上是沒有的,有些數(shù)據(jù)可能就丟失了。
所以 MySQL 實際上在這一塊有兩個機制,一個是半同步復(fù)制,用來解決主庫數(shù)據(jù)丟失問題;一個是并行復(fù)制,用來解決主從同步延時問題。
這個所謂半同步復(fù)制,也叫semi-sync
復(fù)制,指的就是主庫寫入 binlog 日志之后,就會將強制此時立即將數(shù)據(jù)同步到從庫,從庫將日志寫入自己本地的 relay log 之后,接著會返回一個 ack 給主庫,主庫接收到至少一個從庫的 ack 之后才會認為寫操作完成了。
所謂并行復(fù)制,指的是從庫開啟多個線程,并行讀取 relay log 中不同庫的日志,然后并行重放不同庫的日志,這是庫級別的并行。
MySQL 主從同步延時問題
以前線上確實處理過因為主從同步延時問題而導(dǎo)致的線上的 bug,屬于小型的生產(chǎn)事故。
是這個么場景。有個同學是這樣寫代碼邏輯的。先插入一條數(shù)據(jù),再把它查出來,然后更新這條數(shù)據(jù)。在生產(chǎn)環(huán)境高峰期,寫并發(fā)達到了 2000/s,這個時候,主從復(fù)制延時大概是在小幾十毫秒。線上會發(fā)現(xiàn),每天總有那么一些數(shù)據(jù),我們期望更新一些重要的數(shù)據(jù)狀態(tài),但在高峰期時候卻沒更新。用戶跟客服反饋,而客服就會反饋給我們。
我們通過 MySQL 命令:
show status
查看Seconds_Behind_Master
,可以看到從庫復(fù)制主庫的數(shù)據(jù)落后了幾 ms。
一般來說,如果主從延遲較為嚴重,有以下解決方案:
分庫,將一個主庫拆分為多個主庫,每個主庫的寫并發(fā)就減少了幾倍,此時主從延遲可以忽略不計。打開 MySQL 支持的并行復(fù)制,多個庫并行復(fù)制。如果說某個庫的寫入并發(fā)就是特別高,單庫寫并發(fā)達到了 2000/s,并行復(fù)制還是沒意義。重寫代碼,寫代碼的同學,要慎重,插入數(shù)據(jù)時立馬查詢可能查不到。如果確實是存在必須先插入,立馬要求就查詢到,然后立馬就要反過來執(zhí)行一些操作,對這個查詢設(shè)置直連主庫。不推薦這種方法,你要是這么搞,讀寫分離的意義就喪失了。開啟并行復(fù)制
開啟多線程復(fù)制,默認關(guān)鍵的參數(shù)有兩個:
mysql> show variables like 'slave_parallel_%'; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | slave_parallel_type | DATABASE | | slave_parallel_workers | 0 | +------------------------+----------+ 2 rows in set (0.00 sec)
slave-parallel-type 默認值為database
slave-parallel-workers 默認值為0
開啟:
mysql> stop slave sql_thread; Query OK, 0 rows affected (0.05 sec) mysql> set global slave_parallel_type='LOGICAL_CLOCK'; Query OK, 0 rows affected (0.00 sec) mysql> set global slave_parallel_workers=4; Query OK, 0 rows affected (0.00 sec) mysql> start slave sql_thread; Query OK, 0 rows affected (0.07 sec)
參考資料:
https://www.jianshu.com/p/3932551e0221
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MySql中 is Null段判斷無效和IFNULL()失效的解決方案
這篇文章主要介紹了MySql中 is Null段判斷無效和IFNULL()失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06MySQL千萬級數(shù)據(jù)從190秒優(yōu)化到1秒的全過程
優(yōu)化MySQL千萬級數(shù)據(jù)策略還是比較多的,分表分庫,創(chuàng)建中間表,匯總表以及修改為多個子查詢,這里討論的情況是在MySQL一張表的數(shù)據(jù)達到千萬級別,在這樣的情況下,開發(fā)者可以嘗試通過優(yōu)化SQL來達到查詢的目的,所以本文給大家介紹了MySQL千萬級數(shù)據(jù)從190秒優(yōu)化到1秒的全過程2024-04-04MySQL Installer is running in Community mode 的解決辦法
這篇文章主要介紹了MySQL Installer is running in Community mode 的解決辦法,需要的朋友可以參考下2018-06-06解決MySQL讀寫分離導(dǎo)致insert后select不到數(shù)據(jù)的問題
這篇文章主要介紹了解決MySQL讀寫分離導(dǎo)致insert后select不到數(shù)據(jù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12一鍵搭建MYSQL主從,輕松應(yīng)對數(shù)據(jù)備份與恢復(fù)
MYSQL主從是一種常見的數(shù)據(jù)庫架構(gòu),它可以提高數(shù)據(jù)庫的可用性和性能,在主從架構(gòu)中,主數(shù)據(jù)庫負責處理寫操作,而從數(shù)據(jù)庫負責處理讀操作,當主數(shù)據(jù)庫發(fā)生故障時,從數(shù)據(jù)庫可以接管并繼續(xù)提供服務(wù),從而實現(xiàn)高可用性,需要的朋友可以參考下2023-10-10mysql_connect(): Connection using old (pre-4.1.1) authentica
MySQL錯誤提示:Connection using old (pre-4.1.1) authentication protocol refused (client option ‘secure_auth’ enabled)解決辦法,需要的朋友可以參考下2014-04-04