MySQL主從同步node
主從同步使得數據能夠從一個數據庫服務器複製到其餘的服務器上。在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave)。mysql
由於複製是異步進行的,因此從服務器不須要一直連着主服務器,而是斷斷續續鏈接主服務器。sql
經過配置文件,能夠實現全部數據庫,指定數據庫 ,指定數據庫的表,進行復制。shell
主從同步的好處數據庫
數據庫複製centos
MySQL是異步複製,MySQL cluster是同步複製。有不少主從同步,可是核心的方法有兩種:安全
也可使用Mixed Bases Replication(MBR) 混合複製bash
在MySQL5.6,默認使用SBR。而MySQL5.6.5及之後的版本,基於global transaction identifiters(GIDS)來進行事務複製。經過設置服務器的系統變量binog_format來指定要使用的格式服務器
各機制的優缺異步
SBR 當使用二進制日誌來實現主從複製時,主服務器把SQL語句寫入到日誌中,而後從服務器執行日誌
優點:
日誌文件小
記錄全部語句,能夠用於審計
劣勢:
使用一些函數的語句則不能進行復制
在日誌中出現警告信息則不能複製
RBR 主服務器把表的行變化做爲事件寫入二進制中,主服務器把表明行變化的事件複製到從服務器中
優點:
全部數據變化都被複制,這是最安全的複製
更少的行級鎖表
劣勢:
日誌很大
不能經過日誌來審計執行的SQL語句,不過可使用mysqlbinlog
主從同步機制
MySQL服務器之間的主從同步是基於二進制的日誌機制。主服務器使用日誌變化來記錄數據庫變化記錄,從服務器經過讀取和執行該日誌文件來保持和主服務器的數據一致。
主服務器和從服務器都必須配置一個惟一的ID號。另外從服務器須要經過change master to
的語句來配置它要鏈接的主服務器和ip地址,日誌文件名和該日誌的位置(這些信息,均存放在主服務器的數據庫裏)
主從配置過程
主服務器操做:
show master status
查看當前主機的日誌信息和存放位置從服務器操做:
change master to
語句,配置主服務器信息start slave
開啓從服務器show slave status
查看從服務器狀態MySQL的主從同步配置方式,能夠配置爲:
下面的過程是配置一主一從的配置,一主多從的配置,只是修改從服務器的配置文件,其餘過程和從服務器配置同樣。
在node19 和node20上,分別建立和執行一下shell腳本
#!/bin/bash if [ "$#" != "2" ];then echo "scripts usage:$0 [hostname] [db_password]" && exit 0 fi HOSTNAME=$1 PASSWORD=$2 # centos6 #yum -y install mysql mysql-server mysql-devel mysql-libs # centos7 yum -y install mariadb mariadb-server maridb-clients mariadb-devel mariadb-libs if [ "$?" == "0" ];then #service mariadbd start 2>/dev/null && echo "start mysqld ok" systemctl start mariadb 2>/dev/null && echo "start mysqld ok" else echo "yum mysql fail" && exit 0 fi mysql <<EOF delete from mysql.user where user = " " and host = "localhost"; delete from mysql.user where user = " " and host = "127.0.0.1"; delete from mysql.user where user = " " and host = "${HOSTNAME}"; delete from mysql.user where user = "root" and host = "${HOSTNAME}"; delete from mysql.user where user = "root" and host = "::1"; grant all privileges on *.* to 'root'@'localhost' identified by '${PASSWORD}'; grant all privileges on *.* to 'root'@'127.0.0.1' identified by '${PASSWORD}'; flush privileges; EOF systemctl enable mariadb
執行上述代碼以後,兩個節點上,均部署了MySQL(mariadb)服務
在node19上,修改配置文件/etc/my.cnf,在[mysqld]的配置模塊下,添加
log-bin=mysql-bin server-id=1
執行systemctl restart mariadb
重啓MySQL服務器
mysql -uroot -p
登錄數據庫系統,執行一下語句
# 建立用於複製數據庫的帳號並受權 grant replication slave on *.* to 'repl'@'192.168.10.%' identifiedby 'liwanliang'; # 刷新數據庫並設置只讀 flush tables with read lock; # 查看主服務器的狀態,獲取日誌信息 show master status;
在node20上,修改配置文件/etc/my.cnf,在[mysqld]的配置模塊下,添加
log-bin=mysql-bin server-id=2
執行systemctl restart mairadb
重啓服務器
mysql -uroot -p
登錄數據庫胸痛,執行如下語句
# 配置主服務器 change master to master_host='192.168.10.19', master_user='repl', master_password='liwanliang', master_log_file='mysql-bin.000001', master_log_pos=552; # 啓動從服務器 start slave # 查看狀態 show slave status\G;
以上述操做過程,配置多個從服務器亦可實現
在主庫node19上建立數據庫create database liwl_01;
在從庫node20/node21上查看數據庫show databases
暫停node20上的數據庫複製,進行數據備份:mysqladmin -uroot -p stop-slave
,或僅暫停SQL進程(此過程僅暫停SQL執行,而不暫停日誌的複製),執行命令:mysql -uroot -p -e 'stop slave sql_thread';
在主庫node19上建立數據庫liwl_02,create databases liwl_02;
查看從庫node21進行了複製,而node20上沒有複製
在node20上重啓複製進程:mysqladmin -uroot -p start-slave
,查看到數據庫已經同步過來
直接複製文件
爲了保證數據的文件的完整性,在執行備份以前,應該關閉從服務器:
mysqladmin -uroot -p shutdown
拷貝數據庫文件,而後啓動MySQL服務
經過mysqldump複製
主庫宕機以後,數據可能丟失
半同步複製,解決s數據丟失問題
從庫只有一個SQL線程,主庫寫壓力大時,複製可能存在延時
並行複製,解決從庫複製延遲問題