centos7上mariadb10.3多實例安裝部署及主從複製

    mariaDB是開源的數據庫,是mysql的衍生版。mysql

   Mariadb官方: https://mariadb.com/ web

  os:centos7sql

 mariadb:10.3數據庫

yum安裝實現。vim

一個版本mysql經過多個端口實現centos

規劃3個實例的端口:3306/3307/3308。緩存

將各自的配置文件、日誌文件、pid、socket單獨存放。bash


1、yum安裝app

    採用 yum安裝,centos7默認的yum源是mariadb5.5版本,因此須要修改yum倉庫配置文件,以安裝10.3.0版本的mariadb
ssh

vim /etc/yum.repos.d/CentOS-Base.repo

在倉庫配置文件中添加以下行

# MariaDB 10.3 CentOS repository list - created 2019-01-07 01:34 UTC
#  
[mariadb]
name = MariaDB
baseurl =  
gpgkey= 
gpgcheck=1

完成後,更新yum緩存,而後檢查maradb是否已經更換

yum info MariaDB-server

image.png

確認後,便可使用yum進行安裝

yum install MariaDB-server


2、配置

三個數據庫實例都放在獨立的目錄中

mkdir -pv /data/{3306,3307,3308}/{etc,socket,pid,log,data}

完成後的目錄結構以下所示:

image.png

確認mysql的用戶帳戶是否已經被建立

getent passwd mysql

image.png

修改數據庫的權限和組信息

chown -R mysql.mysql /data

生成各個實例數據庫文件

mysql_install_db --datadir=/data/3306/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3307/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3308/data --user=mysql --basedir=/usr

image.png


根據3個不一樣的實例準備3個配置文件,用/etc/my.cnf 當模板:

將配置文件考到各自的文件下:

cp /etc/my.cnf /data/3306/etc/
cp /etc/my.cnf /data/3307/etc/
cp /etc/my.cnf /data/3308/etc/


修改各自實例的配置文件,以下所示:

vim /data/3306/etc/my.cnf

[mysqld]
port=3306                    #手動添加部分
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid
#!includedir /etc/my.cnf.d            #須要註釋掉

image.png

其餘實例3307,3308的配置文件也按上修改

注意,配置文件中,能夠有不少優化,能夠查詢資料後製定


3、準備啓動腳本

首先確認中止mariadb服務

systemctl stop mariadb

在/data/3306/路徑下建立mysql啓動腳本,腳本內容以下:

touch /data/3306/mysql
vim /data/3306/mysql


#!/bin/bash

port=3306                                  #設定實例端口號
mysql_user="root"                          
mysql_pwd="abc@123"                        #設定數據庫密碼
cmd_path="/usr/bin"
mysql_basedir="/data"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac

完成後的目錄結構以下:

image.png

注意修改3307,3308各個實例的腳本

cp /data/3306/mysqld  /data/3307/(配置文件端口改成port=3307)
cp /data/3306/mysqld  /data/3308/(配置文件端口改成port=3308)

設置合適的權限

chmod 700 /data/3306/mysqld
chmod 700 /data/3307/mysqld
chmod 700 /data/3308/mysqld

啓動腳本

./ mysqld start

image.png

檢查服務啓動狀態

image.png

可見 各個端口都是正常開啓


測試鏈接

須要用sock指定文件連接到 mysql

mysql -S /data/3306/socket/mysql.sock
mysql -S /data/3307/socket/mysql.sock
mysql -S /data/3308/socket/mysql.sock

經過查看端口判斷進入哪一個實例

show variables like 'port';

image.png

設置密碼

mysqladmin -uroot -S /data/3306/socket/mysql.sock password 'abc@123'


此時進入3306實例數據庫

mysql -S /data/3306/socket/mysql.sock -u root -p

image.png


4、主從複製

主從複製是一個異步的複製過程,數據從一個Mysql數據庫複製到另外一個mysql數據庫,在主和從之間實現整個主從複製使的過程是由三個線程參與完成的。

其中有兩個線程在從端,另一個線程在主端。
要實現主從複製,首先必須打開master端的binlog記錄功能,不然沒法實現。整個主從複製過程就是從端從主端獲取binlog日誌,而後再到slave上以相同的順序獲取binlog日誌中所記錄的各類

SQL操做。

要打開binlog記錄功能,可經過配置文件my.cnf中的mysqld模塊增長log-bin參數選項來實現。

image.png

主從複製原理

從庫生成兩個線程,一個I/O線程,一個SQL線程;

 

i/o線程去請求主庫 的binlog,並將獲得的binlog日誌寫到relay log(中繼日誌) 文件中;

主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;

 

SQL 線程,會讀取relay log文件中的日誌,並解析成具體操做,來實現主從的操做一致,而最終數據一致;

主從複製重點:

1)主從複製是異步的邏輯的sql語句級的複製

2)複製時,主庫有一個I/O線程,從庫有有兩個線程,即I/O和SQL線程。

3)實現主從複製的必要條件是主庫須要開啓binlog功能

4)做爲複製的全部mysql節點的server-id都不能相同

5)binlog文件只記錄對數據庫有更改的sql語句,不記錄任何查詢語句。

以本機單機數據庫多實例環境測試主從複製

主庫於從庫IP信息以下:

主庫            3306
從庫1          3307

從庫2          3308


4.1設置server-id值並開啓binlog功能參數

修改主庫配置文件my.cnf,按照以下修改兩個參數

vim /data/etc/my.cnf
[mysqld]
server-id =1            #用於同步的每臺機器或者實例server-id都不能相同
log-bin = /data/3306/mysql-bin            #注意,只須要主庫設置便可,從庫不須要設置此參數

說明:

參數要放在my.cnf的[mysqld]模塊下

server-id的值不能相同

參數不能重複

修改完成後重啓數據庫

/data/3306/mysql restart

登錄數據庫,檢查參數的更改狀況,以下:

mysql -S /data/3306/socket/mysql.sock -u root -pabc@123


show variables like 'server_id';
show variables like 'log_bin';

image.png

按照這個方法檢查其餘實例數據庫



4.2主庫創建用於主從複製的帳號

從庫想要和主庫同步,必須有一個能夠鏈接主庫的帳號,而且這個帳號是主庫上建立的,權限是運行主庫鏈接並同步數據庫。

登錄主庫後,創建用於從庫複製的帳號rep

grant replication slave on *.* to 'rep'@'172.31.208.%' identified by 'abc@123';
flush privileges;

image.png


檢查主庫rep帳號

image.png


4.3實現對主數據庫鎖表只讀

對主數據庫鎖表只讀

flush table with read lock;


查看主庫狀態

image.png


鎖表後,導出主庫數據(新開一個ssh鏈接)

mkdir /data/backup -p
mysqldump -uroot -p'abc@123' -S /data/3306/socket/mysql.sock --events -A -B |gzip >/data/backup/mysql_bak.$(date +%F).sql.gz

爲了確保導出數據期間,數據庫沒有數據插入,導出主庫完畢後能夠再次檢查主庫狀態信息,結果以下:

image.png

能夠看到主庫沒有數據寫入

完成主庫導出後,解鎖主庫,恢復可寫

unlock tables;

完成導出後,則可使用mysqldump將主庫數據備份到從庫上


4.4從庫上配置

數據庫的server-id通常在一套主從複製體系內時惟一的,從庫的server-id須要和主庫和其餘從庫的不一樣,而且要註釋掉從庫的binlog參數配置,若是從庫不作級聯複製,而且不做爲備份做用,則不須要開啓binlog,開啓反而會增長從庫磁盤I/O壓力。

    可是有兩種狀況須要打開從庫的binlog記錄功能,記錄數據庫更新的SQL語句。

1)A-B-C級聯同步,中間的B數據庫服務,須要開啓binlog記錄功能

2)在從庫作數據庫備份要開啓binlog記錄功能,由於數據庫備份必需要有全備和binlog日誌,纔是完成的備份。

完成從庫3307的配置文件修改後,檢查從庫參數改變狀況

image.png

使用mysqldump命令將主庫備份文件恢復到從庫

gzip -d mysql_bak.2019-01-07.sql.gz
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock <mysql_bak.2019-01-07.sql


4.5 主從庫同步

從庫的配置信息以下:

CHANGE MASTER TO
MASTER_HOST='172.31.208.81',               #主庫ip
MASTER_PORT=3306,                          #主庫端口
MASTER_USER='rep',                         #主庫上的複製權限用戶rep
MASTER_PASSWORD='abc@123',                #rep用戶密碼
MASTER_LOG_FILE='mysql-bin.000001',        #show master status時查看到的二進制文件名稱,注意不能多空格
MASTER_LOG_POS=648;                       #show master status時看到的二進制日誌偏移量,注意不能多空格

也能夠按照以下方式配置從庫鏈接主數據庫進行配置

image.png


實際上,以上操做信息其實是寫入從庫新的master.info文件中

image.png



啓動從庫主從複製開關,並查看複製狀態

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "start slave;"
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"

image.png

主從複製是否成功,最關鍵的是下面的3項狀態參數

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"

image.png

說明:

 Slave_IO_Running :IO線程狀態,IO線程負責從庫到主庫讀取binlog日誌,並寫入從庫的中繼日誌,狀態爲yes表示IO工做征程

Slave_SQL_Runing :SQL線程狀態,SQL線程負責讀取中繼日誌中的數據並轉換爲SQL 語句到從數據庫,狀態爲YES 表示SQL線程工做正常

Seconds_Behind_Master: 複製過程當中從庫比主庫的延遲秒數



4.6總結

一、主庫配置log-bin和server-id參數,從庫只用配置 server-id,配置完成後重啓數據庫

二、主庫增長同步用戶帳號,例如rep 受權 repliaction slave權限

三、登錄主庫,整庫鎖表flush table with read lock,檢查show master status 查看binlog的位置狀態

四、同步以前,備份主庫,可使用mydump導出到指定位置

五、完成主庫導出後,執行unlock tables解鎖主庫

六、把主庫導出的數據恢復到從庫

七、根據主庫show master status  查看的binlog位置狀態,從庫執行change master to 語句

八、從庫開啓複製開關,執行start slave;

9 、從庫show slave status\G,檢查同步狀態

相關文章
相關標籤/搜索