Redis 高可用及分片集群,说了你也不懂

Stella981
• 阅读 620

Redis 简介

Memcached:
    优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash
多核结构、多线程读写性能高。
    缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
Redis:
    优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
    缺点:多线程读写较Memcached慢

Redis 安装和基本配置

1.安装教程

下载:
wget http://download.redis.io/releases/redis-3.2.10.tar.gz
解压:
tar xzf redis-3.2.10.tar.gz
mv redis-3.2.10 redis
安装:
cd redis
make
启动:
src/redis-server &

2.配置文件 vi /etc/redis.conf

是否后台运行:
daemonize  yes
默认端口:
port 6379
日志文件位置
logfile /var/log/redis.log
RDB持久化数据文件:
dbfilename dump.rdb
持久化文件的位置:
dir /data/redis

3.安全配置

Bind
    指定IP进行监听 bind 10.0.0.129(本地) 127.0.0.1
禁止protected-mode
    protected-mode yes/no (保护模式,是否只允许本地访问)
增加requirepass  {password}
    requirepass root

4.配置完成后需要重启Redis

127.0.0.1:6379> shutdown
/application/redis/src/redis-server /etc/redis.conf 
/application/redis/src/redis-cli  -h 10.0.0.129 -a 123456 -p 6379

5.在线修改配置

获取当前配置
CONFIG GET *
变更运行配置
CONFIG SET requirepass 123456

Redis 持久化

RDB持久化

基于时间点快照的方式,复用方式进行数据持久化
比较常用的方式,效率较高,安全性相对较低

在 /etc/redis.conf中添加以下内容
dbfilename dump.rdb
dir /data/redis
save 900 1
save 300 10
save 60 10000

分别表示:
    rdb文件名
    rdb的放置路径
    900秒(15分钟)内有1个更改
    300秒(5分钟)内有10个更改
    60秒内有10000个更改
    当达到以上定义的配置时间时,就将内存数据持久化到磁盘。

AOF持久化

只追加的方式记录所有redis中执行过的修改类命令
效率相对较低,安全性较高

appendonly yes
appendfsync always或者everysec或者no
分别表示:
    是否打开aof日志功能
    每1个命令,都立即同步到aof 

Redis 开发/管理实战

数据类型

String/Hash/List/Set/Sorted set
增删改查操作:自己查文档

全局key操作

KEYS *                         查看KEY支持通配符
DEL                            删除给定的一个或多个key
EXISTS                         检查是否存在
RENAME                         变更KEY名
TYPE                        返回键所存储值的类型
EXPIRE\ PEXPIRE             以秒\毫秒设定生存时间
TTL\ PTTL                     以秒\毫秒为单位返回生存时间
PERSIST                     取消生存实现设置

消息模式

1.队列模式(queuing)
2.发布-订阅模式(publish-subscribe)
PUBLISH channel msg
    将信息 message 发送到指定的频道 channel 
SUBSCRIBE channel [channel ...]
    订阅频道,可以同时订阅多个频道
PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所    有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有    以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
PUNSUBSCRIBE [pattern [pattern ...]]
    退订指定的规则, 如果没有参数则会退订所有规则
PUBSUB sub command [argument [argument ...]]
    查看订阅与发布系统状态
注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。

事务

DISCARD 
取消事务,放弃执行事务块内的所有命令。
EXEC 
执行所有事务块内的命令。
MULTI 
标记一个事务块的开始。
UNWATCH 
取消 WATCH 命令对所有 key 的监视。
WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
---------------------
具体的命令----  watch命令
例: 
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
//现在已经对ticket进行了监控,另外一个窗口将ticket改动了
另一个窗口:> decr ticket    
redis 127.0.0.1:6379> exec
(nil)   // 返回nil,说明监视的ticket已经改动了,事务就取消了.队列就不执行了。
redis 127.0.0.1:6379>mget ticket money
"0"
"200"

watch key1 key2  ... keyN
作用:监听key1 key2..keyN有没有变化,如果任意一个有变, 则事务取消
unwatch 
作用: 取消所有watch监听

服务器管理命令

Info
Clinet list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置统计
CONFIG GET/SET 动态修改
Dbsize
FLUSHALL 清空所有数据 
select 1
FLUSHDB 清空当前库
MONITOR 监控实时指令

SHUTDOWN 关闭服务器
save将当前数据保存
SLAVEOF host port 主从配置
SLAVEOF NO ONE
SYNC 主从同步
ROLE返回主从角色

Redis 高可用及集群技术

主从复制

1.环境配置

准备两个或两个以上redis实例

    mkdir -p /data/6380/
    mkdir -p /data/6381/
    mkdir -p /data/6382/
-------------
/data/6380/redis.conf
/data/6381/redis.conf
/data/6382/redis.conf

三套配置文件示例:
vim /data/6380/redis.conf
----------------
bind 127.0.0.1 10.0.0.200
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
slowlog-log-slower-than 10000
slowlog-max-len 128
protected-mode no

6381/6382文件配置同上

启动:
/application/redis/src/redis-server   /data/6380/redis.conf
/application/redis/src/redis-server  /data/6381/redis.conf
/application/redis/src/redis-server /data/6382/redis.conf


查看启动状态
netstat -lnp|grep 638

主节点:6380
从节点:6381、6382

开启主从:
6381/6382命令行:

redis-cli -p 6381
SLAVEOF 127.0.0.1 6380


redis-cli -p 6382
SLAVEOF 127.0.0.1 6380


主从复制状态监控:info replication

主从切换:slaveof no one

2.配置sentinel 哨兵

mkdir /data/26380 
cp /application/redis/src/redis-sentinel /data/26380
cd /data/26380
 ./redis-sentinel ./sentinel.conf
vim sentinel.conf

port 26380
dir "/tmp"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 0

启动
 ./redis-sentinel ./sentinel.conf

3.python连接 redis-sentinel集群

1、安装python3.5
 tar xf Python-3.5.2.tar.xz 

cd Python-3.5.2

./configure

make && make install

2、安装redis的python驱动
unzip redis-py-master.zip
cd redis-py-master
python3 setup.py install


3、python3连接redis  sentinel集群

连接之前必须先启动哨兵 切记切记
cd /data/26380
 ./redis-sentinel ./sentinel.conf

python3
>>>from redis.sentinel import Sentinel  
>>>sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)  
>>>sentinel.discover_master('mymaster')  
>>>sentinel.discover_slaves('mymaster')  
>>>master = sentinel.master_for('mymaster', socket_timeout=0.1)  
>>>slave = sentinel.slave_for('mymaster', socket_timeout=0.1)  
>>>master.set('foo', 'bar')  
>>>slave.get('foo')  

4.redis cluser集群组件安装

EPEL源安装ruby支持
yum install ruby rubygems -y
使用国内源
gem sources -a http://mirrors.aliyun.com/rubygems/ 
gem sources  --remove http://rubygems.org/
gem sources -l
gem install redis -v 3.3.3


--------------------
0、集群节点准备,创建节点目录:
mkdir -p /data/7000
mkdir -p /data/7001
mkdir -p /data/7002
mkdir -p /data/7003
mkdir -p /data/7004
mkdir -p /data/7005


1、配置文件添加:
-------------------------
vim /data/7000/redis.conf

port 7000
daemonize yes
pidfile /data/7000/redis.pid
logfile "/var/log/redis7000.log"
dbfilename dump.rdb
dir /data/7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

7001/7002/7003/7004/7005节点配置同上
-------------------------------

2、启动所有节点
/application/redis/src/redis-server /data/7000/redis.conf
/application/redis/src/redis-server /data/7001/redis.conf
/application/redis/src/redis-server /data/7002/redis.conf
/application/redis/src/redis-server /data/7003/redis.conf
/application/redis/src/redis-server /data/7004/redis.conf
/application/redis/src/redis-server /data/7005/redis.conf


ps -ef |grep 700
-------------------------

3、集群创建

/application/redis/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
---------------------
4、集群状态查看

/application/redis/src/redis-cli -p 7000 cluster nodes | grep master
/application/redis/src/redis-cli -p 7000 cluster nodes | grep slave

Redis 多API开发实践

Python 连接 redis cluster

(1) redis-py并没有提供redis-cluster的支持,去github找了一下,有个叫redis-py-cluster的源码,
但是和redis-py不是一个作者,地址为:https://github.com/Grokzen/redis-py-cluster
watch,star,fork还算可以。
(2) 安装

unzip redis-py-cluster-unstable.zip
cd redis-py-cluster-unstable
python3 setup.py install

(3) 使用
>>> from rediscluster import StrictRedisCluster  
>>> startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]  
>>> # Note: decode_responses must be set to True when used with python3  
>>> rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
  
>>> rc.set("foo", "bar")  
>>> print(rc.get("foo"))
点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
3年前
CentOS 7下 部署Redis
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用、可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点2)当集群中的某一个节点故障时,redis还可以继续处理客户端的请求一个Redis集群包含16384个哈希槽(hashslot
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis(1.7)Redis高可用架构(理论篇)
【0】常用架构种类  (0.1)单机Redis  (0.2)单纯的Redis主从复制  (0.3)哨兵SentinelRedis主从复制集群(实现高可用自动故障转移)  (0.4)RedisCluster分布式数据库集群  (0.5)第三方中间件Redis主从复制【1】Redis主从复制
Stella981 Stella981
3年前
Redis5.0:简单的集群模式——主从模式详解
主从模式主从模式是最简单的集群模式,其实就是复制基本只能解决读写分离问题,主机服务器一旦宕机基本完蛋,不具备高可用。基本上redis的性能瓶颈主要在于网络IO和内存主频上面,单机版Redis在不考虑高可用的情况下基本满足80%的项目需要,因为单机版Redis可以实现10W/S的请求,除非缓存KV值过大,通过读写分离缓存网卡的压
Stella981 Stella981
3年前
Redis、MPP、kafka 、MongDB简介
Redis:间值数据库,适合缓存用户Session会话与经常需要查的数据1.Redis集群,为什么在项目中使用集群 1.持久化,持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要左右是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失;2、复制:主从复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用
Stella981 Stella981
3年前
Redis的简介
Redis简介Redis是一个高性能的keyvalue数据库。支持复杂的数据结构,支持持久化,支持主从集群,支持高可用,支持较大的value存储...Redis是一个nosql,非关系型数据库。Redis与其他keyvalue缓存产品有以下几个特点:Reids是基于内存
图解Redis和Zookeeper分布式锁 | 京东云技术团队
使用Redis还是Zookeeper来实现分布式锁,最终还是要基于业务来决定,可以参考以下两种情况:(1)如果业务并发量很大,Redis分布式锁高效的读写性能更能支持高并发(2)如果业务要求锁的强一致性,那么使用Zookeeper可能是更好的选择
服务端应用多级缓存架构方案 | 京东云技术团队
20w的QPS的场景下,服务端架构应如何设计?常规解决方案可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。