第一部分:安装
1.单节点搭建
tar xf xxx
2.伪分布式搭建
redis-server --port 6380
redis-server --port 6381 --slaveof 127.0.0.1 6380
redis-server --port 6382 --slaveof 127.0.0.1 6380
redis-server --port 6380
redis-server --port 6381 --slaveof 127.0.0.1 6380
redis-server --port 6382 --slaveof 127.0.0.1 6380
redis-cli -p 638?
。 slaveof no one
让6381/6382由从变成主。如果让6381变成主,再通知6382。slaveof 127.0.0.1 6381
通知6382,作为6381的从。伪分布哨兵集群搭建:
vi s1.conf cp s2.conf s3.conf
port 26380,1,2
sentinel monitor jw 127.0.0.1 6380 2
redis-sentinel s1.conf s2.conf s3.conf
3.全分布式搭建
备:全分布式只在node02上搭建。所有的操作都在一个节点的不同的客户端窗口中进行。
rm -fr /opt/jw/reids
make && make PREFIX=/opt/jw/redis install
yum -y install ruby rubygems
gem install --local redis-3.3.0.gem
mkdir 7000 7001 7002 7003 7004 7005
1 cluster-enabled yes
2 port 7000
redis-server redis.conf redis.conf
ss -tanl | grep 700
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
redis-cli -p 7000 -c
127.0.0.1:7000> set k1 a
-> Redirected to slot [12706] located at 127.0.0.1:7002 // a模值在槽位在7002上会跳转到7002上。
OK
127.0.0.1:7002>
[root@node02 ~]# redis-cli -p 7001 -c
127.0.0.1:7001> get k1
-> Redirected to slot [12706] located at 127.0.0.1:7002
"a"
127.0.0.1:7002>
如果查看需要在7002的客户端上去拿。
测试,如果把7000挂掉,则7003会由备变成主。测试从7003的客户端可以查看7000上的数据。
第二部分:带哨兵的集群架构细节分析
集群的分析:
由于单点故障/瓶颈,因此需多个节点负载
一变多(一致性<弱一致,最终一致性>)->可用性
最终一致性:一部分角色确认 -> 网络分区(脑裂)->过半机制
镜像:数据容量不变
切片:横向扩展
Cap原则
集群分类
主从复制 Replication:镜像:增删改(主<退化到单节点>)查询负载到从节点
高可用 Sentinel
分布式 twemproxy:切片
集群 Cluster
主从复制 Replication
3.只有Master可以执行写命令,Slaves只能执行读命令
4.从服务器执行客户端发送的读命令,比如GET、LRANGE、SMEMMBERS、HGET、ZRANGE等等
主从复制创建
redis-server --slaveof
,配置当前服务称为某Redis服务的Slave redis-server --port 6380 --slaveof 127.0.0.1 6379
SLAVEOF host port命令,将当前服务器状态从Master修改为别的服务器的Slave
redis > SLAVEOF 192.168.1.1 6379,将服务器转换为Slave
redis > SLAVEOF NO ONE ,将服务器重新恢复到Master,不会丢弃已同步数据
主从复制问题
监控 Monitoring
Sentinel会不断检查Master和Slaves是否正常
每一个Sentinel可以监控任意多个Master和该Master下的Slaves
Sentinel网络
监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息
右图中3个Sentinel监控着S1和它的2个Slave
服务器下线
Sentinel 配置文件
至少包含一个监控配置选项,用于指定被监控Master的相关信息
指定sentinel端口号:
port 26380(Sentinel默认端口号为26379)
Sentinel monitor
,
例如:sentinel monitor mymaster 127.0.0.1 63802
监视mymaster的主服务器,服务器ip和端口,将这个主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移
Sentinel会根据Master的配置自动发现Master的Slaves
Sentinel 配置举例
执行以下两条命令,将创建两个监视主服务器s1的sentinel实例:
$redis-sentinel sentinel1.conf
$redis-sentinel sentinel2.conf
其中sentinel1.conf的内容为:
port 26379
Sentinel monitor s1 127.0.0.1 6380 1
sentinel2.conf的内容为:
Port 26380
Sentinel monitor s1 127.0.0.1 6379 2
Sentinel 总结
第三部分:全分布式集群架构细节分析
在redis3.0版本之前推特公司自己研发了集群版redis。主要的是利用代理服务。
分析:
redis3.0版本正式版
简介:采用取模方式但是优化的地方在于,采用槽位的思想
一共有16384个槽位(slot),然后这些槽位被几个几点分割。比如节点1从0-1000。节点2从1001-1600,节点3从16001-16383.这样,如果增加了节点,只需要把操作再分配以下就可以了。不想推特的做法,还需要重新计算取模的方式。在数据迁移、倾斜的时候都会因为之前知道key和槽位的关系。就会好办些。
Redis集群分片
Redis集群节点复制
Redis集群故障转移
Redis集群Redirect转向
redis集群的缺点:
不支持类似MR的suffle的过程。比如不同节点都有相同set集合。redis让2者不可以汇聚,既不可以交并差操作。群杜绝了它们之间对的沟通。防止影响其负载均衡的能力。
第四部分:原理及简介
1.redis的引入
介绍在数据没出来前都是通过文件系统的存储数据的。但是存在如果文件中的数据过多,读取过慢情况,因此产生了数据库的概念。有2大知识点支持数据的发展。第一是:DP(datapage),有很多的DP,通过切片的方式存储大文件的数据。每个DP是4k。(4K,是因为磁盘的最小单位是扇区,每个扇区最大是512个字节)。比如导入数据库的文件,都是被切割成很多4k的小块存储的。
2.redis简单介绍
2.1.开源的(BSD协议),(genu)使用ANSI C 编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库
2.2.redis把数据分为冷数据和热数据。 热数据放在内存里,冷数据放在磁盘中。客户端访问服务器,如果第一次第一,内存中没有此数据。服务器读取磁盘上表结构的数据。把数据放入内存中,下次访问直接走内存。redis机制中,会对数据设置过期时间。然后定期查询,时间轮循的方式。(类似的内存数据库, NameNode,DataNode,memcache)。其中redis比memcache火的原因,mencache只支持String类型,而redis支持海量类型。
2.3.支持数据结构类型丰富,有如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
丰富的支持主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript
2.4.用途:缓存(StackOverFlow)、数据库(微博)、消息中间件(微博)
2.5. 世界上任何数据类型都可以由以下几种(组合)方式表达
a=1 a=k
a=(1,3,98)
a={x=11,w=88}
2.6.可视化客户端
RedisDesktopManager