《老男孩Linux運維》筆記
MySQL-Documentation
概述
MySQL介紹
MySQL屬于傳統(tǒng)關(guān)系型數(shù)據(jù)庫產(chǎn)品,它開放式的架構(gòu)使得用戶選擇性很強,同時社區(qū)開發(fā)與維護(hù)人數(shù)眾多。
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系型數(shù)據(jù)庫的特點是將數(shù)據(jù)保存在不同的表中,再將這些表放入不同的數(shù)據(jù)庫中,而不是將所有數(shù)據(jù)統(tǒng)一放在一個大倉庫里,這樣的設(shè)計增加了MySQL的讀取速度,而且靈活性和可管理型也得到了很大提高。
訪問和管理MySQL數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言為SQL結(jié)構(gòu)化查詢語言。
MariaDB介紹
自從甲骨文公司收購了MySQL之后,為了避免Oracle將MySQL閉源,MySQL社區(qū)采用分支的方式來避開這個風(fēng)險。MariaDB就這樣誕生了。
MariaDB是一個向后兼容,可能在以后替代MySQL的數(shù)據(jù)庫產(chǎn)品。
MySQL多實例介紹
什么是MySQL多實例
MySQL多實例就是在一臺服務(wù)器上同時開啟多個不同的服務(wù)器端口(如3306, 3307),同時運行多個MySQL服務(wù)進(jìn)程,這些服務(wù)進(jìn)程通過不同的socket監(jiān)聽不同的服務(wù)器端口來提供服務(wù)。
這些MySQL多實例公用一套MySQL安裝程序,使用不同的 my.cnf(也可以相同)和數(shù)據(jù)文件。在提供服務(wù)時,多實例MySQL在邏輯上看起來是各自獨立的,他們根據(jù)配置文件的對應(yīng)設(shè)定值,獲得服務(wù)器相應(yīng)數(shù)量的硬件資源。
其實很多網(wǎng)絡(luò)服務(wù)都是可以配置多實例的,如 Nginx,Apache,Mongodb,Redis等。
MySQL多實例的作用與問題
MySQL多實例作用:
- 有效利用服務(wù)器資源;
- 節(jié)約服務(wù)器資源;
MySQL多實例有它的好處,也有其弊端。比如,會存在資源互相搶占的問題
MySQL多實例的應(yīng)用場景
- 資金緊張型公司的選擇;
- 并發(fā)訪問不是特別大的業(yè)務(wù);
- 門戶網(wǎng)站應(yīng)用MySQL多實例場景;
MySQL多實例常見的配置方案
單一配置文件、單一啟動程序的多實例部署方案
單一配置文件、單一啟動程序?qū)嵤┓桨浮?br>
vim /etc/my.cnf
[mysqld_multi]
mysqld = /bin/mysqld_safe
mysqladmin = /bin/mysqladmin
user = mysql
[mysqld1]
socket = /dir/path/mysql.sock
port = 3306
pid-file = /dir/path/mysql.pid
datedir = /dir/path/mysql
user = mysql
[mysql2]
socket = /path/mysql.sock
port = 3307
pid-file = /path/mysql.pid
datedir = /path/mysql
user = mysql
啟動命令:
mysqld_multi --config-file=/path/my.cnf start 1,2
不建議使用單一配置文件和單一啟動程序部署多實例方案
安裝并配置多實例MySQL數(shù)據(jù)庫
安裝MySQL多實例
安裝MySQL依賴包
yum install -y ncurses-devel libaio-devel
安裝MySQL
- 源碼安裝:
useradd -s /sbin/nologin -M mysql
wget mysql源碼包
tar mysql壓縮包
cd mysql-xxx
./configure
make&&make install
- rpm包安裝:
wget http://repo.mysql.com/xxx 選擇匹配的版本
rpm -ivh mysql.xxx.rpm
yum install mysql-server
創(chuàng)建MySQL多實例的數(shù)據(jù)文件目錄
mkdir -p /var/mysql/{3306,3307,3308}/db
創(chuàng)建MySQL多實例的配置文件
MySQL數(shù)據(jù)庫默認(rèn)為用戶提供了多個配置文件模板,用戶可以根據(jù)服務(wù)器硬件配置的大小來選擇。
vi /var/mysql/3306/my06.cnf
vi /var/mysql/3307/my07.cnf
vi /var/mysql/3308/my08.cnf
為了讓MySQL多實例之間彼此獨立,要為每一個實例建立一個 my.cnf 配置文件和一個啟動文件MySQL,讓它們分別對應(yīng)自己的數(shù)據(jù)文件目錄 db。
| 3306實例 | 3307實例 | 3308實例 |
|---|---|---|
| [ client ] port = 3306 socket = /var/mysql/3306/mysql.sock [ mysql ] no-auto-rehash [ mysqld ] user = mysql port = 3306 socket = /var/mysql/3306/mysql.sock basedir = /bin/mysql datadir = /var/mysql/3306/db 以及其他優(yōu)化信息 [ mysql_safe ] pid-file = /var/mysql/3306/mysql.pid log-error = /var/log/mysql/mysql06.log |
[ client ] port = 3307 socket = /var/mysql/3307/mysql.sock [ mysql ] no-auto-rehash [ mysqld ] user = mysql port = 3307 socket = /var/mysql/3307/mysql.sock basedir = /bin/mysql datadir = /var/mysql/3307/db 以及其他優(yōu)化信息 [ mysqld_safe ] pid-file = /var/mysql/3307/mysql.pid log-error = /var/log/mysql/mysql07.log |
[ client ] port = 3308 socket = /var/mysql/3308/mysql.sock [ mysql ] no-auto-rehash [ mysqld ] user = mysql port = 3308 socket = /var/mysql/3308/mysql.sock basedir = /bin/mysql datadir = /var/mysql/3308/db 以及其他優(yōu)化信息 [ mysqld_safe ] pid-file = /var/mysql/3308/mysql.pid log-error = /var/log/mysql/mysql08.log |
創(chuàng)建MySQL多實例的啟動程序
創(chuàng)建MySQL啟動文件
vim /var/mysql/3306/mysql.sh
vim /var/mysql/3307/mysql.sh
vim /var/mysql/3308/mysql.sh
這幾個啟動MySQL實例的腳本自己根據(jù)需要來寫。
在多實例啟動文件中,啟動MySQL不同實例服務(wù),所執(zhí)行的命令實質(zhì)是有區(qū)別的。
mysqld_sage --defaulte-files=/var/mysql/3306/my06.cnf >/dev/null 2>&1
mysqladmin -u root -p passwd -S /var/mysql/3306/mysql.sock shutdown
配置MySQL多實例文件權(quán)限
建議權(quán)限:700
MySQL相關(guān)命令加入全局路徑的配置
配置MySQL全局路徑
which mysql
echo 'export PATH=/path/xxx/mysql/bin:$PATH' >> /etc/profile
echo $PATH 查看
或者使用軟連接的方法
ln -s /path/xxx/mysql/bin/* /usr/local/sbin/
務(wù)必把MySQL命令路徑放在PATH路徑中其他路徑的前面,否則,可能會導(dǎo)致使用的 mysql 命令不是同一個,進(jìn)而產(chǎn)生錯誤。
啟動MySQL多實例數(shù)據(jù)庫
/var/mysql/3306/mysql.sh start
/var/mysql/3307/mysql.sh start
/var/mysql/3308/mysql.sh start
如果發(fā)現(xiàn)沒有顯示MySQL對應(yīng)實施的端口,請稍等幾秒在檢查,MySQL服務(wù)的啟動比Web服務(wù)慢一些;
請查看錯誤日志
配置及管理MySQL多實例數(shù)據(jù)庫
服務(wù)的開機自啟動很關(guān)鍵!把MySQL多實例的啟動命令加入 /etc/rc.local,實現(xiàn)開機自啟動。
echo "/var/mysql/3306/mysql.sh start
echo "/var/mysql/3307/mysql.sh start
echo "/var/mysql/3308/mysql.sh start
socket connect
mysql -S /var/mysql/3306/mysql.sock
MySQL安全配置:
mysqladmin -uroot -S /var/mysql/3306/mysql.sock -ppasswd #設(shè)置密碼
mysql -uroot -S /var/mysql/3306/mysql.sock -p
禁止使用 kill -9 等命令強制殺死數(shù)據(jù)庫,這會引起數(shù)據(jù)庫無法啟動等故障發(fā)生。
MySQL主從復(fù)制介紹
MySQL的主從復(fù)制并不是數(shù)據(jù)庫磁盤上的文件直接拷貝,而是通過邏輯的 binlog 日志復(fù)制到要同步的服務(wù)器本地,然后由本地的線程讀取日志里面的 SQL 語句,重新應(yīng)用到MySQL數(shù)據(jù)庫匯總。
MySQL數(shù)據(jù)庫支持單向、雙向、鏈?zhǔn)郊壜?lián)、環(huán)狀等不同業(yè)務(wù)場景的復(fù)制。
在復(fù)制過程中,一臺服務(wù)器充當(dāng) 主服務(wù)器(Master), 接收來自用戶的內(nèi)容更新;
而一個或多個的其他服務(wù)器充當(dāng)從服務(wù)器(Slave),接收來自主服務(wù)器 binlog 文件的日志內(nèi)容,解析出SQL,重新更新到從服務(wù)器,使得主從服務(wù)器數(shù)據(jù)達(dá)到一致;
如果設(shè)置了鏈?zhǔn)郊壜?lián),那么,從服務(wù)器(Slave)本身除了充當(dāng)從服務(wù)器外,也會同時充當(dāng)其下面從服務(wù)器的主服務(wù)器。鏈?zhǔn)郊壜?lián)復(fù)制類似 A-->B-->C 的復(fù)制形式。






MySQL主從復(fù)制都是異步的復(fù)制方式,既不是嚴(yán)格實時的數(shù)據(jù)同步,但是正常情況下給用戶的體驗是實時的。
MySQL主從復(fù)制的企業(yè)應(yīng)用場景
MySQL主從復(fù)制集群功能使得MySQL數(shù)據(jù)庫支持大規(guī)模高并發(fā)讀寫成為可能,同時有效保護(hù)了物理服務(wù)器宕機場景的數(shù)據(jù)備份。
應(yīng)用場景1:從服務(wù)器作為主服務(wù)器的實時數(shù)據(jù)備份
主從服務(wù)器架構(gòu)的設(shè)置可以大大加強MySQL數(shù)據(jù)庫架構(gòu)的健壯性。當(dāng)主服務(wù)器出現(xiàn)問題時,可設(shè)置自動切換到從服務(wù)器繼續(xù)提供服務(wù),此時從服務(wù)器的數(shù)據(jù)與宕機時的主數(shù)據(jù)庫幾乎是一模一樣的。
這類似 NFS 儲存數(shù)據(jù)通過 inotify+rsync 同步到備份的 NFS服務(wù)器,只不過MySQL的復(fù)制方案是其自帶的工具。
利用MySQL的復(fù)制功能進(jìn)行數(shù)據(jù)備份時,在硬件故障、軟件故障的場景下,該數(shù)據(jù)備份是有效的;但是對于人為地執(zhí)行 drop , delete 等語句刪除數(shù)據(jù)的情況,從庫的備份功能就沒用了,因為從服務(wù)器也會執(zhí)行刪除的語句。
應(yīng)用場景2:主從服務(wù)器實現(xiàn)讀寫分離,從服務(wù)器實現(xiàn)負(fù)載均衡
主從服務(wù)器架構(gòu)可通過程序(PHP,Java等)或代理軟件實現(xiàn)對用戶(客戶端)的請求讀寫分離。即讓重復(fù)服務(wù)器僅僅處理用戶的 select 查詢請求,降低用戶查詢響應(yīng)時間,以及同事讀寫在主服務(wù)器上帶來的訪問壓力; 對于更新的數(shù)據(jù),如update, insert, delete等,仍交給主服務(wù)器處理。確保主服務(wù)器和從服務(wù)器保持實時同步。
百度、淘寶等絕大多數(shù)網(wǎng)站都是用戶瀏覽頁面多余用戶發(fā)布內(nèi)容,因此通過在從服務(wù)器上接受 只讀請求,就可以很好地減輕主庫的 讀壓力,且從服務(wù)器可以很容易地擴(kuò)展為多臺,使用LVS做負(fù)載均衡效果就非常幫棒了。
這就是傳說中的數(shù)據(jù)庫讀寫分離架構(gòu)
應(yīng)用場景3:把多個從服務(wù)器根據(jù)業(yè)務(wù)重要性進(jìn)行拆分訪問
可以把幾個不同的從服務(wù)器,根據(jù)公司的業(yè)務(wù)進(jìn)行拆分。如:
用來做查詢服務(wù)的從服務(wù)器;
用來做數(shù)據(jù)備份的從服務(wù)器;
為公司人員提供訪問的從服務(wù)器;
為開發(fā)人員使用的從服務(wù)器;
這樣的拆分減輕了主服務(wù)器的壓力外,還可以是數(shù)據(jù)庫各個業(yè)務(wù)互不影響。
實現(xiàn)MySQL主從讀寫分離的方案
1. 通過程序?qū)崿F(xiàn)讀寫分離(推薦)
PHP和Java等程序都可以通過設(shè)置多個連接文件輕松地實現(xiàn)對數(shù)據(jù)庫的讀寫分離,即當(dāng)語句關(guān)鍵字為 select 時,就去連接 讀庫 的連接文件,若為 update, insert, delete 時,則連接寫庫的連接文件。

2. 通過開源軟件實現(xiàn)讀寫分離
3. 大型門戶獨立開發(fā) DAL 層綜合軟件
像百度、阿里等大型門戶都會自己開發(fā)適合自己業(yè)務(wù)的讀寫分離、負(fù)載均衡、監(jiān)控報警、自動擴(kuò)容等一系列功能的DAL層軟件。

MySQL主從復(fù)制原理介紹
MySQL的主從復(fù)制是一個異步的復(fù)制過程,雖然一般情況下感覺是實時的。數(shù)據(jù)將從一個MySQL數(shù)據(jù)庫(Master)復(fù)制到另一個MySQL數(shù)據(jù)庫(Slave)。
在Master與Slave之間實現(xiàn)整個主從復(fù)制的過程是由三個線程參與完成的。其中有兩個線程(SQL線程和I/O線程)在Slave端,另外一個線程(I/O線程)在Master端。
要實現(xiàn)MySQL的主從復(fù)制,首先必須打開Master端的 binlog 記錄功能,否則就無法實現(xiàn)。因為整個復(fù)制過程實際上就是Slave從Master端獲取 binlog 日志,然后再在Slave上以相同順序執(zhí)行獲取的 binlog 日志中所記錄的各種 SQL 操作。
打開MySQL的binlog功能
vim /etc/my.cnf
[ mysqld ]
log-bin = /path/mysql-bin
注意是放在 [mysqld]里,不要放錯位置了!
MySQL主從復(fù)制原理過程詳解
- 在Slave服務(wù)器上執(zhí)行
start slave命令開啟主從復(fù)制開關(guān),開始,開始進(jìn)行主從復(fù)制; - Slave服務(wù)器的I/O線程會通過在Master上已經(jīng)授權(quán)的復(fù)制用戶權(quán)限請求連接Master服務(wù)器,并請求從指定 binlog 日志文件的指定位置(日志文件名和位置就是在配置主從復(fù)制服務(wù)時執(zhí)行 change master 命令指定的),之后開始發(fā)送 binlog 日志內(nèi)容。
- Master服務(wù)器接收到來自Slave服務(wù)器的I/O線程請求后,其上負(fù)責(zé)復(fù)制的I/O線程會根據(jù)Slave服務(wù)器的I/O線程請求的信息分批讀取指定 binlog 日志文件指定位置之后的 binlog 日志信息,然后返回給 Slave 端的I/O線程。返回的信息中除了 binlog 日志內(nèi)容外,還有在Master服務(wù)器端記錄的新的 binlog 文件名稱,以及在新的 binlog 中的下一個指定更新位置。
- 當(dāng)Slave服務(wù)器的I/O線程獲取到Master服務(wù)器上I/O線程發(fā)送的日志內(nèi)容、日志文件及位置點后,會將 binlog 日志內(nèi)容依次寫到Slave端自身的 Relay Log(中繼文件)的最末端,并將新的 binlog 文件名和位置記錄到 master-info 文件中,以便下一次讀取Master端新 binlog 日志時能夠告訴Master服務(wù)器從新binlog 日志的指定文件及位置開始請求新的 binlog 日志內(nèi)容;
- Slave服務(wù)器端的SQL線程會實時監(jiān)測本地的 Relay Log 中 I/O線程新增加的日志內(nèi)容,然后及時地把Relay Log文件中的內(nèi)容解析成SQL語句,并在自身Slave服務(wù)器上按解析SQL語句的位置順序執(zhí)行應(yīng)用這些SQL語句,并在relay-log.info中記錄當(dāng)前應(yīng)用中繼日志的文件名和位置點。

小結(jié):
- 主從復(fù)制是異步邏輯的SQL語句級的復(fù)制;
- 復(fù)制時,主庫有一個I/O線程,從庫有兩個線程,即I/O和SQL線程;
- 實現(xiàn)主從復(fù)制的必要條件是主庫要開啟記錄的 binlog 功能;
- 作為復(fù)制的所有MySQL節(jié)點的server-id都不能相同;
- binlog文件只記錄對數(shù)據(jù)庫有更改的SQL語句,不記錄任何查詢語句。
MySQL主從復(fù)制實踐
主從復(fù)制實踐
MySQL主從復(fù)制實踐對環(huán)境要求較簡單,可以是單機單數(shù)據(jù)庫多實例(3306,3307,3308)的環(huán)境;也可以是多臺服務(wù)器,每個服務(wù)器一個獨立數(shù)據(jù)庫的環(huán)境。
建議使用多服務(wù)器實現(xiàn)數(shù)據(jù)庫主從功能!
單機數(shù)據(jù)庫多實例
1. 主從復(fù)制數(shù)據(jù)庫單機多實例環(huán)境準(zhǔn)備
使用前面配置的 3306,3307,3308三個實例
2. 定義主從復(fù)制需要的服務(wù)器角色
主庫及從庫名稱、IP、Port信息:
Master,ip:3306;
Slave1,ip:3307;
Slave2,ip:3308;
3. 在主庫Master上執(zhí)行操作配置
設(shè)置server-id并開啟binlog功能參數(shù)
vim ./3306/my.cnf
[mysqld]
server-id = 1
log-bin = /path/3306/mysql-bin
提示:
- 這兩個參數(shù)一定要放置于[mysqld]模塊下,否則會出錯;
- server-id建議使用服務(wù)器ip最后一個點分十進(jìn)制數(shù),目的是避免不同機器或?qū)嵗?ID 重復(fù);
- 參數(shù)不能重復(fù);
- 修改參數(shù)后重啟數(shù)據(jù)庫。
4. 在主庫上建立用于主從復(fù)制的賬號
登錄主庫3306:
mysql -uroot -ppasswd -S /path/3306/mysql.sock
件利用與從庫復(fù)制的賬號:
grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 'passwd';
#登錄之后
flush privilege;
#grant 權(quán)限1,權(quán)限2,…權(quán)限n on 數(shù)據(jù)庫名.表名稱 to 用戶名@用戶地址 identified by ‘連接口令’;
# 192.168.0.%代表此網(wǎng)段
select user,host form mysql.user where user='rep';
5. 實現(xiàn)對主數(shù)據(jù)庫鎖表只讀
對主數(shù)據(jù)庫鎖表只讀:
flush table with read lock;
在引擎不同的情況下,這個鎖表命令的時間會受下面參數(shù)的控制。鎖表時,如果超過設(shè)置時間不操作會自動解鎖。

鎖表后查看主庫狀態(tài):
mysql> show master status;
鎖表后導(dǎo)出數(shù)據(jù)庫:
mysqldump -uusername -ppasswd -S /path/mysql.sock xxxxx
導(dǎo)出數(shù)據(jù)完畢后,解鎖主庫,恢復(fù)可寫:
mysql> unlock tables;
6. 把主庫導(dǎo)出的數(shù)據(jù)遷移到從庫
這里常用的命令有 scp,rsync等,將備份的數(shù)據(jù)往異地拷貝。
在MySQL從庫上執(zhí)行的操作
1. 設(shè)置server-id并關(guān)閉binlog功能參數(shù)
數(shù)據(jù)庫的server-id一般在一套主從復(fù)制體系內(nèi)是唯一的,這里從庫的 server-id 要與主庫及其他從庫不同,并且要注釋掉從庫的 binlog 參數(shù)配置。如果從庫不做級聯(lián)復(fù)制,并且不作為備份用,就不要開啟 binlog,開啟了反而會增加從庫磁盤I/O等的壓力。
這兩種情況需要打開從庫 binlog 記錄功能,記錄數(shù)據(jù)庫更新的SQL語句:
級聯(lián)同步 A-->B-->C中B時,需要開啟;
在從庫做數(shù)據(jù)備份,數(shù)據(jù)庫備份必須要有全備和binlog日志,才是完整的備份。
vim /path/3307/my.cnf
[mysqld]
server-id = 2
2. 把主庫的數(shù)據(jù)導(dǎo)入從庫
mysql -uusername -ppasswd -S /path/mysql.sock < mysql_bak.sql
3. 登錄從庫,配置復(fù)制信息
從庫連接主庫配置信息:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_PORT='3306',
MASTER_USER='rep',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='mysql-bin.log',
MASTER_LOG_POS=342;
#字符串用單引號' '括起來,數(shù)值不用引號,注意內(nèi)容前后無空格,參數(shù)不能出錯。
上述操作的原理實際上是把用戶密碼等信息寫入從庫新的 master.info 文件中。
啟動從庫同步開關(guān),測試主從復(fù)制配置
1. 啟動從庫主從復(fù)制,并查看狀態(tài)
mysql -uroot -ppasswd -S /path/mysql.sock -e "start slave;"
#等同于 mysql> start slave;
主從復(fù)制是否成功的3項關(guān)鍵參數(shù):
- Slave_IO_Running:Yes,這個是I/O線程狀態(tài)。I/O線程復(fù)制從從庫到主庫讀取binlog日志,并寫入從庫的中繼日志;
- Slave_SQL_Running:Yes,這個是SQL線程狀態(tài)。SQL線程負(fù)責(zé)讀取中繼日志(relay-log)中的數(shù)據(jù)并轉(zhuǎn)換為SQL語句應(yīng)用到從數(shù)據(jù)庫中;
- Seconds_Behind_Master:0,這個是復(fù)制過程中從庫比主庫延遲的秒數(shù),這個參數(shù)很重要。
測試主從復(fù)制:
在主庫上隨便新建數(shù)據(jù),然后觀察從庫的數(shù)據(jù)狀況。
MySQL主從復(fù)制配置小結(jié)
- 環(huán)境實例準(zhǔn)備;
- 配置my.cnf文件;
- 登錄主庫并配置;
- 導(dǎo)出數(shù)據(jù);
- 從庫配置;
- 從庫數(shù)據(jù)恢復(fù);
- 從庫開啟復(fù)制;
- 檢查同步狀態(tài)。
MySQL主從復(fù)制應(yīng)用技巧
工作中MySQL從庫停止復(fù)制故障
模擬重現(xiàn)故障的能力是運維人員最重要的能力。
先在從庫創(chuàng)建一個庫,然后去主庫創(chuàng)建一個同名的庫來模擬數(shù)據(jù)沖突。
然后運行 show slave status 查看報錯信息。
讓從庫記錄binlog日志的方法
從庫需要記錄binlog的應(yīng)用場景:當(dāng)前從庫還要作為其他從庫的主庫,如級聯(lián)或互為主從的情況。
vim /path/my.cnf
[mysqld]
log-slave-updates
log-bin = /path/mysql-bin
MySQL主從復(fù)制集群架構(gòu)的數(shù)據(jù)備份策略
有了主從復(fù)制,還需要做定時 全量 + 增量 備份嗎?答案是肯定的!
因為,如果主庫有誤操作(如:drop),從庫也會執(zhí)行,這樣主從庫都沒有了該數(shù)據(jù)。
把從庫作為數(shù)據(jù)庫備份服務(wù)器時,備份策略如下:

MySQL主從復(fù)制延遲問題的原因及解決方案
1. 主庫的從庫太多,導(dǎo)致復(fù)制延遲
從庫數(shù)量盡量不要超過五個,要復(fù)制的節(jié)點數(shù)量過多,會導(dǎo)致復(fù)制延遲;
2. 從庫硬件比主庫差,導(dǎo)致復(fù)制延遲
查看主從系統(tǒng)配置,可能是因為配置不當(dāng);
3. 慢SQL語句過多
加入一條SQL語句執(zhí)行時間是20s,那么從執(zhí)行完畢到從庫上能查到數(shù)據(jù)至少需要20s,這樣就延遲了20s;
一般要把SQL語句的優(yōu)化作為常規(guī)工作,不斷地進(jìn)行監(jiān)控和優(yōu)化。如果單個SQL的寫入時間長,可以修改后分多次寫入;
通過查看慢查詢?nèi)罩净?show full processlist命令,找出執(zhí)行時間長的慢查詢語句或大的事務(wù)。
4. 主從復(fù)制的設(shè)計問題
如,主從復(fù)制單線程,如果主庫寫并發(fā)太大,來不及傳送到從庫,就會導(dǎo)致延遲;
5. 主從庫之間的網(wǎng)絡(luò)問題
主從庫之間的網(wǎng)卡、線路、連接設(shè)備等都有可能稱為復(fù)制的瓶頸,導(dǎo)致延遲;
6. 主庫讀寫壓力大,導(dǎo)致復(fù)制延遲
主機硬件搞好一點,增加buffer。
通過read-only參數(shù)讓從庫只讀訪問
read-only參數(shù)可以讓從服務(wù)器只允許來自從服務(wù)器線程或具有SUPER權(quán)限的數(shù)據(jù)庫用戶進(jìn)行更新,確保從服務(wù)器不接受來自用戶端的非法用戶更新。
方法一:直接帶 --read-only 參數(shù)啟動或重啟數(shù)據(jù)庫
mysql xxxxx --read-only
方法二:vim /path/my.cnf
[mysqld]
read-only
MySQL主從復(fù)制讀寫分離集群
讀寫分離賬戶設(shè)置
主從庫,賬戶權(quán)限,訪問IP等······
#Master
GRANT SELECT, INSERT, 權(quán)限 ON 'database'.'table' TO 'user'@'ip' identified by 'passwd';
#Slave
GRANT SELECT ON 'database'.'table' TO 'user'@'ip' identified by 'passwd';
flush privilege;
重點
- MySQL多實例的實現(xiàn)原理和實戰(zhàn)部署;
- MySQL主從復(fù)制的原理;
- MySQL主從復(fù)制的實踐;
- MySQL主從復(fù)制故障解決思路;
- MySQL主從復(fù)制延遲原因及解決思路;
- MySQL主從復(fù)制集群,從庫備份的思想和思路;
- MySQL主從復(fù)制讀寫分離授權(quán)訪問用戶方案;