MySQL MHA + LVS + KEEPALIVED 高可用讀寫分離,讀負載均衡環境部署
一.MHA介紹
MHA是一款MySQL高可用開源軟件,實現MySQL一主多從架構下,主備的failover自動切換、手動切換、狀態監控等功能,是比較常用的高可用解決方案之一。
LVS是linux下的一款虛擬服務器軟件,內部實現了虛擬路由協議,實現多節點服務器之間負載均衡。
Keepalived高可用軟件,支持LVS算法,從而結合LVS實現負載均衡服務器的高可用。
二.部署
安裝數據庫
在各數據庫節點上安裝Mysql,安裝方法略。
配置主從複製
數據庫配置爲1主2從,2個從庫中,1個用於主從切換,1個恆從庫用於同步relay-log。
初始mysql-master的配置
[server]
server_id=11
log_bin=master-log
relay-log=relay-bin
skip_name_resolve=ON
innodb_file_per_table=ON
max_connections=65536
所有mysql-slave的配置
[server]
server_id=1[x]
log-bin=master-bin
relay-log=relay-bin
skip_name_resolve=ON
innodb_file_per_table=ON
max_connections=65536
relay_log_purge=0 #關閉中繼日誌自動修剪
read_only=1 #將從節點設置爲只讀
從庫定時刪除relay-log
mkdir /opt/mha/log
crontab -e
加入以下定時任務:
0 2 * * * /usr/bin/purge_relay_logs --user=root --disable_relay_log_purge >> /opt/mha/log/purge_relay_logs.log 2>&1
從庫開啓綁定VIP的服務
編輯腳本/etc/init.d/realserver
#./etc/rc.d/init.d/functions
LVS_VIP=10.10.10.200
case "$1" in
start)
ifconfig lo:0 $LVS_VIP netmask 255.255.255.255 broadcast $LVS_VIP
/sbin/route add -host $LVS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "Server Started"
;;
stop)
ifconfig lo:0 down
route del $LVS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "Server Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
保存並開啓服務
chmod +x realserver
service realserver start
部署mha
首先,安裝基礎環境
1.安裝mha4mysql-node
tar -zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
2.安裝mha4mysql-manager
tar -zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
配置mha4mysql-manager
將源碼包中的默認配置文件複製到/etc/mha,包含masterha_default.cnf和app1.cnf兩個配置文件,然後編輯/etc/mha/app1.cnf,在該配置文件中,涉及到的目錄或賬號請自行創建。
[server default]
manager_workdir=/opt/mha/app1
manager_log=/opt/mha/app1/manager.log
#user=mysql
#password=mysqltellu
#ssh_user=mysql
repl_user=repl
repl_password=repltellu
ping_interval=1
#shutdown_script="/opt/mha/scripts/power_manager"
#master_ip_failover_script="/opt/mha/scripts/master_ip_failover"
#master_ip_online_change_script="/opt/mha/scripts/master_ip_online_change"
#report_script="/opt/mha/scripts/send_report"
[server1]
hostname=10.10.10.11
master_binlog_dir="/data/mysql/master-log"
candidate_master=1
[server2]
hostname=10.10.10.12
master_binlog_dir="/data/mysql/master-log"
candidate_master=1
[server3]
hostname=10.10.10.13
no_master=1
操作mha4myql-manager
#啓動
masterha_manager --conf=/etc/mha/app1.cnf 2>&1 &
#停止
masterha_stop --conf=/etc/mha/app1.cnf
部署mha4mysql-node
1、各數據庫節點安裝mha4mysql-node。
rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
2、MHA管理端與各數據庫節點、各數據庫節點之間需要實現免密登錄。
ssh-keygen -t rsa -P ‘’
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
chmod go= .ssh/authorized_keys
for i in 7 8 9;do scp -p /root/.ssh/id_rsa /root/.ssh/authorized_keys [email protected].$i:/root/.ssh/ ;done
3、在各數據庫上創建用於mha的複製賬號
grant all privileges on . to ‘repl’@‘10.10.10.%’ identified by ‘repltellu’;
flush privileges;
4、測試配置結果
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
部署LVS+keepalived
安裝ipvsadm+Keepalived
yum -y install ipvsadm keepalived
配置LVS
開啓路由轉發功能
sed -i ‘s/ip_forward = 0/ip_forward = 1/p’ /etc/sysctl.conf
sysctl -p
配置Keepalived
分離keepalived日誌
sed -i ‘s/KEEPALIVED_OPTIONS="-D"/KEEPALIVED_OPTIONS="-D -d -S 0"/g’ /etc/sysconfig/keepalived
編輯keepalived.conf
global_defs {
router_id LVS
}
#如果配置了mha通過lvs高可用,本人的mha是單機,所以不需要
#vrrp_script check_masterha_manager {
# script "/opt/scripts/check_mha4mysql_manager.sh"
# interval 3
#}
vrrp_instance MYSQL_SLAVE {
state MASTER #從lvs上把 MASTER 改爲 BACKUP
interface eno16777736
virtual_router_id 200
priority 100 #從lvs上把 100 改爲 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.200
}
nopreempt
#smtp_alter
#如果配置了mha通過lvs高可用,本人的mha是單機,所以不需要
#notify_master "/opt/scripts/notify_master.sh"
#notify_backup "/opt/scripts/notify_stop.sh"
#notify_stop "/opt/scripts/notify_stop.sh"
}
virtual_server_group MysqlRead {
10.10.10.200 3306
}
virtual_server 10.10.10.200 3306 {
delay_loop 6
lb_algo wlc
lb_kind DR
nat_mask 255.255.255.0
#persistence_timeout
protocol TCP
#如果想加設一臺專用故障轉移的備機
#sorry_server 10.10.10.10 3306
real_server 10.10.10.12 3306 {
weight 6
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 10.10.10.13 3306{
weight 0
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}