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

您所在的位置:网站首页 redissearch持久化 Redis学习+集群搭建+持久化+主从复制(详细学习)

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

#Redis学习+集群搭建+持久化+主从复制(详细学习)| 来源: 网络整理| 查看: 265

Redis学习 一,redis简介

官网:Redis

1.redis是什么? redis是一个完全开源的非关系型数据库,遵守BSD协议,是一个高性能的key-value数据库

特点:

redis支持持久化,可以将数据读取到内存,加快访问的读取,第二次读取中可以直接将数据读取到内存中使用

redis不仅支持key-value类型,同时还提供了 list,set,zset,hash等数据类型

redis支持数据的备份,即master-slave模式为备份模式

redis支持cluster模式,支持集群化控制

2.redis优势?

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s

丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作

原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性

二,redis部署 一,windows安装redis

注意:不建议使用,redis官网提到过,redis没用面向win系统开发,都使用在linux系统来使用

1.下win中redis包 win:https://github.com/tporadowski/redis/releases 2.将包解压到win本地

3.打开cmd终端,切换到redis的存放目录 redis-server.exe redis.windows.conf #启动redis服务 4.使用redis-cli客户端程序安装即可 redis-cli.exe -h 127.0.0.1 -p 6379 二,linux安装redis 1.网络安装redis #yum源下载 yum -y install redis-server 2.源码包安装redis

官网下载:Download | Redis

1.准备安装和数据目录 mkdir -p /data/soft mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid} 2.下载redis安装包 cd /data/soft wget http://download.redis.io/releases/redis-5.0.7.tar.gz 3.解压redis到/opt/redis_cluster/ tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/ ln -s /opt/redis_cluster/redis-5.0.7 /opt/redis_cluster/redis 4.切换目录安装redis cd /opt/redis_cluster/redis make && make install 5.编写redis启动配置文件 vim /opt/redis_cluster/redis_6379/conf/6379.conf 添加: bind 127.0.0.1 192.168.2.1 #指定启动地址 port 6379 #端口号 daemonize yes pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid #存放PID的文件目录 logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log #存放日志的文件目录 databases 16 dbfilename redis.rdb #数据库文件 dir /opt/redis_cluster/redis_6379 #群集文件 保存退出 6.启动当前的服务 redis-server /opt/redis_cluster/redis_6379/conf/6379.conf 7.关闭服务 redis-cli shudown 8.登录 redis-cli -h 127.0.0.1 -p 6379 #指定redis的地址,和端口号 三,redis命令 一,redis 键(key)

命令

作用

set [key] [value]

创建键

get [key]

读取键内容

del [key]

删除key

dump [key]

序列化

exists [key]

检查指定的key是否存在

expire [key] seconde

为给定key设置过期时间,以秒计数

expireat [key] timestamp

与expore类似,支持unix时间戳

pexpire [key] milliseconds

设置key过期时间,以毫秒为单位

pexpireat [key] time

设置key过期时间戳,以毫秒为单位

keys [pattern]

查找所有符合给定模式的key

move key db

将当前数据库的key移动到指定的数据库db中

persist key

移除key的过期时间,key将持久保持

pttl key

以毫秒为单位返回key的剩余过期时间

tty key

以秒为单位,返回key的剩余生存时间

randomkey

从数据库中随机返回一个key

rename key newkey

修改key的名称

renamenx key newkey

仅当newket不存在时,将key改名为newkey

type key

返回key所储存的值的类型

二,redis 字符串(string)

命令

作用

set key value

设置指定key的值

get key

获取key的值

getrange key start end

返回key中字符串的子字符

getset key value

将key的值设为value,并返回旧的值

getbit key offset

对key所有存储的字符串值,获取指定偏移量上的位

mget key1

获取所有一个或多个key的值

setbit key offset value

对key所有储存的字符串值,设置或清除指定偏移量上的位

setex key seconds value

将值value关联到key,并将key的过期时间设为seconds

setnx key value

只要在key不存在时设置key的值

strlen key

返回key所储存的字符串的长度

mset key value [key value]

同时设置一个或多个key-value

msetnx key value [key value]

同时设置一个或多个key-value,当且仅所有给定key都不存在

incr key

将key中存储的数字+1

incrby key increment

将key所存储的值加上给定的浮点增量值

decr key

将key中储存的数字减一

append key value

如果key已经存在并且是一个字符串,append命令将指定的value追加到该key原来值(value)的末尾

三,redis 哈希(hash) Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

命令

作用

hdel key field

删除一个或多个哈希字段

hexists key field

查看哈希表key中,指定的字段是否存在

hget key field

获取在哈希表中指定key的所有字段和值

hgetall key

获取在哈希表中指定key的所有字段和值

hincrby key field increment

为哈希表key中的指定字段的整数值加上增量increment

hkeys key

获取所有哈希表中的字段

hlen key

获取哈希表中字段的数量

hmget key field1

获取所有给定字段的值

hmset key field1 value

同时将多个field-value对设置到哈希表key中

hsetnx key filed value

只有在字段field不存在时,设置哈希表字段的值

hset key field value

将哈希表key中的字段field的值设为value

hvals key

获取哈希表中所有的值

四,redis 列表(list)

命令

作用

blpop key1 timeout

移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

brpop key

移出并获取列表的最后一个元素

lindex key index

通过索引获取列表中的元素

llen key

获取列表长度

lpop key

移出并获取列表的第一个元素

lpush key value

将一个或多个值插入到列表头部

lrange key start stop

获取列表指定范围内的元素

lrem key count value

移除列表元素

lset key index value

通过索引设置列表元素的值

ltrim key start stop

对一个列表进行修剪,让列表只保留指定区间内的元素

rpop key

移除列表

rpoplpush source destination

移除列表

rpush key value1

在列表中添加一个或多个值

rpushx key value

为已存在的列表添加值

五,redis 集合(set)

命令

作用

sadd key member1

向集合添加一个或多个成员

scard key

获取集合的成员数

sdiff key1

返回第一个集合与其他集合之间的差异

sdiffstore destination key1

返回给定所有集合的差集并存储在destination

sinter key1 key2

返回给定所有集合的交集

sinterstore destination key1

判断

sismember key member

返回集合中的所有成员

smove source destination member

将member 元素从source集合移动到destination集合

spop key

移除并返回集合中的一个随机元素

srandmember key [count]

返回集合中一个或多个成员

srem key member1

移除集合中一个或多个成员

sunion key1

返回所有给定集合的并集

sunionstore destination key1

所有给定集合并集存储在destination集合中

sscan key cursor [match patterm] [count count]

迭代集合中的元素

六,reids 有序集合(sorted set)

命令

作用

[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/ [email protected]:/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 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 所指定的节点添加到集群当中,让它成为集群的一份子。 CLUSTER FORGET 从集群中移除 node_id 指定的节点。 CLUSTER REPLICATE 将当前节点设置为 node_id 指定的节点的从节点。 CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 槽(slot) CLUSTER ADDSLOTS [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER DELSLOTS [slot ...] 移除一个或多个槽对当前节点的指派。 CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 CLUSTER SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中。 CLUSTER SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 键 (key) CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。 CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。CLUSTER GETKEYSINSLOT 返回 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/ git clone https://github.com/sripathikrishnan/redis-rdb-tools cd redis-rdb-tools python setup.py install

使用方法

cd /data/redis_cluster/redis_6380/ rdb -c memory redis_6380.rdb -f redis_6380.rdb.csv

分析rdb并导出

awk -F ',' '{print $4,$2,$3,$1}' redis_6380.rdb.csv |sort > 6380.txt 4.监控过期键

需求背景

因为开发重复提交,导致电商网站优惠卷过期时间失效

问题分析

如果一个键已经设置了过期时间,这时候在set这个键,过期时间就会取消

解决思路

如何在不影响机器性能的前提下批量获取需要监控键过期时间

1.Keys * 查出来匹配的键名。然后循环读取ttl时间

2.scan * 范围查询键名。然后循环读取ttl时间

Keys 重操作,会影响服务器性能,除非是不提供服务的从节点

Scan 负担小,但是需要去多次才能取完,需要写脚本

脚本内容:

cat 01get_key.sh #!/bin/bash key_num=0 key_name.log for line in $(cat key_list.txt) do while true do scan_num=$(redis-cli -h 192.168.47.75 -p 6380 SCAN ${key_num} match ${line}\* count 1000|awk 'NR==1{print $0}') key_name=$(redis-cli -h 192.168.47.75 -p 6380 SCAN ${key_num} match ${line}\* count 1000|awk 'NR>1{print $0}') echo ${key_name}|xargs -n 1 >> key_name.log ((key_num=scan_num)) if [ ${key_num} == 0 ] then break fi done done


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3