Redis安装配置文档(主从)

## Redis安装
1. 下载Redis,这里我们使用Redis-2.8.24,文件名为:`redis-2.8.24.tar.gz`,放到Linux目录`/usr/local/src`下。
2. 安装Redis之前我们需要先安装Redis的依赖程序tcl和gcc,如果不安装在执行make编译的时候就会报错,命令:`yum install -y tcl gcc`
3. 下面就开始编译安装Redis:
```
$ cd /usr/local/src
$ tar zxvf redis-2.8.24.tar.gz -C /usr/local
$ cd /usr/local/
$ mv redis-2.8.24 redis
$ cd redis
$ make
$ make test
$ make install
$ mkdir /etc/redis
$ cp redis.conf /etc/redis/
```

4. 执行初始化脚本s
```
cd redis/utils
./install_server.sh
```
执行以后会让你确认几个配置,直接回车即可,成功以后提示信息如下:
```
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
/var/run/redis_6379.pid exists, process is already running or crashed
Installation successful!
```

5. 初始化脚本以后,redis会自动启动,如果没有启动,可以手动启动redis:
```
启动:/etc/init.d/redis_6379 start
关闭:/etc/init.d/redis_6379 stop
或者
启动:systemctl start redis_6379
关闭:systemctl stop redis_6379
查看状态:systemctl status redis_6379
```

6. 使用客户端操作一下redis吧。
```
redis-cli
>set name hello
OK
>get name
"hello"
```

7. 这时我们在本机上可以直接连接,但是如果需要远程连接的话,必须要在防火墙上开通redis的监听端口,这里是6379端口,下面编辑防火墙配置文件,开放6379端口。
```
vim /etc/sysconfig/iptables
systemctl restart iptables
```

## Redis主从配置
### 配置主从
Redis主从配置只需要修改Redis的配置文件,下面我们来看一下主和从的配置:
1. 主配置
```
masterauth hokai #主库认证密码
requirepass hokai #客户端连接密码
注释bind 127.0.0.1
```

2. 从配置
其他与主配置一样,只不过是将slaveof指定主服务器的IP地址和端口
```
slaveof 192.168.99.111 6379
```

3. 重启主和从的redis服务,测试redis主从配置
因为我们设置了密码,所以在对redis操作的时候,需要验证一下密码。
另外,从服务器对主服务器是只读的,所有从服务器是不能修改信息的。

- 主服务器
```
[root@redis01 ~]# redis-cli
127.0.0.1:6379> AUTH hokai
OK
127.0.0.1:6379> set test 111
OK
```

- 从服务器
```
[root@redis02 ~]# redis-cli
127.0.0.1:6379> AUTH hokai
OK
127.0.0.1:6379> get test
"111"
127.0.0.1:6379> set test 222
(error) READONLY You can't write against a read only slave.
```

### 注意事项
#### 主从复制原理
当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;
当 Master 挂掉,Slave 正时, Slave接管服务,同时关闭主从复制功能;
当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。
然后依次循环。
需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失。
Redis的复制功能是非常简单易用的,配置为主从复制功能之后允许Redis的slave服务器复制出与master完全一致的服务器。
#### 在master节点关闭持久化功能时,复制的安全性
当在设置中开启Redis复制功能时,强烈建议的做法是在master节点中开启持久化功能,或者绝对不可能发生的是:因为延迟问题,将Redis实例被配置为避免自动重启。
为了更好的理解为什么将关闭持久化功能的master节点配置为自动重启是非常危险的,我们看看下面在数据从master节点与其对应的所有slave节点移除时发生的失败类型:

假设A节点是master节点,B,C节点是其对应的副本。
A发生崩溃时,(配置为自动重启),重新启动了进程。然而因为持久化功能是关闭的,所以重启之后,该节点内的数据为空。
节点B,C将会从A进行复制,这时A中的数据集是空的,因此,这时,B,C将会彻底删除他们之前备份的数据。

为了高可用性,引入了Redis的哨兵(sentinel),关闭了master节点上的持久化,并且两者都配置为自动重启,这种做法也是非常危险的。举个例子:master节点可能非常快的就完成了重启,以至于sentienl都没有感知到失败的发生,接下来就会发生和上面例子一样的结果。
在任何时间,数据的安全都是非常重要的,因此,在使用复制功能时,master节点如果没有持久化功能,自动重启的功能是必须被禁止的。

## 安装报错信息解决
#### 1、不能编译,没有GCC 编译工具
cc -c -std=c99 -pedantic -O2 -Wall -W -g -rdynamic -ggdb adlist.c
make: cc:命令未找到
make: *** [adlist.o] 错误 127

**解决方法:安装gcc**
命令如下:yum install gcc

#### 2、make时可能会报如下错误:
collect2: ld returned 1 exit status
make[1]: [redis-server] Error 1
make[1]: Leaving directory `/usr/local/redis/src'
make: [all] Error 2

解决办法:
编辑src/.make-settings里的OPT,改为OPT=-O2 -march=i686

#### 3、make时还可能会报如下错误:
cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
cc: error: ../deps/lua/src/liblua.a: No such file or directory
cc: error: ../deps/jemalloc/lib/libjemalloc.a: No such file or directory
make: [redis-server] Error 1

分别进入redis下的deps下的hiredis、lua 运行make
注意:jemalloc下可能要先运行./configure,然后make
回到src目录运行 make

结果还是报cc: error: ../deps/lua/src/liblua.a: No such file or directory

这下子我把redis的解压包 删除掉 rm -rf redis
重新解压,进入redis make 还真没报错了。

**院内HIP 的redis 初始化数据,在redis-cli 中执行下面命令:**

```
set hiip:empi:pageheader '[{"name":"empiId","chsName":"empiid","type":"String","order":1},{"name":"idNo","chsName":"身份证号","type":"String","order":1},{"name":"name","chsName":"居民姓名","type":"String","order":1},{"name":"genderName","chsName":"性别","type":"String","order":1},{"name":"birthDate","chsName":"出生日期","type":"String","order":1},{"name":"maritalStatusName","chsName":"婚姻状况","type":"String","order":1},{"name":"nationalityName","chsName":"民族","type":"String","order":1}]'
```

原文地址:https://www.cnblogs.com/davidchen211/p/10081196.html