1. 下载安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#下载redis的最新版本
wget http://download.redis.io/releases/redis-6.0.7.tar.gz

yum -y install openssl-devel zlib-devel libtool automake autoconf make gcc gcc-c++

#解压:
tar -zxvf redis-6.0.7.tar.gz
#编译:
cd redis-6.0.7                                     
make PREFIX=/usr/local/redis install
cp -rf redis.conf /usr/local/redis/

2. 编辑配置文件

1
 vi /usr/local/redis/redis.conf
  • 将其中的"daemonize no"行改为"daemonize yes"
    默认值no,该参数用于定制redis服务是否以守护模式运行
  • 注释掉bind,不再添加任何IP,避免出现问题.
  • 将其中的"protected-mode yes"行改为"protected-mode no" 不同网段的服务器才可以连接该redis服务(例10.0.200.109访问10.0.8.148:6379) ( Protected-mode 是为了禁止公网访问redis cache,加强redis安全的;)
  • 修改内存大小以及失效模式
    “maxmemory 4gb”
    “maxmemory-policy volatile-lru”
    Redis在运行时,不重启使用redis-cli修改配置
    CONFIG SET maxmemory 4gb
  • 批量删除keys 批量删除包含 “_2016” 的key,每次删除5000条
1
redis-cli  EVAL "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 *_2016*  

或者自从redis2.8以后就开始支持scan命令,批删除大量的key

1
redis-cli --scan --pattern "*_2016*" | xargs -L 5000 redis-cli DEL 
  • 修改pidfile的路径
1
pidfile /usr/local/redis/redis.pid

3. 测试Redis

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#启动redis
 /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
#测试redis: 
/usr/local/redis/bin/redis-cli 
127.0.0.1:6379> set foo springrain
OK
127.0.0.1:6379> get foo
"springrain"
#关闭redis
/usr/local/redis/bin/redis-cli shutdown

4. 注册服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#启动测试:
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
#复制启动脚本到 /etc/init.d
cp -rf ./utils/redis_init_script /etc/init.d/redis

vi /etc/init.d/redis
#修改脚本顶部的默认配置变量值为:
#!/bin/sh
# 
# chkconfig: 2345 20 80
# description: Simple Redis init.d script conceived to work on Linux systems.as it does use of the /proc filesystem.

REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/usr/local/redis/redis.pid
CONF="/usr/local/redis/redis.conf"

#chkconfig 添加服务
chkconfig --add redis
chkconfig redis on

5. Redis主从配置

Redis的主从比较简单,只需要修改slave的配置
修改slaveof master的ip master的端口
slaveof 192.168.0.88 6379

6. 集群

参考资料:https://redis.io/topics/cluster-tutorial

6.1 集群配置和脚本

cluster.zip

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#解压到/usr/local/redis/ 目录下
#添加执行权限:
chmod 755 /usr/local/redis/cluster/*.sh
#启动6个redis节点:
/usr/local/redis/cluster/redis-start.sh 
#创建集群:
/usr/local/redis/bin/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 
#关闭6个节点:
/usr/local/redis/cluster/redis-stop.sh
#清除集群数据:
/usr/local/redis/cluster/redis-clear.sh 

6.2 维护

1
2
3
4
5
6
#连接集群:
/usr/local/redis/bin/redis-cli -c -p 7001
#集群节点查看:
/usr/local/redis/bin/redis-cli -p 7001 cluster nodes
#集群检查
/usr/local/redis/bin/redis-cli --cluster check 127.0.0.1:7001

6.3 添加新的master节点到集群

redis-server 新节点.conf
-redis-cli –cluster add-node 新节点IP:新节点PORT 集群中任一IP:7001
例子:# redis-cli –cluster add-node 127.0.0.1:8001 127.0.0.1:7001
说明:
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
新节点没有包含任何数据,也没有包含任何slot.
当集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,同时新的主节点因为没有包含任何slot,不参加选举和failover.
为新节点分配slot
-redis-cli –cluster reshard 新节点IP:新节点PORT

6.4 添加新的slave节点到集群

启动新节点
redis-server 新节点.conf
方法一.
语法:-redis-cli –cluster add-node -slave 新节点IP:新节点PORT 集群中任一IP:7001
例子:# redis-cli –cluster add-node -slave 127.0.0.1:8011 127.0.0.1:7001
方法二.
语法:redis-cli –cluster add-node -slave -master-id \ MASTER_ID 新节点IP:PORT 任意存在节点:PORT
例子:# redis-cli –cluster add-node -slave -master-id \ 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:8011 127.0.0.1:7001
说明:
-master-id xxxx 主节点的 ID
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
例子:
注意:在线添加slave 时,需要bgsave整个master数据,并传递到slave,再由 slave加载rdb文件到内存,rdb生成和传输的过程中消耗Master大量内存和网络IO,以此不建议单实例内存过大,线上小心操作.

6.5 在线reshard数据

对于负载/数据不均匀的情况,可以在线reshard slot来解决,方法与添加新master的reshard一样,只是需要reshard的master节点是已存在的老节点.
语法:redis-cli –cluster reshard master节点IP:PORT
例子:redis-cli –cluster reshard 127.0.0.1:7003

6.6 删除一个slave节点

语法:redis-cli –cluster del-node ip:port ‘
例子:redis-cli –cluster del-node 127.0.0.1:7001 ‘c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378’
说明:
ip:port 集群中已有的任意一节点(不是被删除的节点) 被删除节点的 ID

6.7 删除一个master 节点

删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点. (目前redis-cli –cluster只能把被删除master的slot对应的数据迁移到一个节点上).

6.8 改变从节点的隶属关系

1
2
3
# redis-cli -p 7013
127.0.0.1:7013> cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835
#说明:2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835  为新的主节点的 ID

7. Redis容错说明

Redis集群需要超过一半的Master存活才能正常运行,所以集群生存性存在风险,建议一台服务器一个redis实例. 例如两台服务器,3主3从. A服务器2主1从,B服务器2从1主.如果A宕机,集群就会异常.如果B宕机,A就会有3个主,即便B恢复了,A也不能宕机.建议6台机器进行集群,每台1个redis实例.