mysql主從復制、基于gtid的主從復制、并行復制、半同步
標簽: mysql主從復制 數據備份 mysql并行復制 mysql半同步
主從復制用途以及條件
實時災備,用于故障切換
讀寫分離,提供查詢服務
備份,避免影響業務
主從部署的必要條件
主庫開啟binlog日志(設置log-bin參數)
主從server-id不同
從庫服務器能連同主庫
主從復制原理
從庫生成兩個線程,一個i/o線程,一個SQL線程;
i/o線程去請求主庫的binlog,并且得到的binlog日志寫道relay log(中繼日志)文件中,
主庫會生成一個log dump線程,用來給從庫的i/o線程傳binlog;
SQL線程,會讀取中繼日志文件,并解析成具體的操作執行,這樣主從的操作就一致了,而最終的數據也就一直了。
主從復制存在的問題以及解決辦法
主庫宕機之后,數據可能會丟失
從庫只有一個sql Thread,主庫寫壓力大,復制很可能延時
解決方法:
半同步復制解決--解決數據丟失的問題
并行復制--解決從庫復制延時的問題
1. mysql 的 AB主從復制
實驗環境:
rhel6.5.x86_64
master : 172.25.5.2
slave1 : 172.25.5.3
mysql5.1.71
注: mysql 數據庫的版本,兩個數據庫版本要相同,或者 slave 比 master 版本高!
master配置
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin ###啟動二進制日志系統
binlog-do-db=lockey ####二進制需要同步的數據庫名,如果需要同步多個庫,例如要再同步halo庫,再添加一行“binlog-do-db=halo”,以此類推
server-id=1 ####必須為 1 到 232–1 之間的一個正整數值
binlog-ignore-db=mysql ####禁止同步 mysql 數據庫
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
配置完成后重新啟動mysqld服務然后連接到數據庫
創建同步帳戶,并給予權限
mysql> grant replication slave on *.* to ha@'172.25.5.%' identified by 'halo';
Query OK, 0 rows affected (0.00 sec)
mysql> Flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 326 | lockey | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)##記錄 File 和 Position 的值,配置slave時會用到。
slave 配置
vim /etc/my.cnf
只需要在[mysqld]下面添加server-id即可
server-id=2
#從服務器 ID 號,不要和主 ID 相同,如果設置多個從服務器,每個從服務器必
須有一個唯一的 server-id 值,必須與主服務器的以及其它從服務器的不相同。
可以認為 server-id 值類似于 IP 地址:這些 ID 值能唯一識別復制服務器群集
中的每個服務器實例。
配置完成后重新啟動mysqld服務然后連接到數據庫
mysql> show slave status;
Empty set (0.00 sec)
mysql> change master to master_host='172.25.5.2',master_user='ha',master_password='halo',master_log_file='mysql-bin.000002',master_log_pos=326;
Query OK, 0 rows affected (0.05 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.5.2######
Master_User: ha##########
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002###
Read_Master_Log_Pos: 326#####
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000002#####
Slave_IO_Running: Yes##########
Slave_SQL_Running: Yes##########
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: 326#####
Relay_Log_Space: 407
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
注意:slave上要開啟read_only,不然可能會因為不小心的操作導致數據不一致以及主從復制出現問題!!!
測試數據同步
在master上進行數據庫操作
mysql> use lockey;
Database changed
mysql> create table users(username varchar(20) not null,password varchar(20) not null);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users values('lockey','root');
Query OK, 1 row affected (0.00 sec)
mysql> insert into users values('lockey1','root1');
Query OK, 1 row affected (0.00 sec)
在slave上邊驗證
mysql> use lockey;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_lockey |
+------------------+
| users |
+------------------+
1 row in set (0.00 sec)
mysql> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| lockey | root |
| lockey1 | root1 |
+----------+----------+
2 rows in set (0.00 sec)
兩邊數據是一致的,表示主從復制成功!!!
注意:如果開啟主從復制之前兩邊的數據不一致的話需要拷貝二進制日志文件,要確保開啟主從復制之前兩邊數據是一致的
2. Mysql-5.7 基于GTID的主從復制
實驗環境與上例基本一致,只是Mysql的版本換成了5.7,可以從官網下載以下格式的安裝包然后提取文件進行安裝:
mysql-5.7.19-1.el6.x86_64.rpm-bundle.tar
tar -xf mysql-5.7.19-1.el6.x86_64.rpm-bundle.tar
yum install mysql-community-common-5.7.19-1.el6.x86_64.rpm mysql-community-libs-5.7.19-1.el6.x86_64.rpm mysql-community-client-5.7.19-1.el6.x86_64.rpm mysql-community-server-5.7.19-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.19-1.el6.x86_64.rpm -y
如果是在前面的兩臺主機上繼續接著實驗,請先卸載前面安裝的mysql并且刪除數據目錄,再執行上邊的yum install命令,安裝完成之后進行以下配置:
master && slave
前一步的配置不變,接著添加以下內容即可:
vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=1
并且開啟兩臺主機的mysql服務
/etc/init.d/mysqld start
初次啟動一般來說登錄之后是不能進行數據庫操作的,需要首先更改密碼的,根據提示進行操作即可,密碼如果沒有在terminal中顯示出來,可以在日志文件中過濾查找,是一串奇怪的字符,通過初始密碼登錄之后修改密碼如下:
mysql> alter user root@localhost identified by 'Lockey+123';
在master上進行以下操作:
##創建同步帳戶,并給予權限
mysql> grant replication slave on *.* to ha@'172.25.5.%' identified by 'Lockey+123';
Query OK, 0 rows affected (0.00 sec)
mysql> Flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 326 | lockey | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后在slave上進行以下操作:
mysql> change master to master_host='172.25.5.2',master_user='ha',master_password='Lockey+123',master_auto_position=1;
測試:
在master上進行數據庫操作,然后在mysql數據庫中使用以下命令查看結果:
mysql> select * from gtid_executed;
mysql> show master status
然后在slave上的mysql數據庫中使用以下命令查看結果:
mysql> select * from gtid_executed;
重起master之后再次在mysql數據庫中使用以下命令查看結果:
mysql> select * from gtid_executed;
3.MySQL 5.7并行復制
此配置只在slave上進行
在進行以下配置之前首先可以通過一條命令看一下結果(得到的結果條目很少):
mysql> show processlist;
然后配置vim /etc/my.cnf
#添加以下內容(前面的配置繼續保留):
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
master_info_repository解釋
開啟MTS功能后,務必將參數master_info_repostitory設置為TABLE,這樣性能可以有50%~80%的提升。這是因為并行復制開啟后對于元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。在之前InnoSQL的版本中,添加了參數來控制刷新master.info這個文件的頻率,甚至可以不刷新這個文件。因為刷新這個文件是沒有必要的,即根據master-info.log這個文件恢復本身就是不可靠的。在MySQL 5.7中,Inside君推薦將master_info_repository設置為TABLE,來減小這部分的開銷。
slave_parallel_workers解釋
若將slave_parallel_workers設置為0,則MySQL 5.7退化為原單線程復制,但將slave_parallel_workers設置為1,則SQL線程功能轉化為coordinator線程,但是只有1個worker線程進行回放,也是單線程復制。然而,這兩種性能卻又有一些的區別,因為多了一次coordinator線程的轉發,因此slave_parallel_workers=1的性能反而比0還要差
重啟mysql服務,然后再次執行:
mysql> show processlist;
結果增加了16條,就是配置slave-parallel-workers=16的作用,也就是開啟了并行復制的結果。
4. mysql半同步
半同步復制簡介
何為半同步復制模式呢?在此我們先了解異步復制模式,這是MySQL的默認復制選項。異步復制即是master數據庫把binlog日志發送給slave數據庫,然后就沒有了然后了。在此暴露一個問題,當slave服務器發生故障了,那么肯定會導致主從數據庫服務器的數據不一致。
為了解決上面的問題,MySQL5.5引入一種叫做半同步復制模式。開啟這種模式,可以保證slave數據庫接收完master數據庫發送過來的binlog日志并寫入自己的中繼日志中,然后反饋給master數據庫,告知已經復制完畢。
開啟這種模式后,當出現超時,主數據庫將會自動轉為異步復制模式,直到至少有一臺從服務器接受到主數據庫的binlog,并且反饋給主數據庫。這時主數據庫才會切換回半同步復制模式。
mysql> show variables like ‘have_dynamic_loading’;
#確保value為YES
注意:半同步復制模式必須在主服務器和從服務器同時中開啟,否則將會默認為異步復制模式。
半同步復制需要安裝插件,而插件的位置如下:
master上安裝插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)
mysql> set global rpl_semi_sync_master_enabled=ON;
Query OK, 0 rows affected (0.00 sec)
slave上安裝插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)
mysql> set global rpl_semi_sync_slave_enabled=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%semi%';
測試:
首先在master上查看以下參數:
然后slave上關閉io_thread
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.01 sec)
然后在master上執行數據庫操作,比如插入等,結果就是操作會等待10s返回結果,這時候退回異步復制,slave上沒有接收到數據,這時候我們去查看master上的相關狀態:
此時插入數據會有一個10s的timeout,所以會卡頓一會,有些參數的值也變了:
show status like ‘%rpl_semi_sync%’;
會發現部分參數的值改變了(Rpl_semi_sync_master_clients
、Rpl_semi_sync_master_no_tx等)
然后我們開啟io_thread再去查看數據庫的變化,發現數據同步了
mysql> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)
智能推薦
mysql主從復制 | 級聯方式復制 | 并行復制 | 半同步復制 | 全同步
兩種模式 注意: 去中心化server3找server2,server2找server1 -------級聯,這樣降低了server1的負載 配置mysql是,很多問題直接看報錯日志就可以解決!!!!! 主從復制是單向的,不能在從機直接操作數據庫寫數據 主從復制的基礎是在底層數據一致上才能搭建,如果不一致,一定要先同步數據在slave上 /////////////////...
基于gtid的半同步mysql主從復制
此篇博客的是在上一篇博客(mysql主從復制)的基礎上寫的 https://blog.csdn.net/weixin_40543283/article/details/87911286 此篇博客寫的是基于gtid的半同步mysql主從復制 一、gtid的半同步mysql主從復制的原理介紹 1.什么是gtid? GTID (Global Transaction ID) 是對于一個已提交事...
MySQL5.7安裝+基于GTID主從復制+并行復制+增強半同步復制+讀寫分離+M-S-S架構(聯級復制)
實驗環境: Centos7.2 角色 主機IP server_id 數據狀態 Proxysql 192.168.148.62 null 無 Master 192.168.148.62 1 剛安裝的全新MySQL實例 Slave1 192.168.148.61 2 剛安裝的全新MySQL實例 Slave2 192.168.148.64 3 剛安裝的全新MySQL實例 一、安裝最新版本M...
mysql主從復制、半同步復制、并行復制、多組復制
一、主從復制 redhat6.5 master:server1 172.25.35.52 slave:server3 172.25.35.53 master: slave: 測試: master:添加數據庫 slave:查看到同步過來 二、Gtid主從復制 測試: master:給數據庫插入內容 slave:可以同步過來 三、半同步復制 master: timeout 10s,超過該時間會轉為異步...
Mysql的主從復制以及基于gtid的主從復制、半同步復制、組復制
前言: Mysql是現在普遍使用的數據庫,但是如果宕機了必然會造成數據丟失。為了保證mysql數據庫的可靠性。就要會一些提高可靠性的技術。因此,一般來說都是通過 主從復制(Master-Slave)的方式來同步數據提高可靠性,再通過讀寫分離(MySQL-Proxy)來提升數據庫的并發負載能力。 本文我們將會詳細給大家介紹在Redhat7環境下Mysql的主從復制以及基于gtid的主從復制、半同步復...
猜你喜歡
linux mysql的主從復制(GTID)/并行復制/無損復制
安裝mysql 本次使用五個rpm包安裝 安裝后修改密碼即可 密碼默認在log中 初始化修改即可 開啟mysql二進制日志 可以設定徐亞同步的數據庫或不需要的數據庫 進入mysql創建備份賬戶 查看日至位置以及pos在備份機使用 grant replication slave on *.* to 'bobo'@'172.25.15....
基于gtid實現的mysql主從復制,半同步復制,組復制
MySQL主從復制 1.mysql主從復制原理: 從庫有兩個線程IO線程和SQL線程 1.從庫的IO線程向主庫的主進程發送請求,主庫驗證從庫,交給主庫IO線程負責數據傳輸; 2.主庫IO線程對比從庫發送過來的master.info里的信息,將binlog文件信息,偏移量和binlog文件名等發送給從庫 3.從庫接收到信息后,將binlog信息保存到relay-bin中,同時更新master.inf...
mysql主從復制,基于gtid的主從,半同步復制
MySQL復制原理,其通過三個線程來完成,在master節點上運行的binlogdump線程以及在slave節點上運行的I/O線程和SQL線程。 1. master節點上的binlogdump線程,在slave與其正常連接的情況下,將binlog發送到slave上。 2.slave節點上的I/O線程,通過讀取master節點發送的內容,并將數據復制到本地的relaylog中。 3.slave節點上...
mysql主從復制及半同步(基于gtid)
1.MySQL主從復制(基于GTID) Mysql主庫(master):server2 —>172.25.155.2 Mysql從庫( slave ):server3 —>172.25.155.3 下載安裝包 mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-...