MySQL之主從複製

主從複製:簡稱AB複製,在A主機上作create、update、insert、drop、delete等數據庫、表、記錄的增、刪、改操做,B主機上會自動作數據庫、表、記錄的同步更新。mysql

如圖,主從複製的工做過程其實十分簡單:sql

  1. A主機作出操做:create  database  tb;  ---->    會將此命令自動寫入本機的二進制日誌文件(即log-bin)中。shell

  2. 再由B主機的I/O線程對A主機的二進制日誌文件實時監控,將A寫入二進制日誌文件的操做,寫入B主機的中繼日誌中。數據庫

  3. 最後被B主機的SQL線程對寫入中繼日誌的操做在B主機上執行,從而創建了tb這個庫(create database tb;)。bash

image.png

環境部署:要在兩臺主機上部署主從複製即「一主一從」。master爲:192.168.11.11    slave爲:192.168.11.12服務器

部署思路:ssh

1.在A主機(master)上的/etc/my.cnf主配置文件中開啓binlog二進制日誌文件功能,而且給主機設置server-id惟一標識編號。重啓mariadb服務。ide

2.在A主機上建立用於AB主從複製的用戶帳號,並查看master狀態中的binlog日誌文件的position位置數值。spa

3.在B主機上的/etc/my.cnf主配置文件中設置server-id惟一標識編號。。重啓mariadb服務。線程

4.在B主機上用help   change  master查命令幫助,並用change  master命令告訴B主機他的master主人的正確信息。

5.在B主機上用start   slave啓動mariadb的隨從服務,並用show   slave   status查看AB主從複製的數據同步狀態,要確認兩個線程的yes狀態。


具體操做:

1、在「主」主機下作以下操做:

1.在mariadb的主配置文件(/etc/my.cnf)的主標識下加入

server-id=11(服務器id,隨便定,通常取主機IP的末位)

log-bin=master-bin(指定二進制日誌文件名)

skip_name_resolv=1(跳過域名解析)


2.而後重啓服務:systemctl enable mariadb


3.進入mysql,設置功能爲應答「隨從」,僅容許同網段訪問的,用戶名和密碼都爲zc的帳號。更新帳號權限信息,查看數據庫當前正在使用的二進制日誌文件的位置

grant replication slave on *.* to zc@'%' identified by 'zc';

flush privileges;

show master status;

記下查到的file、position兩個狀態碼,分別寫在部署「從」主機的「二進制日誌文件名」和「position值」上。



2、接下來開始配置「從」主機:

1.在mariadb的主配置文件(/etc/my.cnf)的主標識下加入

server-id=12(服務器id,隨便定,通常取主機IP的末位)


2.而後重啓服務:systemctl enable mariadb


3.依次輸入經過「help change master to」查詢並修改獲得的命令,而後開啓slave功能,最後查看slave的狀態信息,主要查看I/O和SQL線程的狀態,yes便可(Slave_IO_Running: Yes       Slave_SQL_Running: Yes)。

  ->   CHANGE MASTER TO

    ->   MASTER_HOST='192.168.11.11', (「主」主機的IP地址)

    ->   MASTER_USER='zc', (功能爲應答slave的用戶)

    ->   MASTER_PASSWORD='zc', (該用戶的密碼)

    ->   MASTER_PORT=3306, (工做端口爲3306)

    ->   MASTER_LOG_FILE='master-bin.000001', (二進制日誌文件名)

    ->   MASTER_LOG_POS=245, (position值)

    ->   MASTER_CONNECT_RETRY=10; (重連時間)

start slave;

show slave status\G;



3、驗證方法:在「主」主機上隨意建立一個庫或表,再到「從」主機上去查詢,看可否查到在「主」主機上建立的庫和表。


最後這是我總結時寫的一個shell腳本雖然比較low,但已調試成功。

#!/bin/bash

maria='mariadb mariadb-server'

rpm -q $maria ||yum -y install $maria > /dev/null

cat >/etc/my.cnf.d/master.cnf <<EOF

[mysqld]

server-id=11

log-bin=master-bin

skip_name_resolv=1

EOF

systemctl restart mariadb && systemctl enable mariadb

mysql -e "grant replication slave on *.* to tian@'%' identified by 'bin';flush privileges;"

File=$(mysql -e "show master status;" |awk -F" " '/master/{print $1}')

Position=$(mysql -e "show master status;" |awk -F" " '/master/{print $2}')

#接下來作「從」的設置

echo "

rpm -q $maria ||yum -y install $maria > /dev/null

echo '[mysqld]

server-id=12

skip_name_resolv=1' >/etc/my.cnf.d/slave.cnf

systemctl restart mariadb

mysql -e 'stop slave;'

mysql -e \"

CHANGE MASTER TO

  MASTER_HOST='192.168.11.11',

  MASTER_USER='tian',

  MASTER_PASSWORD='bin',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='$File',

  MASTER_LOG_POS=$Position,

  MASTER_CONNECT_RETRY=10;\"

mysql -e 'start slave;show slave status\G' " > ~/slave.sh

#接下來用scp將「從」的腳本傳到12主機上,並用ssh遠程執行腳本。

[ -x /usr/bin/expect ] || yum -y install expect > /dev/null

[ -f ~/.ssh/id_rsa ] || ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -q

/usr/bin/expect <<EOF

set timeout 10

spawn ssh-copy-id root@192.168.11.12

expect "yes/no"

send "yes\n"

expect "password"

send "0\n"

expect eof

EOF

cd

scp slave.sh root@192.168.11.12:/root/

ssh root@192.168.11.12 "cd;. slave.sh"

相關文章
相關標籤/搜索