數據庫這一層須要作到避免單點故障能夠是主從備份和主主備份,主主備份可能有性能損耗和數據同步的問題。這裏記錄下主從備份,mysql
mysql進行備份以前確保mysql的版本是同樣的,我這裏用的都是mysql5.7.18nginx
一、原文博客地址:http://qizhanming.com/blog/2017/06/20/how-to-config-mysql-57-master-slave-replication-on-centos-7sql
這篇博客已經寫的很好了,再也不記錄了。shell
mysql備份好了之後,操做主mysql上面的數據能夠看到從數據庫的數據實時同步的。數據庫
二、那問題來了,若是在項目中主mysql掛了,咱們是要手動切換msyql嗎,這樣會比較麻煩的,並且這段時間項目是不能用的。這裏用keepalived實現IP的vip漂移,centos
keepalived就是一個軟件,在主mysql和從mysql上面都安裝後,會有一個虛擬IP在其中的一臺服務器上面,若是這臺服務器宕機了,這個IP就會出如今另外一臺服務器上面,這是keepalived的功能,可以判斷是否可用和權重大小,而後自動漂移IP,這個IP是虛擬IP,咱們能夠本身隨意設置,不過要跟主,從mysql的IP在同一個網段,雲服務器好像須要再設置下默認是關閉的,若是是主機是能夠直接用的。服務器
一、安裝keepalived
# yum install keepalived –y
二、備份keepalived.conf
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.back
三、編輯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=1oop
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的自動切換,這裏也就是 說說還沒作過