热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql双主ha_(5.16)mysql高可用系列——keepalived+mysql双主ha

【1】KeepAlived的基本概念与原理双主KeepAlived利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障

【1】KeepAlived的基本概念与原理

双主KeepAlived

利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障转移群集)

更高级的架构如下:

keepalived架在双主上,双主互为主从,多个从库连接keepalived的VIP。外部使用mycat做读写分离与读负载均衡

6672bb61a2d89dcdaa8fd2bd6ad1f409.png

【1.1】keepalived 简介

(1.1.1)Keepalived服务的工作原理

Keepalived服务对之间通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的(有点像故障转移群集中的投票仲裁形式),主的优先级高于备,因此工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外服务。

在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用(也就是备没有受到VRRP广播包信息),就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

(1.1.2)keepalived 的三个核心模块

分别是core/check/vrrp

core:keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

check:负责健康检查,包括常见的各种检查方式。

vrrp:是用来实现VRRP协议的;(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

(1.1.3)什么是VRRP?

VRRP,全称 virtual router redundancy protocol,虚拟路由冗余协议。

VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

Keepalived通过组播(默认)、单播(自定义),实现keepalived主备推选,工作模式分为抢占和非抢占。

《1》抢占模式

主服务器正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不供服务,备提供服务。

也就是说,抢占模式下,不分主备,只管优先级。

不管 keepalived.conf 里的 state 配置成 master 还是 backup ,只看谁的priority 优先级高, priority 优先级高的那一个,在故障恢复后,会自动将VIP资源再次抢回来。

举例:

1)俩台都为master/backup时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。

此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。

2)  server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。

当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式

3)  server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。

当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式

《2》非抢占模式

这种方式通过参数nopreempt(一般设置在advert_int 的那一行下面)来控制。不管priority优先级,只要master机器发生故障,VIP资源就会被切换到backup上。

并且,当master机器恢复后,也不会将VIP资源抢回来。除非Backup机器发生故障,才能自动把VIP等资源切换会主库。

nopreempt这个参数只能用户state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!

也就是说

d)  当state状态都为master或者都为backup的时候,没有加nopreempt参数,那么

a)当state状态一个为master,一个为backup的时候,加不加nopreempt 这个参数都是一样的效果。

即都是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

b)当state状态都设置成backup,如果不配置nopreempt参数。

也是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

c)当state状态都设置成backup,如果配置了 nopreempt 参数,那么久不会去考虑priority优先级了。

是非抢占模式! 即只有VIP当前所在机器发生故障,另一台机器才能接管VIP。 不考虑优先级问题。

注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了

【1.2】Keepalived在MySQL上有什么作用?

mysql双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备。

但一个Master宕机后不能实现动态切换,使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

【1.3】较为详细的介绍

Keepalived是一个高度模块化设计的软件,从源代码结构似乎也很容易看出这一点。Keepalived 1.2.13源代码中只有如下目录:check  core  etc  include  libipvs-2.4  libipvs-2.6  vrrp

check:Keepalived的healthchecker子进程的目录,包括了所有的健康检查方式以及对应配置的解析,LVS的配置解析也在这个里面。

core:Keepalived的核心程序,如全局配置的解析,进程启动等等。

etc:包含Keepalived的配置模板和启动脚本等文件。

include:头文件目录。

libipvs*:LVS使用的库文件。

vrrp:Keepalived的vrrpd子进程以及相关的代码。

(1) 多进程模式

Keepalived采用了多进程的设计模式,每个进程负责不同的功能,我们在使用LVS的机器上通常可以看到三个Keepalived进程:

111 keepalived    <父进程&#xff0c;负责内存管理、监控子进程等

112 \_ keepalived

113 \_ keepalived

(2) 控制面板

这里所谓的控制面板就是对配置文件的编译和解析。Keepalived的配置文件解析比较另类&#xff0c;并不是一次解析所有配置&#xff0c;而是只在用到某模块时才解析相应的配置。在源文件里面可以看到类似XXX_parser.c的文件&#xff0c;就是做这个用的。

(3) 看门狗

WatchDog框架提供了对VRRP和healthchecker子进程的监控。

(4)IPVS封装

Keepalived里面所有对LVS的相关操作并不直接使用ipvsadm客户端程序&#xff0c;而是使用IPVS提供的函数进行操作&#xff0c;这些代码都在check/ipwrapper.c中。

【2】环境与架构准备

【2.1】实验基本配置情况

操作系统&#xff1a;CentOS7.5

mysql&#xff1a;5.7.24

Mysql master DB3&#xff1a; 192.168.135.173

Mysql slave   DB4&#xff1a; 192.168.135.174

keepalived&#xff1a;https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从&#xff0c;这里略

【2.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持echo "net.ipv4.ip_nonlocal_bind&#61;1" >> /etc/sysctl.conf

sysctl-p

#(2)配置iptables,添加VRRP通讯支持

-A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳

-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信

-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能

#临时

echo "1">/proc/sys/net/ipv4/ip_forward

#永久

echo "net.ipv4.ip_forward&#61;1" >> /etc/sysctl.conf

sysctl -p

【2.3】下载、安装 keepalived

#(1)下载

官网&#xff1a;https://www.keepalived.org/download.html

wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包

mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考&#xff1a;yum源配置、epel源配置)

yum install kernel-devel openssl-devel popt-devel -y

#(3)安装

cd /soft/

tar -zxvf keepalived-1.3.3.tar.gz

cd keepalived-1.3.4

./configure --prefix&#61;/usr/local/keepalived/

make && make install

#(4)设置keepalived开机自启

systemctl enable keepalived

------------下面(5)(6)可以忽略------------------------

#(5)如果不设置自定义目录&#xff0c;默认目录如下

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

#(5)构建keepalived 配置文件目录与文件

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

#(6)基本配置文件复制

cp usr/local/keepalived/sbin/keepalived /usr/sbin/

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

【2.4】配置文件解析

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File forkeepalived

global_defs { #全局定义&#xff0c;

notification_email {#邮件通知&#xff0c;下面的是收件人邮件地址&#xff0c;需要开启sendmail服务

acassen&#64;firewall.loc

failover&#64;firewall.loc

sysadmin&#64;firewall.loc

}

notification_email_from Alexandre.Cassen&#64;firewall.loc #邮件通知的发件人地址

smtp_server192.168.200.1 #发送邮件服务器地址smtp_connect_timeout30 #连接邮件服务器超时时间-秒router_id LVS_DEVEL #路由id&#xff0c;随便取名字但同一个连接网络要唯一

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval0vrrp_gna_interval0}

vrrp_instance VI_1 {#配置虚拟实例&#xff0c;这个名字任意取

state MASTER #角色状态&#xff0c;可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体

interface eth0 #指定HA检测网络的接口

virtual_router_id51 #路由idpriority100 #优先级advert_int1 #广播频率&#xff0c;单位是秒

#nopreempt #默认抢占模式&#xff0c;这个参数设置非抢占模式&#xff0c;需要主从state 都为BACKUP 才生效authentication {#身份验证

auth_type PASS #验证类型 PASS为密码验证

auth_pass1111 #验证密码&#xff0c;主从一样就好了}

virtual_ipaddress {#虚拟IP&#xff0c;我们启动后虚拟IP是多少192.168.200.16 #192.168.1.210/24

192.168.200.17

192.168.200.18}

}

virtual_server192.168.200.100 443{#虚拟服务器&#xff0c;IP&#43;端口&#xff0c;以空格分隔

delay_loop6 #运行情况检查&#xff0c;IP&#43;端口是否可用&#xff0c;单位是秒lb_algo rr #设置负载调度算法&#xff0c;这里设置rr&#xff0c;即轮询算法

lb_kind NAT #设置LVS实现负载均衡机制&#xff0c;有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout50 #会话保持单位时间&#xff0c;单位是秒protocol TCP #指定转发协议类型&#xff0c;有TCP和UDP两种

real_server192.168.201.100 443{#虚拟服务器对应的实际服务器、端口

weight1 #配置服务节点的权值&#xff0c;权值数字越大&#xff0c;权值越高SSL_GET {#获取ssl连接信息

url {

path/digest ff20ad2481f97b1754ef3e12ecd3a9cc

}

url {

path/mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd

}

#notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容

#notify_master /home/mysql/master.sh #如果这个server down掉之后&#xff0c;新主服务器执行这个脚本

connect_timeout3 #tcp检测参数&#xff0c;表示3秒无响应超时retry3 #表示最大重试次数delay_before_retry3 #表示重试间隔秒数

#connect_port 3306 #表示连接检测的端口为3306}

}

}

#后面一样的就不赘述了。

【2.5】最佳实践配置文件

参考代码&#xff1a;

global_defs {#全局定义

router_id MySQL-HA #全局路由ID&#xff0c;主从需要相同

}

vrrp_script check_run {#VRRP自定义脚本&#xff0c;check_run自定义名称

script"/etc/keepalived/mysql_check.sh" #调用的脚本文件URLinterval60 #运行间隔&#xff0c;单位为秒}

vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称

group {#组内成员

VI_1

}

}

vrrp_instance VI_1 {#vrrp虚拟实例

state BACKUP #从

interface ens34 #针对监听的网络接口

virtual_router_id51 #唯一路由ID&#xff0c;主从要一致priority90 #权限advert_int1 #广播频率&#xff0c;单位是秒nopreempt #非抢占模式

authentication {#同一组keepalived的验证方式

auth_type PASS

auth_pass1234}

track_script {#定义跟踪使用脚本

check_run #这里就是我们上面自己定义的脚本

}

notify_master/etc/keepalived/master.sh#当本机换为Master状态时&#xff0c;会呼叫执行 notify_master

notify_stop/etc/keepalived/stop.sh#当本机终止keepalived 时&#xff0c;会呼叫执行 notify_stop

notify_backup /etc/keepalived/backup.sh #当本机进入Backup状态时&#xff0c;会呼叫执行 notify_backup

notify_fault /etc/keepalived/fault.sh #当本机发现异常情况进入Fault状态时&#xff0c;会呼叫执行 notify_fault

virtual_ipaddress { #设置虚拟IP192.168.1.210}

}

我的实际代码&#xff1a;

#主

global_defs {

router_id MySQL-HA

}

vrrp_script check_run {

script"/etc/keepalived/mysql_check.sh"interval60}

vrrp_sync_group VG1 {

group {

VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority100advert_int1nopreempt

authentication {

auth_type PASS

auth_pass1234}

track_script {

check_run

}

notify_master/etc/keepalived/master.shnotify_stop/etc/keepalived/stop.shvirtual_ipaddress {192.168.135.180}

}

#从

global_defs {

router_id MySQL-HA

}

vrrp_script check_run {

script"/etc/keepalived/mysql_check.sh"interval60}

vrrp_sync_group VG1 {

group {

VI_1

}

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority90advert_int1nopreempt

authentication {

auth_type PASS

auth_pass1234}

track_script {

check_run

}

notify_master/etc/keepalived/master.shnotify_stop/etc/keepalived/stop.shvirtual_ipaddress {192.168.135.180}

}

/etc/keepalived/mysql_check.sh的作用是为了没分钟判断一次mysql服务是否存活

#!/bin/bash

source /etc/profilecount&#61;1

whiletrue

do

mysql-uroot -p123456 -S /tmp/mysql_3306.sock -e "show status;" > /dev/null 2>&1i&#61;$?

ps aux| grep mysqld | grep -v grep > /dev/null 2>&1j&#61;$?if [$i &#61; 0] && [$j &#61; 0]

then

exit 0

else

if [$i &#61; 1] && [$j &#61; 0]

then

exit 0

else

if [$count -gt 5]

then

breakfi

count&#61;$((${count}&#43;1))

continuefi

fi

done

systemctl stop keepalived

other

#!/bin/bash

count&#61;1

while true

do

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1j&#61;$?

if [ $j &#61; 0]thenexit0

else

sleep 1

if [ $count -gt 5]thenbreakficount&#61;$((${count}&#43;1))

continuefi

donesystemctl stop keepalived

/etc/keepalived/master.sh 的作用是状态改为master以后执行的脚本。

首先判断复制是否有延迟&#xff0c;如果有延迟&#xff0c;等1分钟后&#xff0c;不论是否有延迟&#xff0c;都并停止复制&#xff0c;并且记录binlog和pos点。文件内容如下。

#!/bin/bash

source /etc/profile

Master_Log_File&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Master_Log_File | awk -F":" &#39;{print $2}&#39;)

Relay_Master_Log_File&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F":" &#39;{print $2}&#39;)

Read_Master_Log_Pos&#61;$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F":" &#39;{print $2}&#39;)

Exec_Master_Log_Pos&#61;$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F":" &#39;{print $2}&#39;)

i&#61;1

while true

do

if [ $Master_Log_File &#61; $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]then

echo "ok"breakelse

sleep 1

if [ $i -gt 60]thenbreakficontinue

let i&#43;&#43;

fi

donemysql-uroot -S /tmp/mysql_3306.sock -e "stop slave;"mysql-uroot -S /tmp/mysql_3306.sock -e "reset slave all;"mysql-uroot -S /tmp/mysql_3306.sock -e "reset master;"

/etc/keepalived/stop.sh  主库 keepalived 停止以后需要执行的脚本。检查是否还有复制写入操作&#xff0c;最后无论是否执行完毕都退出。文件内容如下。

#!/bin/bash

source /etc/profile

M_File1&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F&#39;:&#39; &#39;/File/{print $2}&#39;)

M_Position1&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F&#39;:&#39; &#39;/Position/{print $2}&#39;)sleep 1M_File2&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F&#39;:&#39; &#39;/File/{print $2}&#39;)

M_Position2&#61;$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F&#39;:&#39; &#39;/Position/{print $2}&#39;)

i&#61;1

while true

do

if [ $M_File1 &#61; $M_File1 ] && [ $M_Position1 -eq $M_Position2 ]then

echo "ok"breakelse

sleep 1

if [ $i -gt 60]thenbreakficontinue

let i&#43;&#43;

fi

done

【2.6】修改默认日志文件位置

#默认错误日志位置&#xff1a;/var/log/messages

#(1)修改文件

vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边

KEEPALIVED_OPTIONS&#61;"-D" &#61;》 KEEPALIVED_OPTIONS&#61;"-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.

# --dump-conf         -d Dump the configuration data.

# --log-detail        -D Detailed log messages.

# --log-facility      -S 0-7 Set local syslog facility (default&#61;LOG_DAEMON)

#(2)修改日志级别参数文件

vi /etc/rsyslog.conf

#在最后一行加上

local0.* /var/log/keepalived.log

#(3)重启日志服务

systemctl restart rsyslog

【2.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务

systemctl start keepalived #启动服务

systemctl enable keepalived #设置服务开机自启

systemctl status keepalived#查看服务状态&#xff0c;有没有报错最快可以看这里ps -ef|grep keepalived|grep -v "grep" #查看服务进程

97c08628f9cb5be38076abecfd9fb5a4.png

2b08e4e4096863d8404dca6acf37d66b.png

查看VIP所在。

506fb081110656ce8d7ca95bc5ae6a44.png

【2.8】基于mysql连接的核验

用mysql连接虚拟IP地址&#xff0c;查看是哪个机器。

a8371a0be9ac0543f9190fa1064048a3.png

果然是DB3。

【2.9】故障转移测试

(1)查看当前运行情况&#xff0c;确保keepalived和mysql都在运行

79131ca643e598bdf0ad36724bab3a9d.png

aca15c1e6b06b7cc6ffa35935f578b68.png

(2)查看当前谁是 keepalived 的 master

c02b8265980485588fe3116382b06d17.png

de6598f064dc5198d21b27ed8d6c7c12.png

很明显&#xff0c;现在173是 master

(3)关闭 mysql 服务模拟故障转移

c2635c1631b1724773ed487d92eba28c.png

由上图可以看到&#xff0c;我们关闭了 173(keepalived master) 机器的 mysql服务后&#xff0c;keepalived也跟着关闭了。

(4)故障转移查看

《1》IP地址查看

232310d732aa72f9e1d84235f7fb87c2.png

并且&#xff0c;我们的 master.sh 脚本 还生成了一个txt文件&#xff0c;它记录该机器所在 mysql 实例的 binlog 信息

134e2c15c6a7e2467d3ee80f3616fcd1.png

《2》连接查看&#xff0c;我还特地搞了个 其他机器来连接 VIP&#xff0c;结果成功。

100c8aaec27d42b6aaf790fe2c42ccee.png

【3】MHA配置keepalived

【3.1】实验基本配置情况

操作系统&#xff1a;CentOS7.5

mysql&#xff1a;5.7.24

Mysql master DB1&#xff1a; 192.168.1.201

Mysql slave   DB2&#xff1a; 192.168.1.202

keepalived&#xff1a;https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

先搭建好mysql主从&#xff0c;这里略

【3.2】操作系统环境配置(防火墙)

#(1)添加非本机IP绑定支持

echo "net.ipv3.ip_nonlocal_bind&#61;1" >> /etc/sysctl.conf

sysctl -p

#(2)配置iptables,添加VRRP通讯支持

-A INPUT -d 223.0.0.18 -j ACCEPT #允许组播地址访问本机

-A INPUT -s 192.168.1.0/24 -d 223.0.0.18 -j ACCEPT #允许组播地址通信

-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能

echo "1">/proc/sys/net/ipv4/ip_forward

【3.3】下载、安装 keepalived

#(1)下载

官网&#xff1a;https://www.keepalived.org/download.html

wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz

#(2)安装前置依赖包

mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考&#xff1a;yum源配置、epel源配置)

yum install kernel-devel openssl-devel popt-devel -y

#(3)安装

cd /soft/

tar -zxvf keepalived-1.3.3.tar.gz

cd keepalived-1.3.4

./configure --prefix&#61;/usr/local/keepalived/

make && make install

#(4)设置keepalived开机自启

systemctl enable keepalived

#(5)如果不设置自定义目录&#xff0c;默认目录如下

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

#(5)构建keepalived 配置文件目录与文件

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

b6a4e7cfd9d033be956008349bede855.png

【3.4】配置文件解析

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File forkeepalived

global_defs { #全局定义&#xff0c;

notification_email {#邮件通知&#xff0c;下面的是收件人邮件地址&#xff0c;需要开启sendmail服务

acassen&#64;firewall.loc

failover&#64;firewall.loc

sysadmin&#64;firewall.loc

}

notification_email_from Alexandre.Cassen&#64;firewall.loc #邮件通知的发件人地址

smtp_server 192.168.200.1 #发送邮件服务器地址smtp_connect_timeout 30 #连接邮件服务器超时时间-秒router_id LVS_DEVEL #路由id&#xff0c;随便取名字但同一个连接网络要唯一

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0vrrp_gna_interval 0}

vrrp_instance VI_1 {#配置虚拟实例&#xff0c;这个名字任意取

state MASTER #角色状态&#xff0c;可以是 MASTER/BACKUP,具体情况见 1.1.3下标红字体

interface eth0 #指定HA检测网络的接口

virtual_router_id 51 #路由idpriority 100 #优先级advert_int 1

#nopreempt #默认抢占模式&#xff0c;这个参数设置非抢占模式&#xff0c;需要主从state 都为BACKUP 才生效authentication {#身份验证

auth_type PASS #验证类型 PASS为密码验证

auth_pass 1111 #验证密码&#xff0c;主从一样就好了}

virtual_ipaddress {#虚拟IP&#xff0c;我们启动后虚拟IP是多少

192.168.200.16 #192.168.1.210/24

192.168.200.17

192.168.200.18}

}

virtual_server 192.168.200.100 443{#虚拟服务器&#xff0c;IP&#43;端口&#xff0c;以空格分隔

delay_loop 6 #运行情况检查&#xff0c;IP&#43;端口是否可用&#xff0c;单位是秒lb_algo rr #设置负载调度算法&#xff0c;这里设置rr&#xff0c;即轮询算法

lb_kind NAT #设置LVS实现负载均衡机制&#xff0c;有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout 50 #会话保持单位时间&#xff0c;单位是秒protocol TCP #指定转发协议类型&#xff0c;有TCP和UDP两种

real_server 192.168.201.100 443{#虚拟服务器对应的实际服务器、端口

weight 1 #配置服务节点的权值&#xff0c;权值数字越大&#xff0c;权值越高SSL_GET {#获取ssl连接信息

url {

path /digest ff20ad2481f97b1754ef3e12ecd3a9cc

}

url {

path /mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd

}

#notify_down /etc/keepalived/keepalived_stop.sh #如果这个server down掉之后这个服务器执行的内容

#notify_master /home/mysql/master.sh #如果这个server down掉之后&#xff0c;新主服务器执行这个脚本

connect_timeout 3 #tcp检测参数&#xff0c;表示3秒无响应超时retry 3 #表示最大重试次数delay_before_retry 3 #表示重试间隔秒数

#connect_port 3306 #表示连接检测的端口为3306}

}

}

#后面一样的就不赘述了。

virtual_server 10.10.10.2 1358{

delay_loop 6lb_algo rr

lb_kind NAT

persistence_timeout 50protocol TCP

sorry_server 192.168.200.200 1358real_server 192.168.200.2 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

real_server 192.168.200.3 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334c

}

connect_timeout 3retry 3delay_before_retry 3}

}

}

virtual_server 10.10.10.3 1358{

delay_loop 3lb_algo rr

lb_kind NAT

persistence_timeout 50protocol TCP

real_server 192.168.200.4 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

real_server 192.168.200.5 1358{

weight 1HTTP_GET {

url {

path /testurl/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl2/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

url {

path /testurl3/test.jsp

digest 640205b7b0fc66c1ea91c463fac6334d

}

connect_timeout 3retry 3delay_before_retry 3}

}

}

【3.5】最佳实践配置文件

参考&#xff1a;

global_defs {

notification_email {

xxxxxx&#64;sina.com #设置报警邮件地址&#xff0c;可以设置多个&#xff0c;每行一个。需要开启sendmail服务。

}

notification_email_from keepalived&#64;localhost #设置邮件的发送地址

smtp_server 127.0.0.1#设置SMTP Server地址

smtp_connect_timeout 30#设置SMTP Server的超时时间

router_id LVS_DEVEL #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息

}

vrrp_instance VI_1 { #vrrp 实例定义部分

state MASTER #指定Keepalived的角色&#xff0c;MASTER表示些主机是主服务器。BACKUP表示此主机是备用服务器

interface eth1 #指定HA监测网络的接口

virtual_router_id 51#虚拟路由标识&#xff0c;这个标识是一个数字&#xff0c;同一个vrrp实例使用唯一的标识&#xff0c;即同一个vrrp_instance下MASTER与BACKUP必须是一致的

priority 50#定义优先级&#xff0c;数字越大&#xff0c;优先级越高

authentication {

auth_type PASS #设置验证类型和密码&#xff0c;MASTER和BACKUP必须使用相同的密码才能正常通信

auth_pass 1111}

virtual_ipaddress { #设置虚拟IP地址&#xff0c;可以设置多个虚拟IP地址&#xff0c;每行一个

192.168.100.250}

}

virtual_server 192.168.100.250 80{ #设置虚拟服务器&#xff0c;需要指定虚拟IP地址和服务端口&#xff0c;IP与端口之间用空格隔开

delay_loop 6#设置运行情况检查时间&#xff0c;单位为秒

lb_algo rr #设置负载调度算法&#xff0c;这里设置rr&#xff0c;即轮询算法

lb_kind DR #设置LVS实现负载均衡机制&#xff0c;有NAT、TUN、DR三个模式可选

persistence_timeout 60#会话保持单位时间&#xff0c;单位是秒

protocol TCP #指定转发协议类型&#xff0c;有TCP和UDP两种

real_server 192.168.100.60 80{ #配置服务节点1&#xff0c;需要指定real server的真实IP地址和端口

weight 1#配置服务节点的权值&#xff0c;权值数字越大&#xff0c;权值越高

TCP_CHECK { #relserve的状态检测设置部分&#xff0c;单位是秒

connect_timeout 10#表示10秒无响应超时

retry 3#表示重试次数

delay_before_retry 3#表示重试间隔

}

}

real_server 192.168.100.80 80{

weight 1TCP_CHECK {

connect_timeout 10#表示10秒无响应超时

retry 3#表示重试次数

delay_before_retry 3#表示重试间隔

}

}

}

我的配置文件

#master

global_defs {

router_id mysql_ha

}

vrrp_instance VI_1 {

state BACKUP

interface ens34

virtual_router_id 51priority 100authentication {

auth_type PASS

auth_pass 1111}

virtual_ipaddress {

192.168.1.210}

}

virtual_server 192.168.1.201 3306{

delay_loop 6lb_algo rr

lb_kind DR

persistence_timeout 60protocol TCP

real_server 192.168.1.201 3306{

weight 1notify_down /etc/keepalived/keepalived_stop.shTCP_CHECK {

connect_timeout 3retry 3delay_before_retry 3connect_port 3306}

}

}

#slave

global_defs {

router_id mysql_ha

}

vrrp_instance VI_1 {

state BACKUP

interface ens34

virtual_router_id 51priority 100authentication {

auth_type PASS

auth_pass 1111}

virtual_ipaddress {

192.168.1.210}

}

virtual_server 192.168.1.202 3306{

delay_loop 6lb_algo rr

lb_kind DR

persistence_timeout 60protocol TCP

real_server 192.168.1.202 3306{

weight 1notify_down /etc/keepalived/keepalived_stop.shTCP_CHECK {

connect_timeout 3retry 3delay_before_retry 3connect_port 3306}

}

}

杀死keepalived的脚本&#xff0c;防止脑裂

/etc/keepalived/keepalived_stop.sh

echo &#39;#!/bin/bash&#39; >/etc/keepalived/keepalived_stop.sh

echo "pkill keepalived" >>/etc/keepalived/keepalived_stop.sh

chmod u&#43;x /etc/keepalived/keepalived_stop.sh

【3.6】修改默认日志文件位置

#默认错误日志位置&#xff1a;/var/log/messages

#(1)修改文件

vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边

KEEPALIVED_OPTIONS&#61;"-D" &#61;》 KEEPALIVED_OPTIONS&#61;"-D -d -S 0"

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.

# --dump-conf         -d Dump the configuration data.

# --log-detail        -D Detailed log messages.

# --log-facility      -S 0-7 Set local syslog facility (default&#61;LOG_DAEMON)

#(2)修改日志级别参数文件

vi /etc/rsyslog.conf

#在最后一行加上

local0.* /var/log/keepalived.log

#(3)重启日志服务

systemctl restart rsyslog

【3.7】启动、查看keepalived

systemctl daemon-reload #重新装载服务

systemctl start keepalived #启动服务

systemctl enable keepalived #设置服务开机自启

systemctl status keepalived#查看服务状态&#xff0c;有没有报错最快可以看这里ps -ef|grep keepalived|grep -v "grep" #查看服务进程

c19bc2a643ff22c244eb6d2262eb5e43.png

8d60145953b270b289327cb48530ee97.png

【3.8】基于mysql连接的核验

先看看机器信息

791c11231173e8bc0f6edec90c8458a6.png 

6634cf578b91d28789849bfb240a1f25.png

用mysql连接虚拟IP地址&#xff0c;查看是哪个机器。

mysql -uroot -p123456 -h192.168.1.210

6ada8b93a82c47bc9f5ed51be4142028.png

果然是DB1。

【3.9】故障转移测试

因为我们设置的是通过3306端口去做连接访问操作&#xff0c;所以只要mysql挂掉&#xff0c;3306端口也就不可访问了&#xff0c;就可以故障转移了。

我们实践一下&#xff0c;如下图&#xff0c;先关闭DB1的mysql

systemctl stop mysql

984883d6c16a0a168b530b9e4eb6218c.png

(1)查看IP地址&#xff0c;是否有虚拟IP

d309caa2e850e182ce2a955f2b660bfd.png 

7245fdf7bff8308a9fd15c2131c1af23.png

由上图可知&#xff0c;很明显已经飘到DB2机器上来了。

(2)用连接虚拟IP mysql

mysql -uroot -p123456 -h192.168.1.210

1bca7a88ea8a86bc5bfe47d2bc72d759.png

结果是DB2&#xff0c;证明连上的确实是我们想要的结果。

参考文档



推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • NSD cisco高级路由与交换技术2014.8.12
    实验01:DHCP服务的应用实验目标:通过建立DHCP服务,给计算机自动分配地址实验环境:实验步骤:一、配置计算机pc8pc ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
author-avatar
zc43pml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有