什么是redis
redis是内存高速缓存的数据库,redis内部有多个数据库(在redis-conf文件中有配置,用户可以通过select 下标来选择数据库),它保存的数据模型为key-value,支持String/List/Set/Sorted/Zset等类型。redis可将数据从内存持久化到硬盘,保证了数据安全,最重要的是使用缓存减轻了数据库的负载。
是典型的nosql 数据库服务器,采用KEY-VALUE存储结构,可以作为服务程序独立运行于自己的服务器主机,同时作为内存数据库,不用IO读取硬盘数据,能够快速响应 请求。
特点:支持持久化,支持多种数据库结构,支持主从复制、免费
redis特点
- 1、redis不仅仅支持简单的key/value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
- 2、redis支持master-slave(主-从)模式应用;
- 3、redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
- 4、redis单个vlaue的最大限制是1GB,memcached只能保存1MB的数据;
redis 是一种非关系型数据库(NoSQL),MongoDB和Memcache 也是非关系型数据库但并不支持数据持久化
redis支持数据的备份,即master-slave模式的数据备份,同时支持数据的持久化。
redis、memcache、mongoDB 对比
1、性能
都比较高,性能对我们来说应该都不是瓶颈
总体来讲,TPS方面redis和memcache差不多,要大于mongodb
2、操作的便利性
memcache数据结构单一
redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数
mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富
3、内存空间的大小和数据量的大小
redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)
memcache可以修改最大可用内存,采用LRU算法
mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起
4、可用性(单点问题)
对于单点问题,
redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,
所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。
一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡
Memcache本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。
mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。
5、可靠性(持久化)
对于数据持久化和数据恢复,
redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响
memcache不支持,通常用在做缓存,提升性能;
MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性
6、数据一致性(事务支持)
Memcache 在并发场景下,用cas保证一致性
redis事务支持比较弱,只能保证事务中的每个操作连续执行
mongoDB不支持事务
7、数据分析
mongoDB内置了数据分析的功能(mapreduce),其他不支持
8、应用场景
redis:数据量较小的更性能操作和运算上
memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)
MongoDB:主要解决海量数据的访问效率问题
安装
[root@node2 ~]#yum -y install redis
[root@node2 ~]#systemctl start redis.service
6379 端口
[root@node2 ~]#redis-cli 命令行客户端工具
[root@node2 ~]#redis-cli -h 命令行帮助
[root@node2 ~]#vim /etc/redis.conf
62 bind 0.0.0.0
481 requirepass CENTOS
redis主从复制实验
主节点
node2 192.168.243.8
从节点
node3 192.168.243.9
node4 192.168.243.10
三台主机时间同步 都安装redis
在node3上修改主配置文件
[root@node3 ~]#vim /etc/redis.conf 配置完后保存重启服务
61 #bind 127.0.0.1
62 bind 0.0.0.0 打开监听Ip
265 # slaveof <masterip> <masterport>
266 slaveof 192.168.243.8 6379
272 # masterauth <master-password>
273 masterauth CENTOS 如果主节点密码认证(密码为CENTOS),需要在从节点开启此项
我们在主节点node2上可以查看到 从节点的连接
127.0.0.1:6379> SELECT 15
127.0.0.1:6379[15]> CLIENT LIST
或者 执行127.0.0.1:6379[15]> info replication 查看
或者在node3上查看 192.168.243.9:6379[15]> info
在node4上修改主配置文件
用另外一种方法配置从节点
192.168.243.10:6379> SLAVEOF 192.168.243.8 6379
192.168.243.10:6379> CONFIG SET masterauth CENTOS
192.168.243.10:6379> INFO REPLICATION 查看状态
验证:
我们在主节点建个key
127.0.0.1:6379[15]> select 0
127.0.0.1:6379> set testkey "hi redis"
在任意从节点查看
192.168.243.9:6379> get testkey
"hi redis"
sentinel:
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
/etc/redis-sentinel.conf 主配置选项
port 26379
加上
5 port 26379
6 bind 0.0.0.0
sentinel monitor <master-name> <ip> <redis-port> <quorum>
<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;
53 sentinel monitor mymaster 192.168.243.8 6379 2
sentinel auth-pass <master-name> <password>
73 sentinel auth-pass mymaster CENTOS
sentinel down-after-milliseconds <master-name> <milliseconds>
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
83 sentinel down-after-milliseconds mymaster 5000 5秒 默认为30秒
sentinel parallel-syncs <master-name> <numslaves>
指在failover过程中,能够被sentinel并行配置的从节点的数量;
91 sentinel parallel-syncs mymaster 3
sentinel failover-timeout <master-name> <milliseconds>
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
116 sentinel failover-timeout mymaster 180000 默认为3min
sentinel notification-script <master-name> <script-path>
通知脚本,此脚本被自动传递多个参数;
我们在任意一个node节点按照以上步骤简单配置,然后scp 到其他节点上
[root@node2 ~]#scp /etc/redis-sentinel.conf node3:/etc/
然后我们在这三个节点上 systemctl restart redis-sentinel.service
验证:
连接方式 [root@node2 ~]#redis-cli -h 192.168.243.8 -p 26379
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
测试;
模拟把主节点宕了
[root@node2 ~]#systemctl stop redis.service
[root@node2 ~]#redis-cli -h 192.168.243.8 -p 26379
192.168.243.8:26379> SENTINEL masters 查看主节点
查看到node2 从节点变为主节点了
192.168.243.8:26379> SENTINEL slaves mymaster 查看从节点
如何修复宕机的原来的主节点node2?
[root@node2 ~]#vim /etc/redis.conf
265 # slaveof <masterip> <masterport>
266 slaveof 192.168.243.9 6379 指向新的主节点IP(这里新的主节点ip 是node3 192.168.243.9)
273 # masterauth <master-password>
274 masterauth CENTOS
[root@node2 ~]#systemctl restart redis.service
CLuster:
为不受以上实验影响,先在node2、node3、node4这三个节点关闭
systemctl stop redis-sentinel.service
以及 注释或者删除 273 #masterauth “CENTOS” 之后 restart redis.service
然后登陆检查各个节点 info,中replication 是否为master
Replication
role:master
[root@node3 ~]#redis-cli -a CENTOS
127.0.0.1:6379> info
127.0.0.1:6379> flushall
集群相关的配置:
cluster-enabled 是否开启集群配置
724 cluster-enabled yescluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
去掉注释
cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
去掉注释
cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
[root@node2 ~]#vim /etc/redis.conf 按照以上配置设置,然后在node3和node4节点相同配置
[root@node2 ~]#scp /etc/redis.conf node3:/etc/
[root@node2 ~]#scp /etc/redis.conf node4:/etc/
然后再这三个节点 systemctl restart redis.service
配置过程:
(1) 设置配置文件,启用集群功能;
cluster-enabled yes
(2) 启动redis后为每个节点分配slots;
CLUSTER ADDSLOTS
注意:每个slot要独立创建;可用范围是0-16383,共16384个;
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
[root@node2 ~]#redis-cli -a CENTOS cluster addslots {0..5000}
[root@node2 ~]#redis-cli -a CENTOS cluster INFO 查看
[root@node2 ~]#redis-cli -a CENTOS -h 192.168.243.9 cluster addslots {5001..10923}
[root@node2 ~]#redis-cli -a CENTOS -h 192.168.243.10 cluster addslots {10924..16383}
(3) 设定集群成员关系;
CLUSTE MEET
127.0.0.1:6379> CLUSTER MEET 192.168.243.9 6379
127.0.0.1:6379> CLUSTER MEET 192.168.243.10 6379
验证;
当我们在node2 执行
127.0.0.1:6379> set testkey1 hi
OK
127.0.0.1:6379> set testkey2 hello
(error) MOVED 14758 192.168.243.10:6379 根据提示,我们需要在node4(192.168.243.10)执行才行