Redis两种集群部署方案及命令合集

240 阅读7分钟

Redis哨兵集群部署方案

  1. 部署架构及节点信息:

    3节点 一主两从,三哨兵

    节点进程占用端口
    06379,26379
    16379,26379
    26379,26379
  2. 安装前置条件:

    关闭防火墙,或将端口放行

    例如:

    systemctl stop firewalld.service
    或
    firewall-cmd --add-port=6379/tcp --permanent  
    firewall-cmd --add-port=26379/tcp --permanent 
    firewall-cmd --reload
    复制代码
    
  3. 获取部署包,解压及编译同上

  4. 修改配置文件:

# redis主配,每个节点单独修改
vim redis.conf

# 当前服务节点地址
bind 192.168.1.142
# 设置密码
requirepass mypassword
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.1.142 6379
# 主服务器密码
masterauth mypassword

---
# 哨兵配置,三个相同即可
vim sentinel.conf

# 指向主节点的地址,端口,密码和选举票数
sentinel monitor master-0 192.168.1.142 6379 2
sentinel auth-pass master-0 mypassword
# down-after-milliseconds:当一个实例失去联系(要么不回复我们的请求,要么回复一个错误)超过了这个时间(毫秒为单位),Sentinel就开始认为这个实例挂掉了。默认值60000
sentinel down-after-milliseconds master-0 10000

# 以下为默认开启参数与值,可选修改。
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
复制代码
  1. 启动redis服务和哨兵服务:
# 启动Redis服务器进程
nohup redis-server redis.conf > redis.log &
# 启动哨兵进程
nohup redis-sentinel sentinel.conf > sentinel.log &
复制代码
  1. 查看服务状态:
# 连接redis服务
redis-cli -c -h 192.168.1.143 -a mypassword

192.168.1.143:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.142,port=6379,state=online,offset=417996,lag=0
slave1:ip=192.168.1.144,port=6379,state=online,offset=417996,lag=1
master_failover_state:no-failover
master_replid:5f7888609cfca6358e04a538889c3be7f2af4526
master_replid2:dc924d3c2319a3c42e58746cd21bbef5c0024c65
master_repl_offset:417996
second_repl_offset:222238
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:417996

# 连接哨兵服务
redis-cli -c -h 192.168.1.143 -a mypassword -p 26379

192.168.1.143:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master-0,status=ok,address=192.168.1.143:6379,slaves=2,sentinels=3

Redis集群方案部署文档

1. 集群模式裸部方案

  1. 部署架构及节点信息:

    3节点 6redis服务组件集群

    节点进程占用端口
    06379,6380,16379,16380
    16381,6382,16381,16382
    26383,6384,16383,16384
  2. 安装前置条件:

    关闭防火墙,或将端口放行

    例如:

    systemctl stop firewalld.service
    或
    firewall-cmd --add-port=6379/tcp --permanent  
    firewall-cmd --add-port=6380/tcp --permanent 
    firewall-cmd --add-port=16379/tcp --permanent 
    firewall-cmd --add-port=16380/tcp --permanent 
    firewall-cmd --reload
    
  3. 获取部署包:

    官网下载:Redis下载和安装

  4. 解压并编译:

    tar -zxvf redis-6.2.6-rebuild.tar.gz && cd redis-6.2.6 
    
    #编译好的包跳过make步骤
    
    make
    
    cp redis-6.2.6/src/redis-cli /usr/bin
    cp redis-6.2.6/src/redis-server /usr/bin
    cp redis-6.2.6/src/redis-sentinel /usr/bin
    
  5. 修改配置文件:

    开启集群模式,主要配置字段如下:

    #服务运行端口
    port 6379
    pidfile /var/run/redis_6379.pid
    cluster-config-file nodes-6379.conf
    # 按实际情况修改本机的ip
    bind 192.168.1.141
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 5000
    appendonly yes
    
  6. 分别在3节点运行:

    142运行:
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6379.conf > nohup-6379.out &
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6380.conf > nohup-6380.out &
    141运行:
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6381.conf > nohup-6381.out &
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6382.conf > nohup-6382.out &
    143运行:
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6383.conf > nohup-6383.out &
    nohup redis-6.2.6/src/redis-server redis-6.2.6/redis-6384.conf > nohup-6384.out &
    
  7. 组建集群,在某台节点执行:

redis-cli --cluster create 192.168.1.142:6379 192.168.1.142:6380 192.168.1.141:6381 192.168.1.141:6382 192.168.1.143:6383 192.168.1.143:6384 --cluster-replicas 1

image.png

  1. 查看集群状态:

image.png

  1. 配置详解及修改:
配置项说明详细行数
bind修改为当前节点IP75
protected-mode禁止外网访问redis cache。默认开启。在没有bind IP,没有设置密码时生效94
port服务运行端口98
pidfile一个节点运行多个服务时,分别定义名称289
databases数据库个数,集群版仅支持为1327
save默认开启RDB方式做快照持久化,值为""时,表示不开启RDB。372
dbfilename创建的RDB文件名称431
dir指定创建RDB,AOF与日志文件的目录454
requirepass开启redis服务密码901
appendonly开启AOF持久化1252
appendfilename创建的AOF文件名称1256
appendfsync如何选择见10的详细说明1282
cluster-enabled开启集群模式1385
cluster-config-file集群自动生成的集群配置文件1393
  1. AOF配置appendfsync与no-appendfsync-on-rewrite的详细说明:
关于aof的几个选项如下:
    appendfsync always:总是写入aof文件,并完成磁盘同步  
    appendfsync everysec:每一秒写入aof文件,并完成磁盘同步
    appendfsync no:写入aof文件,不等待磁盘同步。
 
    可见,从持久化角度讲,always是最安全的。从效率上讲,no是最快的。而redis默认设置进行了折中,选择了everysec。
    
    bgrewriteaof机制,在一个子进程中进行aof的重写,从而不阻塞主进程对其余命令的处理,同时解决了aof文件过大问题。
    
    现在问题出现,同时在执行bgrewriteaof和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,现在no-appendfsync-on-rewrite参数出场了。
    
    如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes呢?这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?在linux的操作系统的默认设置下,最多会丢失30s的数据。
   
    因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no

2. 集群模式helm部署方案

获取包地址: GitHub - IBM/operator-for-redis-cluster: IBM Operator for Redis Cluster

# 部署operator
    helm install redis-operator charts/operator-for-redis
# 部署redis-cluster
    helm install redis-cluster charts/node-for-redis

Redis控制台操作合集

  1. 优雅关闭redis服务

    redis-cli shutdown
    redis-cli -h 192.168.1.142 -a nancal.123 shutdown
    

    强制kill可能会导致缓存区数据未持久化而丢失

  2. 显示key和数量

    # 显示所有key。过期的不计算。数据量大会直接卡死.
    keys *  !慎用
    # 统计所有key的数量,过期也计算。
    dbsize
  1. 键的操作:
    # 查询键是否存在。不存在返回0,存在1
    exists key
    # 设置键值过期时间,单位秒,不成功返回0,成功1
    expire key 10
    # 查看key剩余过期时间。返回-2为键不存在,-1未设置,大于0是剩余时间
    ttl key
    # 删除键,可同时删除多个键
    del key0 key1 key2
    # 查看键数据结构类型。返回none为键不存在
    type key
    # 更改键名
    rename test test123

  1. 客户端查询:
    # 查询链接的客户端有哪些
    client list
    # 终止客户端链接
    client kill 192.168.1.142:59244
    # 查询客户端信息
    info clients
    # 查看更多详细信息
    info
    # 查询存储文件目录
    config get dir
  1. 集群操作:
    # 打印集群的信息
    CLUSTER INFO
    # 列出集群所有node
    CLUSTER NODES