1. 主從復制概述
1.1 如何提升數(shù)據(jù)庫并發(fā)能力
此外嫌术,一般應用對數(shù)據(jù)庫而言都是“ 讀多寫少 ”,也就說對數(shù)據(jù)庫讀取數(shù)據(jù)的壓力比較大,有一個思路就
是采用數(shù)據(jù)庫集群的方案束昵,做 主從架構 、進行 讀寫分離 葛峻,這樣同樣可以提升數(shù)據(jù)庫的并發(fā)處理能力锹雏。但
并不是所有的應用都需要對數(shù)據(jù)庫進行主從架構的設置,畢竟設置架構本身是有成本的术奖。
如果我們的目的在于提升數(shù)據(jù)庫高并發(fā)訪問的效率礁遵,那么首先考慮的是如何 優(yōu)化SQL和索引 ,這種方式
簡單有效采记;其次才是采用 緩存的策略 佣耐,比如使用 Redis將熱點數(shù)據(jù)保存在內(nèi)存數(shù)據(jù)庫中,提升讀取的效
率唧龄;最后才是對數(shù)據(jù)庫采用 主從架構 兼砖,進行讀寫分離。
1.2 主從復制的作用
主從同步設計不僅可以提高數(shù)據(jù)庫的吞吐量既棺,還有以下 3 個方面的作用讽挟。
-
第1個作用:讀寫分離。
image.png 第2個作用就是數(shù)據(jù)備份丸冕。
第3個作用是具有高可用性耽梅。
2. 主從復制的原理
Slave 會從 Master 讀取 binlog 來進行數(shù)據(jù)同步。
2.1 原理剖析
- 三個線程
實際上主從同步的原理就是基于 binlog 進行數(shù)據(jù)同步的胖烛。在主從復制過程中眼姐,會基于 3 個線程 來操
作诅迷,一個主庫線程,兩個從庫線程众旗。
二進制日志轉儲線程 (Binlog dump thread)是一個主庫線程竟贯。當從庫線程連接的時候, 主庫可以將二進
制日志發(fā)送給從庫逝钥,當主庫讀取事件(Event)的時候屑那,會在 Binlog 上 加鎖 ,讀取完成之后艘款,再將鎖釋
放掉持际。
從庫 I/O 線程 會連接到主庫,向主庫發(fā)送請求更新 Binlog哗咆。這時從庫的 I/O 線程就可以讀取到主庫的
二進制日志轉儲線程發(fā)送的 Binlog 更新部分蜘欲,并且拷貝到本地的中繼日志 (Relay log)。
從庫 SQL 線程 會讀取從庫中的中繼日志晌柬,并且執(zhí)行日志中的事件姥份,將從庫中的數(shù)據(jù)與主庫保持同步。
復制三步驟:
步驟1: Master 將寫操作記錄到二進制日志( binlog )年碘。
步驟2: Slave 將 Master 的binary log events拷貝到它的中繼日志( relay log )澈歉;
步驟3: Slave 重做中繼日志中的事件,將改變應用到自己的數(shù)據(jù)庫中屿衅。 MySQL復制是異步的且串行化
的埃难,而且重啟后從 接入點 開始復制。
復制的問題
復制的最大問題: 延時
復制的基本原則
- 每個 Slave 只有一個 Master
- 每個 Slave 只能有一個唯一的服務器ID
- 每個 Master 可以有多個 Slave
3. 一主一從架構搭建
一臺 主機 用于處理所有 寫請求 涤久,一臺 從機 負責所有 讀請求 涡尘,架構圖如下:
3.1 準備工作
1、準備 2臺 CentOS 虛擬機
2响迂、每臺虛擬機上需要安裝好MySQL (可以是MySQL8.0 )
3.2 主機配置文件
建議mysql版本一致且后臺以服務運行考抄,主從所有配置項都配置在 [mysqld] 節(jié)點下,且都是小寫字母蔗彤。
mysql配置文件地址:/etc/my.cnf川梅,都是在[mysqld]模塊下
具體參數(shù)配置如下:
#【必選】主服務器唯一ID
server-id=1
#【必選】啟用二進制日志,指明路徑幕与。比如:自己本地的路徑/log/mysqlbin
log-bin=atguigu-bin
#【可選】0(默認)表示讀寫(主機)挑势,1表示只讀(從機)
read-only=0
#【可選】設置日志文件保留的時長,單位是秒
binlog_expire_logs_seconds=6000
#【可選】控制單個二進制日志大小啦鸣。此參數(shù)的最大和默認值是1GB
max_binlog_size=200M
#【可選】設置不要復制的數(shù)據(jù)庫
#binlog-ignore-db=test
#【可選】設置需要復制的數(shù)據(jù)庫潮饱,默認全部記錄。比如binlog-do-db=atguigu_master_slave
#binlog-do-db=atguigu_master_slave
#【可選】設置binlog格式
binlog_format=STATEMENT
3.3 從機配置文件
要求主從所有配置項都配置在 my.cnf 的 [mysqld] 欄位下诫给,且都是小寫字母香拉。
#【必選】從服務器唯一ID
server-id=2
#【可選】啟用中繼日志
relay-log=mysql-delay
重啟后臺mysql服務啦扬,使配置生效。
3.4 主機:建立賬戶并授權
在主機MySQL里執(zhí)行授權主從復制的命令
CREATE USER 'slave1'@'%' IDENTIFIED BY 'weizehong1987';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
#此語句必須執(zhí)行凫碌。否則見下面扑毡。
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password By 'weizehong1987';
flush privileges;
查詢Master的狀態(tài),并記錄下File和Position的值盛险。
注意:執(zhí)行完此步驟后不要再操作主服務器MySQL瞄摊,防止主服務器狀態(tài)值變化。
3.5 從機:配置需要復制的主機
步驟1:從機上復制主機的命令
CHANGE MASTER TO
MASTER_HOST='主機的IP地址',
MASTER_USER='主機用戶名',
MASTER_PASSWORD='主機用戶名的密碼',
MASTER_LOG_FILE='mysql-bin.具體數(shù)字',
MASTER_LOG_POS=具體值;
舉例:
CHANGE MASTER TO MASTER_HOST='192.168.140.130',MASTER_USER='slave1',MASTER_PASSWORD='weizehong1987',MASTER_LOG_FILE='atguigu-bin.000003',MASTER_LOG_POS=1135;
步驟2:
#啟動slave同步
START SLAVE;
接著苦掘,查看同步狀態(tài):
SHOW SLAVE STATUS\G;
3.6 測試
主機新建庫换帜、新建表、insert記錄鹤啡,從機復制:
CREATE DATABASE atguigu_master_slave;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'zhang3');
INSERT INTO mytbl VALUES(2,@@hostname);
3.7 停止主從同步
- 停止主從同步命令:
stop slave;
-
如何重新配置主從
如果停止從服務器復制功能惯驼,再使用需要重新配置主從。否則會報錯如下:
image.png
重新配置主從递瑰,需要在從機上執(zhí)行:
stop slave;
reset master; #刪除Master中所有的binglog文件祟牲,并將日志索引文件清空,重新開始所有新的日志文件(慎用)