Redis

摘要:
分布式系统存储特点
Redis概述及安装
Redis集群及HA高可用实现

分布式存储特点
CAP:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式统满足分区容错性几乎是必须的
C:多个数据节点上的数据一致;
A:用户发出请求后的有限时间范围内返回结果;
P:network partition,网络发生分区后,服务是否依然可用;
BASE:BA,S,E,基于CAP演化而来

BA:Basically Available,基本可用;
S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
E:Eventually consistency,最终一致性;
分布式一致性协议:Paxos,Raft等
Redis概述
随着业务的增长和产品的完善,急速增长的数据给Oracle数据库带来了很大的压力,而随着我们对产品服务质量要求的提高,传统的数据查询方式已无法满足我们需求。为此我们需要寻找另外一种模式来提高数据查询效率。NoSQL内存数据库是最近兴起的新型数据库,Nosql官网,它的特点就是把数据放在内存中操作,数据处理速度相对于磁盘提高了好几个量级,因此,通过把经常访问的数据转移到内存数据库中,不但可以缓解Oracle的访问压力,而且可以极大提高数据的访问速度,提高用户体验。
Redis是一个开源的,先进的key-value持久化产品。它通常被称为数据结构服务器,REmote DIctionary Server,它的值可以是字符串(String)、哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等类型。可以在这些类型上面做一些原子操作,如:字符串追加、增加Hash里面的值、添加元素到列表、计算集合的交集,并集和差集;或者区有序集合中排名最高的成员。为了取得好的性能,Redis是一个内存型数据库。不限于此,Redis也可以把数据持久化到磁盘中,或者把数据操作指令追加了一个日志文件,把它用于持久化。也可以用Redis容易的搭建master-slave架构用于数据复制。其它让它像缓存的特性包括,简单的check-and-set机制,pub/sub和配置设置。Redis可以用大部分程序语言来操作:C、C++、C#、Java、Node.js、php、ruby等等。Redis是用ANSIC写的,可以运行在多数POSIX系统,如:Linux,*BSD,OS X和Soloris等。官方版本不支持Windows下构建,可以选择一些修改过的版本,照样可以使用Redis。

Redis简介
安装及配置
centos系统的base仓库自带redis-3.2.10,我们用yum安装即可.
~]# yum info redis
~]# yum install -y redis
~]# rpm -q –scripts redis
~]# rpm -ql redis
~]# vim /etc/redis.conf #仅修改以下选项
bind 0.0.0.0 #增加监听地址为所有
requirepass ilinux #要求密码验证
~]# systemctl start redis
~]# grep ‘^####’ /etc/redis.conf #配置文件的段落如下
################################## INCLUDES ###################################
################################## NETWORK #####################################
################################# GENERAL #####################################
################################ SNAPSHOTTING ################################
################################# REPLICATION #################################
################################## SECURITY ###################################
################################### LIMITS ####################################
############################## APPEND ONLY MODE ###############################
################################ LUA SCRIPTING ###############################
################################ REDIS CLUSTER ###############################
################################## SLOW LOG ###################################
################################ LATENCY MONITOR ##############################
############################# EVENT NOTIFICATION ##############################
############################### ADVANCED CONFIG ###############################

Redis的基本数据结构(5种)
1.STRING:可以存储字符串、浮点型、整型,如果是字符串可以执行字符串操作,如果是浮点型、整型也可以执行加减操作。redis会识别出它的具体类型。
2.LIST:链表,链表中的每个NODE包含一个字符串。可以对链表进行两端推入、弹出操作。
3.SET:无序集合,不会存在相同的集合元素,集合的交集、并集、差集运算。
4.HASH:键值对的无需散列,增、删、获取键值。
5.ZSET:有序集合,根据一个浮点数分值来排序。

redis两种持久化原理(RDB、AOF)
redis支持两种方式来持久化数据
第一种:snapshotting(镜像或快照)也称RDB;
第二种:AOF(append-only file 文件追加)。
如:
RDB:镜像模式就是将某个时间段的所有内存数据直接写入硬盘。
AOF:将执行的写命令增量复制到硬盘里面。
这两种其实就是不同的侧重,RDB是数据持久化,AOF是命令持久化,数据持久化比较直接,还原的时候直接恢复数据即可。命令持久化恢复的话需要执行一遍命令才行。

redis执行持久化操作取决于两方面:默认是根据持久化配置来执行,还有就是用户手动触发。手动触发有两个命令
SAVE:会block所有的用户操作,知道持久化结束。
BGSAVE:后台子进程执行,linux中使用fork命令开启一个子进程副本,这个子进程副本与主进程共用一套内存空间,直到主进程或子进程对内存进行修改,被修改之后的内存区域将被子进程复制出来单独使用。

持久化存储对应的配置文件设置
]# vim /etc/redis.conf
################################ SNAPSHOTTING ################################
save 900 1
save 300 10
save 60 10000
save 5 200000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
############################## APPEND ONLY MODE ###############################
appendonly no
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes

登录,查询帮助,Redis3.2版本有个很好的显示帮助,Tab补全功能强大。

基本用法
~]# redis-cli
127.0.0.1:6379> AUTH ilinux #认证,和配置文件的requirepass相对应
OK
127.0.0.1:6379> help
redis-cli 3.2.10
To get help about Redis commands type:
“help @<group>” to get a list of commands in <group>
“help <command>” for help on <command>
“help <tab>” to get a list of possible help topics
“quit” to exit
127.0.0.1:6379> help @list
127.0.0.1:6379> rpush weekdays Sunday
127.0.0.1:6379> LPUSH weekdays Sun Mon Tue Wed
127.0.0.1:6379> lindex weekdays 0
“Wed”
127.0.0.1:6379> lindex weekdays 1
“Tue”
127.0.0.1:6379> lindex weekdays 2
“Mon”
127.0.0.1:6379> lindex weekdays 3
“Sun”
127.0.0.1:6379> lindex weekdays 4
“Sunday”
127.0.0.1:6379> llen weekdays
(integer) 5
127.0.0.1:6379> lpop weekdays
“Wed”
127.0.0.1:6379> lpop weekdays
“Tue”
127.0.0.1:6379> lpop weekdays
“Mon”
127.0.0.1:6379> lpop weekdays
“Sun”
127.0.0.1:6379> llen weekdays
(integer) 1
127.0.0.1:6379> lindex weekdays 0
“Sunday”
127.0.0.1:6379> rpush weekdays Mon Tue Wed
(integer) 4
127.0.0.1:6379> lrange weekdays 1 3
1) “Mon”
2) “Tue”
3) “Wed”
127.0.0.1:6379> llen weekdays
(integer) 4
127.0.0.1:6379> lrange weekdays 1 10
1) “Mon”
2) “Tue”
3) “Wed”
127.0.0.1:6379> lrange weekdays 0 10
1) “Sunday”
2) “Mon”
3) “Tue”
4) “Wed”
127.0.0.1:6379> ltrim weekdays 1 2
OK
127.0.0.1:6379> lrange weekdays 0 10
1) “Mon”
2) “Tue”

@SET,无序集合,不会存在相同的集合元素,集合的交集、并集、差集运算。

127.0.0.1:6379> help @set
SADD key member [member …]
summary: Add one or more members to a set
since: 1.0.0

SCARD key
summary: Get the number of members in a set
since: 1.0.0

SDIFF key [key …]
summary: Subtract multiple sets
since: 1.0.0

SDIFFSTORE destination key [key …]
summary: Subtract multiple sets and store the resulting set in a key
since: 1.0.0

SINTER key [key …]
summary: Intersect multiple sets
since: 1.0.0

SINTERSTORE destination key [key …]
summary: Intersect multiple sets and store the resulting set in a key
since: 1.0.0

SISMEMBER key member
summary: Determine if a given value is a member of a set
since: 1.0.0

SMEMBERS key
summary: Get all the members in a set
since: 1.0.0

SMOVE source destination member
summary: Move a member from one set to another
since: 1.0.0

SPOP key [count]
summary: Remove and return one or multiple random members from a set
since: 1.0.0

SRANDMEMBER key [count]
summary: Get one or multiple random members from a set
since: 1.0.0

SREM key member [member …]
summary: Remove one or more members from a set
since: 1.0.0

SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elements
since: 2.8.0

SUNION key [key …]
summary: Add multiple sets
since: 1.0.0

SUNIONSTORE destination key [key …]
summary: Add multiple sets and store the resulting set in a key
since: 1.0.0
127.0.0.1:6379> SADD stus tom jerry lilei hanmeimei lucy lily
(integer) 6
127.0.0.1:6379> SPOP stus 2
1) “lily”
2) “lilei”
127.0.0.1:6379> SCARD stus
(integer) 4
127.0.0.1:6379> smembers stus
1) “jerry”
2) “hanmeimei”
3) “tom”
4) “lucy”
127.0.0.1:6379> srem stus hanmeimei
(integer) 1
127.0.0.1:6379> smembers stus
1) “jerry”
2) “tom”
3) “lucy”
127.0.0.1:6379> SADD stus2 tom jeryy lucy lilei
(integer) 4
127.0.0.1:6379> sinter stus stus2
1) “tom”
2) “lucy”
127.0.0.1:6379> sunion stus stus2
1) “jerry”
2) “lilei”
3) “jeryy”
4) “tom”
5) “lucy”
127.0.0.1:6379> sdiff stus stus2
1) “jerry”
127.0.0.1:6379> sdiff stus2 stus
1) “lilei”
2) “jeryy”
redis主从
Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。master可以有多个slave。除了多个slave连到相同的master外,slave也可以连接其它slave形成图状结构。主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理客户端发来的请求。相反slave在初次同步数据时则会阻塞不能处理客户端的请求。
主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于客户端的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余。可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置,然后只在 slave 上配置数据持久化。

redis cluster

master 192.168.48.7
slave 192.168.48.17

master相关配置

]# yum install -y redis
]# grep ‘^[^#]’ /etc/redis.conf
bind 0.0.0.0 #保证protected-mode不运行
requirepass ilinux
]# systemctl start redis

slave相关配置

]# yum install -y redis
]# vim /etc/redis.conf #仅修改以下选项
bind 0.0.0.0
requirepass ilinux
slaveof 192.168.48.7 6379
masterauth ilinux
]# systemctl start redis
]# redis-cli -a ilinux
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.48.17,port=6379,state=online,offset=77446,lag=1

Redis的主从配置相当简单,相对于mysql的冗杂。

Redis-HA的sentinel方案
试验环境如下
——————–
Arch : x86_64
——————–
centos 7.5
——————–
master 192.168.48.7
node01 192.168.48.17
node02 192.168.48.18

redis 的高可用方案基于自己的一套sentinel 集群来管理。

先配置主从,修改配置文件/etc/redis.conf

master节点
]#
]# vim /etc/redis.conf
bind 0.0.0.0
requirepass ilinux
node01节点
]# vim /etc/redis.conf
bind 0.0.0.0
requirepass ilinux
slaveof 192.168.48.7 6379
masterauth ilinux
node01节点
]# vim /etc/redis.conf
bind 0.0.0.0
requirepass ilinux
slaveof 192.168.48.17 6379
masterauth ilinux
]# systemctl start redis #三台主机全部启动redis服务。
]# redis-cli -a ilinux
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.48.17,port=6379,state=online,offset=77446,lag=1
slave1:ip=192.168.48.18,port=6379,state=online,offset=77446,lag=1
master_repl_offset:77585
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:77584

再配置HA,/etc/redis-sentinel.conf配置文件

]# vim /etc/redis-sentinel.conf #修改以下选项
bind 0.0.0.0 #否则要进行认证,保证protected-mode不运行
# sentinel myid 65ca85904ebbf0dbf0d88b18c53a5ffedbedc8f9 #要用到scp,保证myid不重复。
sentinel monitor mymaster 192.168.48.17 6379 2
sentinel auth-pass mymaster ilinux
]# scp /etc/redis-sentinel.conf node01:/etc/
]# scp /etc/redis-sentinel.conf node02:/etc/
]# systemctl start redis-sentinel.service

高可用试验验证

redis-cli -p 26379
127.0.0.1:26379> sentinel masters #查看master信息,
127.0.0.1:26379> sentinel slaves mymaster #mymaster 为集群名称
]# systemctl stop redis #停止主节点的redis服务。
]# redis-cli -p 26379
127.0.0.1:26379> sentinel masters #隔一段时间,查看信息。
10) “master,disconnected” #主节点失联
10)”s_down,master,disconnected #主观_down
10) “s_down,o_down,master,disconnected” #客观_down
10)”master” ##这里已经更换了主节点了。 #switch-master
#这里可以看日志更为详细
]# tail -f /var/log/redis/sentinel.log
2448:X 24 Jul 17:07:03.499 # +sdown master mymaster 192.168.48.7.18 6379
2448:X 24 Jul 17:07:03.540 # +new-epoch 3
2448:X 24 Jul 17:07:03.542 # +vote-for-leader 65ca85904ebbf0dbf0d88b18c53a5ffedbedc8f9 3
2448:X 24 Jul 17:07:03.562 # +odown master mymaster 192.168.48.7 6379 #quorum 3/2
2448:X 24 Jul 17:07:03.562 # Next failover delay: I will not start a failover before Tue Jul 24 17:13:04 2018
2448:X 24 Jul 17:07:04.427 # +config-update-from sentinel 65ca85904ebbf0dbf0d88b18c53a5ffedbedc8f9 192.168.1.18 26379 @ mymaster 192.168.1.18 6379
2448:X 24 Jul 17:07:04.427 # +switch-master mymaster 192.168.48.7 6379 192.168.48.18 6379
2448:X 24 Jul 17:07:04.427 * +slave slave 192.168.1.18:6379 192.168.48.7 6379 @ mymaster 192.168.48.18 6379
2448:X 24 Jul 17:07:04.427 * +slave slave 192.168.1.28:6379 192.168.48.17 6379 @ mymaster 192.168.48.18 6379
2448:X 24 Jul 17:07:34.431 # +sdown slave 192.168.1.18:6379 192.168.48.48.7 6379 @ mymaster 192.168.48.18 6379
2448:X 24 Jul 17:07:50.405 # -sdown slave 192.168.1.18:6379 192.168.48.7 6379 @ mymaster 192.168.48.18 6379

当然,redis-HA方案有好几种,我们也可以用keepalived+VIP来实现,将master、backup、slave分离开来,master、backup自动VIP切换。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104779

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code