mysql的主从复制和半同步复制的配置
主從復制:
其實就是復制的是主服務器的二進制日志,從服務器然后再重新根據日志操作一遍,從而達到和主服務器里的數據一樣,但是時間上會有延遲
mysql主從復制的基本原理
官方文檔:https://dev.mysql.com/doc/refman/5.7/en/replication-implementation-details.html
操作步驟
-
分別在兩臺centos7上安裝好centos7的系統,編譯安裝好MySQL
-
在主服務器啟動二進制日志功能
-
新建并且授權用戶
-
并且將主服務器里的數據導出,在從服務器上導入數據,做好前期2臺服務器之間的數據的一致性工作
grant replication slave on *.* to 'oudi'@'192.168.0.69' identified by 'Sanchuang123#'; mysqldump -uroot -p'Sanchuang123#' --all-databases > /backup/all_db.sql scp /backup/all_db.sql root@'192.168.0.70':/root mysql -uroot -p'Sanchuang123#' </root/all_db.sql -
在從服務器上配置master信息
# 在主服務器上查看信息 show master status; flush logs; show master status; # 在從服務器上配置master信息 CHANGE MASTER TO MASTER_HOST='192.168.0.69' ,MASTER_USER='oudi',MASTER_PASSWORD='Sanchuang123#',MASTER_PORT=3306,MASTER_LOG_FILE='sc-mysql-master-bin.000005',MASTER_LOG_POS=154; #查看slave的狀態root@(none) 15:28 mysql>show slave status\G;
-
關閉主服務器和從服務器的防火墻和selinux
vim /etc/sysconfig/selinux SELINUX = disabled systemctl stop firewalld systemctl disable firewalld
-
開啟slave服務
start slave; show master status;
可能遇到的問題:
解決UUID一樣的問題,服務器如果是克隆過來的mysql中uuid是一樣的,要解決這個問題
mysql [(none)]> show variables like "%uuid%"; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | f359f726-3e50-11e8-8551-000c295ed919 | +---------------+--------------------------------------+ 1 row in set (0.01 sec) # 復制該uuid號 vim /data/mysql/auto.cnf [auto] server-uuid=f359f726-3e50-11e8-8551-000c295ed917 =>修改幾個字符就可以了,和主服務器的不一樣就行 [root@mysql-slave ~]# service mysqld restart Redirecting to /bin/systemctl restart mysqld.service [root@mysql-slave ~]# [root@mysql-slave ~]# mysql -uroot -p'Sanchuang123#' mysql [(none)]> show slave status\G; *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.0.69Master_User: kuigeMaster_Port: 3309Connect_Retry: 60Master_Log_File: mysql-master-bin.000001Read_Master_Log_Pos: 600Relay_Log_File: mysql-slave-relay-bin.000003Relay_Log_Pos: 827Relay_Master_Log_File: mysql-master-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes? 2.
1)防火墻和selinux沒有關
? 2)在從服務器上輸入下面的命令
CHANGE MASTER TO MASTER_HOST=‘192.168.0.69’ ,
MASTER_USER=‘oudi’,
MASTER_PASSWORD=‘Sanchuang123#’,
MASTER_PORT=3306,
MASTER_LOG_FILE=‘sc-mysql-master-bin.000005’,
MASTER_LOG_POS=154;
注意授權的用戶密碼是否正確,同時二進制日志文件是否正確
mysql的三種復制方式
半同步復制
介于異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后,不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到relay log中才返回給客戶端
優點:
? 相對于異步復制,半同步復制提高了數據的安全性
缺點:
? 造成了一定的程度的延遲,這個延遲最少是一個TCP/IP往返的時間,所有,半同步復制最好在低延時的網絡中使用。
配置半同步復制的步驟:
-
在主服務器上,下載插件,并且啟動半同步
root@localhost [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.00 sec) 然后查看安裝的情況 root@(none) 15:44 mysql>show plugins; | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | #打開半同步復制 root@(none) 15:45 mysql>set global rpl_semi_sync_master_enabled=1; Query OK, 0 rows affected (0.00 sec) 啟用半同步 root@(none) 15:46 mysql>show global variables like '%rpl_semi%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | +-------------------------------------------+------------+ 6 rows in set (0.01 sec)
-
在從服務器上執行安裝插件,打開半同步復制
root@localhost [(none)]>install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.01 sec)從庫上啟用半同步功能 root@(none) 15:59 mysql>set global rpl_semi_sync_slave_enabled=1; Query OK, 0 rows affected (0.00 sec)root@(none) 16:00 mysql>show global variables like '%rpl_semi%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ 2 rows in set (0.01 sec) -
半同步測試
從庫停止復制以后在主庫建表測試
slave端:
stop slavemaster端:
use sc; root@sc 16:41 mysql>create table t6(id int); Query OK, 0 rows affected (10.09 sec) 所花費的時間超過10秒root@xiongda 16:42 mysql> root@xiongda 16:42 mysql>show status like 'Rpl_semi_sync_master_status'; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | Rpl_semi_sync_master_status | OFF | 半同步關閉 +-----------------------------+-------+ 1 row in set (0.00 sec) 在從服務器那邊啟用start slave ; root@sc 16:42 mysql>start slave; Query OK, 0 rows affected (0.01 sec)root@sc 16:44 mysql> root@sc 16:44 mysql>show tables; 查看同步情況 +-------------------+ | Tables_in_sc | +-------------------+ | t1 | | t2 | | t6 | 在主服務器上查看狀態 root@sc 16:43 mysql>show status like 'Rpl_semi_sync_master_status'; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | Rpl_semi_sync_master_status | ON | +-----------------------------+-------+ 1 row in set (0.01 sec)
同步復制:
指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。
由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點(N/2 +1)決議并通過,才能得以提交。如上圖所示,由三個節點組成一個復制組,Consensus層為一致性協議層,在事務提交過程中,發送組問通訊,由2個節點決議通過這個事務,事務才能夠最終得以提交并響應。
組復制是為了解決傳統異步復制和半同步復制可能產生數據不一致的問題。
異步復制
mysql默認的復制即是異步的,主庫在執行客戶端提交的事務后悔立即將結果返回給客戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能并沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。
總結
以上是生活随笔為你收集整理的mysql的主从复制和半同步复制的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何做一个基于python校园失物招领系
- 下一篇: linux cmake编译源码,linu