數據庫這一層需要做到避免單點故障可以是主從備份和主主備份,主主備份可能有性能損耗和數據同步的問題。這里記錄下主從備份,
mysql進行備份之前確保mysql的版本是一樣的,我這里用的都是mysql5.7.18
1、原文博客地址:http://qizhanming.com/blog/2017/06/20/how-to-config-mysql-57-master-slave-replication-on-centos-7
這篇博客已經寫的很好了,不再記錄了。
mysql備份好了以后,操作主mysql上面的數據可以看到從數據庫的數據實時同步的。
2、那問題來了,如果在項目中主mysql掛了,我們是要手動切換msyql嗎,這樣會比較麻煩的,而且這段時間項目是不能用的。這里用keepalived實現IP的vip漂移,
keepalived就是一個軟件,在主mysql和從mysql上面都安裝后,會有一個虛擬IP在其中的一台服務器上面,如果這台服務器宕機了,這個IP就會出現在另一台服務器上面,這是keepalived的功能,能夠判斷是否可用和權重大小,然后自動漂移IP,這個IP是虛擬IP,我們可以自己隨意設置,不過要跟主,從mysql的IP在同一個網段,雲服務器好像需要再設置下默認是關閉的,如果是主機是可以直接用的。
1、安裝keepalived
# yum install keepalived –y
2、備份keepalived.conf
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.back
3、編輯keepalived.conf
global_defs {
notification_email{
xxx@qq.com
}
notification_email_from waterlufei123@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KeepAlive_Mysql
}
vrrp_script vs_mysql_82 {
script "/etc/keepalived/checkMySQL.sh"
interval 60
}
vrrp_instance VI_82 {
state BACKUP
nopreempt
interface eth1
virtual_router_id 82
priority 100
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
vs_mysql_82
}
virtual_ipaddress {
192.168.108.156/24 brd 192.168.108.255 dev eth1 label eth1:1
}
}
virtual_server 192.168.108.156 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.108.146 3306 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
其中/etc/keepalived/checkMySQL.sh需要新建,內容為:
echo "enter mysql_check.sh" >> /etc/keepalived/check_mysql.log
MYSQL=/usr/bin/mysql
MYSQL_HOST=127.0.0.1
MYSQL_USER=user
MYSQL_PASSWORD=password
MYSQL_PORT=3306
# 日志文件
LOG_FILE=/etc/keepalived/check_mysql.log
# 檢查次數
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -P${MYSQL_PORT} -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
#echo `date --date=today +"%Y-%M-%d %H:%m:%S"` - [INFO] - mysql available: success[$MYSQL_OK] >> $LOG_FILE
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
/etc/init.d/keepalived stop
echo `date --date=today +"%Y-%M-%d %H:%m:%S"` - [INFO] - mysql invaild. keepalived stop. >> $LOG_FILE
exit 1
fi
sleep 1
done
添加執行權限:
shell > chmod +x /etc/keepalived/checkMySQL.sh
手動執行下這個腳本,看看返回是否是0,如果是1,請檢查mysql連不上的原因:
shell > /etc/keepalived/checkMySQL.sh
shell > echo $?
從庫的keepalived.conf為:
global_defs {
notification_email{
1163804452@qq.com
}
notification_email_from waterlufei123@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KeepAlive_Mysql
}
vrrp_script vs_mysql_82 {
script "/etc/keepalived/checkMySQL.sh"
interval 60
}
vrrp_instance VI_82 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 82
priority 90
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
vs_mysql_82
}
virtual_ipaddress {
192.168.108.156/24 brd 192.168.108.255 dev eth0 label eth0:1
}
}
virtual_server 192.168.108.156 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.108.145 3306 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
/etc/keepalived/checkMySQL.sh文件一樣。
然后主從服務器都啟動keepalived:
shell > service keepalived start
shell > chkconfig keepalived on
查看虛擬VIP
# ip addr
連接數據庫IP是192.168.108.156,當從庫壞了以后不應該主庫,當主庫壞了以后,VIP會漂移到145上,當我們繼續訪問192.168.108.156時,實際訪問的是145上的數據庫
總的來說就是keepalived可以實現生成虛擬IP的功能,但是已什么為條件生成轉移VIP呢?所以這里就加了checkMySQL.sh配置文件,根據mysql的狀態漂移vip,然后呢,然后這里keepalived還可以用到其他地方,例如nginx,然后弄一個checkNginx.conf之類的,實現nginx的自動切換,這里也就是 說說還沒做過
