Redis学习+集群搭建+持久化+主从复制(详细学习)_windows7 redis集群搭建(1)

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

命令作用
[ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员,或者更新已存在成员的分数
zcard key获取有序集合的成员数
zcount key min max计算在有序集合中指定区间分数的成员数
zincrby key increment member有序集合中对指定成员的分数加上增量increment
zlexcount key min pmax在有序集合中计算指定字典区间内成员数量
zrange key start stop通过索引区间返回有序集合指定区间内的成员
zrangebylex key min max通过字典区返回有序集合的成员
zrank key member返回有序集合中指定成员的索引
zrem key member member移除有序集合中的一个或多个成员
zremrangebylex key min max移除有序集合中给定的字典区间的所有成员
zremrangebyrank key start stop移除有序集合中给定的排名区间的所有成员
zrevrank key_member返回有序集合中指定分数区间内的成员,分数从高到低

四,redis持久化

1.持久化类型
rdb方式:

rdb:是redis默认的持久化方法,rdb方法是通过快照完成的,他保存的是某一时的数据并不关注过程

优点:

  • rdb是二进制压缩文件,占用空间小,便于传输(传给slave)

  • 主进程fork子进程,可以最大化redis性能

  • 使用RDB文件来恢复数据快

缺点:

  • 不保证数据完整性,会丢失最后一次快照以后更改的所有数据

  • 父进程在fork子进程的时候如果主进程比较大会阻塞

aof方式:

aof:开启aof持久化后redis将所有对数据进行写入的命令(以及参数),记录到aof文件,以此达到记录数据库状态的目的,这样当redis重启后只要按顺序回放这些命令就会恢复到原始状态了

优点:

  • AOF存储命令操作

  • 大概率保证数据不丢失

缺点:

  • 日志量巨大
ROB与AOF对比
  • RDB存某个时刻的数据快照,采用二进制压缩存储,AOF存操作命令,采用文本存储(混合);

  • RDB性能高,AOF性能较低。

  • RDB在配置触发状态会丢失最后一次快照以后更改的所有数据,AOF设置每一秒保存一次,则最多丢2秒数据

  • redis以主服务器模式运行,RDB不会保存过期键值对数据,redis以从服务器模式运行,rdb会保存过期键值对,当主服务器向从服务器同步,再清空过期键值对

  • aof写入文件时,对过期的key会追加一条del命令,当执行AOF重写,会忽略过期key和del命令

应用场景
  • 内存数据库rdb+aof数据不容易丢失

  • 缓存数据器rdb性能高 不建议使用aof(性能差)

  • 在数据还原时 有rdb+aof则还原aof,因为rdb会造成文件的丢失,aof相对数据要完整

2.rdb配置
redis-cli	登录redis
bgsave		rdb保存命令

vim /opt/redis_cluster/redis_6379/conf/6379.conf	
添加:
save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照
3.aof配置
vim /opt/redis_cluster/redis_6379/conf/6379.conf
添加:
appendonly yes			#启用AOF持久化
appendfilename "redis.aof"	#指定AOF文件名
appendfsync everysec		#每秒同步一次
4.设置完成后,重启服务
redis-cli shutdown
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf

五,主从复制

1.redis主从复制

为解决单点故障把数据复制到一个或多个副本副本服务器(从服务器),实现故障恢复和负载均衡

2.开启第二台服务器,安装redis
(1)把第一台服务器的redis安装目录,scp到第二台服务器上
	scp -rp /opt/redis_cluster/ root@192.168.8.20:/opt
(2)在第二台服务器上,make install安装redis
	cd /opt/redis_cluster/redis
	make install
	vim /opt/redis_cluster/redis_6379/conf/6379.conf 
	修改:
	bind 127.0.0.1 192.168.2.2
	slaveof 192.168.2.1 6379
	保存退出
(3)启动服务
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
(4)主服务器上新建键值,测试从服务器自动同步
(5)从服务器在同步过程中,只能复制主数据库的数据,不能手动添加修改数据;

如果从服务器非要修改数据,需要断开同步:

	redis-cli slaveof no one 

六,redis集群

一,redis集群的概念

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的错误。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

redis集群提供了以下两个好处:

  • 将数据自动切分到多个节点的能力

  • 当集群中的一部分节点失灵或无法进行通信,仍然可以继续处理命令请求能力

二,集群redis部署

环境:

redis1-2:192.168.2.1

redis2-3:192.168.2.2

redis3-4:192.168.2.3

实现环境:

一,安装redis
1.redis1部署
1.安装redis
[root@localhost ~]# tar -xf /mnt/redis-5.0.7.tar.gz -C /opt/
[root@localhost ~]# /opt/redis-5.0.7
[root@localhost redis-5.0.7]# make && make install
[root@localhost ~]# ln -s  /opt/redis-5.0.7/ /opt/redis		#做一个软链接,方便以后更新

注意(当make编译时出现问题,大多数原因是缺少gcc编译器):[root@localhost redis-5.0.7]# yum -y install gcc gcc-c++

2.创建配置文件存放位置
[root@localhost ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
[root@localhost ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
3.编写redis配置文件
[root@localhost ~]# cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.2.1
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
4.创建6381端口的redis
[root@localhost ~]# cd /opt/redis_cluster/
[root@localhost redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
[root@localhost redis_cluster]# sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf
5.启动redis
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
6.传递redis
[root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.2:/opt
[root@localhost opt]# scp -rp /opt/redis*/ root@192.168.2.3:/opt
2.redis2部署
1.重新安装一下redis
[root@localhost ~]# cd /opt/redis
[root@localhost redis]# make install
2.更改配置文件中的IP地址
[root@localhost redis]# find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#192.168.2.1#192.168.2.2#g"
3.创建存放数据的目录
[root@localhost redis]# mkdir -p /data/redis_cluster/redis_{6380,6381}
4.开启redis服务器
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
3.redis3部署(同redis2除IP外)
二,手动配置节点发现

节点发现使用命令: CLUSTER MEET {IP} {PORT}

提示:在集群内任意一台机器执行此命令就可以

1.添加节点在192.168.2.1:6380
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6380
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.2 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6380
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.3 6381
OK
[root@localhost opt]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678676225000 4 connected
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678676226000 0 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678676226199 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678676224000 1 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678676223000 2 connected
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678676227207 3 connected
2.redis cluster通信流程

redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。

通信过程:

1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000).

2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息

3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,

只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。

通讯消息类型:

Gossip

Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。

常见 Gossip 消息分为:ping、 pong、 meet、 fail 等

  • meet

meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换

  • ping

ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。

  • pong

Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。

  • fail

fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。

3.redis cluster手动分配槽位

注意:虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态。 反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.

[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster addslots {0..5460}
OK
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6380 cluster addslots {5461..10922}
OK
[root@localhost ~]# redis-cli -h 192.168.2.3 -p 6380 cluster addslots {10923..16383}
OK

查看:

[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678677991468 4 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 master - 0 1678677992477 0 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 master - 0 1678677990459 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678677991000 1 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678677992000 2 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678677993485 3 connected 5461-10922
4.手动分配集群高可用
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6381 cluster replicate d9ea4f26b2221a5497d78326a7c1aff828e98426  #输入第二台6380的ID
OK
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6381 cluster replicate b6f47e859ad6a3b9b238778d1cf0df4f95710a1f  #输入第三台6380的ID
OK
[root@localhost ~]# redis-cli -h 192.168.2.3 -p 6381 cluster replicate 9f48a4262474744dc22524b28096ccba111d236d  #输入第一台6380的ID
OK
5.redis cluster ASK路由介绍

在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点

如果节点是自身,则处理键命令;

否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.

知道了ask路由后,我们使用-c选项批量插入一些数据

1.编写创建键值对脚本
[root@localhost ~]# vi input_key.sh
#!/bin/bash
for i in $(seq 1 10000)
do
    redis-cli -c -h 192.168.2.1 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done
#保存退出
#运行测试
bash input_key.sh

测试

[root@localhost ~]# redis-cli -c -h 192.168.2.1 -p 6380
192.168.2.1:6380> get k_10000
-> Redirected to slot [12695] located at 192.168.2.3:6380 #存放到了2.3上的第12695槽位
"v_10000"
192.168.2.3:6380> get k_1000
-> Redirected to slot [79] located at 192.168.2.1:6380 #存放到了2.1上的第79槽位
"v_1000"
三,故障转移
1.模拟redis2故障
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6380 shutdown
2.查看从是否晋升为主
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678679339733 4 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678679339000 4 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 slave 9f48a4262474744dc22524b28096ccba111d236d 0 1678679337719 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 master - 0 1678679338726 6 connected 5461-10922
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678679338000 2 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master,fail - 1678679289623 1678679289320 3 disconnected
3.启动redis2:6380
[root@localhost redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
4.重回master
[root@localhost ~]# redis-cli -h 192.168.2.2 -p 6380 cluster failover
OK
[root@localhost ~]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678679584000 4 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678679586000 4 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 slave 9f48a4262474744dc22524b28096ccba111d236d 0 1678679586593 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 slave d9ea4f26b2221a5497d78326a7c1aff828e98426 0 1678679583000 7 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678679584000 2 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678679585588 7 connected 5461-10922
三,自动搭建部署redis cluster
1.低版本部署

手动搭建集群便于理解集群创建的流程和细节,不过手动搭建集群需要很多步骤,当集群节点众多时,必然会加大搭建集群的复杂度和运维成本,因此官方提供了 redis-trib.rb的工具方便我们快速搭建集群。redis-trib.rb是采用 Ruby 实现的 redis 集群管理工具,内部通过 Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用前要安装 ruby 依赖环境

前提准备:

停掉所有的节点,然后清空数据,恢复成一个全新的集群,所有机器执行命令

pkill redis
rm -rf /data/redis_cluster/redis_6380/*
rm -rf /data/redis_cluster/redis_6381/*

全部清空之后启动所有的节点,所有机器执行

redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

(1)安装命令:注意新版本redis不需安装,直接采用步骤(2)

yum makecache fast
yum install rubygems
gem sources --remove https://rubygems.org/
gem sources -a http://mirrors.aliyun.com/rubygems/
gem update –system
gem install redis -v 3.3.5

redis1执行创建集群命令

cd /opt/redis_cluster/redis/src/
./redis-trib.rb create --replicas 1 192.168.8.10:6380 192.168.8.20:6380 192.168.8.20:6380 192.168.8.10:6381 192.168.8.30:6381 192.168.8.30:6381

检查集群完整性

./redis-trib.rb check 192.168.8.10:6380
2.redis5.0版本自动部署cluster

清空手动创建的缓存

pkill redis
rm -rf /data/redis_cluster/redis_6380/*
rm -rf /data/redis_cluster/redis_6381/*

自动部署cluser

redis-cli --cluster create --cluster-replicas 1 192.168.2.1:6380 192.168.2.2:6380 192.168.2.3:6380 192.168.2.1:6381 192.168.2.2:6381 192.168.2.3:6381

检查完整性:

redis-cli --cluster check 192.168.8.10:6380
3.扩容节点
1.添加节点
[root@localhost ~]# mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
[root@localhost ~]# mkdir -p /data/redis_cluster/redis_{6390,6391}
[root@localhost ~]# cd /opt/redis_cluster/
[root@localhost redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
[root@localhost redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
[root@localhost redis_cluster]# sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
[root@localhost redis_cluster]# sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6390/conf/redis_6390.conf
[root@localhost redis_cluster]# redis-server /opt/redis_cluster/redis_6391/conf/redis_6391.conf
2.发现节点
[root@localhost redis_cluster]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6390
OK
[root@localhost redis_cluster]# redis-cli -h 192.168.2.1 -p 6380 cluster meet 192.168.2.1 6391
OK
3.分配slots
redis-cli --cluster reshard 192.168.2.1:6390 
输入分配的slots数:4096		#你分配多少空间给他
再输入6390的id号:			#确认一下6390的ID
再输入all					#从那几台集群服务器分配 all所有服务器平均分配
4.分配slave
[root@localhost redis_cluster]# redis-cli -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678681164252 4 connected 12288-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678681164000 4 connected
c03a5451d189fb10451a58ccc44846a66f86a83f 192.168.2.1:6391@16391 master - 0 1678681164000 8 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 slave 9f48a4262474744dc22524b28096ccba111d236d 0 1678681166266 5 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 slave d9ea4f26b2221a5497d78326a7c1aff828e98426 0 1678681164000 7 connected
ec5e8ba00823c8d972f8c6c048ea0b964df10f40 192.168.2.1:6390@16390 master - 0 1678681165259 9 connected 0-1364 5461-6826 10923-12287
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678681163000 2 connected 1365-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678681167272 7 connected 6827-10922
[root@localhost redis_cluster]# redis-cli -h 192.168.2.1 -p 6391 cluster replicate ec5e8ba00823c8d972f8c6c048ea0b964df10f40
OK
4.收缩节点

1.移除节点槽位

[root@localhost redis_cluster]# redis-cli --cluster reshard 192.168.8.10:6390
How many slots do you want to move (from 1 to 16384)?  1365 
What is the receiving node ID?  9f48a4262474744dc22524b28096ccba111d236d 
Please enter all the source node IDs. 
Type 'all' to use all the nodes as source nodes for the hash slots. 
Type 'done' once you entered all the source nodes IDs.
Source node #1: ec5e8ba00823c8d972f8c6c048ea0b964df10f40
Source node #2: done
翻译:
你想移动多少个槽位(从1到16384)?1365
接收节点的ID是什么?9 f48a4262474744dc22524b28096ccba111d236d
请输入所有源节点id
键入'all'以使用所有节点作为散列槽的源节点。
输入所有源节点id后,输入` done `。
本课案例中分三次移除:分别 
	1365  给redis1的6380
	1366  给redis2的6380
	1365  给redis3的6380

2.移除节点

redis-cli -c -h 192.168.8.10 -p 6380  cluster forget 6390的ID

redis-cli -c -h 192.168.8.10 -p 6380  cluster forget 6391的ID
[root@localhost redis_cluster]# redis-cli -c -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678681998352 12 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678681998000 12 connected
c03a5451d189fb10451a58ccc44846a66f86a83f 192.168.2.1:6391@16391 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678682003000 12 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 slave 9f48a4262474744dc22524b28096ccba111d236d 0 1678682000000 10 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 slave d9ea4f26b2221a5497d78326a7c1aff828e98426 0 1678682003386 11 connected
ec5e8ba00823c8d972f8c6c048ea0b964df10f40 192.168.2.1:6390@16390 master - 0 1678682002382 9 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678682001000 10 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678682002000 11 connected 5461-10922
[root@localhost redis_cluster]# redis-cli -c -h 192.168.2.1 -p 6380 cluster forget ec5e8ba00823c8d972f8c6c048ea0b964df10f40
OK
[root@localhost redis_cluster]# redis-cli -c -h 192.168.2.1 -p 6380 cluster forget c03a5451d189fb10451a58ccc44846a66f86a83f
OK
[root@localhost redis_cluster]# redis-cli -c -h 192.168.2.1 -p 6380 cluster nodes
b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 192.168.2.3:6380@16380 master - 0 1678682062784 12 connected 10923-16383
dee913166afa30b567b151e6e1196847ed0a8a96 192.168.2.2:6381@16381 slave b6f47e859ad6a3b9b238778d1cf0df4f95710a1f 0 1678682061777 12 connected
693d6d17f5860887d3343ebe0083351cd9815c8d 192.168.2.3:6381@16381 slave 9f48a4262474744dc22524b28096ccba111d236d 0 1678682061000 10 connected
961bb9571f4e2f64a320da2631ae8cfc3b78d1e1 192.168.2.1:6381@16381 slave d9ea4f26b2221a5497d78326a7c1aff828e98426 0 1678682059764 11 connected
9f48a4262474744dc22524b28096ccba111d236d 192.168.2.1:6380@16380 myself,master - 0 1678682060000 10 connected 0-5460
d9ea4f26b2221a5497d78326a7c1aff828e98426 192.168.2.2:6380@16380 master - 0 1678682059000 11 connected 5461-10922

3.删除节点数据,关闭

pkill redis
rm -rf /data/redis_cluster/redis_6390/*
rm -rf /data/redis_cluster/redis_6391/*

七,科普

一,常用命令
集群(cluster)
	CLUSTER INFO 打印集群的信息
	CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 
节点(node)
	CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
	CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
	CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
	CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 
槽(slot)
	CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
	CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
	CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
	CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
	CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
	CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
	CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 
键 (key)
	CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
	CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
二,redis运维工具
1.redis管理脚本
[root@redis1 ~]# cat redis_shell.sh 
#!/bin/bash

USAG(){
    echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}
if [ "$#" = 1 ]
then
    REDIS_PORT='6379'
elif 
    [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
then
    REDIS_PORT="$2"
else
    USAG
    exit 0
fi

REDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log

CMD_START(){
    redis-server ${PATH_CONF}
}

CMD_SHUTDOWN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}

CMD_LOGIN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}

CMD_PS(){
    ps -ef|grep redis
}

CMD_TAIL(){
    tail -f ${PATH_LOG}
}

case $1 in
    start)
        CMD_START
        CMD_PS
        ;;
    stop)
        CMD_SHUTDOWN
        CMD_PS
        ;;
    restart)
        CMD_START
        CMD_SHUTDOWN
        CMD_PS
        ;;
    login)
        CMD_LOGIN
        ;;
    ps)
        CMD_PS
        ;;
    tail)
        CMD_TAIL
        ;;
    *)
        USAG
esac
2.数据导出导入工具
刚切换到redis集群的时候肯定会面临数据导入的问题,所以这里推荐使用redis-migrate-tool工具来导入单节点数据到集群里
官方地址:
http://www.oschina.net/p/redis-migrate-tool
安装工具

cd /opt/redis_cluster/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install 
创建配置文件

[root@redis1 ~]# cat redis_6379_to_6380.conf    
[source]
type: single
servers:
- 192.168.8.10:6379
 
[target]
type: redis cluster
servers:
- 192.168.8.10:6380 
 
[common]
listen: 0.0.0.0:8888
source_safe: true
生成测试数据

[root@redis1 ~]# cat input_key.sh 
#!/bin/bash
for i in $(seq 1 1000)
do
    redis-cli -c -h redis1 -p 6379 set k_${i} v_${i} && echo "set k_${i} is ok"
done
执行导入命令

[root@redis1 ~]# redis-migrate-tool -c redis_6379_to_6380.conf 
数据校验

[root@redis1 ~]# redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check
3.分析键值大小

需求背景

redis的内存使用太大键值太多,不知道哪些键值占用的容量比较大,而且在线分析会影响性能.

安装工具

yum install python-pip gcc python-devel 
cd /opt/


为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/b6ed01e294bcb80d6c7944fbc2541ad0.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值