mysql主從備份+keepalived自動切換


數據庫這一層需要做到避免單點故障可以是主從備份和主主備份,主主備份可能有性能損耗和數據同步的問題。這里記錄下主從備份,

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的自動切換,這里也就是 說說還沒做過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM