产品集群部署(redis哨兵部署)
产品集群需要redis支持,redis部署分为两种。一种是单redis部署,适应于可靠性不高的场景;一种是redis哨兵部署,适应于可靠性要求非常高的场景;本章讲解redis哨兵部署的情况
集群场景说明
集群4个节点部署在两台服务器上,对应的服务器IP、端口、工作目录如下。Redis哨兵模式部署和应用服务器部署在一起。以双机双节点的配置ABI集群为例,说明在ABI中如何配置集群。
物理机器 |
节点名称 |
IP地址 |
端口号 |
工作目录 |
---|---|---|---|---|
Machine1 |
Server1(主控) |
172.21.160.1 |
9001 |
/work_dir/ABIrootdir1/ |
Machine1 |
Server2 |
172.21.160.1 |
9002 |
/work_dir/ABIrootdir2/ |
Machine2 |
Server3 |
172.21.160.2 |
9003 |
/work_dir/ABIrootdir3/ |
Machine2 |
Server4 |
172.21.160.2 |
9004 |
/work_dir/ABIrootdir4/ |
物理机器 |
安装软件 |
IP地址 |
端口号 |
---|---|---|---|
Machine1 |
Redis(主) |
172.21.160.1 |
6391 |
Machine2 |
Redis(从) |
172.21.160.2 |
6392 |
Machine1 |
Sentinel |
172.21.160.1 |
26379 |
Machine2 |
Sentine2 |
172.21.160.2 |
26379 |
Machine2 |
Sentine3 |
172.21.160.2 |
26380 |
工作目录指定
涉及到集群的工作目录指定,每个节点必须指定一个单独的工作目录,而且多节点不能同时使用同一个工作目录。
指定工作目录需要在中间件启动文件设置,在Server1的启动文件中设置:
-Desen.abi.workdir =/work_dir/ABIrootdir1
在Server2的启动文件中设置:
-Desen.abi.workdir =/work_dir/ABIrootdir2
在Server3的启动文件中设置:
-Desen.abi.workdir =/work_dir/ABIrootdir3
在Server4的启动文件中设置:
-Desen.abi.workdir =/work_dir/ABIrootdir4
JVM参数设置
节点名称 |
参数设置 |
备注 |
---|---|---|
Server1 |
-Desen.abi.workdir=/work_dir/ABIrootdir1 -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Dfile.encoding=GBK -Dsun.jnu.encoding=GBK -Xms4096m -Xmx8192m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true |
-Xmx和-Xms根据服务器内存大小设置,64位OS建议分配8G-16G 注:jdk1.8开始取消了PermGen,取而代之的是Metaspace,需要将PermSize改为MetaspaceSize,如下:-XX:MetaspaceSize=256m -XX: MetaspaceSize =512m |
Server2 |
-Desen.abi.workdir=/work_dir/ABIrootdir2 -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Dfile.encoding=GBK -Dsun.jnu.encoding=GBK -Xms4096m -Xmx8192m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true |
同上 |
Server3 |
-Desen.abi.workdir=/work_dir/ABIrootdir3 -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Dfile.encoding=GBK -Dsun.jnu.encoding=GBK -Xms4096m -Xmx8192m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true |
同上 |
Server4 |
-Desen.abi.workdir=/work_dir/ABIrootdir4 -Djava.awt.headless=true -Duser.timezone=Asia/Shanghai -Dfile.encoding=GBK -Dsun.jnu.encoding=GBK -Xms4096m -Xmx8192m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true |
同上 |
Redis安装
参考redis安装
redis哨兵模式部署
- 简述
Redis哨兵模式的作用是提高Redis高可用性,当Redis主节点异常退出时,会有从节点替换为主节点,保证Redis可用。
- 部署架构
Redis哨兵模式要求最少有1主1从3哨兵,由此推荐三台及以上服务器部署架构图如下:
图1 部署架构1
两台服务器部署架构图如下:
图2 部署架构2
- Linux下部署
部署过程以两台服务器1主1从3哨兵为例,进行redis哨兵模式安装
启动Redis服务器
先正常启动两个redis,参考第七章第4节redis安装
配置从节点
进入到主节点redis安装目录下,连接从节点、执行命令:
# cd /{redis-path}/src 注:{redis-path}为redis安装目录,按实际填写 # ./redis-cli -h 172.21.160.2 -p 6392
-h:从节点IP;-p:从节点端口;172.21.160.2:6392> slaveof 172.21.1601 6391。
说明:声明主节点
修改哨兵配置文件
sentinel.conf文件在redis安装目录下。
注意其中两个关键配置
- port 指定哨兵端口
- sentinel monitor mymaster 172.21.160.1 6391 2
其中mymaster表示哨兵名称,172.21.160.1 6391是主节点的ip和端口,表示监控主节点,最后的数字2是哨兵用来判断某个 redis 服务器是否下线的参数,表示投票需要的"最少法定人数",比如有10个sentinal哨兵都在监控某一个主节点,如果需要至少6个哨兵发现主节点异常退出后,才认为主节点真正down掉,那么这里就配置为6,最小配置1台主节点,1台从节点。
如果一台服务器有多个哨兵,需要准备多个sentinel.conf文件一一对应,例如172.21.160.2上有端口26380,26381的两个哨兵,就需要两个sentinel.conf文件,命名为sentinel1.conf、sentinel2.conf,其中的哨兵名称要配置成一样的,并且都监控主节点,只要修改端口即可。
sentinel.conf的哨兵名称要与后面集群文件里的哨兵名称保持一致
图3 参考配置
启动哨兵服务进程
# cd /{redis-path}/src # ./redis-sentinel /{path}/sentinel.conf & 注:{redis-path}、{path}为redis安装路径、哨兵的sentinel.conf文件所在路径,启动多个哨兵时指定各自配置文件。
示例:在172.21.160.2上启动两个哨兵服务
图4 示例1
图5 示例2
查看哨兵模式是否启动
Redis主从节点检查:
连接主节点:# ./redis-cli -h 172.21.160.1 -p 6391
执行命令:info replication
图6 检查
哨兵进程检查:
执行命令:ps –ef|grep redis
Redis配置密码说明
如果redis主从节点需要设置密码,则需要在配置文件加入如下配置参数:
- redis.conf配置示例如下:
主redis:
requirepass 123 #连接该redis需要密码123
masterauth 123 #主redis的密码123(为从redis节点时生效)
从redis:
requirepass 123 #连接该redis需要密码123
masterauth 123 #主redis的密码123(为从redis节点时生效)
图7 配置示例
主从redis节点大于2时,redis密码必须保持一致,在主从切换时,保证主从正常通讯进行数据同步
- 配置主从节点时连接redis-cli后需要验证密码,示例如下:
图8 配置主从节点
- sentinel.conf配置示例如下:
sentinel auth-pass mymaster 123 #mymaster为哨兵名称,123为主redis密码
图9 sentinel.conf配置
所有哨兵配置文件都需要加该配置参数,且位置如示例图所示,否则可能不生效。
部署包和产品注册和配置
当在所有节点部署BI包后,需要分别访问下列地址完成产品的注册。
http://172.21.160.1:9001/ABI
http://172.21.160.1:9002/ABI
http://172.21.160.2:9003/ABI
http://172.21.160.2:9004/ABI
在所有4个节点均完成注册后,分别登录所有节点,确认所有节点可以单独访问。
集群文件配置
停掉所有服务器,分别在各个工作目录的conf文件夹中放置cluster.properties,其中Server1为主控节点
参考最简配置,其中cluster.redis.sentinel参数为哨兵的名称,要与哨兵配置文件中的哨兵名称保持一致
以下为详细配置内容,只做参考:
节点名称 |
配置内容 |
---|---|
Server1 |
#charset UTF-8 #必须配置的属性: cluster.enabled=true cluster.iscontrol=true cluster.type=redis cluster.group=group cluster.nodeid=node1 cluster.name=测试集群节点1 #mySentinel为哨兵名称 cluster.redis.sentinel=mymaster cluster.redis.nodes=172.21.160.1:26379,172.21.160.2:26379,172.21.160.2:26380 #视情况配置的属性: #如果redis设置了密码,则配置 #cluster.redis.password=123 #可以不配置的属性: #集群服务器与redis最大时间差 默认120s #cluster.health.maxtimegap=120 #两次心跳间隔时间默认3s #cluster.health.interval=3000 #离开时间间隔算离开 默认30s #cluster.health.leavetime=30 #加入时间算加入 默认8s #cluster.heath.jointime=8 #是否使用连接池 #cluster.redis.usepool=false |
Server2 |
#charset UTF-8 #必须配置的属性: cluster.enabled=true cluster.iscontrol=false cluster.type=redis cluster.group=group cluster.nodeid=node2 cluster.name=测试集群节点2 #mySentinel为哨兵名称 cluster.redis.sentinel=mymaster cluster.redis.nodes=172.21.160.1:26379,172.21.160.2:26379,172.21.160.2:26380 #视情况配置的属性: #如果redis设置了密码,则配置 #cluster.redis.password=123 #可以不配置的属性: #集群服务器与redis最大时间差 默认120s #cluster.health.maxtimegap=120 #两次心跳间隔时间默认3s #cluster.health.interval=3000 #离开时间间隔算离开 默认30s #cluster.health.leavetime=30 #加入时间算加入 默认8s #cluster.heath.jointime=8 #是否使用连接池 #cluster.redis.usepool=false |
Server3 |
#charset UTF-8 #必须配置的属性: cluster.enabled=true cluster.iscontrol=false cluster.type=redis cluster.group=group cluster.nodeid=node3 cluster.name=测试集群节点3 #mySentinel为哨兵名称 cluster.redis.sentinel=mymaster cluster.redis.nodes=172.21.160.1:26379,172.21.160.2:26379,172.21.160.2:26380 #视情况配置的属性: #如果redis设置了密码,则配置 #cluster.redis.password=123 #可以不配置的属性: #集群服务器与redis最大时间差 默认120s #cluster.health.maxtimegap=120 #两次心跳间隔时间默认3s #cluster.health.interval=3000 #离开时间间隔算离开 默认30s #cluster.health.leavetime=30 #加入时间算加入 默认8s #cluster.heath.jointime=8 #是否使用连接池 #cluster.redis.usepool=false |
Server4 |
#charset UTF-8 #必须配置的属性: cluster.enabled=true cluster.iscontrol=false cluster.type=redis cluster.group=group cluster.nodeid=node4 cluster.name=测试集群节点4 #mySentinel为哨兵名称 cluster.redis.sentinel=mymaster cluster.redis.nodes=172.21.160.1:26379,172.21.160.2:26379,172.21.160.2:26380 #视情况配置的属性: #如果redis设置了密码,则配置 #cluster.redis.password=123 #可以不配置的属性: #集群服务器与redis最大时间差 默认120s #cluster.health.maxtimegap=120 #两次心跳间隔时间默认3s #cluster.health.interval=3000 #离开时间间隔算离开 默认30s #cluster.health.leavetime=30 #加入时间算加入 默认8s #cluster.heath.jointime=8 #是否使用连接池 #cluster.redis.usepool=false |
启动服务器
集群配置文件完成后,先启动server1,待server1启动完成后,可同时启动其它三个服务器
集群检查
以admin身份登录ABI,依次进入“系统设置 > 性能与维护 > 集群信息”,检查如下信息:
- 检查所有配置节点是否存在
- 检查所有节点在线状态
- 检查所有节点同步状态
- 检查是否存在控制节点,且只有一个
集群扩容说明
新增N个节点,与原集群各节点配置保持一致,连接同一个Redis,即可达到集群扩容目的。
例如新增物理机器Machine4,节点名称Server5,IP地址172.21.160.3,端口号9005
物理机器 |
节点名称 |
IP地址 |
端口号 |
工作目录 |
---|---|---|---|---|
Machine4 |
Server5 |
172.21.160.3 |
9005 |
/work_dir/ABIrootdir5/ |
指定工作目录、设置JVM参数后,正常注册ABI,然后停掉新增节点服务器,在工作目录的conf文件夹中放置cluster.properties,配置内容为:
节点名称 |
配置内容 |
---|---|
Server5 |
#必须配置的属性: cluster.enabled=true cluster.iscontrol=false cluster.type=redis cluster.group=group1 cluster.nodeid=node5 cluster.name=测试集群节点5 #mySentinel为哨兵名称 cluster.redis.sentinel=mymaster cluster.redis.nodes=172.21.160.1:26379,172.21.160.2:26379,172.21.160.2:26380 #视情况配置的属性: #如果redis设置了密码,则配置 #cluster.redis.password=123 #可以不配置的属性: #集群服务器与redis最大时间差 默认120s #cluster.health.maxtimegap=120 #两次心跳间隔时间默认3s #cluster.health.interval=3000 #离开时间间隔算离开 默认30s #cluster.health.leavetime=30 #加入时间算加入 默认8s #cluster.heath.jointime=8 #是否使用连接池 #cluster.redis.usepool=false |
该配置文件中cluster.redis.ip与原集群各节点保持一致。
然后启动新增节点服务器,启动成功后以admin身份登录ABI,依次进入“系统设置 > 性能与维护 > 集群信息”,检查如下信息:
- 检查所有配置节点是否存在
- 检查所有节点在线状态
- 检查所有节点同步状态
- 检查是否存在控制节点,且只有一个
注意事项
- 集群内各服务器版本需保持一致
- 各服务器的数据库配置需一致
- 各服务器redis配置需一致
- Redis主从切换说明
图11 场景
表7 Redis主从切换说明 物理机器
安装软件
IP地址
端口号
Machine1
Redis(主)
172.21.160.1
6391
Machine2
Redis(从)
172.21.160.2
6392
Machine1
Sentinel
172.21.160.1
26379
Machine2
Sentine2
172.21.160.2
26379
Machine2
Sentine3
172.21.160.2
26380
当redis部署架构如上图时,主从切换以后,主节点为服务器2,有两个redis哨兵;从节点为服务器1,有一个redis哨兵。这时如果主节点再次异常退出,两个redis哨兵也就异常退出了而无法参与主从redis切换投票,主从切换就会失败,所以当redis主从切换一次后,需要进行人工干预再主从切换回来。
操作:
- 连接原从节点,执行slaveof 172.21.160.1 6391
./redis-cli -h 172.21.160.2 -p 6392 172.21.160.2:6392> slaveof 172.21.160.1 6391
- 连接原主节点,执行slaveof no one
./redis-cli -h 172.21.160.1 -p 6391 172.21.160.1:6391> slaveof no one
- 连接原从节点,执行slaveof 172.21.160.1 6391