一. 理論部分
MySQL主從同步
主從同步使得數據可以從一個數據庫服務器復制到其他的服務器上。在復制數據時,一個服務器充當主服務器(master),其余的服務器充當從服務器(slave)。
因為復制是異步進行的,所以從服務器不需要一直連着主服務器,而是斷斷續續連接主服務器。
通過配置文件,可以實現所有數據庫,指定數據庫 ,指定數據庫的表,進行復制。
主從同步的好處
- 通過增加從服務器來提高數據庫的性能。主庫執行寫入和更新,從庫執行讀取,動態增加從服務器,提高數據庫系統性能
- 提高數據的安全性。使用從服務器,備份數據庫,而不破壞服務器上的數據
- 在主庫生成數據,在從庫分析數據,提高主庫的性能
數據庫復制
MySQL是異步復制,MySQL cluster是同步復制。有很多主從同步,但是核心的方法有兩種:
- Statement Based Replication(SBR) 基於SQL語句的復制
- Row Based Replication(RBR) 基於行復制的
也可以使用Mixed Bases Replication(MBR) 混合復制
在MySQL5.6,默認使用SBR。而MySQL5.6.5及以后的版本,基於global transaction identifiters(GIDS)來進行事務復制。通過設置服務器的系統變量binog_format來指定要使用的格式
各機制的優缺
SBR 當使用二進制日志來實現主從復制時,主服務器把SQL語句寫入到日志中,然后從服務器執行日志
優勢:
日志文件小
記錄所有語句,可以用於審計
劣勢:
使用一些函數的語句則不能進行復制
在日志中出現警告信息則不能復制
RBR 主服務器把表的行變化作為事件寫入二進制中,主服務器把代表行變化的事件復制到從服務器中
優勢:
所有數據變化都被復制,這是最安全的復制
更少的行級鎖表
劣勢:
日志很大
不能通過日志來審計執行的SQL語句,不過可以使用mysqlbinlog
主從同步機制
MySQL服務器之間的主從同步是基於二進制的日志機制。主服務器使用日志變化來記錄數據庫變化記錄,從服務器通過讀取和執行該日志文件來保持和主服務器的數據一致。
主服務器和從服務器都必須配置一個唯一的ID號。另外從服務器需要通過change master to
的語句來配置它要連接的主服務器和ip地址,日志文件名和該日志的位置(這些信息,均存放在主服務器的數據庫里)
主從配置過程
主服務器操作:
- 修改配置文件,開啟日志機制,配置獨立的ID號
- 創建用於復制的賬號,並授權給從服務器地址
show master status
查看當前主機的日志信息和存放位置
從服務器操作:
- 修改配置文件,開啟日志機制,配置獨立的ID號
change master to
語句,配置主服務器信息start slave
開啟從服務器show slave status
查看從服務器狀態
二. 實踐部分
MySQL的主從同步配置方式,可以配置為:
- 一主一從
- 一主多從
下面的過程是配置一主一從的配置,一主多從的配置,只是修改從服務器的配置文件,其他過程和從服務器配置一樣。
1. 兩台虛擬機上部署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;
以上述操作過程,配置多個從服務器亦可實現
2. 使用從庫進行數據庫備份
在主庫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
,查看到數據庫已經同步過來
3. 有關數據庫的備份
直接復制文件
為了保證數據的文件的完整性,在執行備份之前,應該關閉從服務器:
mysqladmin -uroot -p shutdown
拷貝數據庫文件,然后啟動MySQL服務
通過mysqldump復制
4. 主從復制可能存在的問題
主庫宕機之后,數據可能丟失
半同步復制,解決s數據丟失問題
從庫只有一個SQL線程,主庫寫壓力大時,復制可能存在延時
並行復制,解決從庫復制延遲問題