keepalived Mysql 高可用
安装
#下载keepalive源码包:
wget https://www.keepalived.org/software/keepalived-1.3.5.tar.gz
#解压:
tar -xf keepalived-1.3.5.tar.gz -C /usr/src/
#安装依赖包:
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel libnl libnl-devel libnfnetlink libnfnetlink-devel
#预编译keepalive:
cd /usr/src/keepalived-1.3.5/
./configure --prefix=/usr/local/keepalived/ --with-kernel-dir=/usr/src/kernels/3.10.0-514.el7.x86_64/
#编译&&安装keepalive:
make && install
#安装完成后,keepalived的默认配置文件地址不一样所以复制过去就可以了
cp /usr/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/src/keepalived-1.3.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#配置环境变量
vim /etc/profile
#后面添加如下内容:
export PATH=$PATH:/usr/local/keepalived/sbin
source /etc/profile
写脚本并赋予权
vim /opt/my.sh
#!/bin/sh
#查看3306端口返回监听此端口的进程数
STAT=`netstat -ant|grep LISTEN|egrep "3306"|wc -l`
#判断进程是否小于0,如果小于0停止keepalived
if [ $STAT -eq 0 ];then
systemctl stop keepalived
exit
fi
:wq
chmod +x my.sh
编写keepalived配置文件
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/opt/my.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -20 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
}
vrrp_instance VI_1 {
state BACKUP #mysql-M与mysql-B保持均为BACKUP
interface eno16780032 #网卡接口
virtual_router_id 77 #router id保持一直
priority 100 #优先级,mysql-B数值小于100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #M与B要一致
}
virtual_ipaddress {
192.168.2.99 #VIP地址 M与B要一致
}
track_script {
chk_mysql_port
}
}
以上是M的配置的,可以复制到B里,修改一下优先级 之后重启即可
systemctl restart keepalived
执行脚本
#!/bin/sh
PATH=/usr/sbin:/usr/bin:$PATH
export PATH
STAT=`netstat -ant|grep LISTEN|egrep "3306"|wc -l`
if [ $STAT -eq 0 ];then
/etc/init.d/keepalived stop
exit
fi
- name: "Statistics CPU Memory Disk Utilization..."
shell: |
详细参数
[全局定义块]
global_defs {
notification_email { --指定keepalived在发生切换时需要发送email到的对象,一行一个;
wgkgood@gmail.com
}
notification_email_from root@localhost --指定发件人
smtp_server 127.0.0.1 --指定smtp服务器地址
smtp_connect_timeout 3 --指定smtp连接超时时间
router_id LVS_DEVEL --运行keepalived机器的标识
}
[监控Nginx进程]
vrrp_script chk_nginx {
script "/data/script/nginx.sh" --监控服务脚本,脚本x执行权限;
interval 2 --检测时间间隔(执行脚本间隔)
weight 2 --权重
}
[VRRP实例定义块]
vrrp_sync_group VG_1{ --监控多个网段的实例
group {
VI_1 --实例名1
VI_2
}
notify_master /data/sh/nginx.sh --指定当切换到master时,执行的脚本
notify_backup /data/sh/nginx.sh --指定当切换到backup时,执行的脚本
notify /data/sh/nginx.sh --发生任何切换,均执行的脚本
smtp_alert --使用global_defs中提供的邮件地址和smtp服务器发送邮件通知;
}
vrrp_instance VI_1 {
state BACKUP --设置主机状态,MASTER|BACKUP
nopreempt --设置为不抢占
interface eth0 --对外提供服务的网络接口
lvs_sync_daemon_inteface eth0 --负载均衡器之间监控接口;
track_interface { --设置额外的监控,网卡出现问题都会切换;
eth0
eth1
}
mcast_src_ip --发送组播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay --在切换到master状态后,延迟进行gratuitous ARP请求
virtual_router_id 50 --VRID标记 ,路由ID,可通过#tcpdump vrrp查看
priority 90 --优先级,优先级高者竞选为master
advert_int 5 --检查间隔,默认5秒
preempt_delay --抢占延时,默认5分钟
debug --debug日志级别
authentication { --设置认证
auth_type PASS --认证方式
auth_pass 1111 --认证密码
}
track_script { --以脚本为监控chk_nginx;
chk_nginx
}
virtual_ipaddress { --设置vip地址
192.168.111.188
}
}
注意:使用了脚本监控Nginx或者MYSQL,不需要下面虚拟服务器设置块。
[虚拟服务器定义块]
virtual_server 192.168.111.188 3306 {
delay_loop 6 --健康检查时间间隔
lb_algo rr --调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR --负载均衡转发规则NAT|DR|TUN
persistence_timeout 5 --会话保持时间
protocol TCP --使用的协议
real_server 192.168.1.12 3306 {
weight 1 --默认为1,0为失效
notify_up <string> | <quoted-string> --在检测到server up后执行脚本;
notify_down <string> | <quoted-string> --在检测到server down后执行脚本;
TCP_CHECK {
connect_timeout 3 --连接超时时间;
nb_get_retry 1 --重连次数;
delay_before_retry 1 --重连间隔时间;
connect_port 3306 --健康检查的端口;
}
HTTP_GET {
url {
path /index.html --检测url,可写多个
digest 24326582a86bee478bac72d5af25089e --检测效验码
--digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html
status_code 200 --检测返回http状态码
}
}
}
- name: Find files
win_find:
paths: C:\Downloads
recurse: yes
register: dwnlds_list
- name: Output file list
debug: msg="{{ dwnlds_list | json_query('files[].path') }}"