mysql主從同步使得數據可以從一個數據庫服務器復制到其他服務器上,在復制數據時,一個服務器充當主服務器(master),其余的服務器充當從服務器(slave),備服務器從主服務器同步數據,完成數據的備份。
【異步同步】
前提:2台服務器,主 192.168.1.101 備 192.168.1.102
1.首先主 備 服務的mysql配置的server的id必須不同,server_id是為了標識binlog,防止同步死循環。
#服務器ID,同個集群必須不同 server_id=1 #端口 port=63751 skip-name-resolve #binlog 過期時間,超過3天未修改的清除 expire_logs_days = 3 #binlog 的名稱 log-bin=mysql-bin.log #同步的庫排除mysql binlog-ignore-db=mysql #同步的庫排除mysql replicate-ignore-db=mysql slave-skip-errors=all #id 的自增量 auto_increment_increment=2 #id 的開始 auto_increment_offset=1 #最大連接數 max_connections=1000 #編碼 collation-server=utf8_unicode_ci init-connect='SET NAMES utf8;' character-set-server=utf8
2.重啟mysql
3.創建主備同步的賬戶和權限

5.則配置同步信息。
change master to master_host='192.168.1.102',master_port=3306,master_user='replication',master_password='test',master_log_file='binlog.000002',master_log_pos=565; //主服務器上執行
change master to master_host='192.168.1.101',master_port=3306,master_user='replication',master_password='test',master_log_file='binlog.000002',master_log_pos=565;//備服務器上執行
6.打開同步 start slave
7.查看slave的狀態show slave status \G看到如下,說明成功
【半同步機制】
1.進入mysql執行如下:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
同時配置文件增加如下配置,重啟mysql即可。
#半同步,10s超時 rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000 rpl_semi_sync_slave_enabled=1
總結:半同步復制個人感覺是維持數據完整性,安全性的的一個策略,雖會損失一點性能,還是值得的。配置很簡單,關鍵是理解其工作機制。
三個問題:
1.為什么server_id是必須的,而且配置主從同步的server_id不允許重復。
答:mysql寫入到binlog時候會攜帶上server_id,所以在主從同步時候,通過server_id 防止死循環。
假設 server_id的1001 為A,server_id 的 1002 為B,在A機器寫入數據的時候binlog帶上 1001 信息,通過binlog同步到B機器上,B機器上的binlog會記錄的會攜帶上1001的信息,這時候如果是雙主形式的互備,A同步B的時候通過server_id會忽略該數據,防止死循環。
2.異步機制是什么與半同步機制有何差異。
答:簡單來講
a.異步機制任務執行到1即結束事務。
b.半同步機制是執行到3結束事務,如果在2或者3超時時候,會采用半同步機制。
綜述,半同步機制更能保障數據的一致性問題,而異步機制的性能更優。
3.雙主同步如果字段key是自增長的如何保證不沖突?
答:如果雙主互備的情況下,通過auto_increment_increment,即id的自增為2,然后雙主兩台的id起始值不同,來保障兩台機器的id完全不相同,這樣在互相切換過程中不會導致id沖突而丟失數據。

