根据项目需求部署服务需要搭建集群环境,配置双机热备,了解学习以此记录
一、环境准备
CentOS7.5,docker,各种服务镜像以及第三方服务
需要搭建集群的springcloud服务和nginx,redis,rabbitmq,tomcat
二、Spring cloud集群配置
2.1 docker容器部署,详细配置说明可移步另一篇博客:
链接地址:Linux服务器部署安装docker以及各种服务配置(一)
2.2 docker-compose安装部署
该配置可实现docker服务管理,包括服务启动顺序管理,可根据需求自行处理
1)在线方式
#其中版本可以选择更改
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#赋予执行权限
chmod +x /usr/local/bin/docker-compose
#检测状态
docker-compose -v
2)离线方式
在GitHub上下载 :官方下载地址
#直接放在/usr/local/bin/目录下,修改文件名为docker-compose
#赋予执行权限
chmod +x /usr/local/bin/docker-compose
#检测状态,版本信息
docker-compose -v
2.3 编写docker-compose.yml配置文件
version: '2.1'
services:
redis:
image: redis #镜像id,先build镜像
container_name: aeccredis #配置容器名称
ports:
- "6379:6379" #开放端口号
command: redis-server --requirepass dev123 #redis需要设置密码时配置
network_mode: "host" #network方式为host
restart: always #设置开机自启
rabbitmq:
image: rabbitmq:management
container_name: aeccrabbit
ports:
- "5672:5672"
- "15672:15672"
- "25672:25672"
- "61613:61613"
- "1883:1883"
environment:
- RABBITMQ_DEFAULT_USER=dev
- RABBITMQ_DEFAULT_PASS=dev123
network_mode: "host"
restart: always
ace-center:
image: ace-center8761
container_name: ace-center
build: /home/aeccspringcloud/service/ace-center-server/Dockerfile
ports:
- "8761:8761"
network_mode: "host"
restart: always
ace-config:
image: ace-config8750
container_name: ace-config
build: /home/aeccspringcloud/service/ace-config-server/Dockerfile
ports:
- "8750:8750"
depends_on:
- ace-center
network_mode: "host"
restart: always
ace-auth:
image: ace-auth9777
container_name: ace-auth
#搭配dockerfile文件启动
build: /home/aeccspringcloud/service/ace-auth-server/Dockerfile
ports:
- "9777:9777"
depends_on: #依赖关系,会等待其他服务开启完成后执行
- ace-center
- ace-config
network_mode: "host"
restart: always
.......
详细配置说明可参考:https://blog.csdn.net/qq_35720307/article/details/87256684
2.4 常用命令
cd /usr/local/bin/
#执行yml配置文件,先build镜像,根据镜像配置来执行
docker-compose up -d
docker-compose ps #查看容器列表
docker-compose images #查看镜像列表
docker-compose stop #停止所有
docker-compose stop 容器id #停止某一容器
docker-compose rm #删除容器
docker-compose rm 容器id #删除某一容器
2.5 配置docker-compose开机自启
#配置docker开机启动
systemctl enable docker
#配置docker-compose开机执行
vim /etc/rc.d/init.d/start-docker-compose.sh
#编写以下内容
#!/bin/bash
# chkconfig: 2345 85 15
# description: docker-compose
/usr/local/bin/docker-compose -f /usr/local/bin/docker-compose.yml up -d
#其中/usr/local/bin/docker-compose.yml是yml的文件位置,开机时会执行该shell文件
以上,根据自己业务调整配置即可实现单机的服务部署,包括多个服务的启动顺序管理
2.6 注册中心高可用配置
SpringCloud高可用的配置,可以通过服务注册中心相互注册实现分布式集群部署
#10.248.5.13机器上的注册中心服务配置bootstrap.yml
spring:
application:
name: ace-center
server:
port: 8761 #启动端口
eureka:
instance:
statusPageUrlPath: /info
preferIpAddress: true
healthCheckUrlPath: /health
leaseRenewalIntervalInSeconds: 5
client:
registerWithEureka: true #false:不作为一个客户端注册到注册中心
fetchRegistry: true
#为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://10.248.5.14:8761/eureka/
#10.248.5.14机器上的注册中心服务配置bootstrap.yml
spring:
application:
name: ace-center
server:
port: 8761 #启动端口
eureka:
instance:
statusPageUrlPath: /info
preferIpAddress: true
healthCheckUrlPath: /health
leaseRenewalIntervalInSeconds: 5
client:
registerWithEureka: true #false:不作为一个客户端注册到注册中心
fetchRegistry: true
#为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://10.248.5.13:8761/eureka/
以上即可实现双机注册中心相互配置,而客户端应用服务配置时,在各自机器上向本机注册中心注册,即可同步到从机上
另,如果在本地开发环境测试的话,本例参考windows服务:
创建eureka server服务,复制成两份
#server1注册中心服务配置bootstrap.yml
spring:
application:
name: ace-center
server:
port: 8761 #启动端口
eureka:
instance:
statusPageUrlPath: /info
hostname: server1
preferIpAddress: false
client:
registerWithEureka: true #false:不作为一个客户端注册到注册中心
fetchRegistry: true
#为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://server2:8762/eureka/
#server2注册中心服务配置bootstrap.yml
spring:
application:
name: ace-center
server:
port: 8762 #启动端口
eureka:
instance:
statusPageUrlPath: /info
hostname: server2
preferIpAddress: false
client:
registerWithEureka: true #false:不作为一个客户端注册到注册中心
fetchRegistry: true
#为true时,可以启动,但报异常:Cannot execute request on any known server
serviceUrl:
defaultZone: http://server1:8761/eureka/
分别启动,访问localhost:8761,localhost:8762查看服务,相互注册成功与否
如果在测试中出现以下情况,会导致服务相互注册失败,参考:解决注册中unavailable-replicas下的情况
三、Redis集群配置
注: 以下是以部署在docker容器中基础上进行配置
3.1 主从配置
redis拉取镜像,以下命令进行启动
主(以host方式挂在宿主机配置文件启动Redis容器):
docker run -d -p 6379:6379 -v /home/redis redis:3.2.8
docker run -d --network host --name aeccredis -p 6379:6379 --restart=always -v /redis/redis.conf:/etc/redis/redis.conf -v /redis/data:/data redis:3.2.8 redis-server /etc/redis/redis.conf --appendonly yes
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /usr/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /usr/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化
--restart=always: 总是重启策略
其中从机的redis.conf配置文件需要修改以下参数:
#bind 127.0.0.1
protected-mode no
appendonly yes
# replicaof <master ip> <master port>
replicaof 192.168.22.130 6379 #Redis主机(Master)IP 端口
#在redis5.x的主从配置中,从机配置要配置 replicaof 参数。而早期版本,要配置的是slaveof参数
确保docker以及redis容器都启动之后,使用docker exec -it <redis容器名> redis-cli命令进入redis进行测试
3.2 哨兵模式
sentinel配置:
vim sentinel.conf //在redis的根目录下
port 26379
daemonize yes
protected-mode no //保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效。
logfile "/data/redis/logs/sentinel.log" //指明日志文件
dir "/data/redis/sentinel"
sentinel monitor mymaster 192.168.198.131 6379 1 //哨兵监控的master。
sentinel down-after-milliseconds mymaster 5000 //master或者slave多少时间(默认30秒)不能使用标记为down状态。
sentinel failover-timeout mymaster 9000 //若哨兵在配置值内未能完成故障转移操作,则任务本次故障转移失败。
sentinel parallel-syncs mymaster 1 //指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel auth-pass mymaster redispass //如果redis配置了密码,那这里必须配置认证,否则不能自动切换
同样以redis镜像方式启动容器(多个哨兵同下,端口可变):
docker run -d --network host --name redis-sentinel -p 26379:26379 --restart=always -v /redis/sentinel.conf:/etc/redis/sentinel.conf redis:3.2.8 redis-sentinel /etc/redis/sentinel.conf
进入到容器内部redis服务中,查看哨兵配置:
info sentinel
四、双机热备-KeepAlived学习
4.1 Keepalived安装
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作;当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
健康检查和失败切换是keepalived的两大核心功能。 所谓的健康检查, 就是采用tcp三次握手, icmp请求, http请求, udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器, 利用VRRP(虚拟路由冗余协议, 可参考RFC文档RFC 5798 - Virtual Router Redundancy Protocol (VRRP) Version 3 for IPv4 and IPv6) 维持主备负载均衡器的心跳, 当主负载均衡器出现问题时, 由备负载均衡器承载对应的业务, 从而在最大限度上减少流量损失, 并提供服务的稳定性。
VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。
官方下载地址:Keepalived for Linux
注:本次学习的版本是1.2.18(较老版本),版本不同文件配置有差异,可自行查找安装配置教程
4.2 解压安装Keepalived1.2.18
#命令安装
#安装依赖包
yum install wget make gcc gcc-c++ openssl-devel
cd /usr/local/src
tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install
#如果报以下警告:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
不用担心,我们只需要用到VRRP功能,不需要用IPVS功能,所以请确保以下三项是yes就行了。
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes
#将 keepalived 安装成 Linux 系统服务
#因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作复制默认配置文件到默认路径
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#复制 keepalived 服务脚本到默认的地址
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#设置 keepalived 服务开机启动
systemctl enable keepalived
#配置firewalld防火墙允许vrrp协议
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.248.5.13" protocol value="vrrp" accept"
firewall-cmd --reload
#如果是backup服务器,source address改成master服务器的IP
#启动keepalived
systemctl start keepalived 或者 service keepalived start
#查看状态
systemctl status keepalived 或者 service keepalived status
#停止
systemctl stop keepalived 或者 service keepalived stop
#restart重启同理
搭配nginx部署配置即可,后续再更新如何进行配置
4.3 Nginx+Keepalived主备切换
1) 修改Keepalived配置文件
1. master节点文件配置(keepalived.conf)
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP
router_id mps_server1 ## 标识本节点的字条串,通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP
interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 我的是 eth0
virtual_router_id 13 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
mcast_src_ip 10.248.5.13 ## 本机 IP 地址
priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 123456 ## 真实生产,按需求对应该过来
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx ## 执行 Nginx 监控的服务
} #
# 虚拟 IP 池, 两个节点设置必须一样
virtual_ipaddress {
10.248.5.12 ## 虚拟 ip,可以定义多个
}
}
2. backup节点文件配置(keepalived.conf)
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id mps_server2
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 13
mcast_src_ip 10.248.5.14
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.248.5.12
}
}
2) 编写Nginx状态检测脚本
/etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)
脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。 内容如下:
1. 如果nginx装配在docker容器中
# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ] #用于查看当前nginx运行状况
then
docker start aeccnginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
kill keepalived
fi
fi
2. 如果nginx按配置装配在宿主机上
# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ] #用于查看当前nginx运行状况
then
systemctl start nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
kill keepalived
fi
fi
保存后,给脚本赋执行权限:
# chmod +x /etc/keepalived/nginx_check.sh
启动Keepalived
# service keepalived start
然后对Keepalived的配置进行测试,启停nginx服务查看服务地址漂移的变化