
# 产品集群部署（单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地址**      | **端口号** |
|:---|:---|:---|:---|
| Machine3 | Redis    | 192.168.1.103 | 6379    |
   
#### 工作目录指定
涉及到集群的工作目录指定，每个节点必须指定一个单独的工作目录，而且多节点不能同时使用同一个工作目录。
指定工作目录需要在中间件启动文件设置，在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支持32位和64位的Windows和Linux操作系统。
1. Windows下安装redis 下载地址：<https://github.com/MSOpenTech/redis/releases>
   图1Redis安装   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680349082.png)
   根据需要选择合适版本的Redis，下载zip包，下载完成后解压缩，会得到一个redis-server.exe。下载完成后，双击安装，安装完成后，启动服务即可
   使用客户端测试连接：redis-desktop-manager-0.9.3.817.exe
   其实Redis在Windows上不需要安装，在命令行下执行这个redis-server.exe，就会启动redis服务，启动后不要关闭这个命令行窗口，关闭它服务就停止了。
   
2. Linux下安装redis(支持国产CPU，如：鲲鹏、龙芯等) redis在linux下的安装使用包管理器来安装即可，对于没有外网的环境也可以复制压缩包，解压后手动安装。
   安装
   ```
   # wget http://download.redis.io/releases/redis-5.0.5.tar.gz
   # tar -zxf redis-5.0.5.tar.gz
   # cd redis-5.0.5
   # make
   # make install
   ```
   启动；编译完成以后，启动 redis-server
   ```
   # cd src
   # ./redis-server ../redis.conf &
   ```
   访问redis
   用自带的redis-cli客户端工具就可以访问Redis服务器了。
   Redis的默认服务端口是6379
   ```
   # redis-cli
   127.0.0.1:6379>
   ```
   Redis配置文件说明
   Redis的配置文件Redis.conf在Redis的安装目录下，里面有很多关于Redis的设置。用户可以通过直接修改文件更改配置，也可以通过命令像设置key-value数据库一样修改配置
   ```
   config get xxx   //获取某一个配置的值
   config set xxx  xxx //设置某一项配置
   config get * 获取所有配置
   ```
   建议直接修改配置文件，因为通过命令修改，重启Redis后就会失效。
   表4主要配置参数列表 
   | **参数**         | **值**     | **描述**                                                                                                 |
   |:---|:---|:---|
   | port           | 6379      | redis的端口                                                                                               |
   | bind           | 127.0.0.1 | 绑定的ip地址，默认是127.0.0.1 。 如果本机有多个网卡，且限制只能通过其中一个网卡对应的IP才能访问redis时，可绑定该IP，例：bind IP |
   | protected-mode | yes       | 保护模式，默认为yes，如果要其他网络能访问，改为no即可                                                                          |
   | requirepass    | -         | 登录密码，默认是空                                                                                              |
   | maxclients     | 0         | 同一时间能够连接到redis的客户端数量，默认是无限制，0表示不限制                                                                     |
   | maxmemory      | -         | redis能够使用的最大内存 单位byte, 默认无限制                                                                           |
      
   建议修改如下，如果考虑安全性，设置密码即可：
   图2设置密码   
   ![](https://support.huaweicloud.com/edms-mnft/zh-cn_image_0000001680508842.png) 
 
#### 部署包和产品注册和配置
当在所有节点部署ABI包后，需要分别访问下列地址完成产品的注册。
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为主控节点
表5集群文件配置1 
| **节点名称** | **配置内容**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|
| Server1  | #charset UTF-8 #必须配置的属性： cluster.enabled=true cluster.iscontrol=true cluster.type=redis cluster.group=group1 cluster.nodeid=node1 cluster.name=测试集群节点1 #单redis连接配置方式 cluster.redis.ip=192.168.1.103 cluster.redis.port=6379 #视情况配置的属性： #如果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=group1 cluster.nodeid=node2 cluster.name=测试集群节点2 #单redis连接配置方式 cluster.redis.ip=192.168.1.103 cluster.redis.port=6379 #视情况配置的属性： #如果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=group1 cluster.nodeid=node3 cluster.name=测试集群节点3 #单redis连接配置方式 cluster.redis.ip=192.168.1.103 cluster.redis.port=6379 #视情况配置的属性： #如果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=group1 cluster.nodeid=node4 cluster.name=测试集群节点4 #单redis连接配置方式 cluster.redis.ip=192.168.1.103 cluster.redis.port=6379 #视情况配置的属性： #如果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 |
   
配置文件中参数说明：
表6集群文件配置2 
| **参数名**                 | **描述**                                  | **例子**          |
|:---|:---|:---|
| cluster.enabled         | 是否启用集群                                  | 默认false不启用      |
| cluster.nodeid          | 集群节点id                                  | node1           |
| cluster.name            | 集群节点名称                                  | 测试集群节点1         |
| cluster.type            | 集群类型（redis：redis集群，netty：netty集群）       | redis，默认使用redis |
| cluster.message.retry   | 消息发送失败后重发次数                             | 3               |
| cluster.health.interval | 心跳时间间隔（单位：毫秒）                           | 1500，默认1500     |
| cluster.health.retry    | 集群节点离线时重试次数，即连续几次没有收到心跳则判定节点离线          | 3               |
| cluster.heath.rejoin    | 集群节点离线后重新加入重试次数，即集群节点连续几次都受到心跳消息则判定节点加入 | 3               |
| cluster.redis.ip        | redis ip                                | 172.21.1.65     |
| cluster.redis.port      | redis端口                                 | 6379            |
| cluster.redis.password  | redis密码，没有密码可不传                         | 默认注释掉           |
   
#### 启动服务器
集群配置文件完成后，先启动server1，待server1启动完成后，可同时启动其它三个服务器
#### 集群检查
以admin身份登录ABI，依次进入"系统设置 \> 性能与维护 \> 集群信息"，检查如下信息：
- 检查所有配置节点是否存在
- 检查所有节点在线状态
- 检查所有节点同步状态
- 检查是否存在控制节点，且只有一个
 
#### 集群扩容说明
新增N个节点，与原集群各节点配置保持一致，连接同一个Redis，即可达到集群扩容目的。
例如新增物理机器Machine4，节点名称Server5,IP地址172.21.160.3，端口号9005
表7集群扩容说明1 
| **物理机器** | **节点名称** | **IP地址**     | **端口号** | **工作目录**               |
|:---|:---|:---|:---|:---|
| Machine4 | Server5  | 172.21.160.3 | 9005    | /work_dir/ABIrootdir5/ |
   
指定工作目录、设置JVM参数后，正常注册ABI（参考本章第3、4、6节内容），然后停掉新增节点服务器，在工作目录的conf文件夹中放置cluster.properties，配置内容为：
表8集群扩容说明2 
| **节点名称** | **配置内容**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|:---|:---|
| Server5  | #必须配置的属性： cluster.enabled=true cluster.iscontrol=false cluster.type=redis cluster.group=group1 cluster.nodeid=node5 cluster.name=测试集群节点5 #需要二选一配置的属性： #集群连接配置方式1 cluster.redis.ip=192.168.1.103 cluster.redis.port=6379 #视情况配置的属性： #如果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、端口、密码
   
 
