不管是在一個web站點仍是其餘須要數據庫的業務系統中,數據庫的重要性是毋庸置疑的。可是關係型數據庫收到自身設計的限制,自己的性能可能會成爲拉低整個平臺的瓶頸。並且數據庫做爲系統重要的一環,必須避免數據庫的單點故障。由此mysql數據庫的集羣就顯得相當重要。mysql
mysql複製集羣整體能夠分爲以下幾類:web
mysql複製集羣是基於以下原理進行的:
主服務器全部的操做都寫入二進制日誌,從服務器開啓中繼日誌和兩個線程:sql
server_id=1 log_bin=master-log
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repladmin'@'192.168.11.%' identified by '1234567a';
server_id=11 relay_log=slave-log read_only=ON #從服務器只容許讀操做,不容許寫操做
CHANGE MASTER TO MASTER_HOST='192.168.11.193',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499; #MASTER_LOG_FILE指的是主服務器的二進制日誌,MASTER_LOG_POS指的是從哪裏開始進行同步,能夠在服務器經過**show master status**進行查看
start slave; show slave status;
狀態信息以下:
Slave_IO_State: Waiting for master to send event #當前複製狀態# Master_Host: 192.168.11.193 #主服務器ip# Master_User: repladmin #進行復制的用戶# Master_Port: 3306 #鏈接的端口# Connect_Retry: 60 #鏈接超時等待多久從新鏈接# Master_Log_File: master-log.000003 #開始同步的二進制日誌文件# Read_Master_Log_Pos: 8523 #從二進制文件哪裏開始同步# Relay_Log_File: slave-log.000005 #執行sql語句replay的二進制文件# Relay_Log_Pos: 961 #從哪裏開始執行# Relay_Master_Log_File: master-log.000003 Slave_IO_Running: Yes #io_thread是否運行# Slave_SQL_Running: Yes #sql_thread是否運行# Replicate_Do_DB: hellodb #這是指定複製過濾器以後的樣子,表示金複製hellodb庫# Replicate_Ignore_DB: Replicate_Do_Table: hellodb.students #表示只複製students表# Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 #複製過程是否有錯誤# Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 8523 Relay_Log_Space: 1534 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 #是否啓用ssl認證# 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 #從服務器是否落後於主服務器,爲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: 1
數據庫
此時在主服務器建立新的庫或者表,從服務器便可同步。(此處由於開啓了複製過濾器,因此只能複製指定的庫和表)服務器
雙主配置原理爲:主服務器和從服務器同時開啓二進制日誌和中繼日誌,數據能夠寫入任何一個服務器,而後均可以同步到另外一臺服務器,這樣兩個庫就均可以提供讀寫工做了。網絡
server_id=1 log_bin=master-log relay_log=slave-log
CHANGE MASTER TO MASTER_HOST='主服務器-2ip地址',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499; CHANGE MASTER TO MASTER_HOST='主服務器-1ip地址',MASTER_USER='repladmin',MASTER_PASSWORD='1234567a',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=499;
start slave;
複製集羣默認採用的都是異步方式,即數據寫入主服務器則直接返回數據寫入成功,而不會等待從服務器寫入成功,此種方法能夠提升性能,不過可能會致使數據不一致問題。半同步表示讓一臺服務器和主服務器採用同步寫入方式,數據寫入到從服務器才返回數據寫入成功,這樣會損失必定性能,不過當主服務器宕機以後這才從服務器能夠馬上接管主服務器,他們的數據都是一致的。
半同步複製集羣須要依賴於半同步模塊,此模塊默認並無加載,須要手動加載到mysql中,模塊以下:semisync_master.so、semisync_slave.so。異步
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; show plugins; #查看mysql加載的全部模塊,能夠看此模塊是否已經加載
SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; SET GLOBAL rpl_semi_sync_master_enabled=ON;
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled=ON; START SLAVE;
show global status like 'rpl_semi%'; #參數以下,只列出部分: Rpl_semi_sync_master_clients #鏈接到主服務器的客戶端數# Rpl_semi_sync_master_net_avg_wait_time #平均網絡等待時間# Rpl_semi_sync_master_net_wait_time #網絡總等待時間# Rpl_semi_sync_master_net_waits #網絡等待次數# Rpl_semi_sync_master_no_times Rpl_semi_sync_master_no_tx Rpl_semi_sync_master_status ……
複製過濾器表示能夠指定只複製指定的表或者只複製指定的庫,其餘的表和庫都不進行復制,兩種方法能夠實現:ide
SET GLOBAL replicate_do_db=庫名 #指定只複製指定的庫# SET GLOBAL Replicate_Ignore_DB=庫名 #指定不復制指定的庫# SET GLOBAL Replicate_Do_Table=表名 #指定只複製指定表# SET GLOBAL Replicate_Ignore_Table=表名 #指定不復制指定表#
當指定了複製過濾器後,經過SHOW SLAVE STATUS;命令能夠查看到指定的庫和表。性能
建議此配置寫入配置文件永久生效。線程
mysql的複製集羣能夠經過以上方法實現,可是此時還缺乏一個組件對外提供數據服務接口,此組件通常稱爲讀寫分離器或語句路由器,並且主服務器宕機以後須要自動提高從服務器爲主服務器,這也須要mysql的MHA來進行。以上兩個組件下一篇博客再討論。