Mysql之replication初探

MySQL的Replication是一種多個MySQL的數據庫做主從同步的方案,特點是異步,廣泛用在各種對MySQL有更高性能,更高可靠性要求的場合。與之對應的另一個技術是同步的MySQL Cluster,但因爲比較複雜,使用者較少。

下圖是MySQL官方給出了使用Replication的場景:
wKiom1RXfpvC6o6ZAAFTXNi6cDU783.jpg


Replication原理
   
Mysql 的 Replication  是一個異步的複製過程,從一個MySQL節點(稱之爲Master)複製到另一個MySQL節點(稱之Slave)。在 Master 與 Slave  之間的實現整個複製過程主要由三個線程來完成,其中兩個線程(SQL 線程和 I/O 線程)在 Slave 端,另外一個線程(I/O 線程)在  Master 端。
   
要實現 MySQL 的 Replication ,首先必須打開 Master 端的 Binary Log,因爲整個複製過程實際上就是 Slave 從 Master 端獲取該日誌然後再在自己身上完全順序的執行日誌中所記錄的各種操作。
   
看上去MySQL的Replication原理非常簡單,總結一下:
    * 每個從僅可以設置一個主。  
    * 主在執行sql之後,記錄二進制log文件(bin-log)。  
    * 從連接主,並從主獲取binlog,存於本地relay-log,並從上次記住的位置起執行sql,一旦遇到錯誤則停止同步。  
    
從這幾條Replication原理來看,可以有這些推論:
    * 主從間的數據庫不是實時同步,就算網絡連接正常,也存在瞬間,主從數據不一致。  
    * 如果主從的網絡斷開,從會在網絡正常後,批量同步。  
    * 如果對從進行修改數據,那麼很可能從在執行主的bin-log時出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,非常小心的修改從上的數據。  
    * 一個衍生的配置是雙主,互爲主從配置,只要雙方的修改不衝突,可以工作良好。  
    * 如果需要多主的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。  




主從設置
1. MySQL主從應用場景

原理是master上數據更新時會記錄一個bin-log,slave會實時同步該bin-log然後slave根據bin-log的sql語句進行相應的操作。
MySQL主從可以實時備份,保證數據高安全性
可以應用在讀寫分離的場景中,用以降低單臺MySQL服務器的I/O
可以實現MySQL服務的HA集羣
可以是1主多從,也可以是相互主從(主主)


2. 安裝、配置MySQL
參考之前步驟搭建MySQL服務


3. 配置主從準備工作

在主上創建測試庫:
建立測試用數據庫|表
#myslq –u root –p
mysql>create database ocean;
mysql>use ocean;
mysql>create table test1(id int,sname char(8));
mysql>insert into test1 values(1,’zhangsang’);



4. 配置主(master)
vim ./my.cnf   #修改或添加:
server-id=1
log-bin=mysql-bin 
兩個可選參數(2選1):
binlog-do-db=ocean        #需要同步的庫【多個庫之間用,分隔】
binlog-ignore-db=ocean    #忽略不同步的庫
修改配置文件後,重啓mysql
pid=`ps uax |grep mysql.sock |grep -v grep |awk '{print $2}'` ; kill $pid; cd /usr/local/mysql_2/bin/; ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
 
Master 授權給Slave
grant replication slave on *.* to 'ocean'@'192.168.9.10' identified by 'ocean';
flush tables with read lock;  #鎖住表,防止數據寫入,slave配置完成後記得解鎖
flush privileges;             #刷新
show master status;           #一定要記住前兩列的內容,一會會用到
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql-bin-log.000028 |      330 | mysql        |                  |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


5. 設置從(slave)
vim my.cnf  #修改或增加
server-id = 2 #這個數值不能和主一樣
可選參數:
replicate-do-db=ocean,ocean2 和 replicate-ignore-db=ocean,ocean2 #意義同主的那兩個可選參數
service mysqld restart
拷貝主的db1庫數據到從:
然後導出主的mysql庫數據然後導入給slave mysql
mysqldump -uroot -p mysql > ocean.sql
在salve 中將數據導入到新創建的數據庫中
mysql -uroot -p -e "create database ocean"; mysql -uroot -p  ocean < ocean.sql


mysql -uroot -p  #登陸Slave的mysql
slave stop;

change master to master_host='192.168.9.9', master_port=3306 ,master_user='ocean',
master_password='ocean', master_log_file='mysql-bin-log.000028', master_log_pos=330;
 
slave start;

Master上: mysql -uroot -p -e "unlock tables"
Slave查看從的狀態:mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.9.9
                  Master_User: ocean
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin-log.000028
          Read_Master_Log_Pos: 330
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 255
        Relay_Master_Log_File: mysql-bin-log.000028
           Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
              Replicate_Do_DB: ocean
          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
                 .....



6. 測試主從
在Master中ocean數據庫中插入一條記錄:
mysql>use ocean;
mysql>insert into test1 values(2,'lisi');
在slave中查看oceanDB是否有新紀錄生成。

建議: MySQL主從機制比較脆弱,謹慎操作。如果重啓master,務必要先把slave停掉,也就是說需要在slave上去執行 slave stop 命令,然後再去重啓master的mysql服務,否則很有可能就會中斷了。當然重啓完後,還需要把slave給開啓 slave start.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章