linux 高可用----keepalived+lvs

什么是高可用?

HA(high availability)即高可用性;就是在高可用集群中发生单点故障时,能够自动转移资源并切换服务,以保证服务一直在线的机制。

LVS

LVS:(linux virtual server)即linux虚拟服务器;开源项目,主要达到负载均衡的作用。

LVS组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm

  1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

ipvsadm包安装

╭─root@localhost.localdomain ~  
╰─➤  yum install ipvsadm -y

负载均衡比较

LVS:

  1. 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
  2. 工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
  3. 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
  4. 应用范围比较广,可以对所有应用做负载均衡;
  5. 不支持正则处理,不能做动静分离。
  6. 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
  7. 配置 复杂,对网络依赖比较大,稳定性很高。

Ngnix:

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
  2. Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
  3. Nginx安装和配置比较简单,测试起来比较方便;
  4. 也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
  5. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
  6. Nginx对请求的异步处理可以帮助节点服务器减轻负载;
  7. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
  8. 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
  9. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
  10. Nginx还能做Web服务器即Cache功能。

HAProxy:

  1. 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
  2. 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
  3. 支持url检测后端的服务器出问题的检测会有很好的帮助。
  4. 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
  5. 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
  6. HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
  7. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  8. 不能做Web服务器即Cache

LVS三种工作模式

  1. NAT模式
  2. 路由模式
  3. 隧道模式

NAT模式

调度器环境:

##连接外部的网卡:
192.168.31.100
255.255.255.0
192.168.31.1
##连接real_server的网卡:
172.16.100.1
255.255.255.0

real_server1环境:

172.16.100.2
255.255.255.0
172.16.100.1    #网关指向调度器

real_server2环境:

172.16.100.3
255.255.255.0
172.16.100.1   #网关指向调度器

调度器配置:

╭─root@localhost.localdomain ~  
╰─➤  cat /proc/sys/net/ipv4/ip_forward 
0
╭─root@localhost.localdomain ~  
╰─➤  echo 1 > /proc/sys/net/ipv4/ip_forward或者vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
#调度器配置命令
ipvsadm -A -t 192.168.31.100:80 -s rr 
ipvsadm -a -t 192.168.31.100:80 -r 192.168.250.2 -m 
ipvsadm -a -t 192.168.31.100:80 -r 192.168.250.3 -m 

查看配置LVS内容:

╭─root@localhost.localdomain ~  
╰─➤  ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.137.3:80 rr-> 172.16.100.10:80             Masq    1      0          2         -> 172.16.100.20:80             Masq    1      0          2

特点:

  • 调度器会成为性能上的瓶颈
  • 可以不同网段

路由模式

DR模式环境:direct_server:192.168.254.17real_server:192.168.254.18real_server:192.168.254.19#vip为虚拟服务ipvip:192.168.254.250    
....................................................................................................................    调度器:
direct_server:ipvsadm -C    #清除配置信息#添加对外提供的服务ipipvsadm -A -t 192.168.254.250:80 -s rr    #-A为ADD   -t为tcp   -s rr为设置算法为轮叫算法#添加2台real_server主机ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g #-a为add   -t为tcp   -r为realserver   -g为DR路由模式#配置网卡的子网口为vip,ip地址为192.168.254.250ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up#添加路由(访问192.168.254.250都走ens33:0这个网卡)route add -host 192.168.254.250 dev ens33:0
........................................................................................................................
real_server端:real_server:#在回环地址的子网口上配置服务ip(vip)ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #添加静态路由指定lo:0端口route add -host 192.168.254.250 dev lo:0echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2">/proc/sys/net/ipv4/conf/lo/arp_announceecho "1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2">/proc/sys/net/ipv4/conf/all/arp_announceecho "0">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0">/proc/sys/net/ipv4/conf/lo/arp_announceecho "0">/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0">/proc/sys/net/ipv4/conf/all/arp_announcearp_ignore:定义接收到ARP请求时的响应级别      0:默认,只用本地配置的有响应地址都给予响应       1:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)arp_announce:定义将自己的地址向外通告时的级别       0:默认,表示使用配置在任何接口的任何地址向外通告       1:尽量仅向目标网络通告与其网络匹配的地址       2:仅向与本地接口上地址匹配的网络进行通告

拓展:python 远程布置LVS路由模式代码:

import paramiko
vip = '192.168.254.250'
ds = '192.168.254.13'
rs1 = '192.168.254.11'
rs2 = '192.168.254.12'
ds_cmd = '''
ipvsadm -C;
ipvsadm -A -t {vip}:80 -s wrr;
ipvsadm -a -t {vip}:80 -r {rs1}:80 -w 1 -g;
ipvsadm -a -t {vip}:80 -r {rs2}:80 -w 2 -g;
ifconfig ens33:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {vip} dev ens33:0;
'''.format(vip=vip, rs1=rs1, rs2=rs2)rs1_cmd = '''
ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {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;
service httpd restart
'''.format(vip=vip)
rs2_cmd = '''
ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {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;
service httpd restart
'''.format(vip=vip)ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())def direct_server():ssh.connect('{ds}'.format(ds=ds), 22, 'root', 'root',timeout=3)stdin, stdout, stderr = ssh.exec_command(ds_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('dicret_server配置完成!!!')def real_server1():ssh.connect('{rs1}'.format(rs1=rs1), 22, 'root', 'root', timeout=3)stdin, stdout, stderr = ssh.exec_command(rs1_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('real_server1配置完成!!!')def real_server2():ssh.connect('{rs2}'.format(rs2=rs2), 22, 'root', 'root', timeout=3)stdin, stdout, stderr = ssh.exec_command(rs2_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('real_server2配置完成!!!')def main():direct_server()real_server1()real_server2()ssh.close()if __name__ == '__main__':main()

keepalived

vrrp协议

VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换不影响主机间的数据通信,这其中涉及两个概念:物理路由器和虚拟路由器

VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,

在虚拟路由器内部,是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称之为主路由器(处于master状态角色)。它拥有对外提供的虚拟ip,提供各种网络功能,比如arp请、icmp、数据转发等,

其他物理路由器不拥有对外提供服务的虚拟ip,也不提供对外网络功能,仅仅接收master的vrrp状态通告信息,这些路由器被统称为备份路由器(处于backup角色)。

在一个虚拟路由器中,只有处于master角色的路由器会一直发送vrrp数据包,处于backup角色的路由器只接受master发过来的报文信息,用来监控master运行状态,因此,不会发生master抢占的现象,除非它的优先级更高,

当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行选举,优先级最高的backup将成为新的master,这种选举并进行角色的过程非常快,因此也就保证了服务的持续可用性

keepalived结构体系

1675881-20190702151441904-467199170.png

安装keepalived

╭─root@localhost.localdomain ~  
╰─➤  yum install keepalived -y

keepalived主配置文件

╭─root@localhost.localdomain ~  
╰─➤  vim /etc/keepalived/keepalived.conf

主配置文件分三部分:

  • 全局配置
  • VRRP配置
  • LVS配置

拓展1:基于mysql或者mariadb数据库的高可用如下配置

! Configuration File for keepalivedglobal_defs {notification_email {}
}vrrp_script chk_mysql {                  #check_mysql是为执行脚本计划起的名字script "/root/sh/check_mysql.sh"     #指定要执行脚本的路径interval 2                           #脚本执行间隔,每2s检测一次
}vrrp_instance HA_1 {state BACKUPinterface ens33virtual_router_id 151priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.254.250/24}track_script {                    #跟踪脚本计划( chk_mysql)chk_mysql}
}

脚本文件内容:

╭─root@localhost.localdomain ~/sh  
╰─➤  vim check_mysql.sh
...................................................
#!/bin/bash
service mariadb status
if [ $? -nq 0 ];thenservice keepalived stop
..................................................

拓展2:基于web网站的负载均衡高可用如下配置

keepalived:yum install keepalivedvim /etc/keepalived/keepalived.conf! Configuration File for keepalived
#全局配置
global_defs {notification_email {#收件人地址}#邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {state MASTER                    #角色类型MASTER|BACKUPinterface ens33                    #网卡名称virtual_router_id 51            #虚拟路由id(需要与BACKUP一致)priority 100                    #优先级advert_int 1                    #没1秒检查一次#nopreempt                        #非抢占模式authentication {auth_type PASS                #认证类型  主备之间必须一样auth_pass 1111                #认证密码  主备之间必须一样}virtual_ipaddress {192.168.254.250/24                #虚拟ip(vip)}
}#LVS配置
virtual_server 192.168.254.250 80 {    delay_loop 3                    #健康检查时间间隔lb_algo rr                        #负载均衡调度算法  lb_kind DR                        #负载均衡转发规则 protocol TCP                    #协议real_server 192.168.254.18 80 {    #要监控的real_server的ip和端口号weight 1                 #权重TCP_CHECK {                    #基于tcp协议的检查connect_timeout 3          #连接时间超时retry 3                    #重连次数delay_before_retry 3    #重连间隔时间}}real_server 192.168.254.19 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}   }   
}

1675881-20190710151309560-1574333289.jpg

转载于:https://www.cnblogs.com/du-z/p/11120825.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户配置相关文件

用户配置相关文件小总结 /etc/passwd 记录用户相关的信息 /etc/shadow 密码影子文件 /etc/group 记录用户组相关的信息 /etc/gshadow 密码影子文件(组密码) /etc/passwd 文件中各段的内容 第1段:用户名 第…

华为5c android n风格,华为荣耀畅玩5C的屏幕怎么样

华为荣耀畅玩5C的屏幕怎么样屏幕方面,华为荣耀畅玩5C采用了5.2英寸1080P级别GFF贴合屏幕,塑料边框采用了弧面状的设计,握感比较舒适。华为荣耀畅玩5C采用了双主天线的设计,分别在上下的塑料区域。此外,边框以及后盖的上…

spring解析配置文件(三)

一、从XmlBeanDefinitionReader的registerBeanDefinitions(doc,resource)开始 1 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) 2 throws BeanDefinitionStoreException { 3 try { 4 …

leetcode968. 监控二叉树(dfs)

给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足…

linux系统部署war包,查看tomcat日志

1.部署war包app/tomcat/bin在tomcat/bin 目录下启动 .startup.sh,在启动过程中tomcat会对war包进行解压,形成相应的项目目录 执行命令:./startup.sh 2.实时查看tomcat的日志。首先需要到tomcat的日志目录下。我的目录供你参考app/tomcat/logs…

代码编写工具_这些工具将帮助您编写简洁的代码

代码编写工具看一下Prettier,ESLint,Husky,Lint-Staged和EditorConfig (A look at Prettier, ESLint, Husky, Lint-Staged and EditorConfig) Learning to write good code, but you don’t know where to start… Going through style-guide…

使用kibana和elasticsearch日志实时绘制图表

前言: 此文接的是上篇,上次的内容是,用python操作elasticsearch存储,实现数据的插入和查询。 估计有些人一看我的标题,以为肯定是 logstash kibana elasticsearch的组合。这三个家伙也确实总是勾搭在一块。 其实logst…

android中设置菜单栏,android – 菜单项没有显示在操作栏

我做了一个全新的项目。我已经添加了项目到菜单布局文件。这些项目不会显示在操作栏的右侧。我记得一个有三个点的图标显示出来,打开菜单。这里是我的活动public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState)…

leetcode617. 合并二叉树(dfs)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接…

conda使用报错:ImportError:DLL load failed

conda安装python环境经常报: ImportError:DLL load failed 将环境变量加入path可以解决: D:\program\anaconda D:\program\anaconda\Scripts D:\program\anaconda\Library\bin 转载于:https://www.cnblogs.com/timlong/p/11122805.html

《程序员修炼之道》笔记(八)

第八章 注重实效的项目 随着你的项目开动,我们需要从个体的哲学和编码问题转向讨论更大的、项目级的问题。我们将不深入项目管理的具体细节,而是要讨论能使项目成功或失败的几个关键区域。 1. 注重实效的团队 书中前面的内容都是帮助个体成为更好的程序员…

android 网络调试 源代码,Android源代码调试环境搭建

我们在调试Android应用程序的时候,有时候遇到一些莫名其妙的问题,因此我们需要查看Android内部是如何调用的。我们都知道Android是一个伟大的开源项目,因此debug的时候肯定是支持源代码级别调试的。采用源代码调试,一方面有利于发…

如何使用HTTP压缩优化服务器

鉴于互联网上的宽带有限,网络管理人员任何旨在加速接入速度的努力都是有价值的。其中的一个方法就是通过HTTP压缩技术实现接入速度的加速,它通过减少在服务器和客户端之间传输的数据量,显著地提高网站的性能。数据压缩本身并不新鲜。但是&…

leetcode117. 填充每个节点的下一个右侧节点指针 II(dfs)

给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 …

cmd命令大全

遍历当前盘所有文件 dir /ad/s/b ASSOC 显示或修改文件扩展名关联。ATTRIB 显示或更改文件属性。BREAK 设置或清除扩展式 CTRLC 检查。BCDEDIT 设置启动数据库中的属性以控制启动加载。CACLS 显示或修改文件的访问控制列表(ACL)。CALL 从另一个批处理程序调用这一个。CD 显示当…

mac web开发_如何设置Mac进行Web开发

mac web开发While you can build basic websites with nothing more than a text editor and browser, you may want to up your game by adding a JavaScript framework like React or Vue and useful tools like Git to your workflow.虽然可以只使用文本编辑器和浏览器来构建…

OpenGL研究3.0 多边形区域填充

OpenGL研究3.0 多边形区域填充 DionysosLai(906391500qq.com)2014-06-22 所谓多边形区域填充。就是将多边形内部区域,所有已相同色块填充。注意:这里讨论的多边形是简单多边形(即不考虑诸如五角星这样的相交多边形)。简单多边形&a…

[转]Android笔记:ScrollView嵌套ViewPager的滚动冲突解决方法

12345678910111213141516171819202122232425262728293031323334/*** 能够兼容ViewPager的ScrollView * Description: 解决了ViewPager在ScrollView中的滑动反弹问题 */ public class ScrollViewExtend extends ScrollView { // 滑动距离及坐标 private float xDistance, yDista…

android tv 乐视手机,乐视超4系列原生Android TV分享

固件:Official USA Firmware:USA BIN Firmware 5.8.050S_1028://mega.nz/#F!7PhyDI6D!TnwNlMmWXosK1uCUdpyNGg[/url]USA ZIP Firmware 5.8.056S_0420 (OTA ZIP, must be flashed only after flashing the above bin)://drive.google.com/open?id1N9...rNHVB_-VPIad…

ping、网络抖动与丢包

基本概念: ping: PING指一个数据包从用户的设备发送到测速点,然后再立即从测速点返回用户设备的来回时间。也就是俗称的“网络延迟” 一般以毫秒(ms)计算 一般PING在0~100ms都是正常的速度,不会有较为明显的卡顿。 测试…