MySQL主從複製步驟詳解mysql
1 主從服務器開啓時間同步(此項必須同步)web
[root@storage ~]# ntpdate 172.18.0.1sql |
2 恢復操做數據庫
首先判斷在構建主從複製架構時主服務器是否有數據。如果已有數據對其備份後在從服務器恢復。若主從架構的構建都爲從0開始。能夠略過此步。主從複製的起始點爲備份操做時,主節點所處的日誌文件及其事件位置。vim
注意:從服務器的MySQL版本需和主服務器的版本相同或高於其版本安全
3 配置主數據庫服務器
[root@storage ~]# vim /etc/my.cnf架構 [mysqld]分佈式 log_bin = /var/log/mariadb/mysql-bin ide 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 [mysqld] 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%'; |
查看到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 驗證
MariaDB [(none)]> show global status like 'rpl_semi_sync_master_clients'; #在主節點查從節點的個數 MariaDB [(none)]> show global status like 'rpl_semi%'; 或查看其參數可使用insert或者建庫建表語句對其進行測試,查看狀態 |