MySQL主從同步配置

一. 理論部分

MySQL主從同步node

主從同步使得數據能夠從一個數據庫服務器複製到其餘的服務器上。在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave)。mysql

由於複製是異步進行的,因此從服務器不須要一直連着主服務器,而是斷斷續續鏈接主服務器。sql

經過配置文件,能夠實現全部數據庫,指定數據庫 ,指定數據庫的表,進行復制。shell

主從同步的好處數據庫

  • 經過增長從服務器來提升數據庫的性能。主庫執行寫入和更新,從庫執行讀取,動態增長從服務器,提升數據庫系統性能
  • 提升數據的安全性。使用從服務器,備份數據庫,而不破壞服務器上的數據
  • 在主庫生成數據,在從庫分析數據,提升主庫的性能

數據庫複製centos

MySQL是異步複製,MySQL cluster是同步複製。有不少主從同步,可是核心的方法有兩種:安全

  • Statement Based Replication(SBR) 基於SQL語句的複製
  • Row Based Replication(RBR) 基於行復制的

也可使用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地址,日誌文件名和該日誌的位置(這些信息,均存放在主服務器的數據庫裏)

主從配置過程

主服務器操做:

  • 修改配置文件,開啓日誌機制,配置獨立的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線程,主庫寫壓力大時,複製可能存在延時

​ 並行複製,解決從庫複製延遲問題



相關文章
相關標籤/搜索