前言
系列文章:
1.MySQL主從復制
2.OneProxy實現(xiàn)MySQL讀寫分離
配置MySQL主從復制龟虎,先來講講一些理論锋勺。
MySQL復制功能提供分擔讀負載变丧。
基于二進制日志的復制是異步的芽狗,那么復制有什么好處?
1.實現(xiàn)在不同服務器上的數(shù)據(jù)分布痒蓬,利用二進制日志增量進行童擎,不需要太多帶寬,但是使用基于行的復制在進行大批量的更改時攻晒,會對帶寬帶來一定的壓力顾复。特別是跨IDC環(huán)境下進行復制,應該分批進行鲁捏。
2.實現(xiàn)數(shù)據(jù)讀取的負載均衡芯砸。可以通過DNS輪詢的方式把程序的讀連接分配到不同的備份數(shù)據(jù)庫中。還有可以通過LVS+Keepalived等等乙嘀。
3.增強了數(shù)據(jù)安全性末购,利用備庫的備份來減少主庫負載,還可以避免單點故障虎谢。值得注意的是,復制并不能替代備份。
4.實現(xiàn)數(shù)據(jù)庫在線升級。
說到日志链嘀,MySQL的服務層日志有二進制日志敢辩,慢查詢?nèi)罩荆ㄓ萌罩咎诮觥6鎯σ娴娜罩居衖nnodb的重做日志(Redo log),回滾日志(Undo log)。
Redo Log:可以實現(xiàn)事務的持久性章蚣。用于記錄某數(shù)據(jù)塊被修改后的值,可以用來恢復未寫入data file的已成功事務更新的數(shù)據(jù)姨夹。通常會初始化2個或更多的 ib_logfile 存儲 redo log纤垂,由參數(shù) innodb_log_files_in_group 確定個數(shù),命名從 ib_logfile0 開始磷账,依次寫滿 ib_logfile 并順序重用峭沦。如果最后1個 ib_logfile 被寫滿,而第一個ib_logfile 中所有記錄的事務對數(shù)據(jù)的變更已經(jīng)被持久化到磁盤中逃糟,將清空并重用之吼鱼。
Undo Log:未提交的事務,獨立于表空間绰咽,需要隨機訪問菇肃,可以存儲在高性能IO設備中。存放于ibdata中取募。
Undo日志記錄某數(shù)據(jù)被修改前的值琐谤,可以用來在事務失敗時進行rollback;Redo日志記錄某數(shù)據(jù)塊被修改后的值矛辕,可以用來恢復未寫入data file的已成功事務更新的數(shù)據(jù)笑跛。
那么二進制日志是什么?
二進制日志記錄了所有對MySQL數(shù)據(jù)庫的修改事件聊品,包括了增刪查改事件和對表結(jié)構(gòu)進行修改的事件飞蹂。
二進制日志格式,可以設置基于段的格式翻屈,比如binlog_format=statement
陈哑。
基于段的格式,優(yōu)點是:日志記錄相對較小,節(jié)約磁盤網(wǎng)絡IO惊窖。缺點是:必須要記錄上下文信息刽宪,保證語句在slave上執(zhí)行的結(jié)果和master上相同。
而基于段的格式binlog_format=row
適用于只對一條記錄修改或者插入界酒,此時所產(chǎn)生的日志量小于段產(chǎn)生的日志量圣拄。
環(huán)境配置如下:
1.master(192.168.10.21) MySQL 5.7.17
2.slave(192.168.10.6) MySQL 5.7.17
給master創(chuàng)建sync用戶并分配所需權限。
grant all privileges on *.* to sync@'%' identified by 'sync' \g
給slave創(chuàng)建sync用戶并分配所需權限毁欣。
grant all privileges on *.* to sync@'%' identified by 'sync' \g
修改master的配置文件
修改slave的配置文件
在master查看binlog
SHOW BINARY LOGS
FLUSH BINARY LOGS #刷新binlog
SHOW BINARY LOGS
在slave查看binlog
SHOW BINARY LOGS
我們在配置slave的時候庇谆,不要對master進行操作。每次在master進行CRUD和對表結(jié)構(gòu)進行修改時凭疮,binlog會發(fā)生變化饭耳。
在slave中,配置master相關的信息执解。
mysql> change master to
-> master_host="192.168.10.21",
-> master_user="sync",
-> master_password="sync",
-> master_log_file="mysql-bin.000002",
-> master_log_pos=154\g
Query OK, 0 rows affected, 2 warnings (0.02 sec)
啟動slave寞肖。
查看slave運行狀態(tài),Slave_IO_Running和Slave_SQL_Running都為yes的話衰腌,說明slave運行沒問題新蟆。
SHOW SLAVE STATUS
在master創(chuàng)建測試庫rap_test,我們發(fā)現(xiàn)binlog也發(fā)生了變化桶唐。
我們查看master的狀態(tài)
SHOW MASTER STATUS
我們再來查看slave的狀態(tài)栅葡,發(fā)現(xiàn)slave已經(jīng)復制成功了。
The position, ON THE MASTER, from which the I/O thread is reading: Master_Log_File/Read_Master_Log_Pos. —–相對于主庫,從庫讀取主庫的二進制日志的位置,是IO線程
The position, IN THE RELAY LOGS, at which the SQL thread is executing: Relay_Log_File/Relay_Log_Pos —-相對于從庫,是從庫的sql線程執(zhí)行到的位置
The position, ON THE MASTER, at which the SQL thread is executing: Relay_Master_Log_File/Exec_Master_Log_Pos —-相對于主庫,是從庫的sql線程執(zhí)行到的位置
更多返回參數(shù)說明可以參考show slave status 參數(shù)詳解
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.21
Master_User: sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1119
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 541
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1119
Relay_Log_Space: 752
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 21
Master_UUID: 67ccaaf1-e4b4-11e7-a07f-c8d3ffc0c026
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
我們在slave中也看到了rap_test庫尤泽,說明從庫復制成功欣簇。
打開slave中的localhost-relay-bin.000002文件,可以看到sql線程執(zhí)行了create database rap_test語句坯约。
另外我們可以通過show slave status命令返回的Seconds_Behind_Master參數(shù)查看主從延遲狀態(tài)熊咽。
尾言
大家好,我是cmazxiaoma(寓意是沉夢昂志的小馬)闹丐,感謝各位閱讀本文章横殴。
小弟不才。
如果您對這篇文章有什么意見或者錯誤需要改進的地方,歡迎與我討論卿拴。
如果您覺得還不錯的話,希望你們可以點個贊衫仑。
希望我的文章對你能有所幫助。
有什么意見堕花、見解或疑惑文狱,歡迎留言討論。
最后送上:心之所向缘挽,素履以往瞄崇。生如逆旅呻粹,一葦以航。