驗證雙主同步
執行步驟:在服務器1的mysql中新建數據庫-創建表-插入一條數據-到服務器2的mysql查看是否有同樣的記錄
keeplived實現高可用
倆臺服務器都安裝keeplived
服務器1配置keeplived.conf 和mysql的檢測腳本
global_defs { # {前一定要有空格!!!
? ? script_user root #執行腳本的用戶
? ? enable_script_security #開啟執行檢測腳本
? ? router_id 192.168.1.100 #唯一標識,一般用自己的主機ip
}
vrrp_script check_mysql {# {前一定要有空格!!! mysql檢測定義
? ? script "/etc/keepalived/check_mysql_pid.sh" ?# mysql檢測腳本位置
? ? interval 2 #每兩秒檢測一次mysql的運行狀態
}
vrrp_instance VI_1 {
? ? state BACKUP #因為要使用非搶占式,所以倆臺都設置為backup
? ? interface ens192 #網卡名稱
? ? virtual_router_id 55 ?#使用同一虛擬ip的這里要保持一致
? ? priority 150 #優先級,如果是非搶占式,就不會依據該值
? ? mcast_src_ip 192.168.1.100 #自己主機ip
? ? advert_int 1 #廣播間隔
? ? nopreempt #設置非搶占式
? ? authentication { #認證
? ? ? ? auth_type PASS
? ? ? ? auth_pass xxxxxxx
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.1.99 #虛擬的ip
? ? }
? ? track_script {
? ? ? ? check_mysql #執行mysql存活檢測腳本
? ? }
}
#!/bin/sh
if [ `netstat -npl | grep 3306 | wc -l` -eq 0 ]
then
? ? echo "${data} mysql proccess not found">>/etc/keepalived/keepalived.log
? ? service mysql start
? ? if [ `netstat -npl | grep 3306 | wc -l` -eq 0 ]
? ? then
? ? ? ? echo "${data} mysql start failed">>/etc/keepalived/keepalived.log
? ? ? ? systemctl stop keepalived
? ? else
? ? ? ? echo "${data} mysql start failed">>/etc/keepalived/keepalived.log
? ? ? ? systemctl restart keepalived
? ? fi
fi
服務器2的keepalived.conf
global_defs { # {前一定要有空格!!!
? ? script_user root #執行腳本的用戶
? ? enable_script_security #開啟執行檢測腳本
? ? router_id 192.168.1.101 #唯一標識,一般用自己的主機ip
}
vrrp_script check_mysql {# {前一定要有空格!!! mysql檢測定義
? ? script "/etc/keepalived/check_mysql_pid.sh" ?# mysql檢測腳本位置
? ? interval 2 #每兩秒檢測一次mysql的運行狀態
}
vrrp_instance VI_1 {
? ? state BACKUP #因為要使用非搶占式,所以倆臺都設置為backup
? ? interface ens192 #網卡名稱
? ? virtual_router_id 55 ?#使用同一虛擬ip的這里要保持一致
? ? priority 150 #優先級,如果是非搶占式,就不會依據該值
? ? mcast_src_ip 192.168.1.101 #自己主機ip
? ? advert_int 1 #廣播間隔
? ? nopreempt #設置非搶占式
? ? authentication { #認證
? ? ? ? auth_type PASS
? ? ? ? auth_pass xxxxxxx
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.1.99 #虛擬的ip
? ? }
? ? track_script {
? ? ? ? check_mysql #執行mysql存活檢測腳本
? ? }
}
驗證高可用操作
? ? systemctl stop mysqld 在服務器1上面操作
通過命令停掉服務器1上的mysql,再去用IP a查看vip是否已經飄到服務器2上,可以在服務器1上的/etc/keepalived/keepalived.log查看到keepalived無法發現mysql并且啟動mysql成功的記錄;
? ? systemctl stop mysqld 在服務器2上面操作
同樣可以看到,IP又飄回到服務器1上面,一切如預期那樣
遇到的問題
mysql連接錯誤次數過多
在開啟同步,利用同步賬號進行互相連接時由于創建的賬號和使用同步的賬號不一致造成,倆臺服務器間數據庫的連接頻繁報錯,觸發了mysql的保護機制,開啟了拒絕連接。
通過修改正確的數據庫用戶和利用flush hosts刷新mysql的主機表來清除主機連接記錄關閉拒絕連接
Public Key Retrieval is not allowed
導致“Public Key Retrieval is not allowed”主要是由于當禁用SSL/TLS協議傳輸后,客戶端會使用服務器的公鑰進行傳輸,默認情況下客戶端不會主動去找服務器拿公鑰,此時就會出現上述錯誤。
經過查閱官方文檔,出現Public Key Retrieval的場景可以概括為在禁用SSL/TLS協議傳輸且當前用戶在服務器端沒有登錄緩存的情況下,客戶端沒有辦法拿到服務器的公鑰。具體的場景如下:
? ? 新建數據庫用戶,首次登錄;
? ? 數據庫的用戶名、密碼發生改變后登錄;
? ? 服務器端調用FLUSH PRIVELEGES指令刷新服務器緩存。
針對上述錯誤,有如下的解決方案:
? ? 在條件允許的情況下,不要禁用SSL/TLS協議,即不要在CLI客戶端使用–ssl-mode=disabled,或在JDBC連接串中加入useSSL=false;
? ? 如果必須禁用SSL/TLS協議,則可以嘗試使用CLI客戶端登錄一次MySQL數據庫制造登錄緩存;
? ? 如果必須禁用SSL/TLS協議,則可以通過增加如下參數允許客戶端獲得服務器的公鑰:
? ? 在JDBC連接串中加入allowPublicKeyRetrieval=true參數;
? ? 在CLI客戶端連接時加入–get-server-public-key參數;
? ? 在CLI客戶端連接時加入–server-public-key-path=file_name參數,指定存放在本地的公鑰文件。
導出導入數據
#導出時,需要關閉標記GTID
#導出某個庫的所有表結構和數據(-d 這個參數可以不導出數據)
mysqldump -h ip -u username -p ?--set-gtid-purged=OFF --column-statistics=0 databasename ?>/保存的文件路徑/文件名.sql
?
#導入時,需要先創建數據庫,進入數據庫后執行命令
source /保存的文件路徑/文件名.sql
?
?
?