Redis

作者: 你好_请关照 | 来源:发表于2019-12-07 09:30 被阅读0次

Redis

内容:

1、Redis简介

2、Redis 安装和基础管理

3、Redis 数据类型

4、Redis 的消息模式

5、事物工作流程和MySQL区别

6、主从数据一致性保证

7、主从复制实现

8、Redis-sentinel(哨兵)

9、Redis-cluster(集群)

**Redis 官网有两个 ** www.redis.cnwww.redis.io

Redis下载地址: http://download.redis.io/releases/

1、Redis 简介

1.1 数据库产品

RDBMS : Oracle MySQL PG MSSQL
NoSQL : Redis MongoDB ES ....
NewSQL: PolarDB,TiDB

TAOBAO : PolarDB + Tair(Memcached) + ES
JD : Redis

1.2 Redis 使用场景介绍

(1)Memcached:多核缓存服务,更加适合用于多用户并发访问次数少的应用场景

​ 基于内存的Key :Value类的存储结构,多核工作模式

优点: 更加适合于多用户访问,少量操作.
缺点: 不支持集群和持久化,需要二次开发使用.

(2)Redis:单核的缓存服务,单节点情况下更实用于少量用户,多次访问的应用场景

(3)Redis:一般是单机多示例架构,配合Redis集群出现

**Redis: **

基于内存的Key :Value类的存储结构,支持多种数据类型(string ,hash,list,set,sortset)

优点: 自带集群功能.支持持久化和集群.

缺点:单核,更加适用于用户量相对少,每个用户大量操作的场景.一般是单机多实例较多

2、Redis 安装和基础管理

2.1 Redis 安装

第一种:yum 安装

yum install -y redis 

第二种:软件包下载到本地安装

[root@db02 /server/tools]# tar -xf redis-3.2.12.tar.gz 
[root@db02 /server/tools]# ln -s  /server/tools/redis-3.2.12 /usr/local/redis
[root@db02 /server/tools]# ll /usr/local/
total 0
lrwxrwxrwx. 1 root root 26 Nov 26 21:52 redis -> /server/tools/redis-3.2.12
[root@db02 /server/tools]# tail -n 1 /etc/profile
[root@db02 /server/tools]# source /etc/profile
export PATH=/usr/local/redis/src:$PATH
[root@db02 /server/tools]# cd /usr/local/redis/
[root@db02 /usr/local/redis]# make

2.2 Redis 启动关闭

[root@db02 ~]# redis-server &           #启动
[1] 10151
[root@db02 ~]# 10151:C 26 Nov 22:05:12.441 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 10151
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

10151:M 26 Nov 22:05:12.444 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
10151:M 26 Nov 22:05:12.444 # Server started, Redis version 3.2.12
10151:M 26 Nov 22:05:12.444 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
10151:M 26 Nov 22:05:12.444 * The server is now ready to accept connections on port 6379

[root@db02 ~]# jobs                 #查看后台是否运行
[1]+  Running                 redis-server &
[root@db02 ~]# redis-server &^C
[root@db02 ~]# redis-cli shutdown       
10151:M 26 Nov 22:07:23.077 # User requested shutdown...
10151:M 26 Nov 22:07:23.077 * Saving the final RDB snapshot before exiting.
10151:M 26 Nov 22:07:23.079 * DB saved on disk
10151:M 26 Nov 22:07:23.079 # Redis is now ready to exit, bye bye...
[1]+  Done                    redis-server
[root@db02 ~]# redis-cli shutdown   #停止
10151:M 26 Nov 22:07:23.077 # User requested shutdown...
10151:M 26 Nov 22:07:23.077 * Saving the final RDB snapshot before exiting.
10151:M 26 Nov 22:07:23.079 * DB saved on disk
10151:M 26 Nov 22:07:23.079 # Redis is now ready to exit, bye bye...
[1]+  Done                    redis-server
[root@db02 ~]# 

2.3 Redis基础管理

无密码连接

[root@db02 ~]# redis-cli 
127.0.0.1:6379> set a 1 
OK
127.0.0.1:6379> get a 
"1"
127.0.0.1:6379> 

Redis安全配置

redis-cli 客户端命令常用参数

-p 指定端口号

-h 指定连接IP

-a 指定连接密码

redis-cli -p 6379 -h 10.0.0.52 -a 123

2.4 配置文件基础

mkdir -p  /data/6379
cat > /data/6379/redis.conf<<EOF
daemonize yes                           # 是否后台运行
port 6379                               #默认端口号
logfile /data/6379/redis.log        #日志文件存放位置
dir /data/6379                          #持久话文件存储位置
dbfilename dump.rdb                 #RDB持久话数据文件
EOF
使用指定的配置文件启动:
Redis:[root@db01 ~]# redis-server /data/6379/redis.conf &

Bind:指定IP 进行监听

vim /data/6379/redis.conf
bind 10.0.0.51 127.0.0.1

增加登录密码 requirepass

vim /data/6379/redis.conf
requirepass 123

验证:
方法一:
[root@db01 ~]# redis-cli -a 123
127.0.0.1:6379> 
方法二:
[root@db01 ~]# redis-cli 
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> 

2.5 Redis的持久化

RDB持久化:

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

RDB持久化核心配置参数

vim /data/6379/redis.conf
dir /data/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

配置说明

save 900 1      #900秒(15分钟)内有1个更改
save 300 10     #300秒(5分钟)内有10个更改
save 60 10000    #60秒内 有10000个更改(可以更改)

AOF持久化:

​ 相当于MySQL的binlog,可以记录所有redis变更类的语句.
​ 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
​ AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
​ 优点:在宕机时,可以最大程度保证数据不丢
​ 缺点:日志记录量级比较大

AOF持久化配置参数说明

appendonly yes              #是否打开aof日志功能
appendfsync everysec    #每一个命令,都立即同步到aof
appendfsync alwayz      #每秒1次
appendfsync no              #写入工作交给操作系统,有操作系统判断缓冲区大小,统一写入到aof
vim /data/6379/redis.conf
appendonly yes  
appendfsync everysec

3、Redis 数据类型

string类型: 字符串类型
hash 类型: 字典类型
LIST 类型: 列表
SET 类型: 集合
Sortset : 有序集合

通用KEY操作

KEYS * keys a keys a* 查看已存在所有键的名字 ****
TYPE 返回键所存储值的类型 ****
EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间 ***
TTL\ PTTL 以秒\毫秒为单位返回生存时间 ***
PERSIST 取消生存时间设置 ***
DEL 删除一个key
EXISTS 检查是否存在
RENAME 变更KEY名

CONFIG SET maxmemory 200M 设定最大使用内存大小

3.1 string 类型:字符串类型

应用场景:session 共享 微博数,粉丝数,订阅、礼物

3.2 hash 类型:字典类型

应用场景: 实现数据库数据缓存

设置方法:

127.0.0.1:6379> hmset k1 id 1 name zs age 18
OK
127.0.0.1:6379> hmget k1 id name age
1) "1"
2) "zs"
3) "18"
127.0.0.1:6379> hgetall k1
1) "id"
2) "1"
3) "name"
4) "zs"
5) "age"
6) "18"
127.0.0.1:6379> 

3.3 LIST 类型: 列表

应用场景:消息队列、展示最新数据的业务中(如微信朋友圈、新浪微博帖子等),侧重于信息的实时性。

设置方法:

127.0.0.1:6379> LPUSH wechat "today is 1 "
(integer) 1
127.0.0.1:6379> LPUSH wechat "today is 2 "
(integer) 2
127.0.0.1:6379> LPUSH wechat "today is 3 "
(integer) 3
127.0.0.1:6379> LPUSH wechat "today is 4 "
(integer) 4
127.0.0.1:6379> LPUSH wechat "today is 5 "
(integer) 5
127.0.0.1:6379> LRANGE wechat 0 5 
1) "today is 5 "
2) "today is 4 "
3) "today is 3 "
4) "today is 2 "
5) "today is 1 "
127.0.0.1:6379> LRANGE wechat 0 3 
1) "today is 5 "
2) "today is 4 "
3) "today is 3 "
4) "today is 2 "
127.0.0.1:6379> 

3.4 SET 类型:集合

应用场景:交友类平台常用,比如:推荐好友,共同好友等(例如求交集或求并集等)。

设置方法:

127.0.0.1:6379> sadd xiaoxi xiaoli xiaowang xiaoxin   
(integer) 3
127.0.0.1:6379> sadd xiaoliang xiaoli xiaozhang xiaoxue
(integer) 3
127.0.0.1:6379> type xiaoliang
set
127.0.0.1:6379> SUNION xiaoxi xiaoliang #求并集
1) "xiaoxin"
2) "xiaoli"
3) "xiaowang"
4) "xiaozhang"
5) "xiaoxue"
127.0.0.1:6379> SINTER xiaoxi xiaoliang  #求交集
1) "xiaoli"
127.0.0.1:6379> SDIFF xiaoxi xiaoliang  #求差集
1) "xiaoxin"
2) "xiaowang"
127.0.0.1:6379> 

3.5 Sortest 类型:有序集合

应用场景:各种排行榜

设置方法

127.0.0.1:6379> zadd topN 0 fskl 0 lzlsfs 0 yldisco 0 smlt 0 a 0 b 0 c 0 d  
(integer) 0
127.0.0.1:6379> type topN
zset
127.0.0.1:6379> ZINCRBY topN 1000 lzlsfs
"1000"
127.0.0.1:6379> ZINCRBY topN 100000 yldsco
"100000"
127.0.0.1:6379> ZINCRBY topN 10 a 
"10"
127.0.0.1:6379> ZINCRBY topN 10 b
"10"
127.0.0.1:6379> ZINCRBY topN 15 c
"15"
127.0.0.1:6379> ZREVRANGE topN 0 -1
1) "yldsco"
2) "lzlsfs"
3) "c"
4) "b"
5) "a"
6) "yldisco"
7) "smlt"
8) "fskl"
9) "d"
127.0.0.1:6379> ZREVRANGE topN 0 -1 WITHSCORES
 1) "yldsco"
 2) "100000"
 3) "lzlsfs"
 4) "1000"
 5) "c"
 6) "15"
 7) "b"
 8) "10"
 9) "a"
10) "10"
11) "yldisco"
12) "0"
13) "smlt"
14) "0"
15) "fskl"
16) "0"
17) "d"
18) "0"
127.0.0.1:6379> 

4、Redis 的消息模式

Redis消息模式:一般很少在大型的业务场景中应用,一般都使用成熟的消息队列产盘,如kafka,ETCD

[图片上传失败...(image-a9dce-1575682198762)]

消息订阅

subscribe ch1 订阅一个
psubscribe ch* 订阅ch开头的所有
psubscribe * 订阅所有
publish ch1 hi 发送

发布者:

127.0.0.1:6379> PUBLISH chn1029 hi
(integer) 1
127.0.0.1:6379> 

接收者:

127.0.0.1:6379> SUBSCRIBE chn1029 
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chn1029"
3) (integer) 1



1) "message"
2) "chn1029"
3) "hi"

5、事物工作流程和MySQL区别

5.1 事物控制语句

multi 开启
exec 执行
discard 取消

redis事物与mysql事物的区别

(1) 事务工作过程中,加载到内存,内存发生修改,commit时候,redo落盘,rollback时候通过undo回滚
(2) redis是将所有事务中的语句放到队列中,exec 真正执行,discard直接取消.
(3) redis应用的是乐观锁机制,先到先得,谁先提交谁生效。
(4) redis 默认没有事物的概念,默认一个操作就算一个事物

6、redis(Master-RS)主复制集

6.1 工作流程

  1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库

  2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库

  3. 副本库接收后会应用RDB快照

  4. 主库会陆续将中间产生的新的操作,保存并发送给副本库

  5. 到此,我们主复制集就正常工作了

  6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.

  7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.

  8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库

  9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的

    [图片上传失败...(image-5c1ec9-1575682198762)]

    6.2 主从一致性保证

    min-slaves-to-write 1
    min-slaves-max-lag 3

    6.3 主库是否要开启持久化?

    如果不开有可能,主库重启操作,造成所有主从数据丢失!

7、主从复制实现

7.1 主从环境搭建

环境介绍:

三台不同的主机节点安装redis,实现1主2从的架构

关闭SELinux

关闭firewalld

安装Redis

第一个节点配置(6380)

mkdir /data/6380 -p 
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
bind 127.0.0.1 10.0.0.54
EOF

redis-server /data/6380/redis.conf   启动

第二个节点配置(6381)

mkdir /data/6381 -p 
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
bind 127.0.0.1 10.0.0.51
EOF


redis-server /data/6381/redis.conf   启动

第三个节点配置(6382)

mkdir /data/6382 -p 
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
bind 127.0.0.1 10.0.0.52
EOF


redis-server /data/6382/redis.conf   启动

7.2 开启主从

6381节点

redis-cli -p 6381 -a 123 SLAVEOF 10.0.0.54 6380

6382节点

redis-cli -p 6382 -a 123 SLAVEOF 10.0.0.54 6380

7.3 查看主从状态

6380

 redis-cli -p 6380 -a 123   info replication

6381

 redis-cli -p 6381 -a 123   info replication

6382

 redis-cli -p 6382 -a 123   info replication    

8、Redis-sentinel(哨兵)

sentinel功能:

1、监控
2、自动选主,切换(6381 slaveof no one)
3、2号从库(6382)指向新主库(6381)
4、应用透明
5、自动处理故障节点

Redis-sentinel仅能实现高可用和读写分离,针对缓解读操作的压力有一定作用,但无法缓解写操作的压力;Redis-Cluster既可以缓解读操作的压力,也可以缓解写操作的压力。

8.1 搭建sentinel

在1主2从的基础上添加一个sentinel节点

**sentinel 默认端口号 26380 **

**sentinel日志:/tmp/sentinel.log **

mkdir /data/26380 -p 

cat >>/data/26380/sentinel.conf <<EOF 
port 26380
dir "/data/26380"
sentinel monitor mymaster 10.0.0.54 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123
EOF

启动:
redis-sentinel /data/26380/sentinel.conf  &>/tmp/sentinel.log &


配置文件解读

port 26380             #默认端口号
dir "/data/26380"         #工作目录
sentinel monitor mymaster 10.0.0.54 6380 1      #监控主库节点,自动发现从库节点
#mymaster 是给主库起的一个名字                                                                
#最后的“1”,表示多个sentinel选举,意为有几个sentinel认为主库宕机了,主库才会下线,一般这个数值会大于sentinel总数的1/2。     
sentinel down-after-milliseconds mymaster 5000  #主库down机超时时长
sentinel auth-pass mymaster 123                     #主库认证密码

说明:在业务中如果有sentinel的场景中,直接访问sentinel节点,一般会有多个sentinel节点(负载均衡使用)。

测试sentinel

第一步:监控sentinel 日志
tail  -f /tmp/sentinel.log  

第二步:停止主库节点
redis-cli -a 123 -p 6380 shutdown


第三步:
这个时候可以查看sentinel 日志是否发生变化
查看sentinel配置文件是否发生改变
cat /data/26380/sentinel.conf 
port 26380
dir "/data/26380"
sentinel myid ca1ae8c091c5e5a1ad9a0d4eaac427a48bccb5c1
sentinel monitor mymaster 10.0.0.51 6381 1
sentinel down-after-milliseconds mymaster 5000
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster 123
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 10.0.0.52 6382
sentinel known-slave mymaster 10.0.0.54 6380
sentinel current-epoch 1

9、Redis-cluster(集群)

高性能:
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 ====》值 (槽位号)。

9.1 Redis-cluster搭建过程

6个redis实例,一般会放到3台硬件服务器
注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
端口号:7000-7005

9.1.2 安装集群插件(在Cluster节点安装)

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

9.1.3 集群节点准备

本环境使用4个节点,其中3个节点中,每个节点2个Redis实例,共计6个Redis实例,另外一台为REdis-Cluster管理节点

01节点-Redis

mkdir /data/700{0,1} -p 

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
bind 10.0.0.51 127.0.0.1
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

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
bind 10.0.0.51 127.0.0.1
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动节点:
redis-server /data/7000/redis.conf 
redis-server /data/7001/redis.conf 

查看启动状态:
ps -ef | grep redis | grep -e "700.*"


02节点-Redis

mkdir /data/700{2,3} -p 

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
bind 10.0.0.52 127.0.0.1
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

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
bind 10.0.0.52 127.0.0.1
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动节点:
redis-server /data/7002/redis.conf 
redis-server /data/7003/redis.conf 

查看启动状态:
ps -ef | grep redis | grep -e "700.*"


03节点-Redis

mkdir /data/700{4,5}

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
bind  10.0.0.53 127.0.0.1
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

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
bind 10.0.0.53 127.0.0.1
dir /data/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动节点:
redis-server /data/7004/redis.conf 
redis-server /data/7005/redis.conf 

查看启动状态:
ps -ef | grep redis | grep -e "700.*"

04集群管理节点

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

安装Redis工具:
yum install redis -y 

添加集群节点:
redis-trib.rb create --replicas 1 10.0.0.51:7000 10.0.0.52:7002  10.0.0.53:7004 \
10.0.0.52:7003 10.0.0.53:7005 10.0.0.51:7001


创建集群节点讲解:

redis-trib.rb create --replicas 1 10.0.0.51:7000 10.0.0.52:7002  10.0.0.53:7004 \
10.0.0.52:7003 10.0.0.53:7005 10.0.0.51:7001
(1)节点对应关系
主从节点一一对应,前面的是主节点,后面的是从节点
10.0.0.51:7000是10.0.0.52:7003的主节点
10.0.0.52:7002是10.0.0.53:7005的主节点
10.0.0.53:7004是10.0.0.51:7001的主节点
(2 )此处的1 表示每个主节点对应一个从节点,修改为0后,表示没有从节点,全部都是主节点
redis-trib.rb create --replicas 1 

注意事项

在使用多节点搭建cluster环境时,使用bind 参数,要注意回环地址不能放在前面,否则会一直join......
导致集群不能成功创建。


1、在生产环境下,每个节点必须加上认证功能,在配置文件中加入如下参数:
requirepass 123
masterauth 123

2、如果只在配置文件中添加秘钥和认证功能,会导致集群起来报如下错误:
[ERR] Sorry, can't connect to node 10.0.0.51:7000

这时需要修改以下配置:
直接vim编辑redis-trib那个脚本,第99行,可以添加密码

@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "123")

9.2 集群状态查看

集群主节点状态
redis-cli -p 7000 -h 10.0.0.51 cluster nodes | grep master
集群从节点状态
redis-cli -p 7000 -h 10.0.0.51 cluster nodes | grep slave

查看信息讲解

[root@db03 ~]# redis-cli -p 7000 -h 10.0.0.51  cluster nodes | grep master
fbb83518d75c9c1ba103b9874927f2cd85d237e0 10.0.0.54:7002 master - 0 1575437798424 2 connected 5461-10922
cf2a273fc45b18d14619e4780883ac42f5f2454b 10.0.0.52:7004 master - 0 1575437797920 3 connected 10923-16383
2458080a0228bf1a6e1aa7113df3586c82e79e8c 10.0.0.54:7003 master - 0 1575437796913 7 connected 0-5460

9.3 集群节点管理

9.3.1 添加集群节点

准备节点

mkdir /data/700{6,7}

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
bind 10.0.0.61
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

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
bind 10.0.0.61
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

redis-server /data/7006/redis.conf 
redis-server /data/7007/redis.conf 

查看启动状态:
ps -ef | grep redis | grep -e "700.*"

添加节点

添加主节点:
redis-trib.rb add-node 10.0.0.61:7006 10.0.0.51:7000 (指定任意一个master节点关联所在群)

转移slot(重新分片):
redis-trib.rb reshard 10.0.0.51:7000

添加一个从节点:
redis-trib.rb add-node --slave --master-id f924d1eec7e93e74528f05fd45b08af10ad47134 10.0.0.61:7007 10.0.0.51:7000

命令释义:
 --master-id  f924d1eec7e93e74528f05fd45b08af10ad47134 要关联的主节点ID
 10.0.0.61:7007 指定从节点的地址
 10.0.0.51:7000 通过那个master节点去加入集群


9.3.2 删除集群节点

将需要删除节点slot移动走
redis-trib.rb reshard 10.0.0.51:7000

删除主节点:
redis-trib.rb del-node 10.0.0.61:7006 f924d1eec7e93e74528f05fd45b08af10ad47134 
删除从节点:
redis-trib.rb del-node 10.0.0.61:7007 a91a54e464fe58d4d66a863736154b2149e97722 


10 测试使用 Redis-cluster

---------------------
 redis的多API支持
python为例
yum install -y python36 
python3 -V

yum install -y python36-pip

pip3 install redis 
pip3 install redis-py-cluster
-----------------------------------------------------------------------------------

对redis的单实例进行连接操作
[root@db01 ~]# redis-server /data/6379/redis.conf 

python3
>>>import redis
>>>r = redis.StrictRedis(host='10.0.0.51', port=6379, db=0,password='123456')
>>>r.set('oldboy', 'oldguo')
>>>r.get('oldboy')
-----------------------------------------------------------------------------------

sentinel集群连接并操作

[root@db01 ~]# redis-server /data/6380/redis.conf
[root@db01 ~]# redis-server /data/6381/redis.conf
[root@db01 ~]# redis-server /data/6382/redis.conf 
[root@db01 ~]# redis-sentinel /data/26380/sentinel.conf &


## 导入redis sentinel包
>>>from redis.sentinel import Sentinel  
##指定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,password="123")  
#读节点
>>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1,password="123")  
###读写分离测试   key     
>>> master.set('oldboy', '123')  
>>> slave.get('oldboy')  

-----------------------------------------------------------------------------------

python连接rediscluster集群测试


python3
>>> from rediscluster import RedisCluster  
>>> startup_nodes = [{"host":"10.0.0.51", "port": "7000"},{"host":"10.0.0.52", "port": "7002"},{"host":"10.0.0.53", "port": "7004"}]  
### Note: decode_responses must be set to True when used with python3  

>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)  
>>> rc.set("foo", "bar")  
True  
>>> print(rc.get("foo"))  
'bar'


Codis


补充

节点设置密码
1、修改配置文件
在配置文件里面增加密码选项,一定要加上masterauth,不然Redirected的时候会失败。
masterauth redispassword
requirepass redispassword
修改后需要重启redis节点。
2、动态修改
连接redis节点进行配置设置,然后config rewrite 将配置同步到配置文件中,不需要重启节点。
redis-cli -p 8001 -c
config set masterauth redispassword
config set requirepass redispassword
config rewrite
注意:每个节点的密码需要保持一致,不然Redirected的时候会失败。


第二种方式不需要重启服务比较快,同时也修改了配置文件 。
集群工具设置密码
默认集群管理工具redis-trib.rb是没有密码的,也没有通过参数可以设置密码。但是这个ruby脚本是调用ruby的redis模块,因此我们只需要找到ruby的client.rb文件,在这个脚本里面修改配置就可以了。
如果使用gem安装一般是可以在家目录下找到client.rb这个脚本。具体可以使用find查找一下:find / -name 'client.rb'
class Client
DEFAULTS = {
:url => lambda { ENV["REDIS_URL"] },
:scheme => "redis",
:host => "127.0.0.1",
:port => 6379,
:path => nil,
:timeout => 5.0,
:password => "redispassword",
:db => 0,
:driver => nil,
:id => nil,
:tcp_keepalive => 0,
:reconnect_attempts => 1,
:inherit_socket => false
}
注意:这个修改之后,本机其他ruby脚本调用默认也是这个密码。

相关文章

网友评论

      本文标题:Redis

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