Mysql的主從復(fù)制
一、什么是主從復(fù)制?
二、為什么要做主從復(fù)制?
主庫故障后,可切換到從數(shù)據(jù)庫繼續(xù)工作,一定程度上實(shí)現(xiàn)高可用。
讀寫分離,單庫情況下如果某張表寫的時(shí)候造成鎖表,那讀操作也會被阻塞,主從的話主庫負(fù)責(zé)寫,從庫負(fù)責(zé)讀,如果主庫寫的時(shí)候鎖表,不會影響從庫讀。
業(yè)務(wù)量越來越大,I/O訪問頻率過高,單機(jī)無法滿足,此時(shí)做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個(gè)機(jī)器的I/O性能。
三、Mysql主從復(fù)制的原理?
master必須啟用binlog,binlog中記錄了每一次數(shù)據(jù)變化事件
slave會在一定時(shí)間間隔內(nèi)對master的binlog進(jìn)行探測,判斷其是否發(fā)生改變,如果發(fā)生改變,則開啟一個(gè)I/O線程請求master的binlog中的事件
master為slave的I/O線程啟動(dòng)一個(gè)dump線程(binlog轉(zhuǎn)儲線程),檢查自己binlog中的事件,跟對方請求的位置對比后,向其發(fā)送二進(jìn)制事件
slave接收到master發(fā)送過來的數(shù)據(jù)把它放置到Relay log(中繼日志,也是二進(jìn)制)文件中;并記錄該次請求到master的具體哪一個(gè)二進(jìn)制日志文件內(nèi)部的哪一個(gè)位置
slave將啟動(dòng)一個(gè)sql線程從Relay log中讀取二進(jìn)制日志,在本地重放,使得其數(shù)據(jù)和主節(jié)點(diǎn)的保持一致;并記錄relay log中該次執(zhí)行的位置信息
最后I/O線程和SQL線程將進(jìn)入睡眠狀態(tài),等待下一次被喚醒

四、主從復(fù)制搭建
4.1、安裝mysql
注:我已經(jīng)安裝好兩臺mysql服務(wù),分別為192.168.209.128、192.168.209.129
rpm安裝默認(rèn)目錄:/var/lib/mysql/:數(shù)據(jù)文件/usr/share/mysql:配置文件模板/usr/bin/:mysql客戶端工具目錄/var/log/:日志目錄4.2、修改配置
192.168.209.129(從)的配置如下:#mysql主從配置--主節(jié)點(diǎn)#節(jié)點(diǎn)ID,需要在集群中唯一server-id=1#開啟binloglog-bin=mysql-bin#是否控制binlog刷盤,0:不控制,意思就是讓mysql自己決定是否刷盤,性能好但可能造成刷盤不及時(shí),1:每次事務(wù)提交都會刷盤,性能差但安全sync_binlog=1#binlog日志格式,一共分為statement、row、mixed三種模式binlog_format=mixed#binlog過期清理時(shí)間expire_logs_days=7#binlog每個(gè)日志文件的大小max_binlog_size=100m#binlog緩存大小binlog_cache_size=4m#最大binlog緩存大小max_binlog_cache_size=512m#不生成日志文件的數(shù)據(jù)庫,多個(gè)忽略數(shù)據(jù)庫可以用逗號拼接,這庫一般都是mysql自帶的庫,和業(yè)務(wù)無關(guān)的,就不用記錄binlog了binlog_ignore_db=mysql,information_schema, performance_schema#跳過從庫的錯(cuò)誤slave-skip-errors=all
#mysql主從配置-從節(jié)點(diǎn)#節(jié)點(diǎn)ID,需要在集群中唯一server_id=2#開啟binloglog-bin=mysql-bin#中繼日志名relay-log=mysql-relay-bin#從庫上事件從中繼日志中過濾,下面的這些表建議都過濾掉replicate-wild-ignore-table =mysql.%replicate-wild-ignore-table =test.%replicate-wild-ignore-table =log.%replicate-wild-ignore-table =information_schema.%replicate-wild-ignore-table =performance_schema.%

systemctl restart mysqld查看下mysql是否啟動(dòng)成功:
systemctl status mysqld

4.3、執(zhí)行語句
#創(chuàng)建用戶CREATE USER replyer IDENTIFIED BY 'Reply_12345';#賦予該用戶復(fù)制的權(quán)利grant?replication?slave?on?*.*?to?'replyer'@'192.168.209.129'??identified?by?'Reply_12345';FLUSH PRIVILEGES;#查看master的狀態(tài)show master status;


#配置從庫CHANGE MASTER TOMASTER_HOST = '192.168.209.128',MASTER_USER = 'replyer',MASTER_PASSWORD = 'Reply_12345',MASTER_PORT = 3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=861,MASTER_RETRY_COUNT = 60,MASTER_HEARTBEAT_PERIOD = 10;#啟動(dòng)從庫slave進(jìn)程start slave;#查看從庫狀態(tài)show slave status;



stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;?start slave;?show slave status;如果Slave_IO_Running是no執(zhí)行:show master status;


4.4、主從復(fù)制演示
登上slave執(zhí)行(master執(zhí)行完每一步后可以執(zhí)行對應(yīng)的語句觀察同步情況):#創(chuàng)建xp_db庫create database xp_db;#使用xp_db庫use?xp_db;#在xp_db庫中創(chuàng)建student表CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT ,`name` varchar(255) NULL ,PRIMARY KEY (`id`));#查看xp_db庫中的表show tables;#往student表中插入數(shù)據(jù)INSERT INTO student(name) VALUES ('xiaopi');
show databases;use xp_db;show tables;select * from student;

