2.5 Redis 常用命令
2.5.1 INFO
显示当前节点redis运行状态信息(可以做监控用)
#列出所有 127.0.0.1:6379> info #列出具体块 127.0.0.1:6379> info Memory
2.5.3 SELECT
切换数据库,相当于在MySQL的 USE DBNAME 指令
注意: 在Redis cluster 模式下不支持多个数据库,会出现下面错误
127.0.0.1:6379> info cluster # Cluster cluster_enabled:1 127.0.0.1:6379> select 0 OK 127.0.0.1:6379> select 1 (error) ERR SELECT is not allowed in cluster mode
2.5.4 KEYS
查看当前库下的所有key,此命令慎用! (生产中不要执行keys带*的操作,造成redis阻塞)
127.0.0.1:6379> KEYS * #通配符查询,性能很差 redis> KEYS *o*
2.5.5 BGSAVE
手动在后台执行RDB持久化操作
2.5.6 DBSIZE
返回当前库下的所有key 数量
127.0.0.1:6379> DBSIZE (integer) 4 127.0.0.1:6379> SELECT 1 OK 127.0.0.1:6379[1]> DBSIZE (integer) 0
2.5.7 FLUSHDB
强制清空当前库中的所有key,此命令慎用!
127.0.0.1:6379[1]> SELECT 0 OK 127.0.0.1:6379> DBSIZE (integer) 4 127.0.0.1:6379> FLUSHDB OK 127.0.0.1:6379> DBSIZE (integer) 0
2.5.8 FLUSHALL
强制清空当前Redis服务器所有数据库中的所有key,即删除所有数据,此命令慎用!
127.0.0.1:6379> FLUSHALL OK #生产建议修改配置使用rename-command禁用此命令 vim /etc/redis.conf rename-command FLUSHALL "" #flushdb和和AOF功能冲突,需要设置 appendonly no,不区分命令大小写,但和flushall (v7.2.3不冲突)
2.5.9 SHUTDOWN
关闭redis
#命令过于危险 #也可以禁用掉该命令 vim /etc/redis.conf rename-command SHUTDOWN "" [root@ubuntu ~]#systemctl restart redis
2.6 Redis 数据类型
2.6.1 字符串 string
2.6.2 列表 list
2.6.3 集合 set
2.6.4 有序集合 sorted set
2.6.5 哈希 hash
2.7 消息队列
2.7.1 生产者消费者模式
2.7.2 发布者订阅模式
3 Redis 集群与高可用
3.1 Redis 主从复制
主从复制特点
一个master可以有多个slave 一个slave只能有一个master 数据流向是从master到slave单向的 master 可读可写 slave 只读
3.1.2.1 主从命令配置
#主节点不用配,默认是主,从节点配置下方2条命令 127.0.0.1:6379> REPLICAOF MASTER_IP PORT #新版推荐使用 127.0.0.1:6379> SLAVEOF MasterIP Port #旧版使用,将被淘汰 127.0.0.1:6379> CONFIG SET masterauth <masterpass> #从节点配上主节点的密码 #上面的命令是动态生效,用永久生效,写到配置文件中
#redis通过 info replication 或者 role 命令可以查看自己是否是主节点 实例: 主节点: 10.0.0.200 从节点: 10.0.0.201 #操作 127.0.0.1:6379> replicaof 10.0.0.200 6379 127.0.0.1:6379> config set masterauth 123456 #主节点密码(这里最好主从密码一致) #此时等待同步,通过 info replication查看 #master_sync_in_progress:0为0表示同步完成,master_link_status:up为up表示连接成功 #主节点 info replication查看,slave会显示从节点信息 #修改配置文件,保证从节点配置永久保存 [root@slave1 ~]#vim /apps/redis/etc/redis.conf replicaof 10.0.0.200 6379 masterauth 123456 #主节点最好把这一行配上,万一哪天它变从节点,可以用 #主从同步已经完成
主节点重启,出发全量复制。从节点重启,出发增量恢复(排除第一次)
3.1.2.1.2 删除主从同步
在从节点执行 REPLICAOF NO ONE 或 SLAVEOF NO ONE 指令可以取消主从复制 取消复制 会断开和master的连接而不再有主从复制关联, 但不会清除slave上已有的数据 #新版 127.0.0.1:6379> REPLICAOF NO ONE #旧版 127.0.0.1:6379> SLAVEOF NO ONE
如果主库崩了,选info中 slave_read_repl_offset和slave_repl_offset值最大的(说明数据最新) 作为新主库
3.1.5 主从复制优化
Redis主从复制分为全量同步和增量同步 Redis 的主从同步是非阻塞的,即同步过程不会影响主服务器的正常访问. 注意:主节点重启会导致全量同步,从节点重启只会导致增量同步 #本质上是根据runId判断的,主节点重启runId变化,那从节点就全量同步过去。(主节点一定要有持久化,否则重启,数据清空,从节点会全量同步) 从redis 2.8版本以前,并不支持部分同步,当主从服务器之间的连接断掉之后,master服务器和slave服务器之间都是进行全量数据同步 从redis 2.8开始,开始引入了部分同步,即使主从连接中途断掉,也不需要进行全量同步
3.1.5.2 主从同步优化配置
Redis在2.8版本之前没有提供增量部分复制的功能,当网络闪断或者slave Redis重启之后会导致主从之 间的全量同步,
即从2.8版本开始增加了部分复制的功能。
性能相关配置
repl-diskless-sync no # 是否使用无盘方式进行同步RDB文件,默认为no(编译安装默认为yes),no表示不使用无盘,
需要将RDB文件保存到磁盘后再发送给slave,yes表示使用无盘,即RDB文件不需要保存至本地磁盘,而且直接通过网络发送给slave(无盘存在内存中效率高,
但不太稳定) repl-diskless-sync-delay 5 #无盘时复制的服务器等待的延迟时间(多长时间复制一次) repl-ping-slave-period 10 #slave向master发送ping指令的时间间隔,默认为10s repl-timeout 60 #指定ping连接超时时间,超过此值无法连接,master_link_status显示为down状态,并记录错误日志 repl-disable-tcp-nodelay no #是否启用TCP_NODELAY #设置成yes,则redis会合并多个小的TCP包成一个大包再发送,此方式可以节省带宽,但会造成同步延迟时长的增加,导致master与slave数据短期内不一致 #设置成no,则master会立即同步数据 repl-backlog-size 1mb #master的写入数据缓冲区,用于记录自上一次同步后到下一次同步前期间的写入命令,
计算公式:repl-backlog-size = 允许slave最大中断时长 * master节点offset每秒写入量,如:master每秒最大写入量为32MB,最长允许中断60秒,
就要至少设置为32*60=1920MB,建议此值是设置的足够大,如果此值太小,会造成全量复制 repl-backlog-ttl 3600 #指定多长时间后如果没有slave连接到master,则backlog的内存数据将会过期。如果值为0表示永远不过期。 slave-priority 100 #slave参与选举新的master的优先级,此整数值越小则优先级越高。当master故障时将会按照优先级来选择slave端进行选举新的master,
如果值设置为0,则表示该slave节点永远不会被选为master节点。 min-replicas-to-write 1 #指定master的可用slave不能少于个数,如果少于此值,master将无法执行写操作,默认为0,生产建议设为1, min-slaves-max-lag 20 #指定至少有min-replicas-to-write数量的slave延迟时间都大于此秒数时,master将不能执行写操作,默认为10s
3.1.5.1.5 避免复制风暴
单主节点复制风暴 当主节点重启,多从节点复制 解决方法:更换复制拓扑
单机器多实例复制风暴 机器宕机后,大量全量复制 解决方法:主节点分散多机器
3.1.6 常见主从复制故障
3.1.6.1 主从硬件和软件配置不一致
主从节点的maxmemory不一致,主节点内存大于从节点内存,主从复制可能丢失数据 rename-command 命令不一致,如在主节点启用flushdb,从节点禁用此命令,结果在master节点执行 flushdb后,导致slave节点不同步
3.1.6.2 Master 节点密码错误
3.1.6.3 Redis 版本不一致
3.2 Redis 哨兵 Sentinel
配合redis高可用,解决当master出现故障时, 自动的将一个slave 节点提升为新的master节点
3.2.2.1 Sentinel 架构和故障转移机制
sentinel可以监控多组主从复制
Sentinel 架构
Sentinel 故障转移
3.2.2.2 Sentinel中的三个定时任务
1.每10 秒每个sentinel 对master和slave执行info 发现slave节点 确认主从关系 2.每2秒每个sentinel通过master节点的channel交换信息(pub/sub) 通过sentinel__:hello频道交互 交互对节点的“看法”和自身信息 3.每1秒每个sentinel对其他sentinel和redis执行ping
3.2.3 实现哨兵架构
生产中为了节约成本,会把sentinel装在redis节点服务器上(这里三胎redis节点,每个节点装一个sentinel)。
sentinel相当于特殊版本的redis(26379端口),在安装redis时,sentinel已经有了
3.2.3.2 编辑哨兵配置
#如果是编译安装,在源码目录有sentinel.conf,复制到安装目录即可, 如:/apps/redis/etc/sentinel.conf [root@ubuntu2204 ~]#cp redis-7.0.5/sentinel.conf /apps/redis/etc/sentinel.conf [root@centos8 ~]#cp redis-6.2.5/sentinel.conf /apps/redis/etc/sentinel.conf #保证配置文件权限,这里直接把目录权限一起修改了 [root@ubuntu2204 ~]#chown -R redis.redis /apps/redis #[root@ubuntu2204 ~]#chown redis.redis /apps/redis/etc/sentinel.conf #包安装修改配置文件(写完把配置文件复制到两外两台节点上) [root@centos8 ~]#vim /apps/redis/etc/sentinel.conf bind 0.0.0.0 port 26379 daemonize yes pidfile "redis-sentinel.pid" #可改为/apps/redis/run/redis-sentinel.pid logfile "sentinel_26379.log" #可改为/apps/redis/log/redis-sentinel.log dir "/tmp" #工作目录 sentinel monitor mymaster 10.0.0.200 6379 2 #有多个集群,这里就配多个 #mymaster是集群的名称(随意取名,要唯一),此行指定当前mymaster集群中master服务器的地址和端口 #2为法定人数限制(quorum),即有几个sentinel认为master down了就进行故障转移,一般此值是所有sentinel节点(一般总数是>=3的 奇数,如:3,5,7等)的一半以上的整数值,
比如,总数是3,即3/2=1.5,取整为2,是master的ODOWN客观下线的依据 sentinel auth-pass mymaster 123456 #有多个集群,这里就配多个 #mymaster集群中master的密码,注意此行要在上面行的下面,注意:要求这组redis主从复制所有节点的密码是一样的 sentinel down-after-milliseconds mymaster 3000 #判断mymaster集群中所有节点的主观下线(SDOWN)的时间,单位:毫秒,建议3000 #sentinel parallel-syncs mymaster 1 #发生故障转移后,可以同时向新master同步数据的slave的数量,数字越小总同步时间越长,但可以减轻新master的负载压力 #sentinel failover-timeout mymaster 180000 #所有slaves指向新的master所需的超时时间,单位:毫秒 #logfile /var/log/redis/sentinel.log #把配置文件复制到另外两台机器上(注意属性不要丢) [root@ubuntu2204 ~]#rsync -av /apps/redis/etc/sentinel.conf 10.0.0.202:/apps/redis/etc
如果是编译安装,可以在所有节点生成新的service文件
#另外两台机器也复制该配置 [root@redis-master ~]#cat /lib/systemd/system/redis-sentinel.service [Unit] Description=Redis Sentinel After=network.target [Service] ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf -- supervised systemd ExecStop=/bin/kill -s QUIT $MAINPID User=redis Group=redis RuntimeDirectory=redis #Mode=0755 [Install] WantedBy=multi-user.target #把配置文件复制到另外两台机器上(注意属性不要丢) [root@ubuntu2204 ~]#scp /lib/systemd/system/redis-sentinel.service 10.0.0.202:/lib/systemd/system/redis-sentinel.service #注意所有节点的目录权限,否则无法启动服务 # [root@redis-master ~]#chown -R redis.redis /apps/redis/ [root@redis-master ~]#systemctl daemon-reload [root@redis-master ~]#systemctl enable --now redis-sentinel.service #此时3台机器sentinel都部署完成,可以连接测试 [root@redis-master ~]#redis-cli -p 26379 127.0.0.1:26379> info #查看Sentinel,显示主从状态 #sentinel.conf已被sentinel追加内容,其中myid是自动生成唯一的,不能拷贝给其他sentinel(复制得在服务起来之前) #实在要复制,把追加的删了,再复制然后重启 #注意redis主节点redis.conf要追加主库的密码,否则异常恢复后变为从节点,sentinel不追加密码参数导致连接失败 masterauth 123456
测试
把主节点redis停了,sentinel自动选举新的主节点,修改所有redis的conf文件,sentinel.conf追加内容也修改了 如果把原来的redis再次启动,会变成新主节点的从节点,redis.conf文件也会被修改
3.2.4 Sentinel 运维
在Sentinel主机手动触发故障切换
#redis-cli -p 26379 127.0.0.1:26379> sentinel failover <masterName>
范例: 手动故障转移
#修改优先级,能让某一个节点变为主节点(数字越小,优先级越高) [root@centos8 ~]#vim /etc/redis.conf replica-priority 10 #指定优先级,值越小sentinel会优先将之选为新的master,默为值为100 [root@centos8 ~]#systemctl restart redis #或者动态修改 [root@centos8 ~]#redis-cli -a 123456 127.0.0.1:6379> CONFIG GET replica-priority 1) "replica-priority" 2) "100" 127.0.0.1:6379> CONFIG SET replica-priority 99 OK #连接到任意一个Sentinel节点中,进行故障转移 [root@centos8 ~]#redis-cli -p 26379 127.0.0.1:26379> sentinel failover mymaster #原主节点自动变成从节点 OK
3.2.5 应用程序连接 Sentinel
程序不直接连接redis主节点,而是连接Sentinel 间接连接主节点
3.2.5.3 Python 连接 Sentinel 哨兵
[root@ubuntu2204 ~]#apt -y install python3-redis [root@centos8 ~]#yum -y install python3 python3-redis [root@centos8 ~]#cat sentinel_test.py #!/usr/bin/python3 import redis from redis.sentinel import Sentinel #连接哨兵服务器(主机名也可以用域名) sentinel = Sentinel([('10.0.0.8', 26379), ('10.0.0.18', 26379), ('10.0.0.28', 26379)], socket_timeout=0.5) redis_auth_pass = '123456' #mymaster 是配置哨兵模式的redis集群名称,此为默认值,实际名称按照个人部署案例来填写 #获取主服务器地址 master = sentinel.discover_master('mymaster') print(master) #获取从服务器地址 slave = sentinel.discover_slaves('mymaster') print(slave) #获取主服务器进行写入 master = sentinel.master_for('mymaster', socket_timeout=0.5, password=redis_auth_pass, db=0) w_ret = master.set('name', 'wang') #输出:True #获取从服务器进行读取(默认是round-roubin) slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password=redis_auth_pass, db=0) r_ret = slave.get('name') print(r_ret) #输出:wang
上面不管是高可用,还是高可用下的哨兵,都有单点写入性能瓶颈问题。cluster就是解决这一问题
3.3 Redis Cluster
3.3.1 Redis Cluster 介绍
使用哨兵 Sentinel 只能解决Redis高可用问题,实现Redis的自动故障转移,但仍然无法解决Redis Master 单节点的性能瓶颈问题 为了解决单机性能的瓶颈,提高Redis 服务整体性能,可以使用分布式集群的解决方案 早期 Redis 分布式集群部署方案: 1.客户端分区:由客户端程序自己实现写入分配、高可用管理和故障转移等,对客户端的开发实现较为复杂 2.代理服务:客户端不直接连接Redis,而先连接到代理服务,由代理服务实现相应读写分配,当前代理服务都是第三方实现.此方案中客户端实现无需特殊开发,
实现容易,但是代理服务节点仍存有单点故障和性能瓶颈问题。比如:Twitter开源Twemproxy,豌豆荚开发的 codis
3.3.2 Redis Cluster 架构
根据key的名称进行算法计算落在不同的主节点上
3.3.2.1 Redis Cluster 架构
缺点:
1.起步6台机器,成本太高,小公司不需要(小公司可能单机版就够了) #实际上最少3个节点可以搭Cluster,全是主节点,没有从节点(就是没有数据安全了) (主节点奇数,防止脑裂) 2.不支持多数据库,只能用0号数据库,不能select切库
3.3.2.4 部署方式介绍
redis cluster 有多种部署方法
1.原生命令安装(太麻烦,不适合) 理解Redis Cluster架构 生产环境不使用 2.官方工具安装 高效、准确 生产环境可以使用 3.自主研发(大公司自己研发) 可以实现可视化的自动化部署
3.3.3 实战案例:基于 Redis 5 以上版本的 Redis Cluster 部署
注意: 如果redis3和4要用redis-trib.rb工具(ruby写的)
3.3.3.1 创建 Redis Cluster 集群的环境准备
创建6个单机版redis, 3台做主, 3台做从
3.3.3.2 启用 Redis Cluster 配置
所有6台主机都执行以下配置
每个节点修改redis配置,必须开启cluster功能的参数
[root@redis-node1 ~]vim /etc/redis.conf bind 0.0.0.0 masterauth 123456 #建议配置,否则后期的master和slave主从复制无法成功,还需再配置 requirepass 123456 cluster-enabled yes #取消此行注释,必须开启集群,开启后查redis进程会有cluster标识(默认0没开启) cluster-config-file nodes-6379.conf #取消此行注释,此为集群状态数据文件,记录主从关系及slot范围信息,由redis cluster集群自动创建和维护(在配置dir工作目录下) cluster-require-full-coverage no #默认值为yes,设为no可以防止一个节点不可用导致整个cluster不可用 #或者执行下面命令,批量修改(里面requirepass没加) [root@redis-node1 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' /etc/redis.con #如果是编译安装可以执行下面操作 [root@redis-node1 ~]#sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' /apps/redis/etc/redis.conf [root@redis-node1 ~]#systemctl enable --now redis
验证当前Redis服务状态:
#注意进程有[cluster]状态 [root@centos8 ~]#ps -ef|grep redis redis 1939 1 0 10:54 ? 00:00:00 /usr/bin/redis-server 0.0.0.0:6379 [cluster] root 1955 1335 0 10:57 pts/0 00:00:00 grep --color=auto redis
3.3.3.3 创建集群
#下面命令在集群节点或任意集群外节点执行皆可,命令redis-cli的选项 --cluster-replicas 1表示每个master对应一个slave节点(不写全是主节点),注意:所有节点数据必须清空 [root@redis-node1 ~]#redis-cli -a 123456 --cluster create 10.0.0.8:6379 10.0.0.18:6379 10.0.0.28:6379 10.0.0.38:6379 10.0.0.48:6379 10.0.0.58:6379 --cluster-replicas 1 #前3个节点自动为主节点,后3个节点自动和前面3个配主从(顺序不确定) 输入yes确定,会显示创建和槽位情况(数据分配位置) #也可以通过--cluster查看集群槽位情况 (-a输入密码) 后面跟上任意节点ip [root@ubuntu ~]#redic-cli -a 123456 --cluster check 10.0.0.8:6379 #查看集群信息 [root@ubuntu ~]#redic-cli -a 123456 cluster info #可以通过cluster配置文件查看 #也可如下查集群 [root@ubuntu ~]#redic-cli -a 123456 info replication
测试
#把一个主节点关了,从节点会自动变为主节点 [root@ubuntu ~]#redic-cli -a 123456 info replication #在从节点查看变为主节点 #原来的主节点恢复,会变为新主的从节点 #测试写入,如果直接连接redis写入,只能写入计算key对应的redis节点上,且从节点不提供读功能,只用来备份数据 #可以通过-c让集群自动判断写入那个redis节点 [root@ubuntu ~]#redis-cli -a 123456 -c 127.0.0.1:6379> set x y #会返回写入哪个槽位的redis中 127.0.0.1:6379> get x #会根据槽位去对应redis上读 127.0.0.1:6379> dbsize #查看当前节点的数据 #注: 不支持mset,mget多值写入,多值查询
python连接Cluster集群
#!/usr/bin/env python3 from rediscluster import RedisCluster if __name__ == '__main__': startup_nodes = [ {"host":"10.0.0.201", "port":6379}, {"host":"10.0.0.202", "port":6379}, {"host":"10.0.0.203", "port":6379}, {"host":"10.0.0.204", "port":6379}, {"host":"10.0.0.205", "port":6379}, {"host":"10.0.0.206", "port":6379}] try: redis_conn= RedisCluster(startup_nodes=startup_nodes,password='123456', decode_responses=True) except Exception as e: print(e) for i in range(0, 10000): redis_conn.set('key'+str(i),'value'+str(i)) print('key'+str(i)+':',redis_conn.get('key'+str(i)))
获取bigkey ,建议在slave节点执行
#redis-cli --bigkeys 范例: 查找 bigkey [root@centos8 ~]#redis-cli -a 123456 --bigkeys
3.3.5 Redis cluster 管理
3.3.5.1 集群扩容
把现有的槽位挪一部分给新的节点(移动存在风险,可能会有数据丢失,最好让开发做备份)
#增加两台redis服务器,编译安装redis [root@redis-node7 ~]#dnf -y install redis [root@redis-node7 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf #编译安装执行下面操作(别忘了加requirepass) [root@redis-node7 ~]#sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /apps/redis/etc/redis.conf [root@redis-node7 ~]#systemctl restart redis
3.3.5.1.2 添加新的master节点到集群
使用以下命令添加新节点,要添加的新redis节点IP和端口添加到的已有的集群中任意节点的IP:端口
add-node new_host:new_port existing_host:existing_port [--slave --master-id <arg>] #说明: new_host:new_port #指定新添加的主机的IP和端口 existing_host:existing_port #指定已有的集群中任意节点的IP和端口
Redis 5 以上版本的添加命令:
#将一台新的主机10.0.0.68加入集群,以下示例中10.0.0.58可以是任意存在的集群节点(命令在任意节点执行都行) [root@redis-node1 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.68:6379 <当前任意集群节点>:6379 #例: 将10.0.0.68将入到10.0.0.58所在的集群中 redis-cli -a 123456 --cluster add-node 10.0.0.68:6379 10.0.0.58:6379
3.3.5.1.3 在新的master上重新分配槽位
新的node节点加到集群之后,默认是master节点,但是没有slots,需要重新分配,否则没有槽位将无法访 问
Redis 5以上版本命令:
[root@redis-node1 ~]#redis-cli -a 123456 --cluster reshard <当前任意集群节点>:6379 How many slots do you want to move (from 1 to 16384)?4096 #新分配多少个槽位=16384/master个数 What is the receiving node ID? d6e2eca6b338b717923f64866bd31d42e52edc98 #新的master的ID Source node #1: all #输入all,将哪些源主机的槽位分配给新的节点,all是自动在所有的redis node选择划分,如果是从redis cluster删除某个主机可以使用此方式将指定主机上的槽位全部移动到别的redis主机 Do you want to proceed with the proposed reshard plan (yes/no)? yes #确认分配 #查看集群槽位分配情况,输入任意集群地址都行 [root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.203:6379
3.3.5.1.4 为新的master指定新的slave节点
Redis 5 以上版本添加命令:
redis-cli -a 123456 --cluster add-node 10.0.0.78:6379 <任意集群节点>:6379 --cluster-slave --cluster-master-id d6e2eca6b338b717923f64866bd31d42e52edc98
范例:
#直接加为slave节点 [root@redis-node1 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.78:6379 10.0.0.8:6379 --cluster-slave --cluster-master-id d6e2eca6b338b717923f64866bd31d42e52edc98 #验证是否成功 [root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
3.3.5.2 集群缩容
3.3.5.2.1 迁移要删除的master节点上面的槽位到其它master
#还槽位 [root@redis-node1 ~]# redis-cli -a 123456 --cluster reshard 10.0.0.68:6379 How many slots do you want to move (from 1 to 16384)?1365 #分3批还给3个主节点 What is the receiving node ID? d6e2eca6b338b717923xxxxxxxxxx #还给的masterID Source node #1: d6exxxxxx717923xxxxxxxxxx #输入10.0.0.68(要还槽位)的ID Source node #2: done #表示结束的意思 Do you want to proceed with the proposed reshard plan (yes/no)? yes #确认分配 #查看是否还槽位成功 [root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379 #按照上述方法,再把剩下的分两次挪给两外两个主节点
3.3.5.2.2 从集群中删除服务器
删除新加入的主和从节点
Redis 5以上版本命令:
[root@redis-node1 ~]#redis-cli -a 123456 --cluster del-node <任意集群节点的IP>:6379 cb028b83f9dc463d732f6e76ca6bbcd469d948a7 #cb028b83f9dc463d732f6e76ca6bbcd469d948a7是删除节点的ID #查看是否没有那两个节点了 [root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379 #如果被删的redis节点还想用,作为单节点用 就在redis.conf中把下面参数改成no cluster-enabled no [root@redis-node1 ~]#systemctl restart redis #删除节点信息(没有用了) [root@redis-node1 ~]#rm -f /var/lib/redis/nodes-6379.conf
3.3.5.3 导入现有Redis数据至集群
3.3.5.3.1 基础环境准备
因为导入时不能指定验证密码,所以导入数据之前需要关闭所有Redis 节点(括集群的的节点和集群外的节 点)的密码。
#单机redis和redis集群全部取消密码和关闭保护模式 #1.新版在所有节点(源节点和集群节点)需要关闭protected-mode [root@ubuntu2204 ~]#redis-cli -a 123456 config set protected-mode no #2.在所有节点(源节点和集群节点)关闭各Redis密码认证 [root@ubuntu2204 ~]#redis-cli -p 6379 -a 123456 --no-auth-warning CONFIG SET requirepass ""
3.3.5.3.2 执行数据导入
将源Redis 节点的数据直接导入之 Redis cluster,此方式慎用(能推走就让开发自己导)!
Redis 5以上版本命令:
[root@redis ~]#redis-cli --cluster import <集群任意节点服务器IP:PORT> --cluster-from <外部Redis node-IP:PORT> --cluster-copy --cluster-replace #只使用cluster-copy,则要导入集群中的key不能存在 #如果集群中已有同样的key,如果需要替换,可以cluster-copy和cluster-replace联用,这样集群中的key就会被替换为外部数据 cluster-replace为替换 #导入完成后还原密码/保护模式 #所有redis执行 [root@ubuntu2204 ~]#redis-cli -p 6379 --no-auth-warning CONFIG SET requirepass "123456" [root@ubuntu2204 ~]#redis-cli -a 123456 config set protected-mode yes
3.3.6 Redis Cluster 的局限性
3.3.6.1 集群的读写分离
在集群模式下的从节点是只读连接的,也就是说集群模式中的从节点是拒绝任何读写请求的。当有命令尝试从slave节点获取数据时,
slave节点会重定向命令到负责该数据所在槽的节点。 为什么说是只读连接呢?因为slave可以执行命令:readonly,这样从节点就能读取请求,但是这只是在这次连接中生效。也就是说,当客户端断开连接重启后,
再次请求又变成重定向了。 集群模式下的读写分离更加复杂,需要维护不同主节点的从节点和对于槽的关系。 通常是不建议在集群模式下构建读写分离,而是添加节点来解决需求。不过考虑到节点之间信息交流带来的带宽问题,官方建议节点数不超过1000个。
3.3.6.2 单机,主从,哨兵和集群的选择
大多数时客户端性能会”降低” 命令无法跨节点使用︰mget、keys、scan、flush、sinter等 客户端维护更复杂︰SDK和应用本身消耗(例如更多的连接池) 不支持多个数据库︰集群模式下只有一个db 0 复制只支持一层∶不支持树形复制结构,不支持级联复制 Key事务和Lua支持有限∶操作的key必须在一个节点,Lua和事务无法跨节点使用 所以集群搭建还要考虑单机redis是否已经不能满足业务的并发量,在redis sentinel同样能够满足高可用,且并发并未饱和的前提下,搭建集群反而是画蛇添足了。
标签:6379,redis,数据类型,cluster,集群,sentinel,master,Redis,节点 From: https://www.cnblogs.com/ludingchao/p/18447694