MySQL主從複制步驟詳解
1 主從伺服器開啟時間同步(此項必須同步)
[root@storage ~]# ntpdate 172.18.0.1 |
在企業内網建構時必須開啟時間同步,設定一個NTP伺服器,使得主從伺服器時間保持同步。此為前提。
2 恢複操作
首先判斷在建構主從複制架構時主伺服器是否有資料。若是已有資料對其備份後在從伺服器恢複。若主從架構的建構都為從0開始。可以略過此步。主從複制的起始點為備份操作時,主節點所處的日志檔案及其事件位置。
注意:從伺服器的MySQL版本需和主伺服器的版本相同或高于其版本
3 配置主資料庫
[root@storage ~]# vim /etc/my.cnf [mysqld] log_bin = /var/log/mariadb/mysql-bin server-id = 1 innodb_file_per_table = on skip_name_resolve = on |
log_bin:該參數後跟檔案路徑表示開啟二進制日志,所跟路徑mysql使用者必須有讀寫權限。建議與資料目錄分别存放,并放置于不同磁盤所在分區,用以降低其損壞率。
server-id:在做主從同步架構中,主伺服器的server-id為1,從伺服器不為1。
Innodb_file_per_table:後跟on或者1為設定InnoDB為獨立表空間模式,在設定此參數後使用InnoDB引擎的每個資料庫的每個表都會建立一個獨立的表空間,該項有一下特點:每個表都有自己獨立的表空間;每個表的資料和索引都會存儲在自己的表空間中。可以實作單表在不同資料庫之間移動(單表導入,導出);空間可以回收(除drop table操作外,表空間不能自己回收)。
skip_name_resolve:跳過使用DNS域名解析。
啟動服務(若資料庫正在使用并開啟binlog可不重新開機)
[root@web ~]# systemctl restart mariadb |
添加主從複制的使用者:
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO copyuser@'192.168.10.%' IDENTIFIED BY 'copypass'; MariaDB [(none)]> FLUSH PRIVILEGES; |
4 配置從資料庫
[root@storage1 ~]# vim /etc/my.cnf datadir=/var/lib/mysql/ server-id=2 relay_log=relay-log relay_log_index=relay-log.index read_only=1 innodb_file_per_table=1 skip_name_resolve=1 |
datadir:指定資料所在目錄
server-id不能為1,當一主多從時,其server-id也最好不同
relay_log:後跟路徑表示開啟中繼日志,使用相對路徑時表示在于資料目錄在同一目錄下。
read_only:從伺服器隻讀。其他與主伺服器一緻。
啟動服務:
[root@ storage1 ~]# systemctl start mariadb |
與主伺服器建立連接配接
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST=192.168.10.6, -> MASTER_USER=copyuser, -> MASTER_PASSWORD=copypass, -> MASTER_LOG_FILE=' mysql-bin.000005', -> MASTER_LOG_POS=24622; |
MASTER_LOG_FILE, MASTER_LOG_FILE為備份時截止的事務時間點。可在恢複時使用的備份目錄下xtrabackup_info檔案中找出。
[root@ storage1 ~]# grep 'binlog_pos' 2017-11-13_20-29-22/xtrabackup_info binlog_pos = filename 'mysql-bin.000005', position '24622' |
當然,如果主從複制架構建構時為從0開始。需要在主伺服器上使用以下指令檢視:
[root@storage ~]# mysql MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | mysql-bin.000005 | 49652 | | | 1 row in set (0.00 sec) |
開啟一個IO_THREAD線程
MariaDB [(none)]> START SLAVE ; |
START SLAVE [IO_THREAD|SQL_THREAD];# 啟動複制線程,停止的話使用STOP
主從複制架構中應注意要點:
1 應限制從伺服器為隻讀
在從服務上設定read_only=ON;此限制對擁有SUPER權限的使用者均無效
如何阻止所有使用者:
mysq> FLUSH TABLES WITH READ LOCAK; # 連上去不退出(測試時使用)
2如何保證主從複制的事物安全?
在主節點啟用參數:sync_binlog=ON,即遇到事物送出時,必須将bin-log緩沖區中記錄下來的事件立即刷寫至磁盤上的二進制日志檔案中,進而通知從節點來複制同步。也可使用sysnc_binlog=n的方式,來開啟此選項,當n次事務送出之後,MySQL執行一次fsync之類的磁盤同步指令,将緩沖區中内容寫入磁盤。當n=0時,表示當事務送出之後,隻将binlog_cache中的資料寫入bin_log檔案,而不進行磁盤同步,這種方式性能最好,但無法保證事務安全性
如果使用的是innodb存儲引擎:
innodb_flush_logs_at_trx_commit= 1 # 将記憶體中的事物相關立即寫到磁盤上的事物日志中去。
innodb_support_xa= ON # xa:分布式式事物;即是否讓innodb支援分布式事物,分布式送出
在SLAVE節點:
skip_slave_start= ON # 關閉自動送出。選取手動啟動,避免錯誤
必要的時候可以開啟# MariaDB[(none)]> show variables like "%relay_log%";
主節點:
sync_slave_start = ON
從節點:
sync_relay_log
sync_relay_log_info
所遇故障:
使用備份恢複至從檔案時在copy-back過程中出現Error: datadir must be specified.
故障說明:
說明是恢複時,未能找到資料恢複目錄,此時隻需要在mariaDB的配置檔案中指定資料庫檔案目錄即可
解決辦法:
在配置檔案中添加datadir參數。
主從複制中半同步複制架構實作:
根據前文所述首先建構主從複制架構,然後借助Google所提供的插件來實作半同步複制。
Mysql支援多種插件,rpm安裝方式,插件所在目錄為/usr/lib64/mysql/plugin
插件使用方法
INSTALL PLUGIN plugin_name SONAME 'shared_library_name'; |
注意:插件名稱與插件檔案名并非對應,使用時應查閱官方文檔
半同步複制所用插件:
semisync_master.so semisync_slave.so |
半同步複制配置步驟詳解:
1 配置主節點
MariaDB [(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; |
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CMmJ2NkNWN3E2YzUDN1IGNjVWN2IDOjlTOwIjZ3kTOj9CX0EzLcFTM3EDMy8CXzN3bvwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
檢視到rpl_semi_sync_master_enabled狀态為off狀态,需把其打開。使用set指令
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; |
2 配置從節點
MariaDB [(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; MariaDB [(none)]>SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1; |
rpl_semi_sync_slave_enabled的狀态也需設定為ON狀态
3 重新開機從節點的IO_THIREAD線程并檢視從節點狀态
MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> START SLAVE; MariaDB [(none)]> SHOW SLAVE STATUS\G #确定節點狀态無誤并保證其IO_THREAD和SQL_THREAD線程正常啟用後方能成功 |
4 驗證