一、環境說明
作業系統: 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 '; 授權操作
4.3 檢視master 伺服器上binlog日志檔案名和pos号
4.3.1 Mysql-01上操作
mysql>show master status\G;
4.3.2 Mysql-02上操作
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後,再次檢視資料庫情況
資料同步正常
五、配置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
http://blog.51cto.com/zpf666/1913822
http://blog.51cto.com/6764097/1954158