一、環境說明
操作系統: CentOS Linux release 7.5.1804
Mysql版本:mysql-5.7.23
Keepalived版本: v1.3.5
Mysql-vip:192.168.64.170
Mysql-01:192.168.64.151
Mysql-02:192.168.64.152
已經關閉firewalld和selinux
二、MySQL 主從複製原理
mysql主從複製需要三個線程,master(binlog dump thread)、slave(I/O thread 、SQL thread)。
master
(1)binlog dump線程:當主庫中有數據更新時,那麼主庫就會根據按照設置的binlog格式,將此次更新的事件類型寫入到主庫的binlog文件中,此時主庫會創建log dump線程通知slave有數據更新,當I/O線程請求日誌內容時,會將此時的binlog名稱和當前更新的位置同時傳給slave的I/O線程。
slave
(2)I/O線程:該線程會連接到master,向log dump線程請求一份指定binlog文件位置的副本,並將請求回來的binlog存到本地的relay log中(中繼日誌開銷很小),relay log和binlog日誌一樣也是記錄了數據更新的事件,它也是按照遞增後綴名的方式,產生多個relay log( host_name-relay-bin.000001)文件,slave會使用一個index文件( host_name-relay-bin.index)來追蹤當前正在使用的relay log文件。
(3)SQL線程:該線程檢測到relay log有更新後,會讀取並在本地做redo操作,將發生在主庫的事件在本地重新執行一遍,來保證主從數據同步。此外,如果一個relay log文件中的全部事件都執行完畢,那麼SQL線程會自動將該relay log 文件刪除掉。
下面是整個複製過程的原理圖:
主主同步就是兩臺機器互爲主的關係,在任何一臺機器上寫入都會同步。
三、yum安裝mysql
3.1 配置官方yum源
按照https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/的指導,配置使用官網yum源。
3.1.1 安裝yum 源
#rpm -Uvh mysql80-community-release-el7-1.noarch.rpm
3.1.2 禁用MySQL 8.0 yum源並啓用MySQL 5.7 的yum源
#yum-config-manager --disable mysql80-community
#yum-config-manager --enable mysql57-community
3.2 安裝mysql
#yum install mysql-community-server –y
3.3 開啓mysqld 服務,並加入開機自啓動
#systemctl start mysqld.service
#systemctl enable mysqld.service
3.4 查找超級用戶“root”密碼,並修改
#grep 'temporary password' /var/log/mysqld.log
2018-09-29T07:23:21.523459Z 1 [Note] A temporary password is generated for root@localhost: JjoQke&;<2G/
#mysql -uroot –p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YouPasswd!';
mysql> use mysql;
mysql> update user set host="%" where user="root";
mysql> flush privileges;
3.5 在另外一臺服務器上重複3.1-3.4的操作
至此,兩臺服務器上的MySQL數據庫安裝完成
四、配置主主複製
4.1 修改/etc/my.cnf配置文件
4.1.1修改Mysql-01 /etc/my.cnf配置文件
# cp /etc/my.cnf /etc/my.cnf.bak
在/etc/my.cnf文件中添加一下配置
server_id = 1
log-bin = mysql-bin
expire_logs_days = 7
binlog_format = mixed
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 1
配置文件說明:
server_id = 1:用於標識SQL語句最初從哪個server寫入,在集羣中server_id一定不能重複。
log-bin = mysql-bin :開啓bin-log 日誌
expire_logs_days = 7 :binlog日誌文件保留時間,超過保留時間會被自動刪除,默認爲0,沒有過期時間
binlog_format= mixed:指定mysql的binlog日誌的格式,mixed是混合模式。
relay-log:開啓中繼日誌功能
relay-log-index:中繼日誌清單
auto-increment-increment= 2:表示自增長字段每次遞增的量,其默認值是1。它的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,所以值設爲2。
auto-increment-offset= 1:用來設定數據庫中自動增長的起點(即初始值),因爲這兩能服務器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避免兩臺服務器數據同步時出現主鍵衝突。
注:另外還可以在my.cnf配置文件中,添加“binlog_do_db=數據庫名”配置項(可以添加多個)來指定要同步的數據庫。如果配置了這個配置項,如果沒添加在該配置項後面的數據庫,則binlog不記錄它的事件。
4.1.2 修改Mysql-02 /etc/my.cnf配置文件,紅色框中的內容一定不能相同
4.2 新增賬號並授予slave 權限,該賬號在配置從服務器同步時使用
4.2.1 Mysql-01 上新增賬號並授權
mysql>grant replication slave on *.* to 'admin01'@'192.168.64.152' identified by ' YouPasswd!'; 授權操作
mysql>flush privileges; 刷新權限
4.2.2 Mysql-02 上新增賬號並授權
mysql>grant replication slave on *.* to 'admin02'@'192.168.64.151' identified by ' YouPasswd '; 授權操作
mysql>flush privileges; 刷新權限
4.3 查看master 服務器上binlog日誌文件名和pos號
4.3.1 Mysql-01上操作
mysql>show master status\G;
4.3.2 Mysql-02上操作
mysql>show master status\G;
4.4 配置主從複製
因爲要搭建主主架構,需要配置Mysql-01 爲Mysql-02 的從服務器,和Mysql-02 爲Mysql-01的從服務器
4.4.1 配置Mysql-01 爲Mysql-02 的從服務器,在Mysql-01上進行操作
mysql> stop slave; #首先要關閉複製功能
mysql> change master to master_host='192.168.64.152', master_user='admin02', master_password=' YouPasswd ', master_log_file='mysql-bin.000005',master_log_pos=154; #這裏的文件名和pos號就是上面Mysql-02查到的具體內容
mysql> start slave; #再開啓複製功能
mysql> show slave status \G #查看複製功能狀態
注:Slave_IO_Runing和slave_SQL_Running這兩個都顯示yes,表示複製功能開啓正常,缺一不可。如果有出現NO的情況,首先要確認socket可以正常通信,然後再更改master_log_file、master_log_pos 的配置和master上查到的相同,一般都可以解決。
4.4.2 配置Mysql-02 爲Mysql-01 的從服務器,在Mysql-02上進行操作
mysql> stop slave;
mysql> change master to master_host='192.168.64.151', master_user='admin01', master_password=' YouPasswd ', master_log_file='mysql-bin.000006',master_log_pos=154; #這裏的文件名和pos號就是上面Mysql-01查到的具體內容
mysql> start slave;
mysql> show slave status \G
4.4.3 測試同步情況
查看現有數據庫情況
Mysql-01:
Mysql-02:
在Mysql-01上新建數據庫mysql_01,Mysql-02上新建數據庫mysql_02後,再次查看數據庫情況
Mysql-01:
Mysql-02:
數據同步正常
五、配置keepalived 高可用,以Mysql-01爲例,需要注意的地方有標註
5.1 安裝keepalived
#yum install keepalived –y
5.2 修改配置
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id mysql-01 # 在Mysql-02上配置時要改成mysql-02
}
vrrp_script check_mysqld {
script "/etc/keepalived/check_mysql.sh"
interval 2
weight -2
}
vrrp_instance VI_1 {
state BACKUP #都配置成BACKUP
interface ens33
virtual_router_id 51
priority 100 #在Mysql-02上配置時要改成99
advert_int 1
nopreempt #不搶佔模式,在優先級高的那臺設置此參數,在Mysql-02上配置時不需要添加此參數
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_mysqld
}
virtual_ipaddress {
192.168.64.170 dev ens33
}
smtp_alert #開啓VIP變換郵件報警,一定要開啓,否則收不到郵件
}
5.3 check_mysql.sh 腳本內容
#!/bin/bash
if [ "$(ps -ef | grep mysqld | grep -v grep)" == "" ]; then
systemctl restart mysqld.service
sleep 2
if [ "$(ps -ef | grep mysqld | grep -v grep)" == "" ]; then
systemctl stop keepalived
fi
fi
注:權限最好給到777
5.4 安裝配置postsfix,以Mysql-01爲例,Mysql-02上操作完全相同
keepalived默認報警調用了postsfix
# yum install postfix mail cyrus-sasl-* -y
5.4.1 修改postsfix配置文件 /etc/postfix/main.cf(postfix主要配置文件),
在其末尾添加以下內容
#指定默認的郵件發送服務器
relayhost = [smtp.yeah.net]:25
#激活sasl認證
smtp_sasl_auth_enable = yes
#指定sasl密碼配置文件
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
#非匿名登錄
smtp_sasl_security_options = noanonymous
#指定認證類型 (提示:需要yum安裝cyrus-sasl-*組件,否則發郵件時會報錯:no mechanism available)
smtp_sasl_type = cyrus
#linux用戶與發件人的對應關係配置文件
sender_canonical_maps = hash:/etc/postfix/sender_canonical
5.4.2 編輯 /etc/postfix/sasl_passwd(郵箱賬號和密碼文件,每行一個)
[smtp.yeah.net]:25 [email protected]: YouPasswd
5.4.3 編輯 /etc/postfix/sender_canonical(linux用戶和發件人對應關係,每行一個)
root [email protected]
5.4.4 創建好後需要使用postmap命令使配置文件生效
#postmap /etc/postfix/sasl_passwd
#postmap /etc/postfix/sender_canonical
5.4.5 重啓postfix
# systemctl restart postfix
5.4.6測試發送郵件
# echo 'ok' | mail -s test_postfix [email protected]
5.5 重啓keepalived,重點測試VIP和郵件報警是否正常
5.5.1重啓之前查看IP配置情況
5.5.2分別重啓keepalived,並加入開機自啓動
5.5.3 再次查看IP情況和郵件報警情況
Mysql-01(優先級高)
Mysql-02(優先級低)
報警郵件可以正常發送
可以進一步測試VIP漂移情況,這裏就不再測試。
至此mysql主主集羣+keepalived 配置全部完成,測試全部通過。
六、參考文檔
https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
https://www.2cto.com/database/201712/709263.html
https://www.cnblogs.com/alec1312/p/5815653.html