兩臺mysql都可讀寫,互為主備,默認只使用一臺(masterA)負責數據的寫入,另一臺(masterB)備用;
masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;
兩臺主庫之間做高可用,可以采用keepalived等方案(使用VIP對外提供服務);
建議采用高可用策略的時候,masterA或masterB均不因宕機恢復后而搶占VIP(非搶占模式)。
這樣做可以在一定程度上保證主庫的高可用,在一臺主庫down掉之后,可以在極短的時間內切換到另一臺主庫上(盡可能減少主庫宕機對業務造成的影響),減少了主從同步給線上主庫帶來的壓力。
1)環境
兩臺安裝好mysql的服務器(yum安裝比較快且方便),關閉防火墻,關閉selinux。
systemctl stop firewalld(臨時關閉)
setenforce 0(臨時關閉)
2)我的主機地址
mysql1:192.168.44.131
mysql2:192.168.44.133
虛擬ip:192.168.44.199
mysql1配置
在/etc/my.cnf新增以下內容:
[mysqld]
#作為主從復制的唯一標識,集群中,不能重復
server-id = 1
#開啟二進制日志
log-bin = master-log
#開啟中繼日志
relay-log = slave-log
auto_increment_offset = 1
auto_increment_increment = 2
注:auto_increment_offset確定AUTO_INCREMENT列值的起點,也就是初始值。
auto_increment_increment控制列中的值的增量值,也就是步長。
mysql中有自增長字段,在做數據庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offset和auto_increment_increment。
在主主同步配置時,需要將兩臺服務器的auto_increment_increment增長量都配置為2,而要把auto_increment_offset分別配置為1和2。
mysql2配置
[mysqld]
#作為主從復制的唯一標識,集群中,不能重復
server-id = 2
#開啟二進制日志
log-bin = master-log
#開啟中繼日志
relay-log = slave-log
auto_increment_offset = 2
auto_increment_increment = 2
重啟mysql服務
systemctl restart mysqld
mysql1為主,mysql為從配置
進入mysql1數據庫創建同步賬號并賦予權限:
mysql> create user zjf@192.168.44.% identified by 123456;
mysql> grant replication slave on *.* to zjf@192.168.44.%;
mysql> show master status;
進入mysql2數據庫執行以下語句:
#log_file和log_pos的數據是mariad1上show master status得到的數據。
mysql> change master to master_host=192.168.44.131,
master_user=zjf, master_password=123456,
master_log_file=master-log.000001, master_log_pos=441;
開啟主從:
mysql> start slave;
mysql> show slave statusG;
mysql2為主,mysql1為從配置
進入mysql2數據庫創建同步賬號并賦予權限:
mysql> create user zjf@192.168.44.% identified by 123456;
mysql> grant replication slave on *.* to zjf@192.168.44.%;
show master status;
進入mysql2數據庫執行以下語句:
#log_file和log_pos的數據是mariad1上show master status得到的數據。
mysql> change master to master_host=192.168.44.131,
master_user=zjf, master_password=123456,
master_log_file=master-log.000004, master_log_pos=441;
開啟主從:
mysql> start slave;
mysql> show slave statusG;
至此, 主主同步復制配置完成!!!
在mysql1創建一個庫test1:
Create database test1
mysql1和mysql2都有。
Show databases;
在mysql2創建一個庫test2:
Create database test2
Mysql1和msql2都有。
Show databases;
主主同步復制配置便測試成功。
8.1 Mysql1和MySQL2都安裝keepalived
yum -y install keepalived
8.2 mysql1的/etc/keepalived/keepalived.conf配置
! configuration File for keepalived
global_defs {
router_id mysql-01 #主機標示符,不一定要用主機名,默認值取主機名
}
vrrp_instance VI_1 {
state BACKUP #非搶占模式兩臺服務器都為BACKUP
interface ens33 #根據機器的ifconfig來定,vip要綁定的網卡
virtual_router_id 50 #虛擬路由ID,倆節點保持一致 #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬于同
priority 100 #主節點的優先級(1-254),備用節點必須比主節點優先級低
advert_int 1 #組播信息發送間隔,兩個節點設置必須一樣
nopreempt #不搶占vip資源,防止故障節點恢復后因為優先級高導致vip再次飄移
authentication { #設置驗證信息,兩個節點必須一樣
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虛擬ip,兩個節點必須一致
192.168.44.199
}
}
#虛擬主機是可選部分,主要用來配置負載均衡。這里可以綁定端口
virtual_server 192.168.44.199 3306 { #綁定端口為3306,0代表所有端口
delay_loop 2
lb_algo rr ##負載均衡輪訓算法,詳見官方文檔
lb_kind DR #路由模式,同網段DR,不同網段NAT
persistence_timeout 50
protocol TCP
real_server 192.168.44.131 3306 {
weight 3
notify_down /etc/keepalived/bin/killkeepalived.sh
notify_down /etc/keepalived/bin/mysql_check.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
8.3 mysql2的/etc/keepalived/keepalived.conf配置
! configuration File for keepalived
global_defs {
router_id mysql-02 #主機標示符,不一定要用主機名,默認值取主機名
}
vrrp_instance VI_1 {
state BACKUP #非搶占模式兩臺服務器都為BACKUP
interface ens33 #根據機器的ifconfig來定,vip要綁定的網卡
virtual_router_id 50 #虛擬路由ID,倆節點保持一致 #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬于同
priority 50 #主節點的優先級(1-254),備用節點必須比主節點優先級低
advert_int 1 #組播信息發送間隔,兩個節點設置必須一樣
nopreempt #不搶占vip資源,防止故障節點恢復后因為優先級高導致vip再次飄移
authentication { #設置驗證信息,兩個節點必須一樣
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虛擬ip,兩個節點必須一致
192.168.44.199
}
}
#虛擬主機是可選部分,主要用來配置負載均衡。這里可以綁定端口
virtual_server 192.168.44.199 3306 { #綁定端口為3306,0代表所有端口
delay_loop 2
lb_algo rr ##負載均衡輪訓算法,詳見官方文檔
lb_kind DR #路由模式,同網段DR,不同網段NAT
persistence_timeout 50
protocol TCP
real_server 192.168.44.133 3306 {
weight 3
notify_down /etc/keepalived/bin/killkeepalived.sh
notify_down /etc/keepalived/bin/mysql_check.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
8.4 腳本
在兩臺服務器上編寫兩個腳本,就在keepalived配置文件指定的地方創建notify_down,當Mysql和keepalived 出現問題的時候會觸發此腳本,用于關掉本機的keepalived進程,之后才能進行切換到另外一個節點上去,并且授予執行權限+x。
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
8.5 結果
啟動兩臺服務器的keepalived,可以看到一臺服務器有虛擬ip,另一臺沒有。
8.6 測試
停掉有虛擬ip的那臺主機的keepalived,虛擬ip會跑到另一臺主機上,且配置了不搶占規則,即使恢復服務,ip也不會漂移回去。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129469.html
摘要:雙主是一個比較簡單的高可用架構,適用于中小集群,今天就說說怎么用做的高可用。缺點也比較明顯,就是增加從節點的情況下,從節點不會主動切換同步對象,而且腳本需要自己實現,有一定風險。 雙主 + keepalived 是一個比較簡單的 MySQL 高可用架構,適用于中小 MySQL 集群,今天就說說怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
摘要:雙主是一個比較簡單的高可用架構,適用于中小集群,今天就說說怎么用做的高可用。缺點也比較明顯,就是增加從節點的情況下,從節點不會主動切換同步對象,而且腳本需要自己實現,有一定風險。 雙主 + keepalived 是一個比較簡單的 MySQL 高可用架構,適用于中小 MySQL 集群,今天就說說怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
MySQL高可用方案測試 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20