Redis哨兵集群部署方案
-
部署架构及节点信息:
3节点 一主两从,三哨兵
节点 进程占用端口 0 6379,26379 1 6379,26379 2 6379,26379 -
安装前置条件:
关闭防火墙,或将端口放行
例如:
systemctl stop firewalld.service 或 firewall-cmd --add-port=6379/tcp --permanent firewall-cmd --add-port=26379/tcp --permanent firewall-cmd --reload 复制代码 -
获取部署包,解压及编译同上
-
修改配置文件:
# 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
复制代码
- 启动redis服务和哨兵服务:
# 启动Redis服务器进程
nohup redis-server redis.conf > redis.log &
# 启动哨兵进程
nohup redis-sentinel sentinel.conf > sentinel.log &
复制代码
- 查看服务状态:
# 连接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. 集群模式裸部方案
-
部署架构及节点信息:
3节点 6redis服务组件集群
节点 进程占用端口 0 6379,6380,16379,16380 1 6381,6382,16381,16382 2 6383,6384,16383,16384 -
安装前置条件:
关闭防火墙,或将端口放行
例如:
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 -
获取部署包:
官网下载:Redis下载和安装
-
解压并编译:
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 -
修改配置文件:
开启集群模式,主要配置字段如下:
#服务运行端口 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 -
分别在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 & -
组建集群,在某台节点执行:
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
- 查看集群状态:
- 配置详解及修改:
| 配置项 | 说明 | 详细行数 |
|---|---|---|
| bind | 修改为当前节点IP | 75 |
| protected-mode | 禁止外网访问redis cache。默认开启。在没有bind IP,没有设置密码时生效 | 94 |
| port | 服务运行端口 | 98 |
| pidfile | 一个节点运行多个服务时,分别定义名称 | 289 |
| databases | 数据库个数,集群版仅支持为1 | 327 |
| 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 |
- 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控制台操作合集
-
优雅关闭redis服务
redis-cli shutdown redis-cli -h 192.168.1.142 -a nancal.123 shutdown强制kill可能会导致缓存区数据未持久化而丢失
-
显示key和数量
# 显示所有key。过期的不计算。数据量大会直接卡死.
keys * !慎用
# 统计所有key的数量,过期也计算。
dbsize
- 键的操作:
# 查询键是否存在。不存在返回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
- 客户端查询:
# 查询链接的客户端有哪些
client list
# 终止客户端链接
client kill 192.168.1.142:59244
# 查询客户端信息
info clients
# 查看更多详细信息
info
# 查询存储文件目录
config get dir
- 集群操作:
# 打印集群的信息
CLUSTER INFO
# 列出集群所有node
CLUSTER NODES