MySQL主從同步配置


一. 理論部分

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線程,主庫寫壓力大時,復制可能存在延時

​ 並行復制,解決從庫復制延遲問題






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM