讀寫分離及主從復制
一、主從復制要求:
a) 至少有兩個服務器
b) 分別設置主服務器和從服務器
c) 對主服務器有任何操作都會同步到從服務器上
二、實現原理:
a) MySQL中有一個日誌bin日誌(也叫二進制日誌),此日誌記錄了所有操作數據庫的的sql語句
b) 主從復制原理實際上是多臺服務器都開啟了bin日誌,然後主服務器會把執行過的sql語句記錄到bin日誌中,之後從服務器讀取此bin日誌,把該日誌內容保存到自己日誌中去,從服務器並將記錄的sql語句執行一遍,這樣主服務器與從服務器的數據就同步了。
c) 實現的技術:用戶的授權,log_bin日誌的開啟
d) 問題:如何解決主從同步過程中的延遲問題?
e) 答:在主從同步過程中添加一個緩存服務器,把剛更新的數據暫時保存在緩存服務器中
三、log_bin日誌
a) 如何開啟log_bin日誌:
- 打開my.ini的配置文件
- Linux在my.cnf配置文件進行配置
b) 如何查看log_bin日誌的內容
- 使用一個命令
- Mysqlbinlog -no-defaults 日誌文件名和路徑
a) Log_bin日誌的一些命令操作
- 前提:數據MySQL相關命令
- Flush logs產生一個新的log_bin日誌
- Reset master;清空以前的log_bin日誌,並產生一個新的log_bin日誌
- Show master status;查看最新的log_bin日誌,包括最新的POS位置
b) 使用log_bin日誌完成一個案例,恢復數據的一個案例
- 步驟 新建一張表
- Create table test(id int);
- Flush logs產生一個新的log_bin日誌文件
- Insert into test values(100);
- Insert into test values(200);
- Insert into test values(300);
- Flush logs產生一個新的log_bin日誌
- Delete from test
- 要求恢復數據
- 比如一家公司,在上午十點備份了一次數據,到十點半時,由於員工的誤操作,把所有數據都刪除了,要求回復到十點半
- 思路:打開log_bin日誌,進行分析,查找insert和POS的位置,根據POS的位置來回復數據
- 第一步:查看當前日誌信息
- 第二步:查看操作sql位置
- 第三步:使用一下命令還原
- Mysqlbinlog -no-default 日誌文件 -start-pos=”開始pos點”-stop-pos=”結束pos點” |Mysql -uroot -proot test
三、主從配置
說明:在同步之前,要同步的數據庫在兩個數據庫服務器中必須都存在,兩個數據庫應該一致。開啟主從同步後,主服務器的寫操作都會同步到從服務器中
a) 配置主服務器:
- 主和從服務器都要開啟log_bin日誌,每臺服務器設置一個唯一的server-id的值。並重啟服務器
- 主服務器:47.93.58.95
- 要給從服務器授權一個用戶,該用戶授權復制
- 要查看主服務器裏面log_bin日誌和pos的位置(停止對主服務器的操作,暫時不往裏面做更新操作)
- Show master status
b) 配置從服務器
- 從服務器ip:47.93.58.96
- 執行stop slave停止從服務器
- Stop slave
- 具體的配置
a) Change master to master_host=”主服務器的ip”,master_user=”授權的用戶名”,master_password=”授權的密碼”,master_log_file=’log_bin 日誌文件的名稱’,master_log_pos=”pos位置”;
b)
- 開啟從服務器start slave
a) Start salve
b)
c) 查詢從服務器狀態
- show slave status
- Slave_IO_Running:Yes
- 此進程負責從服務器從主服務器上讀取binlog日誌,並寫入從服務器的中繼日誌
- Slave_SQL_Running:Yes
- 此進程負責讀取並且執行中繼日誌中的binlog日誌
a) 註:以上兩個都為yes則表名成功,只要其中一個進程的狀態是no,則表示復制進程停止,錯誤原因可以從“last_error”字段中的值看到
- 演示結果:
a) 主服務器插入數據,可以在從服務器上同步
b) 主服務器
c)
d) 從服務器
e)
c) 如何撤銷從服務器
- Stop slave
- Reset slave all
- 從服務器
- 主服務器
四、讀寫分離的實現
a) 在層次進行設計
b) Class mysql{
$dbm = 主服務器
$dbs1= 從服務器
$dbs2= 從服務器
Public function query(){
在query裏面進行語句判斷,分析鏈接不同的mysql服務器
如果是查詢則隨機鏈接兩臺從服務器,如果是修改操作,則連接主服務器
}
}
c)
d)
e)
f) Tp框架支持讀寫分離:
- ‘DB_DEPLOY_TYPE’ => 1 //分布式數據庫支持
- ‘DB_TYPE’ => ’mysqli’ ,//數據庫類型
- ‘DB_HOST’ => ’localhost,192.168.3.250’,//服務器地址
- ‘DB_NAME’ => ’php’,//數據庫名
- ‘DB_USER’ => ’root’,//用戶名
- ‘DB_PWD’ => ’root’//密碼
- ‘DB_PORT’ => ’3306’,//端口
- ‘DB_PREFIX’ => ’’,
- ‘DB_RW_SEPARATE’ => true,//支持讀寫分離
g)
五、說明:
a) 以上配置為讀寫分離操作,如果需要做到讀寫分離、主從復制,還必須手動配置開啟主從復制模式
讀寫分離及主從復制