## redis 安装与部署

## 一、安装
 
### 1.WINDOWS环境
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择，这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘，解压后，将文件夹重新命名为 redis。

打开一个 cmd 窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.windows.conf (如果觉得麻烦可以将c:\redis加入到path中)。

### 2.LINUX环境
> $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz  
> $ tar xzf redis-2.8.17.tar.gz  
> $ cd redis-2.8.17  
> $ make  

make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下：
下面启动redis服务.

>$ cd src  
$ ./redis-server redis.conf



上述安装完成后可以正常运行redis，但是redis推荐的做法是常用的文件和程序文件分离，这样做的好处是可以通过新建多个启动文件夹，以不同的参数启动多个redis服务，  
手动复制配置文件 redis.conf、sentinel.conf和执行脚本:redis-cli 、redis-server 、redis-sentinel到redis1目录下:  
![redis-dir](/assets/redis-dir.jpg)

 
新安装的redis需注意以下几点，按需求调整
 
1. 默认情况redis不是在后台运行,这种情况下关闭shell(命令窗口)就关闭了redis,我们需要把redis放在后台运行,设置了后台运行就得自己设置日志的输出位置  
 **设置redis.conf**   
 ```
 daemonize yes   
 loglevel notice#日志等级  
 logfile "/usr/redis/log/redis.log"#日志保存路径  
 ```
2. Redis默认只让本机连，对其它服务器不开放，需要配置bind参数。  
 ```
 bind  *
 ```
3. Redis默认开机不启动，需要将启动命令加入到/etc/rc.local中  
```
/opt/redis1/src/redis-server /opt/redis/redis1/redis.conf
```


 
 

##  二、部署
#### 1.搭建多个redis服务间的主从关系  
**Redis的主从（master-slave）就是为了数据冗余备份、保证数据的安全、提高性能。**
这里我们准备3个redis服务器，分别复制上面写到的redis1两份命名为redis2和redis3，修改每个redis的redis.conf文件 port和pidfile参数。
注意：pidfile也要改，Linux为每一个redis分配了一个pid进程号，如果这里不作修改，会影响后面redis服务的启动
 
服务名|端口|pidfile|身份  
| -- | -- | --| --|
redis1|6380|/var/run/redis_6380.pid|master|
redis2|6381|/var/run/redis_6381.pid|slave|
redis3|6382|/var/run/redis_6382 .pid|slave|

我们计划搭建成表中的关系，即redis1为主，redis2和redis3为从，给redis设置主从只需要在从服务的redis.conf加入  
 > slaveof 主服务器ip 主服务器端口

分别以下列方式启动3个redis服务:
```
./opt/redis1/redis-server /opt/redis1/redis.conf  
./opt/redis2/redis-server /opt/redis2/redis.conf  
./opt/redis3/redis-server /opt/redis3/redis.conf
```


3个redis服务都已经启动:  
![redis-server](/assets/redis01.png)


查看主redis服务的身份:
```
# redis-cli -h localhost -p 6380
# >info
```  
![redis](/assets/redis02.png) 


>- redis主从关系到此搭建完成，可是如果其中的主redis服务器宕机怎么办，岂不是整个服务都崩掉了？请看下节redis哨兵




## 2.redis哨兵

> Sentinel（哨兵）是Redis 的高可用性解决方案：由一个或多个Sentinel 实例组成的Sentinel系统可以监视任意多个主服务器，以及这些主服务器属下的所有从服务器，并在被监视的主服务器进入下线状态时，自动将下线主服务器属下的某个从服务器升级为新的主服务器。  


![redis](/assets/redis-sentinel.jpg)


> **提示:**

> - redis哨兵会监控主redis以及主redis下面的从redis，如果主redis下线后满足换老大（配置文件配置）的条件，哨兵会从从服务中选取某个redis成为主服务。


#### 配置redis哨兵
1. 配置端口  
在sentinel.conf 配置文件中， 我们可以找到port 属性，这里是用来设置sentinel 的端口，一般情况下，至少会需要三个哨兵对redis 进行监控，我们可以通过修改端口启动多个sentinel 服务。

2. 配置主服务器的ip和端口  
我们把监听的端口修改成6380，并且加上权值为2，这里的权值，是用来计算我们需要将哪一台服务器升级升主服务器
3. 启动Sentinel  
sentinel 启动之后，就会监视到现在有一个主服务器，两个从服务器




当我们把redis2从服务器关闭之后，我们可以看到日志



再启动redis2



哨兵监听主服务器老大哥的同时，也关注了小弟的动态


关闭主redis，发现并没有将提升slave成为master，原因是sentinel的权值设置为2，需要两个哨兵都认为主redis断线才切换。


关闭redis1（6380）后，哨兵告诉我们换了大哥了。


查看redis3（6382），发现它已经成为大哥了


原先没有写的权限，现在也有了 。



当老大哥redis1（6380）回来后，怎么办，谁来当老大？

与实际相符，redis1只能当小弟了。。


总结
一、Sentinel的作用：

A、Master 状态监测
B、如果Master 异常，则会进行Master-slave 转换，将其中一个Slave作为Master，将之前的Master作为Slave 
C、Master-Slave切换后，master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变，即master_redis.conf中会多一行slaveof的配置，sentinel.conf的监控目标会随之调换








 






