自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用keepalived構(gòu)建高可用MySQL-HA

原創(chuàng)
數(shù)據(jù)庫(kù) MySQL
今天我們將介紹利用keepalived構(gòu)建高可用MySQL-HA,保證兩臺(tái)MySQL數(shù)據(jù)的一致性,然后用keepalived實(shí)現(xiàn)虛擬IP,通過(guò)keepalived自帶的服務(wù)監(jiān)控功能來(lái)實(shí)現(xiàn)MySQL故障時(shí)自動(dòng)切換。

關(guān)于MySQL-HA,目前有多種解決方案,比如heartbeat、drbd、mmm、共享存儲(chǔ),但是它們各有優(yōu)缺點(diǎn)。heartbeat、drbd配置較為復(fù)雜,需要自己寫腳本才能實(shí)現(xiàn)MySQL自動(dòng)切換,對(duì)于不會(huì)腳本語(yǔ)言的人來(lái)說(shuō),這無(wú)疑是一種腦裂問(wèn)題;對(duì)于mmm,生產(chǎn)環(huán)境中很少有人用,且mmm 管理端需要單獨(dú)運(yùn)行一臺(tái)服務(wù)器上,要是想實(shí)現(xiàn)高可用,就得對(duì)mmm管理端做HA,這樣無(wú)疑又增加了硬件開(kāi)支;對(duì)于共享存儲(chǔ),個(gè)人覺(jué)得MySQL數(shù)據(jù)還是放在本地較為安全,存儲(chǔ)設(shè)備畢竟存在單點(diǎn)隱患。使用MySQL雙master+keepalived是一種非常好的解決方案,在MySQL-HA環(huán)境中,MySQL互為主從關(guān)系,這樣就保證了兩臺(tái)MySQL數(shù)據(jù)的一致性,然后用keepalived實(shí)現(xiàn)虛擬IP,通過(guò)keepalived自帶的服務(wù)監(jiān)控功能來(lái)實(shí)現(xiàn)MySQL故障時(shí)自動(dòng)切換。

下面,我把即將上線的一個(gè)生產(chǎn)環(huán)境中的架構(gòu)與大家分享一下,看一下這個(gè)架構(gòu)中,MySQL-HA是如何實(shí)現(xiàn)的,環(huán)境拓?fù)淙缦?/p>

  1. MySQL-VIP:192.168.1.200  
  2. MySQL-master1:192.168.1.201  
  3. MySQL-master2:192.168.1.202  
  4.  
  5. OS版本:CentOS 5.4  
  6. MySQL版本:5.0.89  
  7. Keepalived版本:1.1.20 

一、MySQL master-master配置

1、修改MySQL配置文件

兩臺(tái)MySQL均如要開(kāi)啟binlog日志功能,開(kāi)啟方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項(xiàng)

兩臺(tái)MySQL的server-ID不能一樣,默認(rèn)情況下兩臺(tái)MySQL的serverID都是1,需將其中一臺(tái)修改為2即可

2、將192.168.1.201設(shè)為192.168.1.202的主服務(wù)器

在192.168.1.201上新建授權(quán)用戶

  1. MySQL> grant replication slave on *.* to 'replication'@'%' identified by 'replication';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.  
  4. MySQL> show master status;  
  5. +------------------+----------+--------------+------------------+  
  6. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  7. +------------------+----------+--------------+------------------+  
  8. | MySQL-bin.000003 |      374 |              |                  |   
  9. +------------------+----------+--------------+------------------+  
  10. 1 row in set (0.00 sec) 

在192.168.1.202上將192.168.1.201設(shè)為自己的主服務(wù)器

  1. MySQL> change master to master_host='192.168.1.201',master_user='replication',master_password='replication',master_log_file='MySQL-bin.000003',master_log_pos=374;  
  2. Query OK, 0 rows affected (0.05 sec)  
  3.  
  4. MySQL> start slave;  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.  
  7. MySQL> show slave status\G  
  8. *************************** 1. row ***************************  
  9.              Slave_IO_State: Waiting for master to send event  
  10.                 Master_Host: 192.168.1.201  
  11.                 Master_User: replication  
  12.                 Master_Port: 3306  
  13.               Connect_Retry: 60  
  14.             Master_Log_File: MySQL-bin.000003  
  15.         Read_Master_Log_Pos: 374  
  16.              Relay_Log_File: MySQL-master2-relay-bin.000002  
  17.               Relay_Log_Pos: 235  
  18.       Relay_Master_Log_File: MySQL-bin.000003  
  19.            Slave_IO_Running: Yes  
  20.           Slave_SQL_Running: Yes  
  21.             Replicate_Do_DB:   
  22.         Replicate_Ignore_DB:   
  23.          Replicate_Do_Table:   
  24.      Replicate_Ignore_Table:   
  25.     Replicate_Wild_Do_Table:   
  26. Replicate_Wild_Ignore_Table:   
  27.                  Last_Errno: 0  
  28.                  Last_Error:   
  29.                Skip_Counter: 0  
  30.         Exec_Master_Log_Pos: 374  
  31.             Relay_Log_Space: 235  
  32.             Until_Condition: None  
  33.              Until_Log_File:   
  34.               Until_Log_Pos: 0  
  35.          Master_SSL_Allowed: No  
  36.          Master_SSL_CA_File:   
  37.          Master_SSL_CA_Path:   
  38.             Master_SSL_Cert:   
  39.           Master_SSL_Cipher:   
  40.              Master_SSL_Key:   
  41.       Seconds_Behind_Master: 0  
  42. 1 row in set (0.00 sec) 

3、將192.168.1.202設(shè)為192.168.1.201的主服務(wù)器

在192.168.1.202上新建授權(quán)用戶

  1. MySQL> grant replication slave on *.* to 'replication'@'%' identified by 'replication';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.  
  4. MySQL> show master status;  
  5. +------------------+----------+--------------+------------------+  
  6. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  7. +------------------+----------+--------------+------------------+  
  8. | MySQL-bin.000003 |      374 |              |                  |   
  9. +------------------+----------+--------------+------------------+  
  10. 1 row in set (0.00 sec) 

在192.168.1.201上,將192.168.1.202設(shè)為自己的主服務(wù)器

  1. MySQL> change master to master_host='192.168.1.202',master_user='replication',master_password='replication',master_log_file='MySQL-bin.000003',master_log_pos=374;  
  2. Query OK, 0 rows affected (0.05 sec)  
  3.  
  4. MySQL> start slave;  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.  
  7. MySQL> show slave status\G  
  8. *************************** 1. row ***************************  
  9.              Slave_IO_State: Waiting for master to send event  
  10.                 Master_Host: 192.168.1.202  
  11.                 Master_User: replication  
  12.                 Master_Port: 3306  
  13.               Connect_Retry: 60  
  14.             Master_Log_File: MySQL-bin.000003  
  15.         Read_Master_Log_Pos: 374  
  16.              Relay_Log_File: MySQL-master1-relay-bin.000002  
  17.               Relay_Log_Pos: 235  
  18.       Relay_Master_Log_File: MySQL-bin.000003  
  19.            Slave_IO_Running: Yes  
  20.           Slave_SQL_Running: Yes  
  21.             Replicate_Do_DB:   
  22.         Replicate_Ignore_DB:   
  23.          Replicate_Do_Table:   
  24.      Replicate_Ignore_Table:   
  25.     Replicate_Wild_Do_Table:   
  26. Replicate_Wild_Ignore_Table:   
  27.                  Last_Errno: 0  
  28.                  Last_Error:   
  29.                Skip_Counter: 0  
  30.         Exec_Master_Log_Pos: 374  
  31.             Relay_Log_Space: 235  
  32.             Until_Condition: None  
  33.              Until_Log_File:   
  34.               Until_Log_Pos: 0  
  35.          Master_SSL_Allowed: No 
  36.          Master_SSL_CA_File:   
  37.          Master_SSL_CA_Path:   
  38.             Master_SSL_Cert:   
  39.           Master_SSL_Cipher:   
  40.              Master_SSL_Key:   
  41.       Seconds_Behind_Master: 0  
  42. 1 row in set (0.00 sec) 

4、MySQL同步測(cè)試

如上述均正確配置,現(xiàn)在任何一臺(tái)MySQL上更新數(shù)據(jù)都會(huì)同步到另一臺(tái)MySQL,MySQL同步在此不再演示

二、keepalived安裝及配置

1、192.168.1.201服務(wù)器上keepalived安裝及配置

安裝keepalived

  1. #tar zxvf keepalived-1.1.20.tar.gz  
  2. #cd keepalived-1.1.20  
  3. #./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686  
  4. #make && make install 

配置keepalived

我們自己在新建一個(gè)配置文件,默認(rèn)情況下keepalived啟動(dòng)時(shí)會(huì)去/etc/keepalived目錄下找配置文件

  1. #mkdir /etc/keepalived  
  2. #vi /etc/keepalived/keepalived.conf  
  3. ! Configuration File for keepalived  
  4. global_defs {  
  5.      notification_email {  
  6.      luwenju@live.cn  
  7.      }  
  8.      notification_email_from luwenju@live.cn  
  9.      smtp_server 127.0.0.1  
  10.      smtp_connect_timeout 30  
  11.      router_id MySQL-ha  
  12.      }  
  13.  
  14. vrrp_instance VI_1 {  
  15.      state BACKUP   #兩臺(tái)配置此處均是BACKUP  
  16.      interface eth0  
  17.      virtual_router_id 51  
  18.      priority 100   #優(yōu)先級(jí),另一臺(tái)改為90  
  19.      advert_int 1  
  20.      nopreempt  #不搶占,只在優(yōu)先級(jí)高的機(jī)器上設(shè)置即可,優(yōu)先級(jí)低的機(jī)器不設(shè)置  
  21.      authentication {  
  22.      auth_type PASS  
  23.      auth_pass 1111  
  24.      }  
  25.      virtual_ipaddress {  
  26.      192.168.1.200  
  27.      }  
  28.      }  
  29.  
  30. virtual_server 192.168.1.200 3306 {  
  31.      delay_loop 2   #每個(gè)2秒檢查一次real_server狀態(tài)  
  32.      lb_algo wrr   #LVS算法  
  33.      lb_kind DR    #LVS模式  
  34.      persistence_timeout 60   #會(huì)話保持時(shí)間  
  35.      protocol TCP  
  36.      real_server 192.168.1.201 3306 {  
  37.      weight 3  
  38.      notify_down /usr/local/MySQL/bin/MySQL.sh  #檢測(cè)到服務(wù)down后執(zhí)行的腳本  
  39.      TCP_CHECK {  
  40.      connect_timeout 10    #連接超時(shí)時(shí)間  
  41.      nb_get_retry 3       #重連次數(shù)  
  42.      delay_before_retry 3   #重連間隔時(shí)間  
  43.      connect_port 3306   #健康檢查端口  
  44.      }  
  45.      } 

編寫檢測(cè)服務(wù)down后所要執(zhí)行的腳本

  1. #vi /usr/local/MySQL/bin/MySQL.sh  
  2. #!/bin/sh  
  3. pkill keepalived  
  4. #chmod +x /usr/local/MySQL/bin/MySQL.sh 

注:此腳本是上面配置文件notify_down選項(xiàng)所用到的,keepalived使用notify_down選項(xiàng)來(lái)檢查real_server的服務(wù)狀態(tài),當(dāng)發(fā)現(xiàn)real_server服務(wù)故障時(shí),便觸發(fā)此腳本;我們可以看到,腳本就一個(gè)命令,通過(guò)pkill keepalived強(qiáng)制殺死keepalived進(jìn)程,從而實(shí)現(xiàn)了MySQL故障自動(dòng)轉(zhuǎn)移。另外,我們不用擔(dān)心兩個(gè)MySQL會(huì)同時(shí)提供數(shù)據(jù)更新操作,因?yàn)槊颗_(tái)MySQL上的keepalived的配置里面只有本機(jī)MySQL的IP+VIP,而不是兩臺(tái)MySQL的IP+VIP

啟動(dòng)keepalived

  1. #/usr/local/keepalived/sbin/keepalived –D  
  2. #ps -aux | grep keepalived 

測(cè)試

找一臺(tái)局域網(wǎng)PC,然后去ping  MySQL的VIP,這時(shí)候MySQL的VIP是可以ping的通的

停止MySQL服務(wù),看keepalived健康檢查程序是否會(huì)觸發(fā)我們編寫的腳本

2、192.168.1.202上keepalived安裝及配置

安裝keepalived

  1. #tar zxvf keepalived-1.1.20.tar.gz  
  2. #cd keepalived-1.1.20  
  3. #./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686  
  4. #make && make install 

配置keepalived

這臺(tái)配置和上面基本一樣,但有三個(gè)地方不同:優(yōu)先級(jí)為90、無(wú)搶占設(shè)置、real_server為本機(jī)IP

  1. #mkdir /etc/keepalived  
  2. #vi /etc/keepalived/keepalived.conf  
  3. ! Configuration File for keepalived  
  4. global_defs {  
  5.      notification_email {  
  6.      luwenju@live.cn  
  7.      }  
  8.      notification_email_from luwenju@live.cn  
  9.      smtp_server 127.0.0.1  
  10.      smtp_connect_timeout 30  
  11.      router_id MySQL-ha  
  12.      }  
  13.  
  14. vrrp_instance VI_1 {  
  15.      state BACKUP  
  16.      interface eth0  
  17.      virtual_router_id 51  
  18.      priority 90  
  19.      advert_int 1  
  20.      authentication {  
  21.      auth_type PASS  
  22.      auth_pass 1111  
  23.      }  
  24.      virtual_ipaddress {  
  25.      192.168.1.200  
  26.      }  
  27.      }  
  28.  
  29. virtual_server 192.168.1.200 3306 {  
  30.      delay_loop 2  
  31.      lb_algo wrr  
  32.      lb_kind DR  
  33.      persistence_timeout 60  
  34.      protocol TCP  
  35.      real_server 192.168.1.202 3306 {  
  36.      weight 3  
  37.      notify_down /usr/local/MySQL/bin/MySQL.sh  
  38.      TCP_CHECK {  
  39.      connect_timeout 10  
  40.      nb_get_retry 3  
  41.      delay_before_retry 3  
  42.      connect_port 3306  
  43.      }  
  44.      } 

編寫檢測(cè)服務(wù)down后所要執(zhí)行的腳本

  1. #vi /usr/local/MySQL/bin/MySQL.sh  
  2. #!/bin/sh  
  3. pkill keepalived  
  4. #chmod +x /usr/local/MySQL/bin/MySQL.sh  
  5.  
  6. 啟動(dòng)keepalived  
  7. #/usr/local/keepalived/sbin/keepalived –D  
  8. #ps -aux | grep keepalived 

測(cè)試

停止MySQL服務(wù),看keepalived健康檢查程序是否會(huì)觸發(fā)我們編寫的腳本

三、測(cè)試

MySQL遠(yuǎn)程登錄測(cè)試

我們找一臺(tái)安裝有MySQL客戶端的windows,然后登錄VIP,看是否能登錄,在登錄之兩臺(tái)MySQL服務(wù)器都要授權(quán)允許從遠(yuǎn)程登錄

  1. MySQL> grant all privileges on *.* to 'root'@'%' identified by '123456';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.  
  4. MySQL> flush privileges;  
  5. Query OK, 0 rows affected (0.00 sec) 

使用客戶端登錄VIP測(cè)試

  1. C:\MySQL\bin>MySQL.exe -uroot -p123456 -h192.168.1.200 -P3306  
  2. Welcome to the MySQL monitor.  Commands end with ; or \g.  
  3. Your MySQL connection id is 224  
  4. Server version: 5.0.89-log Source distribution  
  5.  
  6. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  
  7.  
  8. MySQL> 

● keepalived故障轉(zhuǎn)移測(cè)試

※在windows客戶端一直去ping  VIP,然后關(guān)閉192.168.1.201上的keepalived,正常情況下VIP就會(huì)切換到192.168.1.202上面去

※開(kāi)啟192.168.1.201上的keepalived,關(guān)閉192.168.1.202上的keepalived,看是否能自動(dòng)切換,正常情況下VIP又會(huì)屬于192.168.1.201

注:keepalived切換速度還是非常塊的,整個(gè)切換過(guò)程只需1-3秒

● MySQL故障轉(zhuǎn)移測(cè)試

※在192.168.1.201上關(guān)閉MySQL服務(wù),看VIP是否會(huì)切換到192.168.1.202上

※開(kāi)啟192.168.1.201上的MySQL和keepalived,然后關(guān)閉192.168.1.202上的MySQL,看VIP是否會(huì)切換到192.168.1.201上

下面是用windows客戶端連接的MySQL的VIP,在切換時(shí)我執(zhí)行了一個(gè)MySQL查詢命令,從執(zhí)行show databases到顯示出結(jié)果時(shí)間為3-5秒(大家可以看到上面有個(gè)錯(cuò)誤提示,不過(guò)不用擔(dān)心,因?yàn)槲覀兊膋eepalived切換大概為3秒左右,這3秒左右VIP是誰(shuí)都不屬于的)

  1. MySQL> show databases;  
  2. ERROR 2006 (HY000): MySQL server has gone away  
  3. No connection. Trying to reconnect...  
  4. Connection id:    592  
  5. Current database: *** NONE ***  
  6.  
  7. +--------------------+  
  8. | Database           |  
  9. +--------------------+  
  10. | information_schema |  
  11. | MySQL              |  
  12. | test               |  
  13. +--------------------+  
  14. 3 rows in set (9.01 sec) 

后話:世間萬(wàn)事萬(wàn)物,都不具備絕對(duì)的完美,就像上面的MySQL-HA一樣,keepalived只能做到對(duì)3306的健康檢查,但是做不到比如像MySQL復(fù)制中的slave-SQL、slave-IO進(jìn)程的檢查。所以要想做到一些細(xì)致的健康檢查,還得需要借助額外的監(jiān)控工具,比如nagios,然后用nagios實(shí)現(xiàn)短信、郵件報(bào)警,從而能夠有效地解決問(wèn)題。

【編輯推薦】

  1. MySQL數(shù)據(jù)庫(kù)集群進(jìn)行正確配置步驟
  2. MySQL 集群在Server1與Server2上如何安裝MySQL
  3. MySQL集群配置
  4. MySQL集群自動(dòng)安裝腳本
  5. MySQL觸發(fā)器如何正確使用
責(zé)任編輯:彭凡 來(lái)源: 51CTO
相關(guān)推薦

2015-05-12 10:22:05

MySQL

2012-02-15 00:01:34

2023-05-15 08:20:56

2014-05-30 13:35:21

MySQL Clust架構(gòu)

2015-10-21 12:58:58

keepalived集群Linux

2017-02-06 11:43:57

ZooKeeper集群

2017-02-19 19:57:05

ZooKeeper集群

2025-03-31 10:40:52

2011-04-14 13:13:28

SQL serverSQL Mirror

2021-09-17 07:51:24

Keepalived服務(wù)高可用

2019-10-09 16:02:16

NginxKeepalivedLvs

2011-10-10 09:47:32

HAProxy負(fù)載均衡Keepalived

2017-12-21 14:00:14

LinuxHA高可用集群服務(wù)器

2022-07-22 20:00:01

高可用路由

2010-11-15 18:37:41

高可用的廣域網(wǎng)絡(luò)

2019-09-26 09:04:22

NginxKeepalived服務(wù)器

2018-08-24 08:51:10

haproxykeepalived均衡器

2019-07-30 10:18:06

NginxKeepalived

2019-12-24 14:28:00

KeepalivedNginxTomcat

2015-07-08 10:24:15

NginxKeepalived
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)