title: 03.Redis安装配置文档 CreateTime: 2019-06-19 14:04:00 UpdateTime: 2025-05-06 13:28:58 CategoryName: Web --- ## 1. 下载安装 ```shell #下载redis的最新版本 wget http://download.redis.io/releases/redis-8.0.0.tar.gz yum -y install openssl-devel zlib-devel libtool automake autoconf make gcc gcc-c++ #解压: tar -zxvf redis-8.0.0.tar.gz #编译: cd redis-8.0.0 make PREFIX=/usr/local/redis install cp -rf redis.conf /usr/local/redis/bin/ ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli ``` ## 2. 编辑配置文件 ```shell vi /usr/local/redis/bin/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 * 修改dump文件目录 ``` # dump 数据文件名 dbfilename dump.rdb # dump文件保存路径 dir /usr/local/redis ``` * 修改内存大小以及失效模式 ```maxmemory 4gb``` ```maxmemory-policy volatile-lru``` Redis在运行时,不重启使用redis-cli修改配置 ```CONFIG SET maxmemory 4gb``` * 批量删除keys 批量删除包含 "_2016" 的key,每次删除500条 ```shell redis-cli EVAL "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,500 do redis.call('del', unpack(keys, i, math.min(i+499, #keys))) end return #keys" 0 *_2016* ``` 或者自从redis2.8以后就开始支持scan命令,批删除大量的key ```shell redis-cli --scan --pattern "*_2016*" | xargs -L 500 redis-cli DEL ``` * 修改pidfile的路径 ```shell pidfile /usr/local/redis/redis.pid ``` ## 3. 测试Redis ```shell #启动redis /usr/local/redis/bin/redis-server /usr/local/redis/bin/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. 注册服务 添加 /etc/systemd/system/redis.service 文件 ```shell [Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target ``` systemctl 注册服务 ```shell systemctl daemon-reload systemctl enable redis.service ``` ## 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](/public/03/cluster.zip)** ```shell #解压到/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 维护 ```shell #连接集群: /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 改变从节点的隶属关系 ```shell # 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实例.