上週咱們介紹了關於數據庫的備份與恢復,你們也差很少能夠在平常生產中作到數據的保障,可是若是咱們的數據庫服務器真的宕機或者各類問題崩潰,等咱們恢復過來也會損失不少的用戶或者交易額,這是生產中能夠避免就避免的問題,因此今天咱們來介紹數據庫的主從複製,實現數據庫的高可用和備份效果,減小時間庫的維護時間,增長可用時間!mysql
通常的生產環境中,都是一個主庫加一個從庫,還有一個遠程的災備庫,當咱們因爲各類緣由宕機崩潰時,還能夠至少有一個庫對外提供服務,不至於全盤over。sql
咱們首先提供三臺機器,分別爲一主兩從,分別安裝mariadb-server。數據庫
修改主數據庫的配置文件:vim /etc/my.cnfvim
[mysqld]後端
server-id=1 #給數據庫指定惟一id
centos
log-bin=mysql-bin #開啓mysql的二進制日誌安全
skip-name-resolve #跳過名詞解析,非必須服務器
systemctl restart mariadb網絡
mysql < show master stauts; #查看二進制日誌狀態,寫哪一個File,從那個Position開始異步
mysql < grant replication slave,replication client on *.* to slave@'slave_server_ip' identified by 'centos'; #創建一個備份使用的用戶,給予複製的權限
修改從數據庫的配置文件:vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
read-only=1 #開啓只讀,雙寫會問題
relay-log=mysql-relay-log #開啓中繼日誌
log-slave-updates=1 #開啓從跟隨主二進制日誌更新
systemctl restart mariadb
mysql < change master to master_host = 'master_server ip', #指定主庫的ip
< change master_user='slave' #上面定義的用戶
< change master_password='centos' #上面定義的密碼
< change master_log_file='File'
< change master_log_pos='Position';
start slave;
show slave status\G;
Slave_IO_Running: Yes #I/O線程正常運行
Slave_SQL_Running: Yes #SQL線程正常運行
當咱們配置完成後咱們可使用數據的各類的SQL語句,測試一下是否會自動複製同步!
這裏的好多有人要問了,爲何這麼配置?從庫的不可寫是由於當兩個數據庫同時寫到一個block塊上是,文件系統會所以崩潰,這個問題是困擾咱們的雙寫的最大問題之一;當咱們的數據庫發生改變時,會先寫入二進制日誌,二進制日誌等知足條件時寫入硬盤中去,當咱們的在從上開啓兩個線程:I/O線程和SQl線程。其中I/O線程是當發現二進制日誌數據更新時,自動拉取日誌,寫入到中繼日誌,中繼日誌又經過SQL線程,寫入本機的mysql數據庫中,此時,兩個庫的操做同步,但有個問題誕生了,若是咱們的二進制日誌被拉取走,主數據庫是等待二進制回來,再返回用戶寫入操做ok,仍是不等待直接返回ok呢?這裏就牽涉到咱們的mysql的同步異步機制了。
mysql的默認爲異步機制,也就是當用戶的寫入操做完成後,記入二進制日誌,咱們就返回ok,無論從服務器的是否拉取,是否完成,這樣就誕生了一個問題,若是咱們此時的數據庫崩潰,當咱們的數據庫從主數據庫切換到從數據庫時,數據會丟失,致使主從數據不一致。
而同步機制呢,是咱們的主數據在被寫入後,等待後端的全部從數據庫複製完成,而咱們的從數據庫有時不僅有一個,加上網絡的消耗,服務時間上很漫長,而客戶不會有那麼多的耐心去等待該過程的完成,由此會致使客戶流失。
可是解決的方法也很簡單,就是兩者取中,半同步機制應運而生,它只要有一個從數據複製完成,就當即返回客戶寫入ok,即強化了安全性,又減小了等待時間,並且半同步機制還能夠設置超時時間,若是必定的時間內沒有複製完成,就無論直接返回給客戶結果。
那麼咱們如何切換到mysql的半同步呢?
咱們的mysql中支持的多種插件在/usr/lib64/mysql/plugins/下,咱們在其中能夠看到有兩個semisync_master.so和semisync_slave.so庫,因此咱們直接在數據庫中安裝便可。
主庫:
mysql < install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql < show global variables like 'rpl_semi%';
mysql < set global rpl_semi_sync_master_enabled =1 #開啓主半同步
從庫:
mysql < install global rpl_semi_sync_slave soname 'semisync_slave.so';
mysql < show global varialbes like 'rpl_semi%';
mysql < set global rpl_semi_sync_slave_enabled=1 #開啓從半同步
mysql < stop slave;
mysql < start slave;
查看mysql的錯誤日誌會看到改變的信息,mysql的錯誤日誌通常在/var/log/mariadb/mariadb.log
Slave I/O thread: Start semi-sync replication to master 'slave@172.17.254.111:3306' in log 'mysql-bin.000003' at position 809
看到這時咱們的半同步就算是完成了。
今天的主從複製就到此結束,大家學到了嗎?