《老男孩Linux運(yùn)維》筆記
MySQL-Documentation
概述
MySQL介紹
MySQL屬于傳統(tǒng)關(guān)系型數(shù)據(jù)庫產(chǎn)品二蓝,它開放式的架構(gòu)使得用戶選擇性很強(qiáng)奶陈,同時(shí)社區(qū)開發(fā)與維護(hù)人數(shù)眾多。
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng)呵曹,關(guān)系型數(shù)據(jù)庫的特點(diǎn)是將數(shù)據(jù)保存在不同的表中,再將這些表放入不同的數(shù)據(jù)庫中,而不是將所有數(shù)據(jù)統(tǒng)一放在一個(gè)大倉庫里辐宾,這樣的設(shè)計(jì)增加了MySQL的讀取速度,而且靈活性和可管理型也得到了很大提高膨蛮。
訪問和管理MySQL數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言為SQL結(jié)構(gòu)化查詢語言叠纹。
MariaDB介紹
自從甲骨文公司收購了MySQL之后,為了避免Oracle將MySQL閉源敞葛,MySQL社區(qū)采用分支的方式來避開這個(gè)風(fēng)險(xiǎn)誉察。MariaDB就這樣誕生了。
MariaDB是一個(gè)向后兼容惹谐,可能在以后替代MySQL的數(shù)據(jù)庫產(chǎn)品持偏。
MySQL多實(shí)例介紹
什么是MySQL多實(shí)例
MySQL多實(shí)例就是在一臺服務(wù)器上同時(shí)開啟多個(gè)不同的服務(wù)器端口(如3306, 3307)驼卖,同時(shí)運(yùn)行多個(gè)MySQL服務(wù)進(jìn)程,這些服務(wù)進(jìn)程通過不同的socket監(jiān)聽不同的服務(wù)器端口來提供服務(wù)鸿秆。
這些MySQL多實(shí)例公用一套MySQL安裝程序酌畜,使用不同的 my.cnf(也可以相同)和數(shù)據(jù)文件。在提供服務(wù)時(shí)卿叽,多實(shí)例MySQL在邏輯上看起來是各自獨(dú)立的桥胞,他們根據(jù)配置文件的對應(yīng)設(shè)定值,獲得服務(wù)器相應(yīng)數(shù)量的硬件資源考婴。
其實(shí)很多網(wǎng)絡(luò)服務(wù)都是可以配置多實(shí)例的贩虾,如 Nginx,Apache沥阱,Mongodb缎罢,Redis等。
MySQL多實(shí)例的作用與問題
MySQL多實(shí)例作用:
- 有效利用服務(wù)器資源喳钟;
- 節(jié)約服務(wù)器資源屁使;
MySQL多實(shí)例有它的好處,也有其弊端奔则。比如蛮寂,會存在資源互相搶占的問題
MySQL多實(shí)例的應(yīng)用場景
- 資金緊張型公司的選擇;
- 并發(fā)訪問不是特別大的業(yè)務(wù)易茬;
- 門戶網(wǎng)站應(yīng)用MySQL多實(shí)例場景酬蹋;
MySQL多實(shí)例常見的配置方案
單一配置文件、單一啟動程序的多實(shí)例部署方案
單一配置文件抽莱、單一啟動程序?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
不建議使用單一配置文件和單一啟動程序部署多實(shí)例方案
安裝并配置多實(shí)例MySQL數(shù)據(jù)庫
安裝MySQL多實(shí)例
安裝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í)例的數(shù)據(jù)文件目錄
mkdir -p /var/mysql/{3306,3307,3308}/db
創(chuàng)建MySQL多實(shí)例的配置文件
MySQL數(shù)據(jù)庫默認(rèn)為用戶提供了多個(gè)配置文件模板范抓,用戶可以根據(jù)服務(wù)器硬件配置的大小來選擇。
vi /var/mysql/3306/my06.cnf
vi /var/mysql/3307/my07.cnf
vi /var/mysql/3308/my08.cnf
為了讓MySQL多實(shí)例之間彼此獨(dú)立食铐,要為每一個(gè)實(shí)例建立一個(gè) my.cnf 配置文件和一個(gè)啟動文件MySQL匕垫,讓它們分別對應(yīng)自己的數(shù)據(jù)文件目錄 db。
3306實(shí)例 | 3307實(shí)例 | 3308實(shí)例 |
---|---|---|
[ 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多實(shí)例的啟動程序
創(chuàng)建MySQL啟動文件
vim /var/mysql/3306/mysql.sh
vim /var/mysql/3307/mysql.sh
vim /var/mysql/3308/mysql.sh
這幾個(gè)啟動MySQL實(shí)例的腳本自己根據(jù)需要來寫虐呻。
在多實(shí)例啟動文件中象泵,啟動MySQL不同實(shí)例服務(wù),所執(zhí)行的命令實(shí)質(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多實(shí)例文件權(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 命令不是同一個(gè)朗涩,進(jìn)而產(chǎn)生錯(cuò)誤忽孽。
啟動MySQL多實(shí)例數(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)實(shí)施的端口,請稍等幾秒在檢查,MySQL服務(wù)的啟動比Web服務(wù)慢一些兄一;
請查看錯(cuò)誤日志
配置及管理MySQL多實(shí)例數(shù)據(jù)庫
服務(wù)的開機(jī)自啟動很關(guān)鍵厘线!把MySQL多實(shí)例的啟動命令加入 /etc/rc.local,實(shí)現(xiàn)開機(jī)自啟動瘾腰。
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
等命令強(qiáng)制殺死數(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)容更新竞慢;
而一個(gè)或多個(gè)的其他服務(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ù)器外准脂,也會同時(shí)充當(dāng)其下面從服務(wù)器的主服務(wù)器劫扒。鏈?zhǔn)郊壜?lián)復(fù)制類似 A-->B-->C
的復(fù)制形式。
MySQL主從復(fù)制都是異步的復(fù)制方式狸膏,既不是嚴(yán)格實(shí)時(shí)的數(shù)據(jù)同步沟饥,但是正常情況下給用戶的體驗(yàn)是實(shí)時(shí)的。
MySQL主從復(fù)制的企業(yè)應(yīng)用場景
MySQL主從復(fù)制集群功能使得MySQL數(shù)據(jù)庫支持大規(guī)模高并發(fā)讀寫成為可能湾戳,同時(shí)有效保護(hù)了物理服務(wù)器宕機(jī)場景的數(shù)據(jù)備份闷板。
應(yīng)用場景1:從服務(wù)器作為主服務(wù)器的實(shí)時(shí)數(shù)據(jù)備份
主從服務(wù)器架構(gòu)的設(shè)置可以大大加強(qiáng)MySQL數(shù)據(jù)庫架構(gòu)的健壯性。當(dāng)主服務(wù)器出現(xiàn)問題時(shí)院塞,可設(shè)置自動切換到從服務(wù)器繼續(xù)提供服務(wù),此時(shí)從服務(wù)器的數(shù)據(jù)與宕機(jī)時(shí)的主數(shù)據(jù)庫幾乎是一模一樣的性昭。
這類似 NFS 儲存數(shù)據(jù)通過 inotify+rsync 同步到備份的 NFS服務(wù)器拦止,只不過MySQL的復(fù)制方案是其自帶的工具。
利用MySQL的復(fù)制功能進(jìn)行數(shù)據(jù)備份時(shí),在硬件故障汹族、軟件故障的場景下萧求,該數(shù)據(jù)備份是有效的;但是對于人為地執(zhí)行 drop , delete
等語句刪除數(shù)據(jù)的情況顶瞒,從庫的備份功能就沒用了夸政,因?yàn)閺姆?wù)器也會執(zhí)行刪除的語句。
應(yīng)用場景2:主從服務(wù)器實(shí)現(xiàn)讀寫分離榴徐,從服務(wù)器實(shí)現(xiàn)負(fù)載均衡
主從服務(wù)器架構(gòu)可通過程序(PHP守问,Java等)或代理軟件實(shí)現(xiàn)對用戶(客戶端)的請求讀寫分離。即讓重復(fù)服務(wù)器僅僅處理用戶的 select
查詢請求坑资,降低用戶查詢響應(yīng)時(shí)間耗帕,以及同事讀寫在主服務(wù)器上帶來的訪問壓力; 對于更新的數(shù)據(jù)袱贮,如update, insert, delete
等仿便,仍交給主服務(wù)器處理。確保主服務(wù)器和從服務(wù)器保持實(shí)時(shí)同步攒巍。
百度嗽仪、淘寶等絕大多數(shù)網(wǎng)站都是用戶瀏覽頁面多余用戶發(fā)布內(nèi)容,因此通過在從服務(wù)器上接受 只讀請求柒莉,就可以很好地減輕主庫的 讀壓力闻坚,且從服務(wù)器可以很容易地?cái)U(kuò)展為多臺,使用LVS做負(fù)載均衡效果就非常幫棒了常柄。
這就是傳說中的數(shù)據(jù)庫讀寫分離架構(gòu)
應(yīng)用場景3:把多個(gè)從服務(wù)器根據(jù)業(yè)務(wù)重要性進(jìn)行拆分訪問
可以把幾個(gè)不同的從服務(wù)器鲤氢,根據(jù)公司的業(yè)務(wù)進(jìn)行拆分。如:
用來做查詢服務(wù)的從服務(wù)器西潘;
用來做數(shù)據(jù)備份的從服務(wù)器卷玉;
為公司人員提供訪問的從服務(wù)器;
為開發(fā)人員使用的從服務(wù)器喷市;
這樣的拆分減輕了主服務(wù)器的壓力外相种,還可以是數(shù)據(jù)庫各個(gè)業(yè)務(wù)互不影響。
實(shí)現(xiàn)MySQL主從讀寫分離的方案
1. 通過程序?qū)崿F(xiàn)讀寫分離(推薦)
PHP和Java等程序都可以通過設(shè)置多個(gè)連接文件輕松地實(shí)現(xiàn)對數(shù)據(jù)庫的讀寫分離品姓,即當(dāng)語句關(guān)鍵字為 select
時(shí)寝并,就去連接 讀庫 的連接文件,若為 update, insert, delete
時(shí)腹备,則連接寫庫的連接文件衬潦。
2. 通過開源軟件實(shí)現(xiàn)讀寫分離
3. 大型門戶獨(dú)立開發(fā) DAL 層綜合軟件
像百度、阿里等大型門戶都會自己開發(fā)適合自己業(yè)務(wù)的讀寫分離植酥、負(fù)載均衡镀岛、監(jiān)控報(bào)警弦牡、自動擴(kuò)容等一系列功能的DAL層軟件。
MySQL主從復(fù)制原理介紹
MySQL的主從復(fù)制是一個(gè)異步的復(fù)制過程漂羊,雖然一般情況下感覺是實(shí)時(shí)的驾锰。數(shù)據(jù)將從一個(gè)MySQL數(shù)據(jù)庫(Master)復(fù)制到另一個(gè)MySQL數(shù)據(jù)庫(Slave)。
在Master與Slave之間實(shí)現(xiàn)整個(gè)主從復(fù)制的過程是由三個(gè)線程參與完成的走越。其中有兩個(gè)線程(SQL線程和I/O線程)在Slave端椭豫,另外一個(gè)線程(I/O線程)在Master端。
要實(shí)現(xiàn)MySQL的主從復(fù)制旨指,首先必須打開Master端的 binlog 記錄功能赏酥,否則就無法實(shí)現(xiàn)。因?yàn)檎麄€(gè)復(fù)制過程實(shí)際上就是Slave從Master端獲取 binlog 日志淤毛,然后再在Slave上以相同順序執(zhí)行獲取的 binlog 日志中所記錄的各種 SQL 操作今缚。
打開MySQL的binlog功能
vim /etc/my.cnf
[ mysqld ]
log-bin = /path/mysql-bin
注意是放在 [mysqld]里,不要放錯(cuò)位置了低淡!
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ù)時(shí)執(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 中的下一個(gè)指定更新位置蜂筹。
- 當(dāng)Slave服務(wù)器的I/O線程獲取到Master服務(wù)器上I/O線程發(fā)送的日志內(nèi)容需纳、日志文件及位置點(diǎn)后,會將 binlog 日志內(nèi)容依次寫到Slave端自身的 Relay Log(中繼文件)的最末端艺挪,并將新的 binlog 文件名和位置記錄到 master-info 文件中不翩,以便下一次讀取Master端新 binlog 日志時(shí)能夠告訴Master服務(wù)器從新binlog 日志的指定文件及位置開始請求新的 binlog 日志內(nèi)容;
- Slave服務(wù)器端的SQL線程會實(shí)時(shí)監(jiān)測本地的 Relay Log 中 I/O線程新增加的日志內(nèi)容麻裳,然后及時(shí)地把Relay Log文件中的內(nèi)容解析成SQL語句口蝠,并在自身Slave服務(wù)器上按解析SQL語句的位置順序執(zhí)行應(yīng)用這些SQL語句,并在relay-log.info中記錄當(dāng)前應(yīng)用中繼日志的文件名和位置點(diǎn)津坑。
小結(jié):
- 主從復(fù)制是異步邏輯的SQL語句級的復(fù)制妙蔗;
- 復(fù)制時(shí),主庫有一個(gè)I/O線程疆瑰,從庫有兩個(gè)線程眉反,即I/O和SQL線程狞谱;
- 實(shí)現(xiàn)主從復(fù)制的必要條件是主庫要開啟記錄的 binlog 功能;
- 作為復(fù)制的所有MySQL節(jié)點(diǎn)的server-id都不能相同禁漓;
- binlog文件只記錄對數(shù)據(jù)庫有更改的SQL語句,不記錄任何查詢語句孵睬。
MySQL主從復(fù)制實(shí)踐
主從復(fù)制實(shí)踐
MySQL主從復(fù)制實(shí)踐對環(huán)境要求較簡單播歼,可以是單機(jī)單數(shù)據(jù)庫多實(shí)例(3306,3307,3308)的環(huán)境掰读;也可以是多臺服務(wù)器秘狞,每個(gè)服務(wù)器一個(gè)獨(dú)立數(shù)據(jù)庫的環(huán)境。
建議使用多服務(wù)器實(shí)現(xiàn)數(shù)據(jù)庫主從功能蹈集!
單機(jī)數(shù)據(jù)庫多實(shí)例
1. 主從復(fù)制數(shù)據(jù)庫單機(jī)多實(shí)例環(huán)境準(zhǔn)備
使用前面配置的 3306,3307,3308三個(gè)實(shí)例
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
提示:
- 這兩個(gè)參數(shù)一定要放置于[mysqld]模塊下鄙才,否則會出錯(cuò)颂鸿;
- server-id建議使用服務(wù)器ip最后一個(gè)點(diǎn)分十進(jìn)制數(shù),目的是避免不同機(jī)器或?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. 實(shí)現(xiàn)對主數(shù)據(jù)庫鎖表只讀
對主數(shù)據(jù)庫鎖表只讀:
flush table with read lock熔萧;
在引擎不同的情況下,這個(gè)鎖表命令的時(shí)間會受下面參數(shù)的控制僚祷。鎖表時(shí)佛致,如果超過設(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í)藕施,需要開啟寇损;
在從庫做數(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ù)不能出錯(cuò)烦绳。
上述操作的原理實(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項(xiàng)關(guān)鍵參數(shù):
- Slave_IO_Running:Yes享扔,這個(gè)是I/O線程狀態(tài)底桂。I/O線程復(fù)制從從庫到主庫讀取binlog日志,并寫入從庫的中繼日志惧眠;
- Slave_SQL_Running:Yes籽懦,這個(gè)是SQL線程狀態(tài)。SQL線程負(fù)責(zé)讀取中繼日志(relay-log)中的數(shù)據(jù)并轉(zhuǎn)換為SQL語句應(yīng)用到從數(shù)據(jù)庫中氛魁;
- Seconds_Behind_Master:0暮顺,這個(gè)是復(fù)制過程中從庫比主庫延遲的秒數(shù),這個(gè)參數(shù)很重要秀存。
測試主從復(fù)制:
在主庫上隨便新建數(shù)據(jù)捶码,然后觀察從庫的數(shù)據(jù)狀況。
MySQL主從復(fù)制配置小結(jié)
- 環(huán)境實(shí)例準(zhǔn)備或链;
- 配置my.cnf文件惫恼;
- 登錄主庫并配置;
- 導(dǎo)出數(shù)據(jù)澳盐;
- 從庫配置祈纯;
- 從庫數(shù)據(jù)恢復(fù)令宿;
- 從庫開啟復(fù)制;
- 檢查同步狀態(tài)腕窥。
MySQL主從復(fù)制應(yīng)用技巧
工作中MySQL從庫停止復(fù)制故障
模擬重現(xiàn)故障的能力是運(yùn)維人員最重要的能力粒没。
先在從庫創(chuàng)建一個(gè)庫,然后去主庫創(chuàng)建一個(gè)同名的庫來模擬數(shù)據(jù)沖突簇爆。
然后運(yùn)行 show slave status
查看報(bào)錯(cuò)信息革娄。
讓從庫記錄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ù)制,還需要做定時(shí) 全量 + 增量 備份嗎匆浙?答案是肯定的安寺!
因?yàn)椋绻鲙煊姓`操作(如:drop)首尼,從庫也會執(zhí)行挑庶,這樣主從庫都沒有了該數(shù)據(jù)。
把從庫作為數(shù)據(jù)庫備份服務(wù)器時(shí)软能,備份策略如下:
MySQL主從復(fù)制延遲問題的原因及解決方案
1. 主庫的從庫太多迎捺,導(dǎo)致復(fù)制延遲
從庫數(shù)量盡量不要超過五個(gè),要復(fù)制的節(jié)點(diǎn)數(shù)量過多查排,會導(dǎo)致復(fù)制延遲凳枝;
2. 從庫硬件比主庫差,導(dǎo)致復(fù)制延遲
查看主從系統(tǒng)配置跋核,可能是因?yàn)榕渲貌划?dāng)岖瑰;
3. 慢SQL語句過多
加入一條SQL語句執(zhí)行時(shí)間是20s,那么從執(zhí)行完畢到從庫上能查到數(shù)據(jù)至少需要20s砂代,這樣就延遲了20s蹋订;
一般要把SQL語句的優(yōu)化作為常規(guī)工作,不斷地進(jìn)行監(jiān)控和優(yōu)化刻伊。如果單個(gè)SQL的寫入時(shí)間長露戒,可以修改后分多次寫入;
通過查看慢查詢?nèi)罩净?show full processlist
命令捶箱,找出執(zhí)行時(shí)間長的慢查詢語句或大的事務(wù)智什。
4. 主從復(fù)制的設(shè)計(jì)問題
如,主從復(fù)制單線程讼呢,如果主庫寫并發(fā)太大撩鹿,來不及傳送到從庫,就會導(dǎo)致延遲悦屏;
5. 主從庫之間的網(wǎng)絡(luò)問題
主從庫之間的網(wǎng)卡节沦、線路键思、連接設(shè)備等都有可能稱為復(fù)制的瓶頸,導(dǎo)致延遲甫贯;
6. 主庫讀寫壓力大吼鳞,導(dǎo)致復(fù)制延遲
主機(jī)硬件搞好一點(diǎn),增加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;
重點(diǎn)
- MySQL多實(shí)例的實(shí)現(xiàn)原理和實(shí)戰(zhàn)部署;
- MySQL主從復(fù)制的原理惨奕;
- MySQL主從復(fù)制的實(shí)踐雪位;
- MySQL主從復(fù)制故障解決思路;
- MySQL主從復(fù)制延遲原因及解決思路梨撞;
- MySQL主從復(fù)制集群雹洗,從庫備份的思想和思路;
- MySQL主從復(fù)制讀寫分離授權(quán)訪問用戶方案卧波;