使用KeepAlived實現高可用的MYSQL_HA集群環境中,MYSQL為(Master/Master)主/主同步復制關系,保證MYSQL服務器數據的一致性,用KeepAlived提供虛擬IP,通過KeepAlived來進行故障監控,實現Mysql故障時自動切換。
布署環境拓朴如下:
Mysql VIP :192.168.187.61
Master1:192.168.187.129
Master:192.168.187.132
OS 環境:Cent OS 5.9
Mysql版本:Mysql5.5.31
安裝mysql
因為CentOS的Mysql還是停留在5.0.19,而我們做Mysql之間的同步復制,Mysql版本至少要在Mysql5.1以上,所以要對其進行升級安裝。
>>使用 yum安裝, yum 可以幫你解決依賴於沖突
# rpm –Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm //安裝最新的mysql的yum源 # yum –y install Mysql55 MySQL55-* --enablerepo=webtatic //安裝Mysql,--enablerepo參數是用來指定源 |
>>開啟mysql服務
# service mysqld start //開啟mysql服務 |
>>剛安裝密碼為空,設置root密碼
# mysqladmin –u root password ‘1234’ //設置root密碼 |
>>更改mysql配置文件
# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf //在etc目錄下建立mysql的配置文件my.cnf # service mysqld restart//重啟mysql服務 |
>>登陸Mysql
# mysql –u root –p 1234 //設置root密碼 Mysql> //登陸進了mysql |
2.2.Mysql主/主配置
2.2.1 設置配置文件
Mysql是通過日志進行同步復制的,先建立日志文件
#touch /var/log/mysql/mysql-bin.log //建立日志文件 #chown mysql.mysql /var/log/mysql/mysql-bin.log //將日志文件的所屬用戶和用戶組更改成mysql |
在兩台要進行備份的mysql服務器上的my.cnf文件進行配置如下(將下面的配置分別加入相關服務器的my.cnf):
Master1(192.168.187.129) |
Master(192.168.187.132) |
#主標服務標識號,必需唯一 server-id = 1 #因為MYSQL是基於二進制的日志來做同步的,每個日志文件大小為 1G log-bin=/var/log/mysql/mysql-bin.log #要同步的庫名 binlog-do-db = test #不記錄日志的庫,即不需要同步的庫 binlog-ignore-db=mysql #用從屬服務器上的日志功能 log-slave-updates #經過1日志寫操作就把日志文件寫入硬盤一次(對日志信息進行一次同步)。n=1是最安全的做法,但效率最低。默認設置是n=0。 sync_binlog=1 # auto_increment,控制自增列AUTO_INCREMENT的行為 用於MASTER-MASTER之間的復制,防止出現重復值, auto_increment_increment=n有多少台服務器,n就設置為多少, auto_increment_offset=1設置步長,這里設置為1,這樣Master的auto_increment字段產生的數值是:1, 3, 5, 7, …等奇數ID auto_increment_offset=1 auto_increment_increment=2 #進行鏡像處理的數據庫 replicate-do-db = test #不進行鏡像處理的數據庫 replicate-ignore-db= mysql |
#主標服務標識號,必需唯一 server-id = 2 #因為MYSQL是基於二進制的日志來做同步的,每個日志文件大小為 1G log-bin=/var/log/mysql/mysql-bin.log #要同步的庫名 binlog-do-db = test #不記錄日志的庫,即不需要同步的庫 binlog-ignore-db=mysql #用從屬服務器上的日志功能 log-slave-updates #經過1日志寫操作就把日志文件寫入硬盤一次(對日志信息進行一次同步)。n=1是最安全的做法,但效率最低。默認設置是n=0。 sync_binlog=1 # auto_increment,控制自增列AUTO_INCREMENT的行為 用於MASTER-MASTER之間的復制,防止出現重復值, auto_increment_increment=n有多少台服務器,n就設置為多少, auto_increment_offset=2設置步長,這里設置為2,這樣Master的auto_increment字段產生的數值是:2, 4, 6, 8, …等奇數ID auto_increment_offset=2 auto_increment_increment=2 #進行鏡像處理的數據庫 replicate-do-db = test #不進行鏡像處理的數據庫 replicate-ignore-db= mysql |
2.2.2查看配置情況
按上面的配置將兩台服務器配置好以后,重新啟動mysql服務,用showmaster status查看一下兩台服務器的Master配置情況,可以看出已經配置成功,如下:
NO1:Master1(192.168.187.129)的情況
# mysql –u root –p 1234 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001| 107 | test | mysql | +------------------+----------+--------------+------------------+ |
NO2:Master(192.168.187.132)的情況
# mysql –u root –p 1234 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001| 107 | test | mysql | +------------------+----------+--------------+------------------+ |
2.2.3建立權限帳戶,實現同步
a.創建賬戶並授予REPLICATION SLAVE權限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '1234'; //建立一個用戶名為slave的帳戶 mysql> FLUSH PRIVILEGES; //刷新相關權限表 |
因為進行雙向復制,兩邊服務器都需要建立一個用於復制的的用戶。兩邊可以復用上面的語句,用戶名和密碼可以自行進行修改。
b.同步設置
Master1(192.168.187.129)上操作如下:
mysql> stop slave; //停止slave mysql>change master to master_host='192.168.187.132', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107; //修改當前的Master的值,因為是互為備份,所以Master1(192.168.187.129)的master為Master2(192.168.187.132),Master2設置復制的用戶名為slave,密碼是1234,上面通過 show master status我們得知,log_file是mysql-bin.000001,postion是107。 mysql>start slave; //開始salve,開始同步 mysql>show slave status; //檢測slave狀態,如果Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0就OK了 |
Master2(192.168.187.132)上面操作如下:
mysql> stop slave; //停止slave mysql>change master to master_host='192.168.187.129', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107; //修改當前的Master的值,因為是互為備份,所以Master2(192.168.187.132)的master為Master2(192.168.187.129),Master1設置復制的用戶名為slave,密碼是1234,上面通過 show master status我們得知,log_file是mysql-bin.000001,postion是107。 mysql>start slave; //開始salve,開始同步 mysql>show slave status; //檢測slave狀態,如果Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0就OK了 |
c.測試情況:
Step1:建一個測試表Test,兩個字段,id與name字段,id字段為自增,兩個服務器上面都是同樣的結構,如下圖:
Step2:我在Master1(192.168.187.129)表上執行一個insert語句,並進行查詢,如下圖:
Step3:在Master2(192.168.187.132)中查詢,可以發現數據已經同步過來了,如下圖:
3KeepAlived安裝配置
3.1 KeepAlived的安裝方法
可參照“高可用的負載均衡配置方法(Haproxy+KeepAlived)”5.1 中KeepAlived的安裝方法
3.2將keepalived加入服務
可參照“高可用的負載均衡配置方法(Haproxy+KeepAlived)”5.2 中將keepalived加入服務
3.3 KeepAlived的配置
安裝好以后,對其進行配置如下:
有兩台機器(MASTER1)所在的192.168.187.129與(Master2)192.168.187.132,用(VIP)192.168.187.61做虛擬IP。
在兩台服各器中的/etc/keepalived文件夾中的keepalived.conf下進行配置:
Master1的設置
192.168.187.129
global_defs {
router_id Mysql_HA #當前節點名
}
vrrp_instance VI_1{
state BACKUP #兩台配置節點均為BACKUP
interface eth0 #綁定虛擬IP的網絡接口
virtual_router_id 51 #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬於同一VRRP組
priority 100 #節點的優先級,另一台優先級改低一點
acvert_int 1 #組播信息發送間隔,兩個節點設置必須一樣
nopreempt #不搶占,只在優先級高的機器上設置即可,優先級低的機器不設置
authentication{ #設置驗證信息,兩個節點必須一致
auth_type PASS
auth_pass 1111
}
Virtual_ipaddress{ #指定虛擬IP,兩個節點設置必須一樣
192.168.187.61
}
}
virtual_server 192.168.187.61 3306 { #linux虛擬服務器(LVS)配置
delay_loop 2 #每個2秒檢查一次real_server狀態
lb_algo wrr #LVS調度算法,rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式 ,NAT|DR|TUN
persistence_timeout 60 #會話保持時間
protocol TCP #使用的協議是TCP還是UDP
real_server 192.168.187.129 3306 {
weight 3 #權重
notify_down /usr/local/bin/mysql.sh #檢測到服務down后執行的腳本
TCP_CHECK {
connect_timeout 10 #連接超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 3306 #健康檢查端口
}
}
Master2的設置
192.168.187.132
global_defs {
router_id Mysql_HA #當前節點名
}
vrrp_instance VI_1{
state BACKUP #兩台配置節點均為BACKUP
interface eth0 #綁定虛擬IP的網絡接口
virtual_router_id 51 #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬於同一VRRP組
priority 90 #節點的優先級,另一台優先級改低一點
acvert_int 1 #組播信息發送間隔,兩個節點設置必須一樣
authentication{ #設置驗證信息,兩個節點必須一致
auth_type PASS
auth_pass 1111
}
Virtual_ipaddress{ #指定虛擬IP,兩個節點設置必須一樣
192.168.187.61
}
}
virtual_server 192.168.187.61 3306 { #linux虛擬服務器(LVS)配置
delay_loop 2 #每個2秒檢查一次real_server狀態
lb_algo wrr #LVS調度算法,rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式 ,NAT|DR|TUN
persistence_timeout 60 #會話保持時間
protocol TCP #使用的協議是TCP還是UDP
real_server 192.168.187.132 3306 {
weight 3 #權重
notify_down /usr/local/bin/mysql.sh #檢測到服務down后執行的腳本
TCP_CHECK {
connect_timeout 10 #連接超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 3306 #健康檢查端口
}
}
腳本/usr/local/bin/mysql.sh
#vi /usr/local/bin/mysql.sh #!/bin/sh killall keepalived |
3.4 KeepAlived測試
可參照“高可用的負載均衡配置方法(Haproxy+KeepAlived)”5.4 中KeepAlived測試
4.Mysql測試
Step1:打開三個服務器進行查看,剛開始三個都為空
Step2:在VIP(192.168.187.61)服務器中插入一條數據
Step3:再查看三個服務器中的數據都已經同步過來了
當關掉做為主機的192.168.187.129做為宕機處理,同樣也不會出問題,虛擬IP由192.168.187.129漂移
到192.168.187.132上面。
5.安裝時出現的問題及處理方法
NO1: Slave將無法鏈接到 Master情況
錯誤:Slave將無法鏈接到 Master
原因:bind-address默認是127.0.0.1你必須更改它
解決辦法:修改my.cnf,加上如下圖紅框所示的配置!
NO2: mysql error 1129 錯誤
錯誤:mysql 1129錯誤!如下圖:
原因:是因為mysql將ip連接阻塞了。
解決辦法:登錄到mysql數據庫服務器端,使用命令:
# mysqladmin -u root -p flush-hosts; Enter password: |