本文共 10885 字,大约阅读时间需要 36 分钟。
摘要:
分布式系统存储特点
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 1save 300 10save 60 10000save 5 200000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /var/lib/redis############################## APPEND ONLY MODE ###############################appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yes登录,查询帮助,Redis3.2版本有个很好的显示帮助,Tab补全功能强大。
基本用法
~]# redis-cli 127.0.0.1:6379> AUTH ilinux #认证,和配置文件的requirepass相对应OK127.0.0.1:6379> helpredis-cli 3.2.10To 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 exit127.0.0.1:6379> help @list 127.0.0.1:6379> rpush weekdays Sunday127.0.0.1:6379> LPUSH weekdays Sun Mon Tue Wed127.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) 5127.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) 1127.0.0.1:6379> lindex weekdays 0"Sunday"127.0.0.1:6379> rpush weekdays Mon Tue Wed(integer) 4127.0.0.1:6379> lrange weekdays 1 31) "Mon"2) "Tue"3) "Wed"127.0.0.1:6379> llen weekdays(integer) 4127.0.0.1:6379> lrange weekdays 1 101) "Mon"2) "Tue"3) "Wed"127.0.0.1:6379> lrange weekdays 0 101) "Sunday"2) "Mon"3) "Tue"4) "Wed"127.0.0.1:6379> ltrim weekdays 1 2OK127.0.0.1:6379> lrange weekdays 0 101) "Mon"2) "Tue"@SET,无序集合,不会存在相同的集合元素,集合的交集、并集、差集运算。
127.0.0.1:6379> help @set
SADD key member [member ...]summary: Add one or more members to a setsince: 1.0.0SCARD key
summary: Get the number of members in a setsince: 1.0.0SDIFF key [key ...]
summary: Subtract multiple setssince: 1.0.0SDIFFSTORE destination key [key ...]
summary: Subtract multiple sets and store the resulting set in a keysince: 1.0.0SINTER key [key ...]
summary: Intersect multiple setssince: 1.0.0SINTERSTORE destination key [key ...]
summary: Intersect multiple sets and store the resulting set in a keysince: 1.0.0SISMEMBER key member
summary: Determine if a given value is a member of a setsince: 1.0.0SMEMBERS key
summary: Get all the members in a setsince: 1.0.0SMOVE source destination member
summary: Move a member from one set to anothersince: 1.0.0SPOP key [count]
summary: Remove and return one or multiple random members from a setsince: 1.0.0SRANDMEMBER key [count]
summary: Get one or multiple random members from a setsince: 1.0.0SREM key member [member ...]
summary: Remove one or more members from a setsince: 1.0.0SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elementssince: 2.8.0SUNION key [key ...]
summary: Add multiple setssince: 1.0.0SUNIONSTORE destination key [key ...]
summary: Add multiple sets and store the resulting set in a keysince: 1.0.0127.0.0.1:6379> SADD stus tom jerry lilei han××× lucy lily(integer) 6127.0.0.1:6379> SPOP stus 21) "lily"2) "lilei"127.0.0.1:6379> SCARD stus(integer) 4127.0.0.1:6379> smembers stus1) "jerry"2) "han×××"3) "tom"4) "lucy"127.0.0.1:6379> srem stus han×××(integer) 1127.0.0.1:6379> smembers stus1) "jerry"2) "tom"3) "lucy"127.0.0.1:6379> SADD stus2 tom jeryy lucy lilei(integer) 4127.0.0.1:6379> sinter stus stus21) "tom"2) "lucy"127.0.0.1:6379> sunion stus stus21) "jerry"2) "lilei"3) "jeryy"4) "tom"5) "lucy"127.0.0.1:6379> sdiff stus stus21) "jerry"127.0.0.1:6379> sdiff stus2 stus1) "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.17master相关配置
]# yum install -y redis
]# grep '^[^#]' /etc/redis.confbind 0.0.0.0 #保证protected-mode不运行requirepass ilinux ]# systemctl start redisslave相关配置
]# yum install -y redis
]# vim /etc/redis.conf #仅修改以下选项bind 0.0.0.0requirepass ilinuxslaveof 192.168.48.7 6379masterauth ilinux]# systemctl start redis]# redis-cli -a ilinux127.0.0.1:6379> INFO replicationrole:master
connected_slaves:1slave0:ip=192.168.48.17,port=6379,state=online,offset=77446,lag=1Redis的主从配置相当简单,相对于mysql的冗杂。
master 192.168.48.7
node01 192.168.48.17node02 192.168.48.18redis 的高可用方案基于自己的一套sentinel 集群来管理。
先配置主从,修改配置文件/etc/redis.conf
master节点
]# ]# vim /etc/redis.confbind 0.0.0.0requirepass ilinuxnode01节点]# vim /etc/redis.confbind 0.0.0.0requirepass ilinuxslaveof 192.168.48.7 6379masterauth ilinuxnode01节点]# vim /etc/redis.confbind 0.0.0.0requirepass ilinuxslaveof 192.168.48.17 6379masterauth ilinux]# systemctl start redis #三台主机全部启动redis服务。]# redis-cli -a ilinux127.0.0.1:6379> INFO replicationrole:master
connected_slaves:2slave0:ip=192.168.48.17,port=6379,state=online,offset=77446,lag=1slave1:ip=192.168.48.18,port=6379,state=online,offset=77446,lag=1master_repl_offset:77585repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:77584再配置HA,/etc/redis-sentinel.conf配置文件
]# vim /etc/redis-sentinel.conf #修改以下选项
bind 0.0.0.0 #否则要进行认证,保证protected-mode不运行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 #主观_down10) "s_down,o_down,master,disconnected" #客观_down10)"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 63792448:X 24 Jul 17:07:03.540 # +new-epoch 32448:X 24 Jul 17:07:03.542 # +vote-for-leader 65ca85904ebbf0dbf0d88b18c53a5ffedbedc8f9 32448:X 24 Jul 17:07:03.562 # +odown master mymaster 192.168.48.7 6379 #quorum 3/22448:X 24 Jul 17:07:03.562 # Next failover delay: I will not start a failover before Tue Jul 24 17:13:04 20182448:X 24 Jul 17:07:04.427 # +config-update-from sentinel 65ca85904ebbf0dbf0d88b18c53a5ffedbedc8f9 192.168.1.18 26379 @ mymaster 192.168.1.18 63792448:X 24 Jul 17:07:04.427 # +switch-master mymaster 192.168.48.7 6379 192.168.48.18 63792448:X 24 Jul 17:07:04.427 +slave slave 192.168.1.18:6379 192.168.48.7 6379 @ mymaster 192.168.48.18 63792448:X 24 Jul 17:07:04.427 +slave slave 192.168.1.28:6379 192.168.48.17 6379 @ mymaster 192.168.48.18 63792448: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 63792448: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切换。
转载于:https://blog.51cto.com/13870640/2172911