更新时间:2024-04-18 GMT+08:00
分享

产品集群部署(redis哨兵部署)

产品集群需要redis支持,redis部署分为两种。一种是单redis部署,适应于可靠性不高的场景;一种是redis哨兵部署,适应于可靠性要求非常高的场景;本章讲解redis哨兵部署的情况

集群场景说明

集群4个节点部署在两台服务器上,对应的服务器IP、端口、工作目录如下。Redis哨兵模式部署和应用服务器部署在一起。以双机双节点的配置ABI集群为例,说明在ABI中如何配置集群。

表1 集群场景说明1

物理机器

节点名称

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/

表2 集群场景说明2

物理机器

安装软件

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参数设置

表3 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哨兵模式部署

  1. 简述

    Redis哨兵模式的作用是提高Redis高可用性,当Redis主节点异常退出时,会有从节点替换为主节点,保证Redis可用。

  2. 部署架构

    Redis哨兵模式要求最少有1主1从3哨兵,由此推荐三台及以上服务器部署架构图如下:

    图1 部署架构1

    两台服务器部署架构图如下:

    图2 部署架构2
  3. 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安装目录下。

    注意其中两个关键配置

    1. port 指定哨兵端口
    2. 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主从节点需要设置密码,则需要在配置文件加入如下配置参数:

    1. 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密码必须保持一致,在主从切换时,保证主从正常通讯进行数据同步

    2. 配置主从节点时连接redis-cli后需要验证密码,示例如下:
      图8 配置主从节点
    3. 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参数为哨兵的名称,要与哨兵配置文件中的哨兵名称保持一致

图10 集群文件配置

以下为详细配置内容,只做参考:

表4 详细配置

节点名称

配置内容

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

表5 集群扩容说明1

物理机器

节点名称

IP地址

端口号

工作目录

Machine4

Server5

172.21.160.3

9005

/work_dir/ABIrootdir5/

指定工作目录、设置JVM参数后,正常注册ABI,然后停掉新增节点服务器,在工作目录的conf文件夹中放置cluster.properties,配置内容为:

表6 集群扩容说明2

节点名称

配置内容

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,依次进入“系统设置 > 性能与维护 > 集群信息”,检查如下信息:

  • 检查所有配置节点是否存在
  • 检查所有节点在线状态
  • 检查所有节点同步状态
  • 检查是否存在控制节点,且只有一个

注意事项

  1. 集群内各服务器版本需保持一致

    只能同一版本的服务器做集群

  2. 各服务器的数据库配置需一致

    各服务器数据库配置需要保持一致,其中url中ip地址也要一致

  3. 各服务器redis配置需一致

    各服务器配置的redis相关参数需要是一致的,如redis ip、端口、密码

  4. 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主从切换一次后,需要进行人工干预再主从切换回来。

    操作:

    1. 连接原从节点,执行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
    2. 连接原主节点,执行slaveof no one
      ./redis-cli -h 172.21.160.1 -p 6391
      172.21.160.1:6391> slaveof no one

相关文档