- MongoDB
- Hbase
- Neo4J/InfoGrid
- Redis
- 对某个指定的客户端来说,读操作保证能返回最新的写操作结果
- 非故障的节点在合理的时间内返回合理的响应
- 当出现网络分区后,系统能够继续“履行职责”
- 在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性、可用性、分区容错性三者中的两个,另外一个必须牺牲。实际上只能保证CP或AP
- Redis是单线程,16个库,默认使用0号库
- 在一个长期运行的系统中使用redis,缓存数据非常多.如果突然缓存故障(内存数据丢失,down机),导致海量访问的请求涌入数据库.数据库承受不住(宕机--重启),可是海量请求并未消失.所以在缓存技术数据恢复之前,系统不可用,这种情况称为雪崩
- 缓存使用数据在内存,为了保证宕机数据不丢失,在运行期间使用持久化机制将内存数据存储在磁盘,可以在技术启动时重新加载磁盘数据
- 保存的的是k-v值
- 文件占用空间小
- 单独开启rdb才加载
- 批量操作,效率高
- 宕机后丢失数据多
- 保存的是执行命令
- 文件占用空间大
- aof加载优先级大于rdb
- 数据几乎同步,接近实时,备份可靠
- 增加了redis-server的压力
yum install -y gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel zlib zlib-devel gcc-c++ libtool yum -y groupinstall "Development Tools"
wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar -xvf redis-5.0.5.tar.gz make && make install
systemctl stop firewalld.service
systemctl disable firewalld.service
- 允许外界访问61行#bind 127.0.0.1
- 关闭保护模式80行protected no
- 开启后台守护进程128行daemonize yes
- 修改日志文件名称163行logfile "6379redis.log"
- 修改rdb持久文件名称237行dbfilename 6379dump.rdb
- 修改缓存清除策略597行maxmemory-policy volitle-lru
- 单节点缺陷:内存物理瓶颈导致上限有限,单节点一旦宕机则无法提供服务
- 数据分片的定义:当使用分布式集群时,通过横向扩张内存容量,使用某种计算逻辑处理数据,使多个节点处理的数据只是整体的一部分,每一部分都是一个分片
- 数据分片逻辑:来一条数据给第一个节点,第二条给第二个节点,第三条给第三个节点,依次循环
- Jedis分片逻辑原理是使用hash取余和hash一致性
- 原理:(key值.hashCode()&Integer.MAX_VALUE)%节点数量
- Jedis的hash取余将分片的对象封装到ShardedJedis中
- 缺点:会导致集群扩容,缩容数据的迁移量过大,不迁移就会造成数据未命中过大--雪崩
- 原理:基于一种hash散列计算(CRC16计算);将内存数据映射 到一个整数区间 0-(2^32-1)43亿;每个节点信息映射一个整数,每个key映射一个整数,key的整数顺时针寻找最近节点整数;Jedis在创建分片对象封装hash一致性时,将虚拟节点的个数设置为160 *weight;weight默认是1
- Jedis的hash一致性需要配置类GenericObjectPoolConfig和连接池ShardedJedisPool
- 数据分片的意义:将数据平均分配到各个节点,防止单个节点内存消耗过大
- 从节点挂载命令:slaveof 主节点ip 主节点端口号
- 主节点可读可写,从节点只可以读
- 没有故障转移和替换的机制,主从的复制无法完成
- 作用:哨兵进程是一个单独的,特殊的redis进程,和redis-server相互独立运行,可以实现对主从结构的监听和管理,实现故障转移的控制
- 原理
- 监听原理:初始化时访问主节点,调用info命令从主节 点获取所有从节点的信息,维护在内存中进行监控管 理,所有节点的状态都会通过哨兵进行维护
- 心跳机制:每秒钟通过rpc(远程通信协议)心跳检测 访问集群的所有节点,一旦发现心跳响应是空的,达 到一定时间判断节点故障宕机
- 投票机制:主节点宕机,选举一个从节点为新的主节点, 通过管理的权限,将这个节点的角色转化为master,将 其他集群节点挂接到这个心的主节点,必须通过投票 完成(哨兵也是集群),必须过半,投票的结果才能执行, 否则将会进入到重新判断循环
- 配置
- 修改sentinel.conf文件,至少生成3份
- protected-mode no
- port 26379
- sentinel monitor mymaster 主节点IP redis端口 2
- 分别执行3份redis-sentinel sentinel.conf命令
- 缺点
- Jedis无法实现哨兵的分布式
- 只解决了高可用问题,哨兵的集群消耗资源
- 作用:redis-cluster的结构和机制解决了前面技术架构的各种问题
- key-node强耦合(key可以从一个节点迁移到另一个节点不 影响数据的命中)
- 客户端代码不需要连接获取所有节点信息就可以操作分 布式集群(节点通信管理)
- 优势
- 节点两两互联
- 集群中节点与节点.部分角色两两互联,底层内部 二进制通信协议,优化传输速度(同步集群先关信 息)
- 优化哨兵逻辑
- 集群中要求最小的master数量是3,将哨兵的进程逻辑整合到master节点中,集群的高可用监听逻辑由master,投票由过半的master决定.因为基础两两互联,master才能实现相互监听管理
- 客户端连接1个节点获取集群所有信息
- 客户端基于两两互联,实现从一个节点,获取集群的所有节点的内容(JedisCluster的代码高可用)
- 槽道实现key和节点松耦合
- 集群中有新分片计算的逻辑--hash slot,底层计算(key.CRC16()%16384)key值会对应到一个槽道号[0-16383],master可以管理一批不同的槽道,实现key-->slot-->节点
- 槽道使用特性:客户端连接集群任意一个节点,发 送处理数据的命令,会计算key值对应的槽道号, 找到管理槽道号的节点,进行通知客户端转发 redirect
- 槽道(hash slot)原理
- 客户端连接节点发送命令,如set name zhangsan
- 任意个主节点接收到,如6379,计算槽道值,判断该值对应下标是0/1,如果是1,执行命令,如果是0(false),继续下一步
- 找到二进制数组拿到槽道值对应下标元素对应的节点信息
- 返回客户端重定向到正确节点
- 该节点接收命令,也要计算槽道值,判断对应下标值是0/1,得到是1(true),立即执行命令
- 配置
- 修改redis.conf文件,至少6个文件
- 之前修改过的配置不变
- appendonly yes
- appendfilename "6379appendonly.aof"
- cluster-enabled yes
- cluster-config-file nodes-6379.conf
- 分别执行6个redis.conf文件
- 再执行redis-cli --cluster create 192.168.150.102:6379 192.168.150.102:6380 192.168.150.102:6381 192.168.150.102:6382 192.168.150.102:6383 192.168.150.102:6384 --cluster-replicas 1;
- 动态添加主节点
- 先启动该节点配置文件
- redis-cli --cluster add-node 新主节点IP:新主节点端口 已存节点IP:已存节点端口
- 动态添加从节点
- 先启动该节点配置文件
- redis-cli --cluster add-node --slave --master-id 挂载主节点id 新主节点IP:新主节点端口 已存节点IP:已存节点端口
- 动态节点删除
- 只能删除从节点和没有槽道管理权的主节点
- redis-cli --cluster del-node 已存节点IP:已存节点端口 要删节点id
- 常见命令
- cluster info
- cluster nodes
- cluster meet <ip> <port>
- cluster forget <node_id>
- cluster replicate <node_id>
- cluster saveconfig
- cluster addslots <slot> [slot ... ]
- cluster delslots <slot> [slot ... ]
- clusterflushslots
- cluster setslot <solt> node <node_id>
- cluster setslot <slot> migrating <node_id>
- cluster setslot <slot> importing <node_id>
- cluster setlot <slot> stable
- cluster keyslot <key>
- cluster countkeysinslot <slot>
- cluster getkeysinslot <slot> <count>
- 启动服务redis-server redis.conf
- 启动客户端redis-cli -p 6379
- 退出客户端quit
- keys pattern(*)
- set key value
- get key
- del key
- exists key
- save
- ttl key
- expire key
- help
- 删除当前库数据flushdb
- 删除所有库数据flushall
- 可以包含任何数据,最大支持512M,文字/图片/对象
- 命令
- incr key
- decr key
- incrby key 步数
- decrby key 步数
- append key 追加内容
- mset k1 v1 k2 v2 k3 v3 ...
- mget k1 k2 k3 ...
- 双向列表,无序可重复
- 命令
- lpush key v1 v2 v3 ...
- rpush key v1 v2 v3 ...
- lrange key 起始下标 结束下标
- linsert key after pivot value
- linsert key before pivot value
- lrem key count value
- ltrim key 起始下标 结束下标
- lpop key
- rpop key
- llen key
- rpoplpush k1 k2
- K-V结构,适合存储Map结构数据和对象
- 命令
- hset key 属性 value
- hget key 属性
- hmset k1 属性 v1 k2 属性 v2 ...
- hmget k1 属性 k2 属性 ...
- hkeys key
- hvals key
- hlen key
- hdel key 属性
- hincrby key 属性 步数
- 集合,无序不可重复
- 命令
- sadd key v1 v2 v3 ...
- srem key v1 v2 v3 ...
- scard key
- sismember key value
- srandmember key 数字
- smembers key
- sinter k1 k2
- suinon k1 k2
- sdiff k1 k2
- 集合,有序不可重复
- 命令
- zadd key score value
- zcard key
- zscore key value
- zrank key value
- zrem key value
- zincrby key score value
- zrange key start end
- zcount key min max
- zremrangebyrank key start end
- zremrangebyscore key min max
- zinterstore 新集合名 key的个数 k1 k2 ..
- zunionstore 新集合名 key个数 k1 k2 ..
原文:https://www.cnblogs.com/fanqinglu/p/11921324.html