redis集群

1. Redis功能介绍

1.1 数据类型丰富
1.2 支持持久化
1.3 多种内存分配及回收策略
1.4 支持弱事务
1.5 消息队列、消息订阅
1.6 支持高可用
1.7 支持分布式分片集群
1.8 缓存穿透\雪崩
1.9 Redis API

Redis: 优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高 ;
缺点:单机情况下,读写性能较慢。

2.Redis安装部署:

(1)下载:

[root@db01 /data]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz

(2)解压:

[root@db01 /data]# tar xzf redis-3.2.12.tar.gz
[root@db01 /data]# mv redis-3.2.12 redis

(3)安装:

[root@db01 /data]# yum -y install gcc automake autoconf libtool make
[root@db01 /data]# cd redis
[root@db01 /data]# make

(4)修改环境变量:

[root@db01 /data]#vim /etc/profile 
export PATH=/data/redis/src:$PATH
source /etc/profile

(5)启动:

[root@db01 /data]# redis-server & 

(6)连接测试:

[root@db01 /data]# redis-cli 
127.0.0.1:6379> set num 10  ##设置num是10
OK
127.0.0.1:6379> get num  ##查看num
10

3. Redis基本管理操作

3.1基础配置文件介绍

[root@db01 ~]#mkdir /data/6379
[root@db01 ~]#cat > /data/6379/redis.conf<<EOF
daemonize yes   ##是否后台运行
port 6379          ##默认端口
logfile /data/6379/redis.log  ##日志文件位置
dir /data/6379  ##持久化文件存储位置
dbfilename dump.rdb   ##RDB持久化数据文件
EOF

3.2 redis安全配置

[root@db01 ~]#vim /data/6379/redis.conf   ##在最初配置下,再加入2行
bind 10.0.0.51  127.0.0.1  ##允许远程和本地登录
requirepass 123456  ##密码
验证:
[root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379
10.0.0.51:6379> set b 2
2
OK
10.0.0.51:6379> get b 
2

3.4 redis持久化(内存数据保存到磁盘)

3.4.1 RDB 持久化

(1)介绍
可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失

(2) rdb持久化核心配置参数:
[root@db01 ~]#vim /data/6379/redis.conf
dir /data/6379 ##持久化存储目录
dbfilename dump.rdb ##以及持久化未来的文件名
save 900 1 ##900秒内累计有1个更改,就持久化一次
save 300 10

save 60 10000

3.4.2 AOF 持久化(append-only log file)

(1)介绍
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,相当于mysql里面的binlog功能。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大

(2) AOF持久化配置
[root@db01 ~]#vim /data/6379/redis.conf
appendonly yes ##开启
appendfsync everysec ##刷写策略设置每秒刷写

4、Redis数据类型:

4.1 类型分类:

String : 字符类型
Hash: 字典类型
List: 列表
Set: 集合
Sorted set: 有序集合

4.2 数据类型应用场景:

string : 计数器应用 ,session 共享
hash : MySQL数据库缓存,canal mysql 自动 redis
list : 朋友圈
set : 集合操作 : 共同好友,共同喜好、二度好友等功能,
sortset : 排行榜

5. Redis主从复制环境搭建:

5.1 环境准备:

准备两个或两个以上redis实例
[root@db01 ~]#mkdir /data/638{0..2}
配置文件示例:
[root@db01 ~]#cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123   ##主从认证信息,所有主从节点这个项必须一致
EOF


[root@db01 ~]#cat >>   /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF


[root@db01 ~]#cat >>   /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF

启动服务:
[root@db01 ~]#redis-server /data/6380/redis.conf
[root@db01 ~]#redis-server /data/6381/redis.conf
[root@db01 ~]#redis-server /data/6382/redis.conf

上面设计节点:
主节点:6380
从节点:6381、6382

5.2 开启主从(在6381/6382节点上设置与主节点关系):

[root@db01 ~]#redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
[root@db01 ~]#redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380

5.3 查询主从状态

[root@db01 ~]#redis-cli -p 6380 -a 123 info replication
[root@db01 ~]# redis-cli -p 6381 -a 123 info replication
[root@db01 ~]# redis-cli -p 6382 -a 123 info replication

图示:


redis主库状态.png

6. redis-sentinel(哨兵)

6.1 功能:

1、监控
2、自动选主,切换(6381 slaveof no one)
3、2号从库(6382)指向新主库(6381)
4、应用透明
5、自动处理故障节点
备注:通过哨兵实现高可用功能,相当于mysql的MHA架构

6.2 sentinel搭建过程
6.2.1 准备环境:

[root@db01 ~]#mkdir /data/26380
[root@db01 ~]#cd /data/26380
配置文件:
[root@db01 ~]#cat > /data/26380/sentinel.conf <<EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster(自己起的集群名称) 127.0.0.1 6380 1   ##127.0.0.1 6380是只监控目前主库节点信息,1指的是至少多少台从库同意他宕了才会切换。
sentinel down-after-milliseconds mymaster 5000   ##主库发生宕机,容忍5秒,超过5秒后,就进行切换
sentinel auth-pass mymaster 123  ##连接主库的密码*(所以在做sentinel集群的时候,所有节点密码就需要一致,因为谁都有可能是主库)
EOF

6.2.2 启动

[root@db01 26380]# redis-sentinel /data/26380/sentinel.conf  &>/tmp/sentinel.log &

6.2.3 停主库测试(验证哨兵是否起作用):

[root@db01 ~]# redis-cli -p 6380 shutdown
[root@db01 ~]# redis-cli -p 6381 info replication   ##看6381状态,是否已经切换到主节点

6.2.4 总结:
哨兵的高可用架构他和mysql中的MHA架构类似,但是又优于MHA架构,他拥有自主处理故障节点能力。当主宕机,主就会从M节点切换到S1节点,然后S2节点会指向新的S1节点。当M节点恢复后,什么也不用进行操作,他会进行自动故障节点处理,只需把它重新加入到架构中即可(修复架构的命令就是启动宕机的服务节点:redis-server /data/6380/redis.conf),此时他会变为从节点。
原理图:


哨兵原理图.png

7. redis cluster 分布式集群

7.1 介绍:

高性能:
1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
2、存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
4、如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储

高可用:
在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。
1、redis会有多组分片构成(3组)
2、redis cluster 使用固定个数的slot存储数据(一共16384slot)
3、每组分片分得1/3 slot个数(0-5500 5501-11000 11001-16383)
4、基于CRC16(key) % 16384 ====》值 (槽位号)。

7.2 规划、搭建过程:

6个redis实例,一般会放到3台硬件服务器
注:在企业规划中,分布式集群的搭建,也需要考虑到主从关系,可以使数据落在不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
端口号:7000-7005


分布式集群.png

7.2.1 安装集群插件,EPEL源安装ruby支持

[root@db01 ~]# yum install ruby rubygems -y

7.2.2 使用国内源:

[root@db01 ~]# gem sources -l
[root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/ 
[root@db01 ~]# gem sources  --remove https://rubygems.org/
[root@db01 ~]# gem sources -l
[root@db01 ~]# gem install redis -v 3.3.3

7.2.3 集群节点准备:

[root@db01 ~]#mkdir /data/700{0..5}

[root@db01 ~]#cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


[root@db01 ~]#cat >>  /data/7003/redis.conf <<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


[root@db01 ~]#cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes    ##打开集群节点功能
cluster-config-file nodes.conf  ##专门配置文件
cluster-node-timeout 5000  ##超时时间,超过5000毫秒会切换主从
appendonly yes
EOF

7.2.4 启动节点:

[root@db01 ~]#redis-server /data/7000/redis.conf 
[root@db01 ~]#redis-server /data/7001/redis.conf 
[root@db01 ~]#redis-server /data/7002/redis.conf 
[root@db01 ~]#redis-server /data/7003/redis.conf 
[root@db01 ~]#redis-server /data/7004/redis.conf 
[root@db01 ~]#redis-server /data/7005/redis.conf 
[root@db01 ~]# ps -ef |grep redis
root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster] 

7.2.5 将节点加入集群管理

[root@db01 ~]#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
--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  
主从规划:7000,7001,7002,3台主库;7003,7004,7005,3台从库;
7000myself,他是一个集群管理节点。

7.2.6 集群状态查看:

集群主节点状态
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep master
集群从节点状态
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep slave

8. 集群节点管理

8.1 增加新的节点
8.1.1 创建新增节点:

[root@db01 ~]#mkdir /data/7006
[root@db01 ~]#mkdir /data/7007
[root@db01 ~]#cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >  /data/7007/redis.conf <<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
启动:
[root@db01 ~]#redis-server /data/7006/redis.conf 
[root@db01 ~]#redis-server /data/7007/redis.conf 

8.1.2 添加主节点:

[root@db01 ~]#redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

8.1.3 添加完节点后,进行转移slot(重新分片也就是分槽位):

[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
添加主节点1.png
添加主节点2.png
添加主节点3.png

8.1.4 添加一个从节点:

[root@db01 ~]#redis-trib.rb add-node --slave --master-id $MASTER-ID  127.0.0.1:7007 127.0.0.1:7000
说明: $MASTER-ID ,上面添加的主库node id号(也就是新添加的7006节点)

8.2 删除节点,将需要删除节点slot先移动走,再进行删除:
8.2.1 挪走0-1364(因为有3段,所以下面命令需要执行3次,把三段全部挪走才行):

[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
1段1.png
1段2.png
2段1.png
2段2.png

8.2.2 删除节点:

[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7006 de07bc7967d3b5953accde8ff2745b3c3f8baf56
[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7007 236b25da436703cb3eebe3cee64e956e65a1a2f4
删除节点1.png
删除节点2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户...
    hadoop_null阅读 1,589评论 0 6
  • 单机/单点 单点故障/瓶颈:多个节点负载:面向数据:一变多(一致性<弱一致,最终一致性>)》可用性最终一致性:一部...
    壹点零阅读 790评论 0 3
  • 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Red...
    Kevin_ZGJ阅读 11,678评论 19 133
  • 本文档汇总了多篇文章知识的结晶,整理出一份完整的Redis集群搭建教程,在本文最后也有注明摘自原文的地址,如果原作...
    纬一阅读 1,376评论 5 23
  • 很多人说性格是不可以改变的,但唐骏却说性格是可以改变的。唐骏在上大学时,是一个没有自信很自卑的人,不敢跟女孩子约会...
    我是范老师阅读 385评论 0 1