主從複製:簡稱AB複製,在A主機上作create、update、insert、drop、delete等數據庫、表、記錄的增、刪、改操做,B主機上會自動作數據庫、表、記錄的同步更新。mysql
如圖,主從複製的工做過程其實十分簡單:sql
A主機作出操做:create database tb; ----> 會將此命令自動寫入本機的二進制日誌文件(即log-bin)中。shell
再由B主機的I/O線程對A主機的二進制日誌文件實時監控,將A寫入二進制日誌文件的操做,寫入B主機的中繼日誌中。數據庫
最後被B主機的SQL線程對寫入中繼日誌的操做在B主機上執行,從而創建了tb這個庫(create database tb;)。bash
環境部署:要在兩臺主機上部署主從複製即「一主一從」。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"