redis是内存高速缓存的数据库,redis内部有多个数据库(在redis-conf文件中有配置,用户可以通过select 下标来选择数据库),它保存的数据模型为key-value,支持String/List/Set/Sorted/Zset等类型。redis可将数据从内存持久化到硬盘,保证了数据安全,最重要的是使用缓存减轻了数据库的负载。
是典型的nosql 数据库服务器,采用KEY-VALUE存储结构,可以作为服务程序独立运行于自己的服务器主机,同时作为内存数据库,不用IO读取硬盘数据,能够快速响应请求。
特点:支持持久化,支持多种数据库结构,支持主从复制、免费
1、redis不仅仅支持简单的key/value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
2、redis支持master-slave(主-从)模式应用;
3、redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
4、redis单个vlaue的最大限制是1GB,memcached只能保存1MB的数据;
程序环境
安装:yum -y install redis
配置文件: /etc/redis.conf
主程序:/usr/bin/redis-server
端口: 6379/tcp
客户端:/usr/bin/redis-cli
数据目录:/var/lib/redis
redis-cli命令:
Usage: redis-cli [OPTIONS] [cmd [arg [arg …]]]
-h HOST
-p PORT
-a PASSWORD
-n DBID(0-15)
与Connection相关命令:
help @connection
AUTH
ECHO
PING
QUIT
SELECT dbid
清空数据库:
FLUSHDB:Remove all keys from the current database
清空当前数据库;
FLUSHALL:Remove all keys from all databases
清空所有数据库;
配置和使用Redis:
基本配置项
网络配置项
持久化相关配置
复制相关的配置
安全相关配置
Limit相关的配置
SlowLog相关的配置
INCLUDES
Advanced配置
通用配置项:
daemonize, supervised, loglevel, pidfile, logfile,
databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:
SELECT
网络配置项:
bind IP
port PORT
 protected-mode
tcp-backlog
unixsocket
timeout:连接的空闲超时时长;
安全配置:
requirepass
设置redis访问密码
密码连接方式 1: redis-cli -a 不推荐使用;
2: redis-cli 输入后 AUTH
Limits相关的配置:
maxclients
maxmemory
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法运行时的采样样本数;
SlowLog相关的配置:
slowlog-log-slower-than 10000 单位是微秒;
slowlog-max-len 128 SlowLog记录的日志最大条目;
ADVANCED配置:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
设置ziplist的键数量最大值,每个值的最大空间;
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
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
266 slaveof 192.168.243.8 6379
272 # masterauth
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 主配置选项
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 <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 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
266 slaveof 192.168.243.9 6379 指向新的主节点IP(这里新的主节点ip 是node3 192.168.243.9)
273 # masterauth
274 masterauth CENTOS
[root@node2 ~]#systemctl restart redis.service
为不受以上实验影响,先在node2、node3、node4这三个节点关闭
systemctl stop redis-sentinel.service
以及注释或者删除 273 #masterauth “CENTOS” 之后 restart redis.service
然后登陆检查各个节点 info,中replication 是否为master
[root@node3 ~]#redis-cli -a CENTOS
127.0.0.1:6379> info
127.0.0.1:6379> flushall
集群相关的配置:
cluster-enabled 是否开启集群配置
724 cluster-enabled yes
[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)执行才行