主從復制原理:
1 復制架構圖

2 初始化圖

3 復制原理
mysql使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上)。當發出start slave時,從服務器創建一個I/O線程,以連接主服務器并讓它發送記錄在其二進制日志中的語句。主服務器創建一個線程將二進制日志中的內容發送到從服務器。該線程可以即為主服務器上show processlist輸出中的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容并將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日志。第3個線程是sql線程,由從服務器創建,用于讀取中繼日志并執行日志中包含的更新。在從服務器上,讀取和執行更新語句被分成兩個獨立的任務。當從服務器啟動時,其I/O線程可以很快地從主服務器索取所有二進制日志內容。
1、主從服務器分別作以下操作:
? 1.1、版本一致。(mysql-5.5.27)
? 1.2、初始化表,并在后臺啟動mysql
? 1.3、修改root的密碼
? 1.4、主服務器master:192.168.142.131
? 1.4、從服務器slave:192.168.142.133
2、修改主服務器master:
~~~
? ?#vi /etc/my.cnf
? ? ? ?[mysqld]
? ? ? ?#
? ? ? ?log-bin=mysql-bin ? #[必須]啟用二進制日志
? ? ? ?server-id=131 ? ? ?#[必須]服務器唯一ID,默認是1,一般取IP最后一段
? ? ? ?#binlog-do-db ? ? ? ? =test ? #需要備份數據,多個寫多行
? ? ? ?#binlog-ignore-db ? ?=mysql #不需要備份的數據庫,多個寫多行
~~~
3、修改從服務器slave:
~~~
? ?#vi /etc/my.cnf
? ? ? ?[mysqld]
? ? ? ?log-bin=mysql-bin ? #[不是必須]啟用二進制日志
? ? ? ?server-id=133 ? ? ?#[必須]服務器唯一ID,默認是1,一般取IP最后一段
? ? ? ?#master-connect-retry=60 #如果從服務器發現主服務器斷掉,重新連接的時間差(秒)
? ? ? ?#replicate-do-db =test #只復制某個庫
? ? ? ?#replicate-ignore-db=mysql #不復制某個庫
~~~
4、重啟兩臺服務器的mysql
? ?service mysqld restart
5、在主服務器上建立帳戶并授權slave:
~~~
? ?# mysql -uroot -p123456 ??
? ?mysql>GRANT REPLICATION SLAVE ON *.* to 'clevercode'@'%' identified by 'q123456'; //一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全。
~~~
6、登錄主服務器的mysql,查詢master的狀態
? ? mysql> show master status;
? ? +------------------+----------+--------------+------------------+
? ? | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
? ? +------------------+----------+--------------+------------------+
? ? | mysql-bin.000011 | ? ? ?248 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
? ? +------------------+----------+--------------+------------------+
? ? 1 row in set (0.00 sec)
? ?注:執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化
7、配置從服務器Slave:
~~~
? ?mysql>stop slave;
? ?mysql>change master to master_host='192.168.142.131',master_user='clevercode',master_password='q123456',
? ? ? ? ?master_log_file='mysql-bin.000011',master_log_pos=248; ? //注意不要斷開,248數字前后無單引號。
? ?Mysql>start slave; ? ?//啟動從服務器復制功能,如果slave是啟動狀態,需要先stop slave;
~~~
8、檢查從服務器復制功能狀態:
~~~
mysql> show slave status\G;
*************************** 1. row ***************************
? ? ? ? ? ? ? ?Slave_IO_State: Waiting for master to send event
? ? ? ? ? ? ? ? ? Master_Host: 192.168.142.131 //主服務器地址
? ? ? ? ? ? ? ? ? Master_User: clevercode //授權帳戶名,盡量避免使用root
? ? ? ? ? ? ? ? ? Master_Port: 3306 //數據庫端口,部分版本沒有此行
? ? ? ? ? ? ? ? Connect_Retry: 60
? ? ? ? ? ? ? Master_Log_File: mysql-bin.000012
? ? ? ? ? Read_Master_Log_Pos: 107 //#同步讀取二進制日志的位置,大于等于Exec_Master_Log_Pos
? ? ? ? ? ? ? ?Relay_Log_File: centos64idx4-relay-bin.000002
? ? ? ? ? ? ? ? Relay_Log_Pos: 253
? ? ? ? Relay_Master_Log_File: mysql-bin.000012
? ? ? ? ? ? ?Slave_IO_Running: Yes ?//此狀態必須YES
? ? ? ? ? ? Slave_SQL_Running: Yes //此狀態必須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: 107
? ? ? ? ? ? ? Relay_Log_Space: 416
? ? ? ? ? ? ? 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: 131
1 row in set (0.00 sec)
~~~
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。
9、主從服務器測試:
1、主服務器Mysql,建立數據庫,并在這個庫中建表插入一條數據:
~~~
mysql> create database db_clevercode;
Query OK, 1 row affected (1.77 sec)
mysql> use db_clevercode;
Database changed
mysql> create table tb_test(id int(3),name char(10)); ? ??
Query OK, 0 rows affected (14.17 sec)
mysql> insert into tb_test values(1,'clevercode');
Query OK, 1 row affected (1.60 sec)
~~~
2、從服務器Mysql查詢:
mysql> show databases; ? ??
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| db_clevercode ? ? ?|
| mysql ? ? ? ? ? ? ?|
| performance_schema |
| test ? ? ? ? ? ? ? |
+--------------------+
5 rows in set (0.00 sec)
mysql> use db_clevercode;
Database changed
mysql> select * from tb_test;
+------+------------+
| id ? | name ? ? ? |
+------+------------+
| ? ?1 | clevercode |
+------+------------+
1 row in set (0.01 sec)
10、主從同步延時:
? ??
通過監控show slave status\G命令輸出的Seconds_Behind_Master參數的值來判斷,是否有發生主從延時。其值有這么幾種:
NULL — 表示io_thread或是sql_thread有任何一個發生故障,也就是該線程的Running狀態是No,而非Yes。
0 — 該值為零,是我們極為渴望看到的情況,表示主從復制良好,可以認為lag不存在。
正值 — 表示主從已經出現延時,數字越大表示從庫落后主庫越多。