
# 产品集群部署（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参数设置
表3JVM参数设置 
| **节点名称** | **参数设置**                                                                                                                                                                                                                                                                                                                                                                                                                              | **备注**                                                                                                                                                                                                  |
|:---|:---|:---|
| 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   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001728527541.png)
   两台服务器部署架构图如下：
   图2部署架构2   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680528326.png) 
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，其中的哨兵名称要配置成一样的，并且都监控主节点，只要修改端口即可。
   ![](https://support.huaweicloud.com/edms-mnft/public_sys-resources/note_3.0-zh-cn.png)
   sentinel.conf的哨兵名称要与后面集群文件里的哨兵名称保持一致
   图3参考配置   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680368546.png)
   启动哨兵服务进程
   ```
   # cd /{redis-path}/src
   # ./redis-sentinel /{path}/sentinel.conf &
   注：{redis-path}、{path}为redis安装路径、哨兵的sentinel.conf文件所在路径，启动多个哨兵时指定各自配置文件。
   ```
   示例：在172.21.160.2上启动两个哨兵服务
   图4示例1   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001728447637.png)
   图5示例2   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001728527545.png)
   查看哨兵模式是否启动
   **Redis主从节点检查：**
   连接主节点：# ./redis-cli -h 172.21.160.1 -p 6391
   执行命令：info replication
   图6**检查**   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680528330.png)
   **哨兵进程检查：**
   执行命令：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**配置示例**   
      ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680368550.png)
      ![](https://support.huaweicloud.com/edms-mnft/public_sys-resources/note_3.0-zh-cn.png)
      主从redis节点大于2时，redis密码必须保持一致，在主从切换时，保证主从正常通讯进行数据同步
      
   
   2. **配置主从节点时连接redis-cli后需要验证密码，示例如下：**
      图8**配置主从节点**   
      ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001728447641.png) 
   
   3. **sentinel.conf配置示例如下：**
      sentinel auth-pass mymaster 123 #mymaster为哨兵名称，123为主redis密码
      图9**sentinel.conf配置**   
      ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001728527549.png)
      ![](https://support.huaweicloud.com/edms-mnft/public_sys-resources/note_3.0-zh-cn.png)
      所有哨兵配置文件都需要加该配置参数，且位置如示例图所示，否则可能不生效。
      
    
 
#### 部署包和产品注册和配置
当在所有节点部署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集群文件配置   
![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680528334.png)
以下为详细配置内容，只做参考：
表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 |
   
![](https://support.huaweicloud.com/edms-mnft/public_sys-resources/note_3.0-zh-cn.png)
该配置文件中cluster.redis.ip与原集群各节点保持一致。
然后启动新增节点服务器，启动成功后以admin身份登录ABI，依次进入"系统设置 \> 性能与维护 \> 集群信息"，检查如下信息：
- 检查所有配置节点是否存在
- 检查所有节点在线状态
- 检查所有节点同步状态
- 检查是否存在控制节点，且只有一个
 
#### 注意事项
1. 集群内各服务器版本需保持一致 只能同一版本的服务器做集群
   
2. 各服务器的数据库配置需一致 各服务器数据库配置需要保持一致，其中url中ip地址也要一致
   
3. 各服务器redis配置需一致 各服务器配置的redis相关参数需要是一致的，如redis ip、端口、密码
   
4. Redis主从切换说明
   图11场景   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680368554.png)
   表7Redis主从切换说明 
   | **物理机器** | **安装软件** | **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
      ```
      
    
 
