mysql雙機熱備以及使用keepalived實現mysql雙主高可用
根據蒐集的資料安裝測試並在安裝測試過程中整理的文件,部分參考文件在相應位置有標記。如有不足希望不吝賜教。
mysql雙機熱備的方式有兩種:
- 主-從伺服器雙機熱備
- 主-主伺服器雙機熱備
下文以主-主伺服器雙機熱備為例,主-從配置類似。
兩臺centos7,ip分別為:
172.17.1.136
172.17.3.134
目錄
一、安裝mysql
本步驟兩臺主機都要執行一遍。兩臺主機都要安裝,mysql安裝見《CentOS7安裝mysql8.0.12》或自行搜尋。
安裝完成後使用命令登入,密碼為自己配置的密碼:
mysql -uroot -p
建立一個測試資料庫:
CREATE DATABASE `test`;
使用test庫(use test;)建立一個測試空表:
create table tb_mobile( mobile VARCHAR(20) comment'手機號碼', time timestamp DEFAULT now() comment'時間' );
注意:網上資料中提到 配置之前要保證兩個mysql資料一致,但因為本次配置兩臺mysql都為全新安裝,因此未測試。
二、伺服器配置
1.建立同步使用者
使用mysql庫,
use mysql
然後分別為另一主機建立一個連結使用者,該帳戶必須授予REPLICATION SLAVE許可權,因為mysql8在授權語句中不能出現IDENTIFIED BY ‘password’;,因此建立使用者和授予許可權需要分開執行:
1) 在136上執行建立使用者並賦權:
CREATE USER 'replicate'@'172.17.3.134' IDENTIFIED WITH 'mysql_native_password' BY '[email protected]';
因為mysql8的許可權驗證機制改變,因此在使用下面的命令建立使用者時會有異常提示
create user 'replicate'@'172.17.3.134' identified by '[email protected]';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'172.17.3.134';
2) 在134上執行:
CREATE USER 'replicate'@'172.17.1.136' IDENTIFIED WITH 'mysql_native_password' BY '[email protected]';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'172.17.1.136';
【注意】對使用者做了許可權變更之後,一定記得重新載入一下許可權,將許可權資訊從記憶體中寫入資料庫。
flush privileges;
建立完成後我們可以通過使用對方主機對本機資料庫進行訪問,看下是否能連結成功【注意:連結對方主機時需要先退出本機mysql或者開啟新的終端】:
mysql -h172.17.3.134 -ureplicate [email protected]
mysql -h172.17.1.136 -ureplicate [email protected]
如果登入成功,則可以對兩臺伺服器進行雙機熱備操作。
2.修改mysql配置檔案
安裝mysql後會在/etc/目錄下生成一個my.cnf配置檔案(如果沒有可以從/usr/share/mysql目錄下複製一份:cp /usr/share/mysql/my-medium.cnf /etc/my.cnf),找到配置檔案後編輯(vim /etc/my.cnf),在[mysqld]中新增(修改)如下內容:
1)172.17.1.136主機
server-id=1 # 唯一id
innodb_flush_log_at_trx_commit=2 # 預設為1
log-bin=mysql-bin-1 #binlog日誌檔名(可以任意命名)
#binlog-do-db=test # 記錄日誌的資料庫(如果沒有此項,表示同步所有的庫)
binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不記錄日誌的資料庫
sync_binlog=1 #開啟binlog日誌同步功能
slave_skip_errors=1146 # 跳過1146錯誤
2)172.17.3.134主機
server-id=2 # 唯一id
innodb_flush_log_at_trx_commit=2 # 預設為1
log-bin=mysql-bin-2 #binlog日誌檔名(可以任意命名)
#binlog-do-db=test # 記錄日誌的資料庫
binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不記錄日誌的資料庫
sync_binlog=1 #開啟binlog日誌同步功能
slave_skip_errors=1146 # 跳過1146錯誤
三、重啟並配置同步
1.重啟兩臺主機上的mysql
兩臺主機分別執行:
systemctl restart mysqld
或者
service mysqld restart
2.檢視兩個伺服器作為主伺服器的狀態
show master status\G
3.用change mster 語句指定同步位置
進入mysql操作介面(mysql -uroot -p),先執行如下指令:
unlock tables;
否則在執行stop slave;時會報如下異常:ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction。
1)172.17.1.136主機
先停步slave服務執行緒,這個是很重要的,如果不這樣做會造成以下操作不成功。
stop slave;
然後:
change master to
master_host='172.17.3.134',master_user='replicate',master_password='[email protected]',
master_log_file='mysql-bin-2.000001',master_log_pos=749;
分別在伺服器上重啟從服務執行緒:
start slave;
2)172.17.3.134主機
先停步slave服務執行緒,這個是很重要的,如果不這樣做會造成以下操作不成功。
stop slave;
然後:
change master to
master_host='172.17.1.136',master_user='replicate',master_password='[email protected]',
master_log_file='mysql-bin-1.000001',master_log_pos=749;
分別在伺服器上重啟從服務執行緒:
start slave;
4.檢視從伺服器狀態
show slave status\G
如果如下兩項狀態為yes則說明配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
四、驗證
在兩臺主機的mysql中插入/刪除資料等操作,另一臺會自動將操作同步。
五、配置keepalived實現mysql雙主高可用
上面的配置已經可以實現mysql雙擊熱備,兩臺主機分別對外提供服務,如果服務連結某一臺主機mysql故障,不能自動切換到另一臺主機實現高可用,如果此可以滿足需要或者不用切換,則可以不繼續進行配置。下面將配置keepalived實現其高可用。
1.下載安裝keepalived
安裝位置:/usr/local/ cd /usr/local/
使用下面命令下載並解壓:
wget http://www.keepalived.org/software/keepalived-2.0.6.tar.gz
tar -xzvf keepalived-2.0.6.tar.gz -C keepalived
在安裝之前需要使用下面命令安裝相關依賴:
yum -y install curl gcc openssl-devel libnl3-devel net-snmp-devel
yum -y install libnfnetlink-devel
yum -y install ipvsadm
然後安裝keepalived:
cd keepalived
./configure
make && make install
PS:編譯時出現問題(異常),根據異常資訊進行相應的修改,如果出現缺少xx-devel等資訊,安裝xx-devel即可,其他請根據異常資訊決定如果操作。
編譯安裝後,會根據系統環境,生成啟動指令碼,如下:
cat /usr/lib/systemd/system/keepalived.service
將keepalved加進系統服務並且在/etc/sysconfig/寫入配置檔案以及將keepalived命令加進/usr/bin 和 /usr/sbin(下面命令中註釋在使用中忽略):
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/keepalived #最好檢視下keeplaived是否有執行許可權
mkdir /etc/keepalived/
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/bin/ #方便以後檢視keepalived的版本,用keepalived -v可以檢視
cp /usr/local/sbin/keepalived /usr/sbin/
拷貝完成後修改配置檔案:
vim /etc/keepalived/keepalived.conf
以下是配置的內容,根據實際修改,不可直接複製
1)172.17.1.136主機
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt #不搶佔模式,只有優先順序高的機器上設定即可,優先順序低的機器可不設定
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.3.210
}
}
virtual_server 172.17.3.210 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60 #會話保持時間
protocol TCP
real_server 172.17.1.136 3306 {
weight 3
notify_down /root/shutdown.sh #檢測到服務down後執行的指令碼
TCP_CHECK {
nb_get_retry 3 #重連次數
connect_timeout 10 #連線超時時間
delay_before_retry 3 #重連間隔時間
connect_port 3306 #健康檢查埠
}
}
}
2)172.17.3.134主機
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 標識本節點的字條串,通常為hostname
vrrp_skip_check_adv_addr
#vrrp_strict #這個最好註釋掉,否則可能造成物理機的瀏覽器無法訪問應用
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
#state MASTER
state BACKUP
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # Block limited to 20 IP addresses @IP
172.17.3.210
}
}
#虛擬伺服器定義塊
virtual_server 172.17.3.210 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 172.17.3.134 {
weight 3
notify_down /root/shutdown.sh
TCP_CHECK {
nb_get_retry 3 #重連次數
connect_timeout 10 #連線超時時間
delay_before_retry 3 #重連間隔時間
connect_port 3306 #健康檢查埠
}
}
}
編寫檢測服務down後所要執行的指令碼shutdown.sh:
vim /root/shtdown.sh
內容為
#!/bin/bash
killall keepalive
注:此指令碼是上面配置檔案notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server的服務狀態,當發現real_server服務故障時,便觸發此指令碼;我們可以看到,指令碼就一個命令,通過killall keepalived強制殺死keepalived程序,從而實現了MySQL故障自動轉移。另外,我們不用擔心兩個MySQL會同時提供資料更新操作,因為每臺MySQL上的keepalived的配置裡面只有本機MySQL的IP+VIP,而不是兩臺MySQL的IP+VIP
2.啟動keepalived並檢視日誌
chkconfig keepalived on
service keepalived start #啟動服務
service keepalived stop #停止服務
service keepalived restart #重啟服務
systemctl enable keepalived.service #設定開機啟動
啟動後檢視日誌:
tail -f /var/log/messages
3.測試
在遠端客戶端通過vip登陸測試
mysql -h 172.17.3.210 -uroot -p
4.其他
1)修改日誌位置
修改日誌檔案存放位置/var/log/keepalived/keepalived.log
echo 'local0.* /var/log/keepalived/keepalived.log' >>/etc/rsyslog.conf
重啟日誌服務
systemctl restart rsyslog
2)keepalived配置引數
全域性定義塊
1、email通知(notification_email、smtp_server、smtp_connect_timeout):用於服務有故障時傳送郵件報警,可選項,不建議用。需要系統開啟sendmail服務,建議用第三獨立監控服務,如用nagios全面監控代替。
2、lvs_id:lvs負載均衡器標識,在一個網路內,它的值應該是唯一的。
3、router_id:使用者標識本節點的名稱,通常為hostname
4、花括號{}:用來分隔定義塊,必須成對出現。如果寫漏了,keepalived執行時不會得到預期的結果。由於定義塊存在巢狀關係,因此很容易遺漏結尾處的花括號,這點需要特別注意。
VRRP例項定義塊
vrrp_sync_group:同步vrrp級,用於確定失敗切換(FailOver)包含的路由例項個數。即在有2個負載均衡器的場景,一旦某個負載均衡器失效,需要自動切換到另外一個負載均衡器的例項是哪
group:至少要包含一個vrrp例項,vrrp例項名稱必須和vrrp_instance定義的一致
vrrp_instance:vrrp例項名
1> state:例項狀態,只有MASTER 和 BACKUP兩種狀態,並且需要全部大寫。搶佔模式下,其中MASTER為工作狀態,BACKUP為備用狀態。當MASTER所在的伺服器失效時,BACKUP所在的服務會自動把它的狀態由BACKUP切換到MASTER狀態。當失效的MASTER所在的服務恢復時,BACKUP從MASTER恢復到BACKUP狀態。
2> interface:對外提供服務的網絡卡介面,即VIP繫結的網絡卡介面。如:eth0,eth1。當前主流的伺服器都有2個或2個以上的介面(分別對應外網和內網),在選擇網絡卡介面時,一定要核實清楚。
3> mcast_src_ip:本機IP地址
4> virtual_router_id:虛擬路由的ID號,每個節點設定必須一樣,可選擇IP最後一段使用,相同的 VRID 為一個組,他將決定多播的 MAC 地址。
5> priority:節點優先順序,取值範圍0~254,MASTER要比BACKUP高
6> advert_int:MASTER與BACKUP節點間同步檢查的時間間隔,單位為秒
7> lvs_sync_daemon_inteface:負載均衡器之間的監控介面,類似於 HA HeartBeat 的心跳線。但它的機制優於 Heartbeat,因為它沒有“裂腦”這個問題,它是以優先順序這個機制來規避這個麻煩的。在 DR 模式中,lvs_sync_daemon_inteface與服務介面interface使用同一個網路介面
8> authentication:驗證型別和驗證密碼。型別主要有 PASS、AH 兩種,通常使用PASS型別,據說AH使用時有問題。驗證密碼為明文,同一vrrp 例項MASTER與BACKUP使用相同的密碼才能正常通訊。
9> smtp_alert:有故障時是否啟用郵件通知
10> nopreempt:禁止搶佔服務。預設情況,當MASTER服務掛掉之後,BACKUP自動升級為MASTER並接替它的任務,當MASTER服務恢復後,升級為MASTER的BACKUP服務又自動降為BACKUP,把工作權交給原MASTER。當配置了nopreempt,MASTER從掛掉到恢復,不再將服務搶佔過來。
11> virtual_ipaddress:虛擬IP地址池,可以有多個IP,每個IP佔一行,不需要指定子網掩碼。注意:這個IP必須與我們的設定的vip保持一致。
虛擬伺服器virtual_server定義塊
virtual_server:定義一個虛擬伺服器,這個ip是virtual_ipaddress中定義的其中一個,後面一個空格,然後加上虛擬服務的埠號。
1> delay_loop:健康檢查時間間隔,單位:秒
2> lb_algo:負載均衡排程演算法,網際網路應用常用方式為wlc或rr
3> lb_kind:負載均衡轉發規則。包括DR、NAT、TUN 3種,一般使用路由(DR)轉發規則。
4> persistence_timeout:http服務會話保持時間,單位:秒
5> protocol:轉發協議,分為TCP和UDP兩種
real_server:真實伺服器IP和埠,可以定義多個
1> weight:負載權重,值越大,轉發的優先順序越高
2> notify_down:服務停止後執行的指令碼
3> TCP_CHECK:服務有效性檢測
* connect_port:服務連線埠
* connect_timeout:服務連線超時時長,單位:秒
* nb_get_retry:服務連線失敗重試次數
* delay_before_retry:重試連線間隔,單位:秒