美文网首页
redis集群

redis集群

作者: 苏水的北 | 来源:发表于2019-10-27 13:00 被阅读0次

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

相关文章

网友评论

      本文标题:redis集群

      本文链接:https://www.haomeiwen.com/subject/gcspvctx.html