目录
1. 前言
2. 安装
3. 配置文件详解
4. 工作原理
5.Linux 下托管. NET Core 项目
6.Linux 下. NET Core 项目负载均衡
7. 负载均衡策略
8. 加权轮询 (round robin) 策略剖析
9.IP 哈希 (ip hash) 策略剖析
10. 最少连接 (least_conn) 策略剖析
11. 随机 (random) 策略剖析
12.URL 哈希 (url hash) 策略剖析
13. 响应时间 (fair) 第三方模块详解
14.Linux 下. NET Core 项目 Nginx+Keepalived 高可用(主从模式)
15.Linux 下. NET Core 项目 Nginx+Keepalived 高可用(双主模式)
16.Linux 下. NET Core 项目 LVS+Keepalived+Nginx 高可用集群
17. 构建静态服务器
18. 日志分析
19. 优化策略
20. 总结
在这里我们简单介绍下 Keepalived, 它是一个基于 VRRP 协议来实现的服务高可用方案, 可以利用其来避免 IP 单点故障, 类似的工具还有 heartbeat,corosync,pacemaker. 但是它一般不会单独出现, 而是与其它负载均衡技术 (如 lvs,haproxy,nginx) 一起工作来达到集群的高可用. 在这里我们就不先详细的介绍 keepalived 的相关内容, 这一部分内容后面的文章会有提到. 这里主要讲解如何去利用 keepalived 部署高可用的双机主从模式.
所谓的双机主从模式, 就是前端使用两台服务器, 一台主服务器和一台热备服务器, 正常情况下, 主服务器绑定一个公网虚拟 IP, 提供负载均衡服务, 热备服务器处于空闲状态; 当主服务器发生故障时, 热备服务器接管主服务器的公网虚拟 IP, 提供负载均衡服务; 但是热备服务器在主机器不出现故障的时候, 永远处于浪费状态.
如果在尝试的过程中, 遇到不明上下文的, 例如像 VM 如何安装, Nginx 如何安装部署等可以看《Nginx 知多少系列之 (一) 前言》,《.NET Core 项目部署到 Linux(Centos7)(一)前言》两个专题系列.
注意: 遇到不明白的地方, 哪里有不对的以及有好的建议的, 记得评论留言喔, 我会尽快回复!
- # 进入 Nginx 配置文件目录
- cd /etc/nginx/conf.d
- # 编辑配置文件
- sudo VIM upstream.conf
- # 按 i 进入编辑模式, 输入下面的内容
- upstream netCoreDemo {
- server 192.168.157.130;
- server 192.168.157.131;
- server 192.168.157.132;
- }
- server {
- listen 80;
- location / {
- proxy_pass http://netCoreDemo;
- }
- }
- # 编辑好后, 按 Esc, 再输入: wq 保存退出
- # 重启 nginx
- sudo nginx -s reload
- # 安装 keepalived
- sudo yum install -y keepalived
- # 进入 keepalived 目录
- cd /etc/keepalived
- # 备份配置文件
- sudo cp keepalived.conf keepalived.conf.bak
- # 删除配置文件, 里面的配置太长了, 这里我们做简单配置, 所以还是删了在创建新的比较方便哈
- sudo rm -rf keepalived.conf
- # 创建新配置文件
- sudo touch keepalived.conf
- # 编辑配置文件
- sudo VIM keepalived.conf
- # 按 i 进入编辑模式, 复制下面的配置信息
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_01
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.157.100
- }
- }
- # 按 Esc, 然后: wq 保存退出
- # 进入 keepalived 目录
- cd /etc/keepalived
- # 备份配置文件
- sudo cp keepalived.conf keepalived.conf.bak
- # 删除配置文件, 里面的配置太长了, 这里我们做简单配置, 所以还是删了在创建新的比较方便哈
- sudo rm -rf keepalived.conf
- # 创建新配置文件
- sudo touch keepalived.conf
- # 编辑配置文件
- sudo VIM keepalived.conf
- # 按 i 进入编辑模式, 复制下面的配置信息
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_02
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 99
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.157.100
- }
- }
- # 按 Esc, 然后: wq 保存退出
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_01 #keepalived 标识信息, 自定义
- }
- vrrp_instance VI_1 {
- state MASTER #指定实例初始状态, 实际的 MASTER 和 BACKUP 是选举决定的
- interface ens33 #指定实例绑定的网卡
- priority 100 #设置优先级, 优先级高的会被竞选为 Master,MASTER 和 BACKUP 的优先级要不一样
- advert_int 1 #检查的时间间隔, 默认 1s
- authentication { #设置认证
- auth_type PASS #认证方式, 支持 PASS 和 AH, 官方建议使用 PASS
- auth_pass 1111 #认证的密码
- }
- virtual_ipaddress { #设置 VIP, 可以设置多个, 用于切换时的地址绑定.
- 192.168.157.100
- }
- }
- # 查看网卡信息
- ifconfig
- # 启动主服务器的 Keepalived
- sudo service keepalived start
- # 查看 keepalived 状态
- service keepalived status
- # 查看日志文件
- sudo Less /var/log/messages
- #Less 查看一个文件时, 可以使用类似 vi 的 command 命令, 在 command 模式下按 G 跳到文件末尾, 再使用 f 或 B 来翻页
- Less filename
- # 查看 IP 信息
- ip add
- # 重启 Linux
- sudo reboot
- # 查看防火墙状态
- service firewalld status
- # 暂时性关闭防火墙, 下次开机又会打开
- sudo service firewalld stop
- # 永久性关闭防火墙
- sudo systemctl disable firewalld
- # 开启服务器的 keepalived
- sudo service keepalived start
- # 开启组播地址
- sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
- # 刷新防火墙配置
- sudo firewall-cmd --reload
- # 查看防火墙状态
- service firewalld status
- # 开启 keepalived
- sudo service keepalived start
- # 查看 keepalived 的状态
- service keepalived status
- # 查看 ip 信息
- ip add
- # 主服务器直接关机
- # 在从服务器尝试 PING 主服务器 IP 192.168.157.150
- ping 192.168.157.150
- # 查看 IP 信息
- ip add
- # 查看日志文件
- sudo Less /var/log/messages
- #Less 查看一个文件时, 可以使用类似 vi 的 command 命令, 在 command 模式下按 G 跳到文件末尾, 再使用 f 或 B 来翻页
- Less filename
- # 停止 keepalived 服务
- sudo service keepalived stop
- # 查看 keepalived 状态
- service keepalived status
- # 停止 Nginx
- sudo nginx -s stop
- # 查看 ip 信息
- ip add
- # 查看 keepalived 的进程
- ps aux |grep keepalived
- # 进入 keepalived.service 目录
- cd /usr/lib/systemd/system
- # 编辑 keepalived.service
- sudo VIM keepalived.service
- # 按 i 进去编辑模式
- # 注释掉
- KillMode=process
- # 按 Esc, 然后: wq 保存退出
- # 重新加载配置
- sudo systemctl daemon-reload
- # 开启主服务器的 keepalived
- sudo service keepalived start
- # 停止主服务器的 keepalived 服务
- sudo service keepalived stop
- # 查看 keepalived 状态
- service keepalived status
- # 查看 IP 信息
- # 编辑 keepalived 配置文件
- sudo VIM /etc/sysconfig/keepalived
- # 按 i 进入编辑模式
- # 把 KEEPALIVED_OPTIONS="-D" 修改为 KEEPALIVED_OPTIONS="-D -d -S 0"
- KEEPALIVED_OPTIONS="-D -d -S 0"
- # 按 Esc 然后: wq 保存退出
- # 修改 rsyslog 文件
- sudo VIM /etc/rsyslog.conf
- # 按 i 进入编辑模式
- # 在文件的最后添加下列的内容, local0 这里记得前面不要有 #, 不然会注释, 不起作用的
- # keepalived -S 0
- local0.*/var/log/keepalived.log
- # 按 Esc 然后: wq 保存退出
- # 重新启动日志
- service rsyslog restart
- # 重启 keepalived
- sudo service keepalived restart
- # 查看日志
- sudo tail -f /var/log/keepalived.log
- # 停止主服务器的 Nginx
- sudo nginx -s stop
- # 进入 keepalived 目录
- cd /etc/keepalived
- # 创建脚本文件
- sudo VIM nginx_health_check.sh
- #!/bin/bash
- # 日志输出, 默认到 / var/log/messages, 这里需要更改为 / var/log/keepalived.log
- #VIM /etc/rsyslog.conf
- # 添加下面内容
- #local0.*/var/log/keepalived.log
- # 表示 local0 设备的日志信息记录于 / var/log/keepalived.log 里
- # 重启 rsyslog 服务
- #service rsyslog restart
- function log(){
- logger -i -t "nginx_check" -p local0.info "$1"
- }
- counter=$(ps -C nginx --no-heading|wc -l)
- if [ "${counter}" = "0" ]; then
- /usr/sbin/nginx
- log "Find nginx stopped and then starting."
- sleep 3
- counter=$(ps -C nginx --no-heading|wc -l)
- if [ "${counter}" = "0" ]; then
- log "Nginx start failed."
- log "keepalived stopping."
- service keepalived stop
- log "keepalived stop success."
- else
- log "Nginx start success."
- fi
- fi
- # 按 Esc 退出编辑, 然后: wq 退出保存
- # 查看 nginx 进程
- ps aux |grep nginx
- # 停止 nginx
- sudo nginx -s stop
- # 查看 nginx 进程
- ps aux |grep nginx
- # 单独执行脚本
- sudo bash /etc/keepalived/nginx_health_check.sh
- # 查看 nginx 进程
- ps aux |grep nginx
- # 编辑 keepalived.con 文件
- sudo VIM /etc/keepalived/keepalived.conf
- # 按 i 进入编辑模式, 增加红色区的内容
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_01
- }
- vrrp_script chk_nginx {
- script "/etc/keepalived/nginx_health_check.sh"
- interval 5
- weight -20
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.157.100
- }
- }
- # 编辑好后, 按 Esc, 然后: wq 退出保存
- # 把 nginx 心跳检测脚本更改权限
- sudo chmod 755 /etc/keepalived/nginx_health_check.sh
- # 临时关闭 selinux, 这个终端关闭了就失效咯
- sudo setenforce 0
- # 查看 selinux
- getenforce
- # 查看 selinux 状态
- sestatus
- # 永久关闭, 编辑 / etc/sysconfig/selinux
- sudo VIM /etc/sysconfig/selinux
- # 按 i 进入编辑模式, 修改下面的内
- SELINUX=disabled
- # 按 Esc, 然后: wq 保存退出编辑
- # 安装 setroubleshoot
- sudo yum -y install setroubleshoot
- #xshell 开启新终端, 监控 messages 日志
- sudo tail -f /var/log/messages
- # 停止 nginx 服务
- sudo nginx -s stop
- # 重启 keepalived
- service keepalived restart
- # 查看错误信息
- sudo cat /var/log/messages |grep setroubleshoot
- # 执行 sealert 命令, 这里只是个例子哈, 具体看上面你们执行出来的结果
- sudo sealert -l 03ad7984-32b7-4d51-82bf-e86bc462d38f
- # 安装依赖软件
- sudo yum -y install policycoreutils-python
- # 返回主目录
- cd
- # 增加 nginx 至 selinux 白名单, mynginx 是自定义名字哈, 记住一定要在开启 nginx 的时候执行, 不然运行了没有效果
- sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M my-nginx
- # 这个是执行了上面命令后, 提示你要执行的命令
- sudo semodule -i my-nginx.pp
- # 增加 keepalived 至 selinux 白名单, 记住一定要在开启 keeaplived 的时候执行, 不然运行了没有效果
- sudo cat /var/log/audit/audit.log | grep keepalived | grep denied | audit2allow -M my-keepalived
- # 这个是执行了上面命令后, 提示你要执行的命令
- sudo semodule -i mykeepalived.pp
- # 删除刚刚创建的 keepalived 相关文件
- sudo rm -rf my-keepalived*
- # 删除刚刚创建的 nginx 相关文件
- sudo rm -rf my-nginx*
- # 用 xshell 开启两个终端, 第一个用来监控主服务器日志文件的变化
- sudo tail -f /var/log/keepalived.log
- # 第二个在主服务器做如下的操作
- # 重启 keepalived
- sudo service keepalived restart
- # 停止 nginx
- sudo nginx -s stop
- # 查看 nginx 进程
- ps aux |grep nginx
- # 隔几秒后再次查看 nginx 进程
- ps aux |grep nginx
- # 查看 IP 信息
- ip add
- # 用 xshell 开启两个终端, 第一个用来监控主服务器日志文件的变化
- sudo tail -f /var/log/keepalived.log
- # 第二个在主服务器做如下的操作
- # 编辑 nginx 心跳检测脚本
- sudo VIM /etc/keepalived/nginx_health_check.sh
- # 按 i 编辑
- # 注释启动 nginx 的命令
- #/usr/sbin/nginx
- # 按 Esc, 然后: wq 退出保存
- # 重启 keepalived
- sudo service keepalived restart
- # 停止 nginx
- sudo nginx -s stop
- # 查看 nginx 进程
- ps aux |grep nginx
- # 查看 IP 信息
- ip add
- # 编辑 keepalived 配置
- sudo VIM /etc/keepalived/keepalived.conf
- # 按 i 进入编辑模式
- # 增加 nopreempt 以及修改 state 为 BACKUP, 标注红色的内容, 如下
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_01
- }
- vrrp_script chk_nginx {
- script "/etc/keepalived/nginx_health_check.sh"
- interval 5
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.157.100
- }
- }
- # 按 Esc, 然后: wq 退出保存
- # 编辑 keepalived 配置
- sudo VIM /etc/keepalived/keepalived.conf
- # 按 i 进入编辑模式
- # 增加 nopreempt, 标注红色的内容, 如下
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_DEVEL_02
- }
- vrrp_script chk_nginx {
- script "/etc/keepalived/nginx_health_check.sh"
- interval 5
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 99
- advert_int 1
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.157.100
- }
- }
- # 按 Esc, 然后: wq 退出保存
- # 重启主从服务器的 keepalived
- sudo service keepalived restart
- # 确保 nginx 都开启了
- ps aux |grep nginx
- # 没有开启的话, 开启 nginx
- sudo nginx
- # 查看两台服务器的 ip 信息, 看看正常情况下, VIP 在哪里
- ip add
- # 停止有 VIP 服务器的 keepalived
- sudo service keepalived stop
- # 查看两台服务器的 IP 信息, 看看 VIP 漂移到哪里了
- ip add
- # 启动主服务器的 keepalived
- sudo service keepalived start
- # 查看两台服务器的 IP 信息, 看看 VIP 漂移到哪里了
- ip add
- # 启动 keepalived
- service keepalived start
- # 停止 keepalived
- service keepalived stop
- # 重启 keepalived
- service keepalived restart
来源: https://www.cnblogs.com/jayjiang/p/12752613.html