MySQL數據庫服務主從復制
隨著訪問量的不斷增加,單臺MySQL數據庫服務器壓力不斷的增加,需要對MySQL進行優化和架構改造,如果MySQL優化不能明顯改善,可以使用高可用,主從復制,讀寫分離,拆分庫,拆分表等方法來進行優化.
MySQL主從復制的目的是實現數據冗余備份,將master數據庫數據定時同時到slave庫中,一旦master數據庫宕機,可以將Web應用數據庫配置快速切換至slave數據庫,確保Web應用有較高的高可用率.
一、什麽是主從復制?**
主從復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;主數據庫一般是準實時的業務數據庫。
二、主從復制的作用
1、做數據的熱備,作為後備數據庫,主數據庫服務器故障後,可切換到從數據庫繼續工作,避免數據丟失。
2、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
3、讀寫分離,使數據庫能支撐更大的並發。在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前臺服務。如果前臺使用master,報表使用slave,那麽報表sql將不會造成前臺鎖,保證了前臺速度。
三、主從復制原理
主從復制架構圖
mysql主從數據同步是一個異步復制的過程,要實現復制首先需要在master上開啟bin-log日誌功能,bin-log日誌用於記錄在master庫中執行的增,刪,改,查的SQL語句整個過程需要開啟3個線程,分別是master 開啟I/O線程,slave 開啟I/O線程和SQL線程,以下是具體原理:
(2)master服務器接收到來自Slave服務器的I/O線程的請求後,其上負責復制的I/O線程會根據slave服務器的I/O線程請求的信息分批讀取指定bin-log日誌文件指定位置之後的bin-log日誌信息,然後返回給slave端的I/O線程。返回的信息中除了bin-log日誌內容外,還有在Master服務器端記錄的新的Binlog文件名稱以及在新的bin-log中的下一個 指定更新位置
(4)slave服務器 SQL線程檢測到realy-log中內容有更新,會立刻解析realy-log日誌中的內容,將解析後的SQL語句在slave服務器執行,執行成功後slave庫與master庫保持一致。
四、環境部署
master 192.168.10.1
slave 192.168.10.2
1、都要安裝mysql數據庫並配置
yum install -y mariadb
2、修改主、從配置文件 /etc/my.cnf
master:在[mysqld]標簽下加入下面二句
log-bin=mysql-bin
server-id=1
slave:在[mysqld]標簽下加入下面一句
server-id=2
3、修改完成之後重新啟動MySQL
systemctl start mariadb
此時可以看 ll /var/lib/mysql/ 看下是否已經有二進制日誌mysql-bin.000001
4、建立復制賬號並授權、授權給slave服務器
grant replication slave on . to ‘test‘@‘192.168.10.2‘ identified by ‘123456‘;
授權時如果想授權任何一個IP都可以登陸,則把IP地址改為 % 號
grant replication slave on . to ‘test‘@‘%‘ identified by ‘123456‘;
flush privileges; --> 刷新權限
授權完成後,在從服務器上登陸測試
mysql -utest -h192.168.122.10 -p123456
5、給master加上鎖,防止有新的數據寫入
flush tables with read lock;
6、查看二進制日誌文件
show master status;
7、退出master數據庫,登陸slave數據庫,關閉slave復制線程(默認停止狀態)
stop slave;
8、配置主從關系,,在slave服務器上寫代碼、需要配置連接主服務器的信息,從服務器能不能在主服務器上面獲取二進制日誌,全靠下面的配置信息
change master to master_user=‘test‘,master_password=‘123456‘,master_host=‘192.168.10.1‘,
master_port=3306,master_log_file=‘mysql-bin.000001‘,master_log_pos=245;
9、slave服務器啟動slave線程
start slave;
10、啟動完成之後,再查看slave線程連接主服務器的狀態
show start slave;
下面兩個顯示都為yes算成功了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MySQL數據庫服務主從復制