Redis三种集群模式部署方式以及数据同步问题

Redis总结

  • 一:数据类型基本操作
    • 1.0 key基本操作
    • 1.1String 类型
    • 1.2 List类型
    • 1.3 Hash类型
    • 1.4 Set集合类型
    • 1.5 Sorted Set 有序集合
  • 2 持久化方式,以及数据备份和恢复
    • 2.1 RDB 持久化
    • 2.2 AOF持久化
    • 2.3 两者优缺点
      • 2.3.1 RDB 存在的优势及缺点
      • 2.3.2 RDB存在的优势和缺点
  • 2 安装部署单机版
    • 2.1 下载
    • 2.2 安装部署
    • 2.3 修改配置文件
    • 2.4 启动服务
  • 3 主从模式搭建
    • 3.1 搭建前准备
    • 3.2 master配置
    • 3.3 slave配置
  • 4 哨兵模式
    • 4.1 简单介绍
    • 4.2 搭建过程,三节点
      • 4.2.1 sentinel配置文件
    • 4.3 状态查询
    • 4.4 spring boot连接sentinel
  • 5 集群模式
    • 5.1 介绍
    • 5.2 如何判断集群中的节点是否宕机
    • 5.3 集群宕机的必要条件
    • 5.4 集群搭建方式
    • 5.5redis集群主从节点分离部署
    • 5.6 集群中基本查看指令
    • 5.7集群中现实的问题
      • 5.7.1集群数据全部清除问题
      • 5.7.2 cluster -node-timeout配置的设置
    • 5.8 redis-shake数据同步

一:数据类型基本操作

1.0 key基本操作

  • key * 返回所有key
  • randomkey 返回随机key
  • type key 返回key的存储的类型
  • exists 判断某个可以是否存在
  • del key 删除key
  • rename key newkey 改名
  • move key 1 将key移动到1数据库
  • ttl key 查询key的生命周期(秒)
  • expire key 正整数,设置key的生命周期以秒为单位
  • pexpire key 正整数,设置key的生命周期以毫秒为单位
  • pttl key 查询可以的生命周期(毫秒)
  • perisist key 把指定key设置为永久有效

1.1String 类型

  • Set key01 value:创建key
  • get key01 获取key的值
  • mset key01 value01 key02 value02 一次设置多个key和value
  • mget key01 key02 获取多个key的值
  • append key01 value 在key01的值后面增加value
  • incr key01 自增,返回新值,需要int
  • strlen key01 获取key的长度
  • getrange key start stop 获取字符串从start 到stop范围内的值

1.2 List类型

  • lpush key value 把值插入到链表的头部
  • rpush key value 把值插入到链表的尾部
  • lpop key 返回并删除链表头部元素
  • rpop key 返回并删除链表尾部元素
  • lrange key start stop 返回[start stop] 范围内的元素
  • lrem key count value 从链表中删除value值,删除cout的绝对值个value
    count>0表示从头删除,<0表示从尾部开始删除,count =0表示删除完
    eg: lrem list_key 1 value1
  • ltrim key start stop :剪切key对应的连接,切[start stop]一段,重新赋予key
  • lindex key index 返回index索引上的值
  • llen key 计算list的元素的个数
  • linsert key after|before search value :在key链表中寻找值为search的,并在其前|后添加value
  • rpoplpush source dest :把source的末尾拿出,放在dest头部,并返回单元值
    执行后的结果
    source中尾部移除,dest中头部多了一个值。

1.3 Hash类型

hash是一个String类型的field和value的映射表,它的添加、删除操作都是O(1),hash特别适合用于存储对象

  • hset myhash field value :设置myhash 的filed为value
    eg:hset myhash name wps
    hset myhash id 111
    hset myhash address 新华社
    • hmset myhash name wps id 111 address xxx同时设置多个filed
    • hget myhash filed 获得filed的值
    • hmget myhash filed1 filed2 获取多个filed的值
    • hincrby myhash filed 1 在指定的field下加上给定的值,需要时int
    • hexists myhash filed 测试指定的filed是否存在
    • hlen myhash 返回hash的filed的数量
    • hdel myhash field 删除hash的filed
    • hkeys myhash 返回hash的所有的field
    • hvals myhash 返回hash的所有的value
    • hgetall myhash 获取某个hash中全部的field和valuse

1.4 Set集合类型

特点:无序性。确定性。唯一性

  • sadd key value1 value2 往集合里面添加元素
  • smembers key 获取集合所有的元素
  • srem key value 删除集合某个元素
  • spop key 返回并删除集合中1个随机元素(可以做抽奖,不会重复抽到某人)
  • srandmember key 随机取一个元素
  • sismember key value 判断集合是否有某个值
  • scard key 返回集合元素的个数
  • smove source dest value 把source的value的值一道dest集合中
  • sinter key1 key2 key3 求key1 和key2 key 3的交集
  • sunion key1 key2 求key1和key2 的交集
  • sdiff key1 key2 求key1 和key2 的差集
  • sinterstore res key1 key2 求key1 和key2 的交集并存在res中

1.5 Sorted Set 有序集合

概念:它在set的基础上增加了一个顺序属性,这一属性在添加元素的时候可以指定,每次指定后,zset会自动按新的值调整顺序
可以理解为两列mysql表,一列存储value 一列存储顺序,操作中key理解为zset的名字

  • zadd key score1 value1 添加元素
  • zrange key start stop [withscore] 把集合排序后,返回名次【start stop】的元素,默认是升序排列, withscres是吧score也打印出来

2 持久化方式,以及数据备份和恢复

Redis的所有数据都保存在内存中,然后不定期的通过异步方式保存到磁盘中(半持久化模式);也可以把每一次数据变化都写入到append only file (aof)里面(全持久化模式)
由于Redis的数据存储在内存中,如果没有配置持久化,redis重启后,数据就会丢失。如果开启了持久化,重启后数据会依然存在,Redis支持两种持久化方式

2.1 RDB 持久化

将Redis内存中的数据在指定的时间间隔内将数据集快照写入磁盘,默认的持久化方式,
触发方式分为手动触发和自动触发

  • 手动触发
    save
  • 自动触发
    在配置文件中添加
    save 900 1 900秒内如果超过1个key被修改,则发起快照保存
    save 300 10 300秒内如果有超过10key被修改,则发起快照保存
    save 60 100000
    测试:
    如果没有数据没有保存到rdb文件中,只存在于内存中,redis重启后这些数据将会丢失,
    如果将数据保存到了rdb中,redis重启后这部分数据仍然存在

2.2 AOF持久化

将Redis的操作日志以追加的方式写入文件
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录

2.3 两者优缺点

2.3.1 RDB 存在的优势及缺点

  • 一旦采用该方式,redis的数据库将只包含一个文件,这对于文件备份是非常好的
  • 对于灾难恢复而言,RDB是非常不错的选择,
  • 如果数据集偏大,RDB的启动效率会比AOF高

缺点:

  • 数据安全性能低,(RDB 是间隔一段时间进行持久化,如果持久化之间redis发生故障,会造成数据丢丢失)
  • 由于RDB是通过fork出子进程来协助完成数据持久化,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

2.3.2 RDB存在的优势和缺点

  • 数据安全性更高,AOF持久化可以配置appendfsync属性(每秒同步、每修改同步、不同步),其中always,每进行一次命令操作就记录到AOF文件中一次,
  • 通过append模式写文件,及时中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题
  • 如果数据日志过大,Redis可以开启rewrite机制,即Redis以aooend模式不断的将修改数据写入老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此时间内修改的内容。因此在进行rewriter切换时可以更好的保证数据安全性
  • 可以通过日志文件,完成数据的重建

缺点:

  • 对于相同数量的数据集而言,AOF文件通常要大于RDB文件,RDB在恢复数据集时的速度要比AOF快
  • 更具同步策略的不同,AOF在运行效率上慢于RDB。

两者之间选择
AOF:牺牲性能、提高缓存一致性
RDB: 不启用备份来换取更高的性能,手动执行save,再做 备份。

2 安装部署单机版

2.1 下载

安装教程:https://blog.csdn.net/usuallyuser/article/details/84890306
稳定版本5.0.7下载地址 http://download.redis.io/releases/

2.2 安装部署

  • 解压到指定目录
  • 在/usr/local/redis下创建bin etc var
    bin 中存放redis-server redis-cli 等
    etc 存放redis.conf
    var 存放备份文件

2.3 修改配置文件

参看https://blog.csdn.net/suprezheng/article/details/90679790

  • bind
    修改为 0.0.0.0 允许外网连接
  • daemonize yes 允许后台运行

2.4 启动服务

在bin目录下
./redis-server …/etc/redis.conf

3 主从模式搭建

3.1 搭建前准备

  • 首先在每一个节点都安装redis单机版
  • 修改master和slave配置

3.2 master配置

master:10.121.22.10
slave:10.121.22.11

bind 0.0.0.0
port 6379
logfile /usr/local/redis/log/redis.log
dbfilename dump.rdb
daemonize yes
rdbcompression yes

3.3 slave配置

bind 0.0.0.0
port 6379
logfile /usr/local/redis/log/redis.log
dbfilename dump.rdb
daemonize yes
rdbcompression yes
slaveof 10.121.22.10 6379

启动各个节点的redis服务,即可完成主从模式的搭建

4 哨兵模式

4.1 简单介绍

sentinel是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。
哨兵模式中,只有在哨兵集群可用的情况下,这时候 启动服务并且使用redis服务是可以的,
如果应用服务已启动,在使用过程中,sentienl集群挂了,但redis的主从模式正常,这时候仍然可以使用redis服务,但如果此时将应用服务重启,则不能通过sentinel来访问redis服务。

4.2 搭建过程,三节点

先搭建一个一主二从的主从模式,配置文件的和第三节相同

4.2.1 sentinel配置文件

bind 0.0.0.0
daeminize yes
logfir /usr/local/redis/log/sentinel.log
dir /usr/local/redis/var
sentinel minitor mymaster 10.121.89.202 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs master 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel suth-pass mymaster 123123
protected-mode yes
三个文件都是这样配置
启动顺序,先启动redis服务。然后在启动sentinel服务
其中参数的解释

  • sentinel monitor master-name ip redis-port quorum
    quorum:是一个数字,指当有多少个sentinel认为一个master失效时,master才算真正的失效

  • sentinel auth-pass [master-name] [passwd]
    设置连接master和slave的密码。注意sentinel不能分别却分master和slave设置不同的密码,因此,master和slave的密码应相同

  • sentienl down0ager-milliseconds master-name milliseconds
    这个配置指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的

  • sentinel parallel-sysns master-name numslaves
    这个配置项指定了在发生failover主备切换是最多可以有多少slave同时对新的master进行同步,数字越小,完成故障转移所需的时间越长,
    数字越大,就以为这越多的slave因为主从同步而不可用个,可以通过将这个值设为1来保证每次至于一个slave出于不能处理命令请求的状态。

4.3 状态查询

./redis-cli -p 26379进入sentinel控制台,然后执行info,可以查看信息

4.4 spring boot连接sentinel

pop.xml

		
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-data-redisartifactId>
		dependency>
		<dependency>
			<groupId>org.apache.commonsgroupId>
			<artifactId>commons-pool2artifactId>
		dependency>

application.yaml

spring:
  redis:
    password: 123123 #切记在添加密码时,时spring.redis.password而不是spring.redis.sentinel.password,否则回报 password no set
    sentinel:
      master: mymaster
      nodes: 10.121.89.202:26379,10.121.89.203:26379,10.121.59.204:26379
    lettuce:
      pool:
        max-idle: 10
        max-active: 20
        min-idle: 5
        max-wait: 10000ms

5 集群模式

5.1 介绍

负载均衡,高可用,分布式集群模式,最少三个节点,最好对每一个节点添加从节点,(三主三从),没有从的话,数据丢失则找不到,每个节点存储的数据都不一样。
Redis三种集群模式部署方式以及数据同步问题_第1张图片
去中心化,每两个节点之间都是相互ping通,每个节点存储的数据都不同,采用分片的形式存储。
Redis三种集群模式部署方式以及数据同步问题_第2张图片

最简单的集群模式,三节点,互为主节点,没有从节点。没有副本数

5.2 如何判断集群中的节点是否宕机

集群中每个节点都会保存集群中其他节点的ip信息,如果超过一半的节点ping某一个主节点时,ping不通,则认为该主节点宕机,然后再启用该主节点的备节点

5.3 集群宕机的必要条件

  • 集群中某个主节点和所有的从节点宕机,则集群宕机
  • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
  • 任意主节点宕机,且没有从节点,或者从节点宕机,则集群宕机

考虑到上述的条件,在部署时,应该讲主从部署到不同的节点,分离部署,提高集群的可用性,不过不分离部署,一个节点宕机则整个集群宕机。

5.4 集群搭建方式

https://www.cnblogs.com/fousor/p/10598400.html

  • 三主,无从节点,需要密码登录访问

  • 新建redis-cluster文件,添加并新建redis.conf配置文件,配置文件模板为单机部署时模板

  • 修改配置文件
    三个配置文件同样的操作
    bind 0.0.0.0
    port 6379
    logfile /usr/local/redis/log/redis.log
    dbfilename dump.rdb
    dir “/usr/local/redis/var”
    daemonize yes
    rdbcompression yes
    requirepass 123123
    cluster-enabled yes
    cluster-config-file nodes-1.conf # 创建集群后生成的配置文件,每个节点对应的配置文件名应不相同
    cluster-node-timeout 15000 # 默认15s,集群间连接超时时间

  • 启动redis服务,并制定上述的配置文件,redis-server /redis-cluster/redis.conf

  • 验证三个节点是否行程集群
    在每一个节点的安装主机中,执行./redis-cli -a 123123进入redis服务
    然后执行 cluster info、查看当前的redis集群状态,现在的状态应该是fail

  • 使用redis-cli 创建集群
    ./redis-cli --cluster create 10.121.89.202:6379 10.121.89.203:6379 10.121.89.204:6379 -a 123123即可完成集群的搭建。
    上述指令创建的是三个节点,没有从节点。

5.5redis集群主从节点分离部署

在上述配置文件中,增加masterauth 123123
端口号每个主机上保持不一样
规划:
10.121.89.201:6001(主)
10.121.89.201:6002(从----203:6001)
10.121.89.202:6001(主)
10.121.89.202:6002(从----201:6001)
10.121.89.203:6001(主)
10.121.89.203:6002(从----202:6001)
主要在于创建集群命令
./redis-cli -a 123123 --cluster create --cluster-replicas 1 10.121.89.201:6001 10.121.89.202:6001 10.121.89.203:6001 10.121.89.202:6002 10.121.89.203:6002 10.121.89.201:6002
交叉写后面的ip和端口号

5.6 集群中基本查看指令

  • 查看集群中各个节点信息,./redis-cli -a 123123 cluster nodes
  • 查看当前集群状态,./redis-cli -a 123123 cluster info

5.7集群中现实的问题

5.7.1集群数据全部清除问题

#!/bin/sh

NODES=`/usr/local/redis/bin/redis-cli -c -p $2 -h $1 -a 63stag  cluster nodes | cut -f2 -d' '`

IFS="
"

for node in $NODES; do
        echo Flushing node $node...
        /usr/local/redis/bin/redis-cli -h ${node%:*} -p ${node##*:} -c  -a 63stag flushall
done

sh clear_database.sh 10.121.55.20 6379

5.7.2 cluster -node-timeout配置的设置

cluster-node-timeout=30000,集群节点超时时间调整为30000,30s,默认为15s,确保足够长的超时时间,避免执行删除数据命令时间过长导致集群发生主从切换

5.8 redis-shake数据同步

使用阿里云的开源组件redis-shake将redis集群中的数据同步另外一个集群、单机中
步骤
1:下载redis-shake v2.0.2tar.gz
安装在集群中主节点的主机中,解压压缩包,并编辑redis-shake.conf
2:修改配置文件
(1):源Redis集群信息

  • source.type:cluster
  • source.address:redis的集群中所有的master主机地址eg:

10.121.89.201:6001;10.121.89.202:6001;10.121.89.203:6001
最后没有“分号”。

  • source.password.raw:密码
  • sorce.rdb.input:输入的rdb的文件路径

(2)目标集群信息

  • target.type:standalone
  • target.address:
  • target.password
  • target.rdb.output:dump.rdb

(3)执行数据同步操作
./redis-shake.linux -type=sync -conf=/redis-shake.conf

你可能感兴趣的:(Redis,redis,缓存)