焦作河南網(wǎng)站建設(shè)品牌策略
在企業(yè)應(yīng)用中,成熟的業(yè)務(wù)通常數(shù)據(jù)量都比較大
單臺(tái)MySQL在安全性、高可用性和高并發(fā)方面都無(wú)法滿足實(shí)際的需求
配置多臺(tái)主從數(shù)據(jù)庫(kù)服務(wù)器以實(shí)現(xiàn)讀寫(xiě)分離
所以要做主從服務(wù)器,保證安全性
做一寫(xiě)一讀服務(wù)器,將提升性能
1、什么是讀寫(xiě)分離
讀寫(xiě)分離,基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫(kù)處理SELECT查詢操作。
2、什么時(shí)候要讀寫(xiě)分離
數(shù)據(jù)庫(kù)不一定要讀寫(xiě)分離,如果程序使用數(shù)據(jù)庫(kù)較多時(shí),而更新少,查詢多的情況下會(huì)考慮使用。利用數(shù)據(jù)庫(kù)主從同步,再通過(guò)讀寫(xiě)分離可以分擔(dān)數(shù)據(jù)庫(kù)壓力,提高性能。
3、主從復(fù)制與讀寫(xiě)分離
在實(shí)際的生產(chǎn)環(huán)境中,數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行讀和寫(xiě),是不能滿足實(shí)際需求的。無(wú)論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。因此,通過(guò)主從復(fù)制的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。有點(diǎn)類似于rsync,但是不同的是rsync是對(duì)磁盤文件做備份,而mysql主從復(fù)制是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)、語(yǔ)句做備份。
主從復(fù)制的目的:把在主服務(wù)器上輸入的同步給從服務(wù)器mysql
讀寫(xiě)分離的目的:在主服務(wù)器上寫(xiě),在從服務(wù)器上讀,提高性能
4、mysql支持的復(fù)制類型
(1)STATEMENT:基于語(yǔ)句的復(fù)制。在服務(wù)器上執(zhí)行sql語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句,優(yōu)點(diǎn):mysql默認(rèn)采用基于語(yǔ)句的復(fù)制,執(zhí)行效率高。缺點(diǎn):在高并發(fā)情況下,命令順序會(huì)混亂,導(dǎo)致主從服務(wù)器的數(shù)據(jù)不一致
(2)ROW:基于行的復(fù)制。把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍。優(yōu)點(diǎn):精確性高,缺點(diǎn):效率慢,占用空間大
(3)MIXED:混合類型的復(fù)制。默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句無(wú)法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
5、主從復(fù)制的工作過(guò)程
-
master(Binlog dump thread)
-
slave(I/O thread 、SQL thread)
-
Master 的一條線程
-
Slave 中的兩條線程
(1)Master節(jié)點(diǎn)將數(shù)據(jù)的改變記錄成二進(jìn)制日志(bin log),當(dāng)Master上的數(shù)據(jù)發(fā)生改變時(shí),則將其改變寫(xiě)入二進(jìn)制日志中。
(2)Slave節(jié)點(diǎn)會(huì)在一定時(shí)間間隔內(nèi)對(duì)Master的二進(jìn)制日志進(jìn)行探測(cè)其是否發(fā)生改變,如果發(fā)生改變,則開(kāi)始一個(gè)I/O線程請(qǐng)求 Master的二進(jìn)制事件。
(3)同時(shí)Master節(jié)點(diǎn)為每個(gè)I/O線程啟動(dòng)一個(gè)dump線程,用于向其發(fā)送二進(jìn)制事件,并保存至Slave節(jié)點(diǎn)本地的中繼日志(Relay log)中,Slave節(jié)點(diǎn)將啟動(dòng)SQL線程從中繼日志中讀取二進(jìn)制日志,在本地重放,即解析成 sql 語(yǔ)句逐一執(zhí)行,使得其數(shù)據(jù)和 Master節(jié)點(diǎn)的保持一致,最后I/O線程和SQL線程將進(jìn)入睡眠狀態(tài),等待下一次被喚醒。
7.搭建 MySQL主從復(fù)制
1.主從服務(wù)器時(shí)間同步
yum install ntp -y
# 安裝ntpvim /etc/ntp.conf
# 修改ntp配置文件,在最后添加server 127.127.80.0
#設(shè)置本地是時(shí)鐘源,注意修改網(wǎng)段
fudge 127.127.80.0 stratum 8
#設(shè)置時(shí)間層級(jí)為8(限制在15內(nèi))service ntpd start
# 啟動(dòng)時(shí)間同步
yum install ntp ntpdate -y
# 從服務(wù)器安裝service ntpd start
/usr/sbin/ntpdate 192.168.64.10
# 和主服務(wù)器進(jìn)行時(shí)間同步crontab -e
# 設(shè)置定時(shí)任務(wù)
*/30 * * * * /usr/sbin/ntpdate 192.168.64.10
# 每半小時(shí)執(zhí)行一次時(shí)間同步
2.主服務(wù)器的mysql配置
vim /etc/my.cnf
# 在server-id=1下添加log-bin=mysql-bin #添加,主服務(wù)器開(kāi)啟二進(jìn)制日志
binlog_format=mixed
#選配項(xiàng)?? ?
expire_logs_days=7? ? ? ? ? #設(shè)置二進(jìn)制日志文件過(guò)期時(shí)間,默認(rèn)值為0,表示logs不過(guò)期
max_binlog_size=500M? ? #設(shè)置二進(jìn)制日志限制大小,如果超出給定值,日志就會(huì)發(fā)生滾? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 動(dòng),默認(rèn)值是1GB
skip_slave_start=1? ? ? ? ? ??#阻止從庫(kù)崩潰后自動(dòng)啟動(dòng)復(fù)制,崩潰后再自動(dòng)復(fù)制可能會(huì)導(dǎo)致數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 據(jù)不一致的"雙1設(shè)置",數(shù)據(jù)寫(xiě)入最安全
innodb_flush_logs_at_trx_commit=1?? ??? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #redo log(事務(wù)日志)的刷盤策略,每次事務(wù)提交時(shí)MySQL都會(huì)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 把事務(wù)日志緩存區(qū)的數(shù)據(jù)寫(xiě)入日志文件中,并且刷新到磁盤中,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 該模式為系統(tǒng)默認(rèn)
sync_binlog=1? ? ? ? ? ? ? ? ? ?#在進(jìn)行每1次事務(wù)提交(寫(xiě)入二進(jìn)制日志)以后,Mysql將執(zhí)行? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一次fsync的磁盤同步指令,將緩沖區(qū)數(shù)據(jù)刷新到磁盤
systemctl restart mysqldmysql -u root -pabc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.64.%' IDENTIFIED BY '123456'; # 創(chuàng)建用戶供服務(wù)器登錄
FLUSH PRIVILEGES;
3.從服務(wù)器的mysql配置
vim /etc/my.cnfserver-id = 2
#修改,注意id與Master的不同,兩個(gè)Slave的id也要不同
relay-log=relay-log-bin
#開(kāi)啟中繼日志,從主服務(wù)器上同步日志文件記錄到本地
relay-log-index=relay-log-bin.index
#定義中繼日志文件的位置和名稱,一般和relay-log在同一目錄
systemctl restart mysqldmysql -u root -pabc123CHANGE master to master_host='192.168.64.10',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=451;
#配置同步,注意 master_log_file 和 master_log_pos 的值要與Master查詢的一致
start slave; #啟動(dòng)同步,如有報(bào)錯(cuò)執(zhí)行 reset slave;
show slave status\G #查看 Slave 狀態(tài)
延遲的產(chǎn)生
當(dāng)主庫(kù)的TPS并發(fā)較高時(shí),由于主庫(kù)上面是多線程寫(xiě)入的,而從庫(kù)的SQL線程是單線程的,導(dǎo)致從庫(kù)SQL可能會(huì)跟不上主庫(kù)的處理速度(生產(chǎn)者比消費(fèi)者快,導(dǎo)致商品堆積)。