1、分布式存储 2、Redis介绍 3、redis安装及命令行接口使用 4、redis配置 5、sentinel机制 6、redis Cluster =============================================================================================================================== 1、分布式存储 有中心节点的分布式存储:中心节点记录了当前分布式中有多少个节点,中心节点上存储了数据的元数据,中心节点也称为 名称节点 namenode。有多个节点 分别存储数据的多个数据块。负责接收数据并将数据存储在分布式中的节点上是由客户端完成。 服务发现。Service discovery 无中心阶段的分布式存储:每个节点都可以帮助客户端完成资源加载 分布式存储中解决数据冗余的方案是在数据库的级别上进行冗余,将一个文件分成块,然后存储到不同的节点上。 任何分布式系统中只能实现三种特性中的两种,这三种特性包括 P分区容错性 、 A可用性 、 C一致性。 2、CAP 2000年,PODC(Principle of Distributed Computing)会议, Brewer Consistency{一致性}、Availablity{可用性}、Partition tolerence{分区容错性} C:多个数据节点上的数据一致; A:用户发出请求后的有限时间范围内返回结果; P:network partition,网络发生分区后,服务是否依然可用; CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。 3、BASE:BA,S,E,基于CAP演化而来 BA:Basically Available,基本可用; S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的; E:Eventually consistency,最终一致性; ================================================================================================================================ 1、介绍 1、Redis(Remote DIctionary Server),Redis是一个开源的、支持网络、基于内存、可选持久性的键值对存储数据库。Redis2009年首次发布。redis不同于 memcached的是可以将数据[持久性]的存储在磁盘,周期性的将内存中的数据写入到磁盘。 2、redis是一个单进程的服务器,[支持主从模式],此外还支持[Clustering分布式]。 3、Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息队列。它支持数据结构,如字符串,哈希,列表,集合,具有范围查询的排 序集 位图,超级日志和具有半径查询的地理空间索引。Redis具有内置复制,Lua脚本,LRU去除,支持事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性,并通过Redis Cluster自动分区。 2、Redis支持的数据结构 Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型不仅限于字符串,还支持如下抽象数据类型: 字符串列表 无序不重复的字符串集合 有序不重复的字符串集合 键、值都为字符串的哈希表 值的类型决定了值本身支持的操作。Redis支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。 3、NoSQL 1、Wide Column Store / Column Families 列式存储 hadoop/HBase Hypertable Amazon SimpleDB 2、Document Store 文档存储 MongoDB Elastic 3、Key Value / Tuple Store 键值存储 DynamoDB Redis Dynomite 4、Graph Databases 图式存储 Neo4J 5、Multimodel Databases 多模型存储 6、Object Databases 对象存储 7、Time Series / Streaming Databases 时序数据库 ============================================================================================================================ redis安装及命令行接口使用 1、安装 yum install redis 2、安装生成文件 /etc/logrotate.d/redis /etc/redis-sentinel.conf # sentinel配置文件 /etc/redis.conf # 主配置文件 /usr/bin/redis-benchmark # 性能评测工具 /usr/bin/redis-check-aof # 检测工具 /usr/bin/redis-check-rdb # 检测工具 /usr/bin/redis-cli # redis客户端接口程序 /usr/bin/redis-sentinel # redis高可用组件程序 /usr/bin/redis-server # redis主程序,监听在TCP/6379端口 /usr/bin/redis-shutdown # 关闭redis的程序 /usr/lib/systemd/system/redis-sentinel.service # 服务脚本 /usr/lib/systemd/system/redis.service # 服务脚本 /var/lib/redis # redis数据文件存储路径 /var/log/redis # 日志文件 3、启动服务 systemctl start redis.service Note:默认情况下,redis监听的端口是6379,地址是本地回环地址。 4、命令行接口程序使用 $ redis-cli 命令格式:Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]] 选项: -a # 指定密码 -p # 指定端口,默认为6379 -h # 主机名,默认为127.0.0.1 -s # 基于本地socket通信时使用socket文件 -r N # 将指定命令执行N此 子命令: help # 获取子命令帮助信息 help @GROUP_COMD # 获取某个子命令组的帮助,tab键可以自动切换 SELECT N # N为一个数字,表示选定某个数据库,数据库默认为16个 示例: {strings} SET name xuejinwei GET name MGET key value key value APPEND key value SET name xuejinwei NX # 表示键不存在时,才设定为新值 SETNX name xuejinwei # 表示键不存在时,才设定为新值 APPEND name dashuibi GET name STRLEN name # 判定指定key中字符串的长度 DEL key # 删除某个key的值 {Integers} 计数器 INCR count INCRBY count N DECR count DECRBY count N {List} RPUSH # 从右边添加一个元素 LPUSH # 从左边边添加一个元素 LPOP # 从左边删除一个元素 RPOP # 从右边删除一个元素 LINDEX # 按索引取出数据 LINSETRT # 按索引插入数据 LRANGE testlist N X # 查看指定范围下标的key所对应的元素 LPUSH testlist xue LINDEX testlist 0 LPUSH testlist jin wei LSET 11 testlist haah {Set} 集合 SADD # 创建一个集合 SMEMBERS SINTER SPOP # 弹出一个元素 SISMEMBER # 查看某个元素是否在集合内 SUNION # 查看一个集合 SADD setname xue jin wei SUNION w1 SISMEMBER w1 xue {Sorted Set} 有序集合 ZADD ZSCORE ZRANGE # ZRANGEBYSCORE {Hash} 哈希,由键值组成 HSET h1 name xuejinwei HGET h1 name HSET h1 age 4 HKEYS h1 # 获取所有键值 HVALS h1 HSTRLEN member age # 获取指定hash值中的某个键值的长度 {Bitmaps} {HyperLogLog} 和server相关的子命令: CONFIG SET parameter value # 设定配置项,并可以实时同步修改到配置文件中 CONFIG REWRITE # 将配置项写入配置文件 CONFIG GET parameter # 获取配置项信息 CONFIG RESETSTAT # 重置info中统计的数据信息 CLIENT LIST # 显示客户端连接的列表 CLIENT SETNAME connection-name # 给当前连接命名 CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no] # 断开一个连接 SHUTDOWN [NOSAVE|SAVE] # 关闭redis进程。save表示同步内存数据后在关闭进程 ========================================================================================================================= redis配置 1、配置文件 /etc/redis.conf daemonize no # 是否将redis运行为守护进程 supervised no # no|upstart|systemd|auto是否与本地超级进程进行信息交互 bind 127.0.0.1 # 监听地址。可以监听多个端口:bind 192.168.1.100 10.0.0.1 port 6379 # 监听端口 tcp-backlog 511 # 等待连接队列长度 unixsocket /tmp/redis.sock # 定义本地unix socket的路径 unixsocketperm 700 # scoket文件访问权限 timeout 0 # 客户端连接后,没有传输数据,空闲多长时间后超时断开连接。0表示不设定超时 tcp-keepalive 300 # tcp协议层的超时时长 loglevel notice # 日志级别 logfile /var/log/redis/redis.log # 日志文件 syslog-enabled no # 是否以syslog服务进行记录日志 syslog-ident redis syslog-facility local0 databases 16 # 使用多少个数据库 save 300 10 # save ,表示数据在多长时间内多少个键值改变则进行快照进行数据持久化 save "" # 禁用缓存持久化 rename-command CONFIG maxclients 10000 # 最大连接数 maxmemory # 最大的内存使用量 maxmemory-policy noeviction # volatile-lru:对设定了过期期限的键有限淘汰;allkeys-lru:表示对所有的键使用LRU算法淘汰算法; volatile-random:随机淘汰设定了过期期限的键的值;allkeys-random:随机淘汰所有键的值; volatile-ttl:有限淘汰过期期限进的键;noeviction:不淘汰任何键; maxmemort-samples 5 # 淘汰缓存时的采样比例。 slowlog-log-slower-then 10000 # 查询大于此值时认为是慢查询 slowlog-max-len 128 # 慢查询日志记录的最大条数 hash-max-ziplist-entries 512 # hash数据结构中,单个数据项最大出现的键值对 hash-max-ziplist-value 64 # 子键最大的字符字节数 client-output-buffer-limit normal 0 0 0 # 对不同身份客户端连接限制 client-output-buffer-limit slave 256mb 64mb 60 # 对slave客户端最多可以使用256m的缓冲,软限制为64m,最多可以使用60秒钟 2、认证功能配置 requirepass xuekaixin Note:认证 redis-cli -h 172.18.26.3 -a xuekaixin 172.18.26.3:6379> AUTH xuekaixin protected-mode yes # 是否启用受保护功能。没有使用bind监听地址和没有requirepass指定密码则自动启用受保护功能 3、清空数据库 FLUSHDB # 清空当前数据库 FLUSHALL # 清空所有数据库 4、事务功能 # 启用事务功能。将一个多个命令归并为一个操作按先后顺序提交给服务器并执行。redis时间一个乐观锁,WATCH,在EXEC命令执行之前,用于 监视其中的某个键数据是否被修改,如果被修改了,则服务器拒绝执行事务。但redis不支持回滚操作。 MULTI SET name xuejinwei SET age 12 EXEC 5、连接相关子命令 PING # 检查服务器是否在线 INFO # 查看与服务器相关的统计信息 CONFIG RESETSTAT # 重置info中统计的数据信息 MINITOR # 实时监控连接 6、 持久化配置 # redis使用两种机制实现数据持久化存储: RDB: snapshot,二进制格式的数据,保存数据集本身。周期性的将数据从内存同步保存到磁盘,数据文件为dump.rdb。客户端也合一使用SAVE或BGSAVE命令 启动快照保存机制,但此种方式是在主线程中保存快照,会阻塞所有连接。如果是自动保存到磁盘,则是主线程会fork出一个子线程,将数据保存到一 个临时文件中,然后将数据复制保存到磁盘上的文件中。每一次都是将数据集完整的保存到磁盘,而不是增量的保存数据集。 客户端手动保存数据的两种方式: SAVE:同步。会阻塞所有连接 BGSAVE:异步。不会阻塞所有连接 配置指令: save 300 10 # save ,表示数据在多长时间(单位为秒)内多少次键值改变则进行快照进行数据持久化 save "" # 禁用缓存持久化 stop-writes-on-bgsave-error yes # 在BGSAVE的过程中,发生错误,是否停止写操作 rdbcompression yes # 是否压缩rdb文件 rdbchecksum yes # 是否对rdb文件做校验码检测 dbfilename dump.rdb # rdb文件名称 dir /var/lib/redis # rdb文件保存目录 AOF: Append Only File,将操作命令以附加的方式添加的文件的尾部。{类似于MySQL中的二进制日志}。当redis重启时,可用过重新执行文件中的命令重建 数据库。 BGREWRITEAOF命令: AOF重写,不会读取正在读取正在使用的AOF文件,而是通过将内存中的数据以命令的方式保存到临时文件中,完成之后替换原有AOF文件。 重写过程: 1、redis主进程通过fork创建子进程 2、子进程根据redis内存中的数据创建数据库重建命令序列到临时文件中 3、父进程继续接收客户端请求,并会把这些请求中的写操作继续追加到原来的AOF文件中,新的写请求还会被放置于一个缓冲 对列中 4、父进程用临时文件替换旧的AOF文件 配置指令: appendonly no # 是否启用aof功能 appendfilename "appendonly.aof" # aof文件的名称 appendfsync everysec|always|no # always每次写操作发生,都立刻同步到磁盘;everysec,每秒执行一次同步操作;no自动 no-appendfsync-on-rewrite no # 重写过程中,对新请求的写操作,不做同步,而是暂存于内存中 auto-aof-rewrite-percentage 100 # 当前aof文件大小是上次重写时的2倍时,触发重写操作 auto-aof-rewrite-min-size 64mb # 避免初始的时候频繁重写aof文件,设置启动重写操作时aof文件的最小值 aof-load-truncated yes # # 注意: BGSAVE和BGREWRITEAOF不会同时执行,在redis服务器启动用于恢复数据时,会优先使用AOF 7、redis复制 1、一个主服务器可以有多个从服务器,支持链式复制,Master以非阻塞方式同步数据值slave,即master可以同时复制数据到多个从服务器。 主库检测从服务器,如果发现在线,则将内存中的数据同步至从服务器。从服务器收到数据后将数据保存到磁盘,然后load到内存中, 完成数据重建。 主服务器也可以将数据保存到磁盘上,然后将文件发送给从服务器,从服务器收到后将文件保存到磁盘,最后load到内存中。 2、配置过程 # slave配置 127.0.0.1:6379> SLAVEOF 172.18.26.3 6379 127.0.0.1:6379> CONFIG SET masterauth # 配置文件配置 vim /etc/redis.conf bind 127.0.0.1 172.18.26.4 slaveof 172.18.26.3 6379 slave-serve-stale-data yes # 当主服务器联系不到,从服务器接收到读请求时,是否使用可能是过期的数据响应 slave-read-only yes # 是否让从服务器只读 repl-diskless-sync no # 是否启用无磁盘的复制。no表示不启用;Disk-backed表示主节点新创建快照文件于磁盘中,然后发 送给其他从节点;Diskless表示主节点 新创建快照后直接通过网络套接字文件发送从节点,为了实 现并行复制,通常需要在复制启动前延迟一个时间段 repl-diskless-sync-delay 5 # 延迟时间 repl-ping-slave-period 10 # 对从服务器的探测时间间隔 repl-timeout 60 # 复制超时时间 repl-disable-tcp-nodelay no # 延迟发送整合更多字节的报文的等待时间介个 repl-backlog-size 1mb # 存放后援队列大小的空间 slave-priority 100 # 复制集群中,主机点故障,提升有限较高的从节点为主节点。{数字越小,优先级越高,0表示不参与选举} min-slaves-max-lag 10 # 从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作 min-slaves-to-write 3 # 主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作 masterauth # 向主服务器认证时的密码 =========================================================================================================================== sentinel机制 1、提供一个第三方节点,监控redis结构中的所有节点,当主节点宕机时,第三方节点能够将一个从节点提升为主节点。 为了避免sentinel节点宕机,应该 将sentinel节点也组织成集群。 sentinel节点间使用流言协议和投票协议决定是否故障迁移、与监测主节点是否在线。一组sentinel架构可以监控多组redis主从架构。 2、sentinel启动 redis-sentinel /path/to/file.conf redis-server /path/to/file.conf --sentinel 3、配置 /etc/redis-sentinel.conf port 26379 sentinel monitor MASTERNAME 172.18.26.3 6379 2 # MASTERNAME是名称,2为法定票数,即至少要有2个节点监控的此节点故障,才能认为故障 sentinel down-after-milliseconds MASTERNAME 30000 # 当sentinel连接不到主节点多长时间后,才进行故障转移,默认单位为毫秒 sentinel parallel-syncs MASTERNAME 1 # 执行故障转移后,刚刚设定了新的主服务器可以被多少个从服务器同时连接同步 sentinel failover-timeout MASTERNAME 180000 # 故障转移的超时时间。当主服务器故障时,故障转移的超时时长,超过这个时间,则认为故障转移失败 sentinel notification-script # 通知脚本,此脚本被自动传递多个参数 主观下线和客观下线: 所有sentinel节点认为主节点故障时,认为是客观下线;当不是全部sentinel节点认为主节点故障,则认为主节点主观下线。 4、相关命令 SENTINEL masters SENTINEL slaves SENTINEL rest # 重置所有状态 SENTINEL failover 5、sentinel配置示例 port 26379 dir /tmp sentinel monitor mymaster 172.18.26.3 6379 1 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 60000 logfile /var/log/redis/sentinel.log 6、查看状态测试 INFO sentinel # 查看sentinel状态 SENTINEL masters # 查看主节点状态信息 SENTINEL slaves mymaster # 查看从节点状态信息 7、测试 1、停止主节点 2、在sentinel节点使用SENTINEL masters命令查看主节点是否转移 3、在从节点使用INFO replication命令查看从节点的主节点是否发生转移 4、再次启动停掉的从节点,在sentinel节点使用INFO slaves mymaster查看停机的从节点是否以从节点的身份上线 ========================================================================================================================== redis Cluster 1、分布式数据库。通过分片机制进行数据分布,cluster内的每个节点仅有数据的一部分。redis是去中心化的分布式存储。 2、常用的实现redis分布式的方案 Redis Cluser (官方) # 无中心化的分片机制; Twemproxy (Twitter) # 代理分片机制; Codis (豌豆荚) # 代理分片机制;基于go和c语言开发,有后台界面。 Cerberus (芒果) 3、配置指令 cluster-enabled yes # 是否开启集群配置 cluster-config-file nodes-6379.conf # 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突。此配置文件需要编辑 任何内容。 cluster-node-timeout 15000 # 集群节点互连超时的阀值,单位毫秒 cluster-slave-validity-factor 10 # 进行故障转移时,salve会 申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成 为master。这个配置用来判断slave是否和master失联时间过长。 4、查看集群状态 CLUSETR INFO 5、配置示例 1、所有节点都配置 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 2、启动所有节点的redis 3、为每个节点都分配slots redis-cli -p 6379 -a xuekaixin CLUSTER ADDSLOTS {0..5500} redis-cli -p 6379 -a xuekaixin CLUSTER ADDSLOTS {5501..11000} redis-cli -p 6379 -a xuekaixin CLUSTER ADDSLOTS {11001..16383} 4、联系节点间互相通信(配置两两个节点都互相通信 ) CLUSTER MEET 172.18.26.2 6379 =========================================================================================================================