默認狀況下,MySQL的複製功能是異步的,異步複製能夠提 供最佳的性能,主庫把binlog日誌發送給從庫即結束,並不驗 證從庫是否接收完畢。這意味着當主服務器或從服務器端發生 故障時,有可能從服務器沒有接收到主服務器發送過來的 binlog日誌,這就會形成主服務器和從服務器的數據不一致, 甚至在恢復時形成數據的丟失。
而半同步架構就是什麼工做機制呢?當用戶寫數據時master服務器會立刻把數據複製到一臺slave服務器上,纔會提示用戶寫入成功。然後再慢慢把數據複製到其餘的slave服務器上,這樣的好處就是能夠提升數據安全性,和容錯性mysql
實現方法:sql
vim /etc/my.cnf 在[mysql]配置塊下添加以下兩行配置 [mysql] log_bin #開啓二進制日誌功能 server_id=1 #爲當前節點設置一個全局唯一的ID號 innodb_file_per_table #數據於表結構分離,存放在兩個不一樣文件
systemctl restart mairadb
登入mysql終端執行 GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass'; 命令解析: 'repluser'@'HOST' :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.% IDENTIFIED BY:設置密碼 *.* :表示全部數據庫,全部表 GRANT REPLCATION SLAVE:就是容許該用戶複製數據 該命令做用就是受權repluser能拷貝數據庫的全部內容
登入mysql終端執行 1,安裝插件 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 2,加載插件 SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1; 3,查看狀態 SHOW GLOBAL VARIABLES LIKE '%semi%'; rpl_semi_sync_master_enabled ON #NO表示開啓半同步功能,OFF表示關閉 rpl_semi_sync_master_timeout 10000 #超時時間微秒爲單位 rpl_semi_sync_master_trace_level 32 rpl_semi_sync_master_wait_no_slave ON
vim /etc/my.cnf 在[mysql]配置塊中添加以下兩行配置 [mysqld] server_id=3 #爲當前節點設置一個全局唯一的ID號 read_only=ON #限制從服務器爲只讀."注意:此限制對擁有SUPER權限的用戶均無效" innodb_file_per_table #數據於表結構分離,存放在兩個不一樣文件
systemctl restart mariadb
1,安裝插件 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 2,加載插件 SET GLOBAL rpl_semi_sync_slave_enabled=1; 3,查看狀態 SHOW GLOBAL VARIABLES LIKE '%semi%'; rpl_semi_sync_slave_enabled ON rpl_semi_sync_slave_trace_level 32
CHANGE MASTER TO MASTER_HOST='master_host', #指定中繼master主機IP MASTER_USER='repluser', #指定master被受權的用戶名 MASTER_PASSWORD='replpass',#指定被master受權的用戶密碼 MASTER_LOG_FILE='mysql-bin.xxxxx', #指定master服務器的哪一個二進制日誌開始複製 MASTER_LOG_POS=#; #二進制日誌位置,能夠在master服務器上執行該命令查看,show master logs; 啓動複製線程IO_THREAD和SQL_THREAD START SLAVE;
MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.68.17 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000001 Read_Master_Log_Pos: 557 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 843 Relay_Master_Log_File: mariadb-bin.000001 Slave_IO_Running: Yes "重點關注若是是NO表示線程沒起來" Slave_SQL_Running: Yes "重點關注 若是是NO表示該線程沒起來" 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: 557 Relay_Log_Space: 1139 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 "該項表示同步時間 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
半同步與主從架構基本類似就是就差在一個插件上數據庫