1. 程式人生 > >第十六章 Mysql主從同步

第十六章 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(自定義,但要唯一

,我們根據IP來設定)

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