redis持久化及群集部署

项目目录

  • RDB持久化
  • 通过RDB文件恢复数据
  • AOF持久化
  • 根据AOF文件恢复数据
  • Redis安装部署
  • Redis数据库常用的命令
  • key 相关命令
  • 多数据库常用命令
  • Redis性能管理
  • 单节点Redis服务器带来的问题
  • Redis集群介绍
  • Redis集群的优势
  • Redis-Cluster数据分片(续)
  • Redis-Cluster数据分片
  • Redis-Cluster的主从复制模型
  • 案例拓扑图
  • Redis群集部署

RDB持久化

1、Redis的默认持久化方式
2、默认文件名dump.rdb
3、触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制
执行save或者是bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据

通过RDB文件恢复数据

1、将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
2、配置文件选项

vim /etc/redis/6379.conf
save 900 1 # 900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的Save项表示关闭RDB
save 300 10
save 60 10000
dbfilename dump.rdb #RDB文件名称
dir /var/lib/redis/6379 #RDB文件路径
rdbcompression yes #是否进行压缩

1、Redis的默认持久化方式
2、默认文件名dump.rdb
3、触发条件

在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
4、优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存

AOF持久化

1、Redis默认不开启
2、弥补RDB的不足(数据的不一致性)
3、采用日志的形式来记录每个写操作,并追加到文件中
4、Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

根据AOF文件恢复数据

将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
配置文件选项
vim /etc/redis/6379.conf、
appendonly yes #开启AOF持久化
appendfilename "appendonly.aof " #AOF文件名
#appendfsync always #always:同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec #everysec:默认推荐,每秒异步记录一次(默认值)
#appendfsync no #no: 不同步,交给操作系统决定如何同步
aof-load-truncated yes #忽略最后一条可能存在问题的指令

Redis安装部署

1、导入redis-5.0.7.tar.gz数据包
2、解压数据包
[root@redis ~]# tar zxvf redis-5.0.7.tar.gz
3、编译安装redis
[root@redis ~]# cd redis-5.0.7/
[root@redis redis-5.0.7]# make
[root@redis redis-5.0.7]# make PREFIX=/usr/local/redis install
4、优化路径
[root@redis redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/
5、设置Redis相关配置文件
[root@redis redis-5.0.7]# cd /root/redis-5.0.7/utils/
[root@redis utils]# ./install_server.sh
6、修改配置文件
[root@redis-1 ~]# vim /etc/redis/6379.conf
bind 127.0.0.1 -------》 bind 127.0.0.1 20.0.0.10

7、重启服务
[root@redis-1 ~]# /etc/init.d/redis_6379 restart
8、测试
s:指定服务器socket。c:指定并发连接数。n:指定请求数。
-d:以字节的形式指定SET/GET值的数据大小。k:1=keep alive 0=reconnect 。
-r: SET/GET/INCR 使用随机 key,SADD使用随机值。-P:通过管道传输请求。
-q:强制退出redis.仅显示query/sec值。–csv:以csV 格式输出。
-l:生成循环,永久执行测试。
-t:仅运行以逗号分隔的测试命令列表。
-I:Idle模式。仅打开N个idle连接并等待。

[root@redis-1 ~]# redis-benchmark -h 20.0.0.10 -p 6379 -c 100 -n 100000

[root@redis-1 ~]# redis-benchmark -h 20.0.0.10 -p 6379 -q -d 100

Redis数据库常用的命令

1、前面提到,Redis数据库采用key-value(键值对)。的数据存储形式。所使用的命令是
2、set 与get命令。
set:存放数据,基本的命令格式为set key value。
get:获取数据,基本的命令格式为get key。
例如在Redis的命令行模式下执行”set teacher zhanglong”,表示在当前数据库下存
放一个key 为teacher,value为zhanglong的数据,而执行“getteacher“命令即可查看
刚才存放的数据

key 相关命令

1、在Redis数据库中,与key 相关的命令主要包含以下几种
keys:使用keys命令可以取符合规则的键值列表,通常情况可以结合 * ? 等选项来使用
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k1 2
OK
127.0.0.1:6379> keys * #查看当前数据所有的key

  1. “myset:rand_int
  2. “k1”
  3. “mylist”
  4. “key:rand_int
  5. “counter:rand_int

127.0.0.1:6379> keys k* #查看当前数据库中以v开头的数据

  1. “k1”
  2. “key:rand_int

127.0.0.1:6379> keys k? #查看当前数据库中以v开头后面一个任意字符的数据

  1. “k1”

127.0.0.1:6379> set k23 abc #查看当前数据库中以v开头后面俩个任意字符的数据
OK
127.0.0.1:6379> keys k??

  1. “k23”

exists :判断键值是否存在,存在返回值为1,不存在返回值为0
127.0.0.1:6379> exists abc
(integer) 0
127.0.0.1:6379> exists k23
(integer) 1

127.0.0.1:6379> del k23 #删除当前数据库制定的key
(integer) 1

127.0.0.1:6379> type k1 #获取指定key对应value值的类型
string
127.0.0.1:6379> type k2
string

127.0.0.1:6379> rename k1 kk1 #对制定的key进行重名
OK

rename的命令格式除命令关键字不同外基本相同
renamenx 源key 目标key
renamenx命令进行重命名时,如果目标 key存在则不进行重命名

127.0.0.1:6379> keys *

  1. “k2”
  2. “myset:rand_int
  3. “kk1”
  4. “mylist”
  5. “key:rand_int
  6. “counter:rand_int
    127.0.0.1:6379> renamenx k2 kk1 #不能重名以存在的key名字
    (integer) 0

127.0.0.1:6379> dbsize #查看当前数据库中key的数目
(integer) 6

多数据库常用命令

1、多数据库间切换
Redis 支持多数据库,Redis在没有任何改动的情况下默认包含16 个数据库,数据库名
称是用数字0-15来依次命名的。使用Select命令可以进行Redis 的多数据库之间的切换,
命令格式为selectindex,其中 index表示数据库的序号。而使用redis-cli连接Redis数
据库后,默认使用的是序号为0的数据库。
如下所示,使用select命令切换数据库后,会在前端的提示符中显示当前所在的数据
库序号如“127.0.0.1:6379[10]>”表示当前使用的是序号为10的数据库;
若当前使用的数
据库是序号为0的数据库,提示符中则不显示序号,如“127.0.0.1:6379>表示当前使用
的是序号为0的数据库。

127.0.0.1:6379> select 10 切换到10这个数据库
OK

2、多数据库间移动数据
Redis的多数据库在一定程度上是相对独立的,例如在数据库О上面存放的k1的数据,
在其它的1-15 的数据库上是无法查看到的。

20.0.0.10:6379> set ky6 100
OK
20.0.0.10:6379> get ky6
“100”
20.0.0.10:6379> select 1
OK
20.0.0.10:6379[1]> get ky6
(nil)

Redis数据库提供了一个move 的命令,可以进行多数据库的数据移动。命令的基本语
法格式为”move key dbindex“。其中“key“表示当前数据库的目标键,“dbindex“表示
目标数据库的序号。

20.0.0.10:6379[1]> select 0
OK
20.0.0.10:6379> get ky6
“100”
20.0.0.10:6379> move ky6 1 #将ky6键移动到1号数据库里
(integer) 1
20.0.0.10:6379> select 1
OK
20.0.0.10:6379[1]> get ky6
“100”

3、清除数据库内数据
Redis数据库的整库数据删除主要分为两个部分:清空当前数据库数据,使用FLUSHDB
命令实现;清空所有数据库的数据,便用FLUSHALL命令头现。但疋,双据清空操作比较危
险,生产环境下一般不建议使用。

20.0.0.10:6379> flushdb
OK

Redis性能管理

内存碎片率
1、操系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出
2、内存碎片是由操作系统低效的分配/回收物理内存导致的不连续的物理内存分配
3、跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换—o

内存使用率
1、redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
2、避免内存交换
针对缓存数据大小选择
尽可能的使用Hash数据结构
设置key的过期时间

回收key
1、保证合理分配redis有限的内存资源
2、当达到设置的最大阀值时,需选择一种key的回收策略
默认情况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
volatile-Iru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-Iru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据

单节点Redis服务器带来的问题

单点故障,服务不可用
无法处理大量的并发数据请求
数据丢失—大灾难
解决方法
搭建Redis集群

Redis集群介绍

1、Redis集群是一个提供在多个Redis间节点间共享数据的程序集
2、Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
3、Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

Redis集群的优势

1、自动分割数据到不同的节点上
2、整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis集群的实现方法
有客户端分片
代理分片
服务器端分片

Redis-Cluster数据分片(续)

1、以3个节点组成的集群为例
节点A包含0到5500号哈希槽
节点B包含5501到11000号哈希槽
节点C包含11001到16384号哈希槽
2、支持添加或者删除节点
添加删除节点无需停止服务
例如:
如果想新添加个节点D,需要移动节点A,B,C中的部分槽到D上
如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除

Redis-Cluster数据分片

1、Redis集群没有使用一致性hash,而是引入了哈希槽概念
2、Redis集群有16384个哈希槽
3、每个key通过CRC16校验后对16384取模来决定放置槽
4、集群的每个节点负责一部分哈希槽

Redis-Cluster的主从复制模型

1、集群中具有A,B,.u二公6电的而不可用群就会因缺少5501-11000这个范围的槽而不可用
2、为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,
任节B人群便会选举B1为新的主节点继续服务
3、当B和B1都失败后,集群将不可用

案例拓扑图

redis持久化及群集部署_第1张图片

Redis群集部署

一、使用准备环境
redis持久化及群集部署_第2张图片六台redis服务器都按如下操作
1、导入redis-5.0.7.tar.gz数据包
2、解压数据包

[root@redis-1 ~]# tar zxvf redis-5.0.7.tar.gz

3、编译安装redis

[root@redis -1~]# cd redis-5.0.7/
[root@redis-1 redis-5.0.7]# make
[root@redis-1 redis-5.0.7]# make PREFIX=/usr/local/redis install

4、优化路径

[root@redis-1 redis-5.0.7]# ln  -s  /usr/local/redis/bin/* /usr/local/bin/

5、设置Redis相关配置文件

[root@redis-1 redis-5.0.7]# cd /root/redis-5.0.7/utils/
[root@redis-1 utils]# ./install_server.sh

6、修改配置文件

[root@redis-1 ~]# vim /etc/redis/6379.conf
bind 127.0.0.1        -------》  bind  20.0.0.10			每台服务器填自己的IP地址
cluster-enabled yes			去掉#
cluster-config-file nodes-6379.conf		去掉#
cluster-node-timeout 15000			去掉#
cluster-require-full-coverage no		去掉#  yes改为no

7、重启服务

[root@redis-1 ~]# /etc/init.d/redis_6379 restart

二、在redis服务器1上设置群集服务

导入redis-3.2.0.gem数据包
[root@redis-1 ~]# gem  install redis-3.2.0.gem
[root@redis-1 ~]# yum -y install ruby rubygems
[root@server1 ~]#  redis-cli --cluster create --cluster-replicas 1  20.0.0.10:6379 20.0.0.20:6379 20.0.0.30:6379 20.0.0.40:6379 20.0.0.50:6379 20.0.0.60:6379
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 20.0.0.50:6379 to 20.0.0.10:6379
Adding replica 20.0.0.60:6379 to 20.0.0.20:6379
Adding replica 20.0.0.40:6379 to 20.0.0.30:6379
M: bdd19bfe6a92e3b375fc70e6addb0be6862605e7 20.0.0.10:6379
   slots:[0-5460] (5461 slots) master
M: ebbc8842152e7fe0e7da8328186c203ad360ce29 20.0.0.20:6379
   slots:[5461-10922] (5462 slots) master
M: 195caf99dc0a51b436714bf3488f56ac391786f4 20.0.0.30:6379
   slots:[10923-16383] (5461 slots) master
S: 730798bb55ec3167c3e0733c8838430116983e81 20.0.0.40:6379
   replicates 195caf99dc0a51b436714bf3488f56ac391786f4
S: 3264738cccfafc8cb5c9e6d456361eddd5978158 20.0.0.50:6379
   replicates bdd19bfe6a92e3b375fc70e6addb0be6862605e7
S: 8e947aa262eeb619d9415c3591662c6032b9eac7 20.0.0.60:6379
   replicates ebbc8842152e7fe0e7da8328186c203ad360ce29
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 20.0.0.10:6379)
M: bdd19bfe6a92e3b375fc70e6addb0be6862605e7 20.0.0.10:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 730798bb55ec3167c3e0733c8838430116983e81 20.0.0.40:6379
   slots: (0 slots) slave
   replicates 195caf99dc0a51b436714bf3488f56ac391786f4
M: ebbc8842152e7fe0e7da8328186c203ad360ce29 20.0.0.20:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 3264738cccfafc8cb5c9e6d456361eddd5978158 20.0.0.50:6379
   slots: (0 slots) slave
   replicates bdd19bfe6a92e3b375fc70e6addb0be6862605e7
M: 195caf99dc0a51b436714bf3488f56ac391786f4 20.0.0.30:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 8e947aa262eeb619d9415c3591662c6032b9eac7 20.0.0.60:6379
   slots: (0 slots) slave
   replicates ebbc8842152e7fe0e7da8328186c203ad360ce29
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


显示登录成功,由上面信息可见20.0.0.2020.0.0.50的主服务器
使用这个关系我们来测试
[root@redis-2 ~]# redis-cli -h 20.0.0.20 -p 6379 -c
20.0.0.20:6379> set a1 100
OK
20.0.0.20:6379> get a1
"100"
[root@redis-5 ~]# redis-cli -h 20.0.0.50 -p 6379 -c
20.0.0.50:6379> get a1
-> Redirected to slot [7785] located at 20.0.0.20:6379
"100"
20.0.0.20:6379> set b1 200
-> Redirected to slot [2874] located at 20.0.0.10:6379
OK

[root@redis-2 ~]# redis-cli -h 20.0.0.20 -p 6379 -c
20.0.0.20:6379> get b1
-> Redirected to slot [2874] located at 20.0.0.10:6379
"200"


[root@server1 ~]# redis-cli -h 20.0.0.10 -p 6379 -c
20.0.0.10:6379> get b1
"200"
20.0.0.10:6379> get a1
-> Redirected to slot [7785] located at 20.0.0.20:6379
"100"
[root@server1 ~]# redis-cli -h 20.0.0.10 -p 6379 -c
20.0.0.10:6379> cluster info		#查看集群状态
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1453
cluster_stats_messages_pong_sent:1483
cluster_stats_messages_sent:2936
cluster_stats_messages_ping_received:1478
cluster_stats_messages_pong_received:1453
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2936

20.0.0.10:6379> cluster nodes		#查看节点状态
730798bb55ec3167c3e0733c8838430116983e81 20.0.0.40:6379@16379 slave 195caf99dc0a51b436714bf3488f56ac391786f4 0 1605015313067 4 connected
ebbc8842152e7fe0e7da8328186c203ad360ce29 20.0.0.20:6379@16379 master - 0 1605015313000 2 connected 5461-10922
3264738cccfafc8cb5c9e6d456361eddd5978158 20.0.0.50:6379@16379 slave bdd19bfe6a92e3b375fc70e6addb0be6862605e7 0 1605015314084 5 connected
195caf99dc0a51b436714bf3488f56ac391786f4 20.0.0.30:6379@16379 master - 0 1605015315101 3 connected 10923-16383
8e947aa262eeb619d9415c3591662c6032b9eac7 20.0.0.60:6379@16379 slave ebbc8842152e7fe0e7da8328186c203ad360ce29 0 1605015313000 6 connected
bdd19bfe6a92e3b375fc70e6addb0be6862605e7 20.0.0.10:6379@16379 myself,master - 0 1605015312000 1 connected 0-5460

你可能感兴趣的:(redis,服务器,运维)