1. 程式人生 > >centos7上mariadb10.3多例項安裝部署及主從複製

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

    mariaDB是開源的資料庫,是mysql的衍生版。

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

  os:centos7

 mariadb:10.3

yum安裝實現。

一個版本mysql通過多個埠實現

規劃3個例項的埠:3306/3307/3308。

將各自的配置檔案、日誌檔案、pid、socket單獨存放。


一、yum安裝

    採用 yum安裝,centos7預設的yum源是mariadb5.5版本,所以需要修改yum倉庫配置檔案,以安裝10.3.0版本的mariadb

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


二、配置

三個資料庫例項都放在獨立的目錄中

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的配置檔案也按上修改

注意,配置檔案中,可以有很多優化,可以查詢資料後製定


三、準備啟動指令碼

首先確認停止mariadb服務

systemctl stop mariadb

在/data/3306/路徑下建立mysql啟動指令碼,指令碼內容如下:

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


#!/bin/bash

port=3306                                  #設定例項埠號
mysql_user="root"                          
mysql_pwd="[email protected]"                        #設定資料庫密碼
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 '[email protected]'


此時進入3306例項資料庫

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

image.png


四、主從複製

主從複製是一個非同步的複製過程,資料從一個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 [email protected]


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 '[email protected]';
flush privileges;

image.png


檢查主庫rep賬號

image.png


4.3實現對主資料庫鎖表只讀

對主資料庫鎖表只讀

flush table with read lock;


檢視主庫狀態

image.png


鎖表後,匯出主庫資料(新開一個ssh連線)

mkdir /data/backup -p
mysqldump -uroot -p'[email protected]' -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 [email protected] -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='[email protected]',                #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 [email protected] -S /data/3307/socket/mysql.sock -e "start slave;"
mysql -uroot [email protected] -S /data/3307/socket/mysql.sock -e "show slave status\G;"

image.png

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

mysql -uroot [email protected] -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總結

1、主庫配置log-bin和server-id引數,從庫只用配置 server-id,配置完成後重啟資料庫

2、主庫增加同步使用者賬號,例如rep 授權 repliaction slave許可權

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

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

5、完成主庫匯出後,執行unlock tables解鎖主庫

6、把主庫匯出的資料恢復到從庫

7、根據主庫show master status  檢視的binlog位置狀態,從庫執行change master to 語句

8、從庫開啟複製開關,執行start slave;

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