nginx实现高可用


什么是高可用

一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。

image-20240603143247089

高可用通常使用什么软件?

硬件通常使用 F5	软件通常使用 keepalived
keepalived是如何实现高可用的?
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题

image-20240603143409544

问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?

image-20240603143439685

高可用核心感念

高可用keepalived使用场景
通常业务系统需要保证7×24小时不DOWN机,比如公司内部的OA系统,每天公司人员都需要使用,则
不允许Down机,作为业务系统来说随时都可用
1、如何确定谁是主节点谁是备节点(选举投票,优先级)
2、如果Master故障,Backup自动接管,那么Master回复后会夺权吗(抢占式、非抢占式)
3、如果两台服务器都认为自己是Master会出现什么问题(脑裂)

环境准备

主机名 角色 IP 应用
lb01 主节点 5 nginx,keepalived
lb02 备节点 6 nginx,keepalived
VIP 虚拟IP 3

keepalived工作环境

1.哪些机器要做高可用 就在哪些机器上面安装keepalived
2.keepalived在主节点 做心跳检测(检测主节点是否存活)
3.心跳检测失败(主机点宕机/断电/炸了) 在主机点杀死自己 停止keepalived进程
4.VIP会漂移到备节点

安装keepalived

[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived

抢占式(主节点永远是主节点)

# 安装
[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived
# 编辑主节点的配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
	router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
	state MASTER 				#标识角色状态
	interface eth0 				#网卡绑定接口
	virtual_router_id 50		 #虚拟路由id
	priority 150 				#优先级
	advert_int 1 				#监测间隔时间
	authentication { 			#认证
		auth_type PASS 				#认证方式
		auth_pass 1111 				#认证密码
}
virtual_ipaddress {
	10.0.0.3 #虚拟的VIP地址
	}
}
# 配置备节点
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
	router_id lb02
}
vrrp_instance VI_1 {
	state BACKUP
	interface eth0
	virtual_router_id 50
	priority 100
	advert_int 1
	authentication {
	auth_type PASS
	auth_pass 1111
}
	virtual_ipaddress {
	10.0.0.3
	}
}
# 主节点和备节点启动keepalived
[root@lb02 ~]# systemctl start keepalived.service
[root@lb01 ~]# systemctl start keepalived.service

# 抢占式原理
主节点宕机/断电 停止keepalived服务
查看VIP是否漂移到备节点(lb02)
再测试 恢复主节点的keepalived服务
查看VIP会从备节点漂移到主节点(lb01)
配置文件区别(/etc/keepalive/keepalived.conf) lb01 lb02
router_id(唯一标识) router_id lb01 route_id lb02
priority (优先级) 150 100
state(角色状态) MASTER BACKUP

非抢占式(互相争夺老大)

1.两个节点state都必须得是BACKUP
2.两个节点都要加上配置nopreempt
3.其中的一个节点的优先级要高于另一个节点的优先级
## 修改主节点的配置
global_defs { #全局配置
	router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
	state BACKUP #标识角色状态
	interface eth0 #网卡绑定接口
	virtual_router_id 50 #虚拟路由id
	priority 150 #优先级
	nopreempt    ### 不同点
	advert_int 1 #监测间隔时间
	authentication { #认证
		auth_type PASS #认证方式
		auth_pass 1111 #认证密码
	}
virtual_ipaddress {
	10.0.0.3 #虚拟的VIP地址
	}
}
## 修改副节点的配置
global_defs {
	router_id lb02
}
vrrp_instance VI_1 {
	state BACKUP
	interface eth0
	virtual_router_id 50
	priority 100
	nopreempt
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}
virtual_ipaddress {
	10.0.0.3
	}
}
# 主节点和备节点重动keepalived
[root@lb02 ~]# systemctl start keepalived.service
[root@lb01 ~]# systemctl start keepalived.service
# 测试
lb01停止keepalived服务
VIp10.0.0.3 漂移到lb02
即使lb01重启keepalived服务
VIP10.0.0.3也不会直接漂移到lb01 而是定格在lb02
抢占 非抢占
router_id lb01 lb02
vrrp_instance VI_1 层下添加nopreempt
priority 150 100
主节点不变 都可以为主节点

keepalived结合nginx做高可用

# 如何判断nginx存活与否
[root@lb01 ~]# ps -ef | grep [n]ginx | wc -l
2
[root@lb01 ~]# systemctl stop nginx
[root@lb01 ~]# ps -ef | grep [n]ginx | wc -l
$?
# 编辑脚本
企业级脚本 不要使
用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
vim cnx.sh
ngx_statu=`ps -ef | grep [n]ginx| wc -l`
if [ $ngx_statu -eq 0 ];then
	systemctl restart nginx
	sleep 3
	ngx_status_pid=`ps -ef | grep [n]ginx| wc -l`
	if [ $ngx_status_pid -eq 0 ];then
		systemctl stop keepalived
	fi
fi


# 测试用他!!!!!!!!!!!!!

vim cnx.sh
#!/bin/bash
ngx_statu=`ps -ef | grep [n]ginx| wc -l`
if [ $ngx_statu -eq 0 ];then
		systemctl stop keepalived
fi

# 添加执行权限给到脚本文件
chmod +x cnx.sh

# 编辑主机点配置文件
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
script "/root/cnx.sh"       ######### 必须有执行权限
	interval 5
}
vrrp_instance VI_1 {
	state BACKUP #标识角色状态
	interface eth0 #网卡绑定接口
	virtual_router_id 50 #虚拟路由id
	priority 150 #优先级
	nopreempt
		advert_int 1 #监测间隔时间
		authentication { #认证
		auth_type PASS #认证方式
		auth_pass 1111 #认证密码
	}	
virtual_ipaddress {
	10.0.0.3 #虚拟的VIP地址
}
#调用并运行脚本
track_script {
	check_web
	}
}

## 编辑完配置文件一定要重启keepalived服务
systemctl restart keepalived

# 副节点也添加检测nignx脚本配置
global_defs {
	router_id lb02
}
vrrp_script check_web {
	script "/root/cnx.sh"
	interval 5
}
vrrp_instance VI_1 {
	state BACKUP
	interface eth0
	virtual_router_id 50
	priority 100
	nopreempt
	advert_int 1
	authentication {
	auth_type PASS
	auth_pass 1111
	}
virtual_ipaddress {
	10.0.0.3
}
track_script {
	check_web
	}
}
10.0.0.3 wp.web.com

Ansible基本概念

什么是Ansible?
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可
以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
同类型软件对比
	1.puppet 学习难,安装ruby环境难,没有远程执行功能
	2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
	3.saltstack 一般选择salt会使用 C/S 结构的模式, salt-master 和 salt-minion ,并行	的,大规
模批量操作的情况下,会比Ansible速度快一些,底层使用的是 zero-MQ 消息队列

手动运维时代(原始社会)

在之前,我们学习了如何安装nginx。但是我们使用的是yum安装的方式,在以前,运维需要规范,需要统一配置管理,我们只能使用源码安装方式,便于我们去管理,源码安装,如果是单台还好,一会也就装完了,如果此时,生产环境压力骤增,需要扩展100台web节点(源码安装100台nginx)我们该如何操作?
重复安装nginx步骤100遍???
以上步骤还只是安装,那还要部署代码呢?修改配置文件?优化?启动?那还工作个毛线啊,一天啥也不用干了,就装 nginx 吧。

自动化运维时代

一条命令搞定,搞定100台集群

image-20240603150033013

image-20240603150114117

Ansible的功能及优点

1.远程执行
批量执行远程命令,可以对多台主机进行远程操作
2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如 saltstack .
saltstack本身可以通过saltcloud管理各大云厂商的云平台。
5.二次开发
因为语法是Python,所以便于运维进行二次开发。
6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装 apache 和启动服务
在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd
在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx

Ansible的架构和执行流程

######## 架构 #########
1、连接插件 connection plugins 用于连接主机 用来连接被管理端
2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块 custom modules 根据自己的需求编写具体的模块
4、插件 plugins 完成模块功能的补充
5、剧本 playbook ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单 inventor 定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块

####### 执行流程 #########
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。

image-20240603150422145


安装Ansible

主机名 wanIP lanIP 角色
m01 61 61 Ansible控制端
lb01 5 5 Ansible被控制
lb02 6 6 Ansible被控制

m01 安装ansible

# 安装ansible
yum install -y ansible


#ansible <host-pattern> [options]
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
[root@m01 ~]# vim /etc/ansible/ansible.cfg
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

[root@m01 ~]# rpm -ql ansible

[root@m01 ~]# zcat /usr/share/man/man1/ansible-config.1.gz
#要查看完整列表,请访问https://docs.ansibe.com/或使用ansibe-config命令。
For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the
\fIansible\-config\fP command.

#/etc/ansible/ansible.cfg 配置文件,如果存在则使用
/etc/ansible/ansible.cfg \-\- Config file, used if present

#~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
~/.ansible.cfg \-\- User config file, overrides the default config if present#\&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。

#如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all
others.

控制主机方式

##### 场景一   基于密码连接 #########
vim /etc/ansible/hosts
[webs]
10.0.0.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.6 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

# 测试
ansible webs -m ping
10.0.0.6 | SUCCESS => {
	"ansible_facts": {
		"discovered_interpreter_python": "/usr/bin/python"
	},
	"changed": false,
	"ping": "pong"
}
10.0.0.5 | SUCCESS => {
"ansible_facts": {
	"discovered_interpreter_python": "/usr/bin/python"
	},
	"changed": false,
	"ping": "pong"
}


##### 场景二 主机名+密码 #####(没成功)
lb01 ansible_ssh_pass='1'
lb02 ansible_ssh_pass='1'

# 做解析
vim /etc/housts

# 免密连接
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

###### 场景三 IP  ########
vim /etc/ansible/hosts
[lb_groups]
10.0.0.5
10.0.0.6

10.0.0.6 | SUCCESS => {
"ansible_facts": {
	"discovered_interpreter_python": "/usr/bin/python"
	},
	"changed": false,
	"ping": "pong"
}
10.0.0.5 | SUCCESS => {
	"ansible_facts": {
	"discovered_interpreter_python": "/usr/bin/python"
	},
	"changed": false,
	"ping": "pong"
}



########## 终极升级进化版企业级别无敌版本 ###########
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

# 主机清单
vim /etc/ansible/hosts
[lb_groups]
lb01 ansible_host=10.0.0.5
lb02 ansible_host=10.0.0.6
[web_groups]
web01 ansible_host=10.0.0.7
web02 ansible_host=10.0.0.8

## 命令
ansible db01 -m shell -a 'df -h'  ##  (-m 指定就模块 shell 和 command)
ansible db01 -m command -a 'df -h'