第十六章 Mysql主從同步
一、 MySQL主從介紹
二、 準備工作
三、 配置主
四、 配置從
五、 測試主從同步
六、 擴充套件
一、 MySQL主從介紹
MySQL主從又叫做Replication、AB複製。簡單講就是A和B兩臺機器做主從後,在A上寫資料,另外一臺B也會跟著寫資料,兩者資料實時同步的。
MySQL主從是基於binlog的,主上須開啟binlog才能進行主從。
binlog就是記錄的MySQL的寫入操作,主要就是建立,插入,修改,刪除等等操作 ;binlog檔案是一個二進位制檔案,無法直接cat檢視。
主從過程大致有3個步驟
1)主將更改操作記錄到binlog裡
2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裡,relaylog又稱為中繼日誌
3)從根據relaylog裡面的sql語句按順序執行
主上有一個log dump執行緒,用來和從的I/O執行緒傳遞binlog
從上有兩個執行緒,其中I/O執行緒用來同步主的binlog並生成relaylog,另外一個SQL執行緒用來把relaylog裡面的sql語句落地.
主從複製原理圖:
二、 準備工作
實現MySQL主從複製需要進行的配置:
需要準備兩臺虛擬機器,分別都裝上MySQL並且能正常執行 注意:克隆的虛擬機器需要將網絡卡配置檔案中的UUID刪除掉,否則會有衝突。
此次實驗的環境是兩臺CentOS7.3系統的虛擬機器
主伺服器:
是之前做LNMP實驗時的系統,裡面已經裝好了MySQL,並且MySQL也有幾個庫了
主機名:Linux01
IP:192.168.239.128
MySQL版本:5.6.39
從伺服器 :
克隆的主伺服器,CentOS7.3系統
主機名:mysql-slave
IP:192.168.239.138
MySQL版本:5.6.39
三、 配置主
1. 編輯/etc/my.cnf配置檔案
在/etc/my.cnf檔案內容中【mysqld】下新增下面兩行配置:
server-id=128(自定義,但要唯一
log_bin=wenyang01(bin_log的字首)
[[email protected] mysql]# pwd
/data/mysql
[[email protected] mysql]# vim /etc/my.cnf
2. 修改完配置檔案後,啟動或者重啟mysqld服務
[[email protected] mysql]# /etc/init.d/mysqld restart
重啟後檢視 datadir 目錄下的檔案:
[[email protected] mysql]# ls -l /data/mysql
3. 建立測試庫及資料,做實驗用(主從參考物件)
[[email protected] mysql]# mysql -uroot -p12345 -e "create database mysql_test" //建立表
[[email protected] mysql]# mysql -uroot -p123456 //登入資料庫
mysql> use mysql_test; //切換庫
mysql> create table tb1(`id` int(4),`name` char(40)); //建立表
mysql> insert into tb1 values(1,'dong'); //表裡插入資料
mysql> insert into tb1 values(2,'wen');
mysql> insert into tb1 values(3,'yang');
mysql> select * from mysql_test.tb1; //查看錶裡資料資訊
[[email protected] mysql]# mysqldump -uroot -p123456 mysql_test >/tmp/mysql_test.sql //備份新建資料庫
檢視目錄下是不是多了一個數據庫及資料庫大小:(而且我們可以看到,log_bin檔案大小增加了,是因為它記錄了資料庫裡的操作過程)
4. 建立用作主從同步資料帳戶
[[email protected] mysql]# mysql -uroot -p123456
mysql> use mysql_test
mysql> grant replication slave on *.* to 'mysql_testuser'@'192.168.239.138' identified by '123456';
建立使用者,並賦予replication和slave許可權,指定從伺服器IP
5. 鎖表,備份新建資料庫
[[email protected] mysql]# mysql -uroot -p123456
mysql> use mysql_test
mysql> flush tables with read lock; //鎖表,禁止寫入。是為了備份資料庫,同步到從伺服器
[[email protected] mysql]# mysqldump -uroot -p123456 mysql_test >/tmp/mysql_test.sql
6. 檢視主伺服器的狀態
mysql> show master status;
這裡需要記住兩個地方,在從伺服器上會用到 # File: wenyang01.000001 ;Position:2514
四、 配置從
1. 編輯/etc/my.cnf配置檔案
在/etc/my.cnf檔案內容中【mysqld】下新增下面配置:
server-id=138(自定義,但要唯一,要求不和主伺服器的一樣,我們根據IP來設定)
[[email protected] mysql]# pwd
/data/mysql
[[email protected] mysql]# vim /etc/my.cnf
2. 修改完配置檔案後,啟動或者重啟mysqld服務
[[email protected] mysql]# /etc/init.d/mysqld restart
3. 將主上備份的測試資料庫複製到從伺服器上的庫並恢復(這裡可以用scp命令,或者FTP等工具來拷貝檔案)
[[email protected] mysql]# scp 192.168.239.128:/tmp/*.sql /tmp/
4. 在從伺服器資料庫中建立對應的資料庫,恢復資料
mysql> create database mysql_test; //建立對應資料庫
[[email protected] mysql]# mysql -uroot -p123456 mysql_test < /tmp/mysql_test.sql //恢復資料
有資料,說明已經恢復成功了
5. 配置從伺服器引數
[[email protected] mysql]# mysql -uroot -p123456 //進入mysql操作介面
mysql> stop slave; //關閉 slave
mysql> change master to master_host='192.168.239.128', master_user='mysql_testuser', master_password='1234556', master_log_file='wenyang01.000001', master_log_pos=2514; //配置slave引數
引數解釋:
change master to 固定命令
master_host= 定義主伺服器的ip;也可以是 ip:port,預設是3306
master_user= 定義主伺服器上用於同步的使用者
master_password= 定義同步使用者的密碼
master_log_file= 定義主伺服器上 show master status 檢視到的 File
master_log_pos= 定義主伺服器上 show master status 檢視到的 Position,不要加雙引號或單引號
mysql> start slave; //然後開啟 slave
mysql> show slave status\G //檢視從伺服器同步狀態
注:如果Slave_IO_Running為 Connecting
需要檢查主伺服器防火牆是否放行msyql的埠
或者檢視slave引數的ip、user、password等引數是否定義正確
還需關注:
Seconds_Behind_Master: 0 # 為主從延遲的時間
Last_IO_Errno: 0 # IO執行緒錯誤程式碼
Last_IO_Error: # IO執行緒錯誤資訊
Last_SQL_Errno: 0 # SQL執行緒錯誤程式碼
Last_SQL_Error: # SQL執行緒錯誤資訊
6. 解除主伺服器的鎖表狀態了(在主伺服器上執行)
[[email protected] mysql]# mysql -uroot -p123456 -e 'unlock tables'
五、 測試主從同步
1. 先檢視主伺服器和從伺服器的庫是否相同
[[email protected] mysql]# mysql -uroot -p123456 -e 'show databases'
[[email protected] mysql]# mysql -uroot -p123456 -e 'show databases'
2. 在主伺服器上建立一個庫 test001
檢視從伺服器是否自動建立這個庫
主上:
[[email protected] mysql]# mysql -uroot -p123456 -e 'create database test001'
[[email protected] mysql]# mysql -uroot -p123456 -e 'show databases'
從上:
[[email protected] mysql]# mysql -uroot -p123456 -e 'show databases'
3. 在主伺服器上的test001庫裡建立一個test111表,並插入一條資料。檢視是否同步
主上:
[[email protected] mysql]# mysql -uroot -p123456
mysql> use test001
mysql> create table test111(`id` int(4), `name` char(40));
mysql> insert into test111 values(1,'dddd');
mysql> show tables;
mysql> select * from test111;
從上:
[[email protected] mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'
4. 在主伺服器上刪除test001庫裡的test111表。使用truncate,刪除表裡的內容,表結構還在
主上:
mysql> truncate table test111;
mysql> select * from test111;
Empty set (0.00 sec)
mysql> desc test001.test111;
從上:
[[email protected] mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'
5. 在主伺服器上刪除test001庫裡的test111表。使用drop,表不在了
主上:
mysql> drop table test111;
mysql> select * from test111;
ERROR 1146 (42S02): Table 'test001.test111' doesn't exist
mysql> desc test001.test111;
ERROR 1146 (42S02): Table 'test001.test111' doesn't exist
從上:
[[email protected] mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'
Warning: Using a password on the command line interface can be insecure.
ERROR 1146 (42S02) at line 1: Table 'test001.test111' doesn't exist
注意:千萬不要在從伺服器上做任何有關寫入的操作,
在從伺服器做寫入操作會導致主從資料不一致,嚴重的需要重新做主從。(因為在從上做操作,會導致資料不一致,主從斷開;可以嘗試重啟slave測試是否能重新建立主從,不行的話只能重新做主從。重新做主從,只需要在從上關閉slave,change....設定slave引數,開啟slave,就可以了)
幾個引數:
• 主伺服器上
• binlog-do-db= //僅同步指定的庫
• binlog-ignore-db= //忽略指定庫
• 從伺服器上
• replicate_do_db=
• replicate_ignore_db=
• replicate_do_table=
• replicate_ignore_table=
• replicate_wild_do_table= //如wenyang.%, 支援萬用字元%(寫庫名.%,同步庫裡的所有表)
• replicate_wild_ignore_table=
最下面兩個常用,最安全穩定。預設是同步所有庫。
六、 擴充套件
有遇到主從不能正常同步,提示uuid相同的錯誤。這是因為克隆機器導致:
https://www.2cto.com/database/201412/364479.html
不停庫不鎖表線上主從配置:
http://seanlook.com/2015/12/14/mysql-replicas/
主從不同步:
http://www.rfyy.net/archives/2309.html
http://blog.51cto.com/storysky/259280
主主
關於 auto_increment https://blog.csdn.net/leshami/article/details/39779509
http://www.cnblogs.com/ygqygq2/p/6045279.html
mysql-proxy 實現讀寫分離
http://blog.51cto.com/zzclinux/1980487
mysql-proxy類似的產品有:
mycat 基於阿里的開源軟體cobar,官網 www.mycat.io
https://my.oschina.net/ruoli/blog/1789370
mycat實現分庫分表
https://www.cnblogs.com/joylee/p/7513038.html
atlas 出自於360,不維護不更新了 https://blog.csdn.net/AnPHPer/article/details/80566385
mysql環形主從
http://ask.apelearn.com/question/11437
mysql架構演變 http://www.aminglinux.com/bbs/thread-8025-1-1.html
MHA架構
http://blog.51cto.com/xiaoshuaigege/2060768
比較複雜的mysql叢集架構 http://ask.apelearn.com/question/17026