SpringCloud部署服务集群-学习笔记

根据项目需求部署服务需要搭建集群环境,配置双机热备,了解学习以此记录

一、环境准备

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服务查看服务地址漂移的变化

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值