原文:https://www.jianshu.com/p/2f93bb771469
1.安装部署
- 安装编译环境
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
- 目录规划
#redis配置文件目录:/opt/redis_cluster/redis{PORT}/conf/ #redis日志文件目录:/opt/redis_cluster/redis{PORT}/logs/ #redis数据文件目录:/opt/redis_cluster/redis{PORT}/data/ #redis pid文件目录:/opt/redis_cluster/redis{PORT}/pid/ #redis程序目录:/opt/redis
- 创建目录
mkdir -pv /opt/redis_cluster/redis{PORT}/{conf,logs,data,pid}
- 下载并安装redis程序
[root@nginx redis]# wget http://download.redis.io/releases/redis-3.2.13.tar.gz [root@nginx redis]# tar xf redis-3.2.13.tar.gz -C /opt/ [root@nginx redis]# ln -sv /opt/redis-3.2.13.tar.gz /opt/redis [root@nginx redis]# cd /opt/redis/ [root@nginx redis]# make && make install
- 创建redis配置文件:/opt/redis_cluster/redis6379/conf/redis6379.conf
### 以守护进程模式启动 daemonize yes ### 绑定的主机地址 bind 192.168.1.92 ###关闭只能本地访问 protected-mode no ###添加认证密码 requirepass 123456 ### 监听端口 port 6379 ### 内存限制(最好是总内存的一半) maxmemory 5gb ### 超出内存之后的测率 #volatile-lru:根据LRU算法删除最老的key。 #allkeys-lru:根据LRU算法删除任何key。 #volatile-random:删除最老的key。 #allkeys->random:随机删。 #volatile-ttl:根据key的过期时间删除 #noeviction:谁也不删,没法再写 maxmemory-policy volatile-lru ### pid文件和log文件的保存地址 pidfile /opt/redis_cluster/redis6379/pid/redis6379.pid logfile /opt/redis_cluster/redis6379/logs/redis6379.log ### 本地数据库的目录 dir /opt/redis_cluster/redis6379/data ### 设置数据库的数量,默认数据库为0 databases 16 ###下面是持久化配置 ### 指定本地持久化文件的文件名,默认是dump.rdb dbfilename redis6379.rdb save 900 1 #900秒(15分钟)内有1个更改 save 300 10 #300秒(5分钟)内有10个更改 save 60 10000 #60秒内有10000个更改 appendonly yes #是否打开aof日志功能 appendfsync always #每1个命令,都立即同步到aof appendfsync everysec #每秒写1次 appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. appendfilename appendonly.aof #aof文件名
- 启动程序和关闭程序
#启动 [root@nginx redis_cluster]# redis-server redis6379/conf/redis6379.conf #关闭 [root@nginx redis_cluster]# redis-cli -h 192.168.1.92 shutdown
2.基本使用
- 全局命令
#查看所有键值 > keys * #查看键的总数 > DBSIZE #查看键是否存在 > Exists KEY #删除键 > Del key [key …] #键过期 # Redis支持对键添加过期时间,当超过过期时间后,会自动删除键. # 通过ttl命令观察键的剩余时间 #>0: 键剩余过期时间 #-1: 键没设置过期时间 #-2: 键不存在 > Expire key seconds #键的数据类型 > Type key #查看redis使用情况 > info
- 字符串数据类型
#设置键 > set key1 value1 #获取键 > get key1 #增加删除键的值 > set key2 100 > incr key2 (integer) 101 > get key2 "101" > incrby key2 10 (integer) 111 > get key2 "111" #一次性设置多个值 > mset key3 v3 key4 v4 key5 v5 > mget key3 key4 key5 #判断键是否存在和删除键,DEL命令返回1说明键存在,返回0说明不存在 > exists key5 > del key5 #获取键类型 > type key5 #键超时,-1不超时,-2键不存在,>0还剩多少秒过期 > ttl key5 #设置键超时 > expire key5 10 #取消键超时 > persist key5
- 列表数据类型
#向列表右侧添加数据 > rpush list1 A #向列表左侧添加数据库 > lpush list1 top1 #从列表中取范围内数据 > lrange list1 0 -1 #从列表左侧删除数据 > lpop list1 #从列表右侧删除数据 > rpop list1
- 哈希数据类型
#指令设置hash中的多个域 > hmset user:1000 username zhangya age 27 job it #取回单个域. > hget user:1000 username #取回一系列的值 > hmget user:1000 username age job #取回所有值 > hgetall user:1000
- 集合数据类型
#设置集合 > sadd set1 1 2 3 #获取集合 > smembers set1 #删除集合内的值 > srem set1 2 4 #取两个集合的差集 > sadd set1 1 2 3 4 > sadd set2 1 4 5 > sdiff set1 set2 1) "2" 2) "3" #取集合并集 > sinter set1 set2 1) "1" 2) "4" #取集合合集 > sunion set1 set2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
3.持久化
RDB 持久化优缺点 可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。 优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。 缺点:会有数据丢失 dir /data/6379 dbfilename dump.rdb save 900 1 #900秒(15分钟)内有1个更改 save 300 10 #300秒(5分钟)内有10个更改 save 60 10000 #60秒内有10000个更改 AOF 持久化优缺点 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 优点:可以最大程度保证数据不丢 缺点:日志记录量级比较大 appendonly yes #是否打开aof日志功能 appendfsync always #每1个命令,都立即同步到aof appendfsync everysec #每秒写1次 appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. appendfilename appendonly.aof #文件名 RDB和AOF文件同时存在时,会优先读取AOF文件。
4.安全认证
#是否只让本地访问redis数据库 protected-mode yes|no #绑定内网地址 bind 10.0.0.51 127.0.0.1 #添加认证密码,最常用 requirepass 123456 #认证节点密码 masterauth 12345678
5.主从复制
#每个从节点只能有一个主节点,主节点可以有多个从节点。开启复制有三种方法: 1.在配置文件中加入slaveof {masterHost} {masterPort} 随redis启动生效. 2.在redis-server启动命令后加入—slaveof {masterHost} {masterPort}生效. 3.直接使用命令:slaveof {masterHost} {masterPort}生效. #从节点断开复制命令 > slave of no one #查看主从复制状态 > Info replication #主从复制流程 1.从库发起同步请求 2.主库接收到请求,执行bgsave命令保存数据 3.主库将持久化的数据发送给从库 4.从库接收到主库的数据,先清空自己的数据 4.从库加载主库发来的数据
6.哨兵
- 在创建哨兵集群之前,需要先做好1主2从复制三个节点
- 创建哨兵服务存放目录,这里是在一台服务器上做的,生产需要分开服务器
]# mkdir -pv {redis26379,redis26380,redis26381}/{conf,logs,pid,data}
- 哨兵26379节点配置(需要密码的话添加sentinel auth-pass mymaster 12345678)
#26379端口哨兵节点配置 bind 192.168.1.92 port 26379 daemonize yes logfile "/opt/redis_cluster/redis26379/logs/redis26379.log" pidfile "/opt/redis_cluster/redis26379/pid/redis26379.pid" dir "/opt/redis_cluster/redis26379/data" #mymaster主节点别名 主节点 ip 和端口,判断主节点失败,两个sentinel节点同意 sentinel monitor mymaster 192.168.1.92 6379 2 #选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。 sentinel down-after-milliseconds mymaster 30000 #向新的主节点发起复制操作的从节点个数,1轮询发起复制 sentinel parallel-syncs mymaster 1 #故障转移超时时间 sentinel failover-timeout mymaster 180000
- 哨兵26380节点配置
bind 192.168.1.92 port 26380 daemonize yes logfile "/opt/redis_cluster/redis26380/logs/redis26380.log" pidfile "/opt/redis_cluster/redis26380/pid/redis26380.pid" dir "/opt/redis_cluster/redis26380/data" sentinel monitor mymaster 192.168.1.92 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 18000
- 哨兵26381节点配置
bind 192.168.1.92 port 26381 daemonize yes logfile "/opt/redis_cluster/redis26381/logs/redis26381.log" pidfile "/opt/redis_cluster/redis26381/pid/redis26381.pid" dir "/opt/redis_cluster/redis26381/data" sentinel monitor mymaster 192.168.1.92 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 18000
- 启动三台哨兵
]# redis-sentinel redis26380/conf/redis26380.conf ]# redis-sentinel redis26381/conf/redis26381.conf ]# redis-sentinel redis26379/conf/redis26379.conf
- 哨兵启动后,配置文件会发生变化
1)Sentinel节点自动发现了从节点,其余Sentinel节点 2)去掉了默认配置,例如parallel-syncs failover-timeout参数 3)添加了配置纪元相关参数
- 哨兵节点API命令
Info Sentinel Sentinel masters Sentinel master <master name> Sentinel slaves <master name> Sentinel sentinels <master name> Sentinel get-master-addr-by-name <master name> Sentinel failover <master name> Sentinel flushconfig
- 手动调整主节点
#Redis Sentinel存在多个从节点时,如果想将指定的从节点晋升为主节点,可以将其他从节点的slavepriority配置为0,但是需要注意failover后,将slave-priority调回原值. 1.查询命令:CONFIG GET slave-priority 2.设置命令:CONFIG SET slave-priority 0 3.主动切换:sentinel failover mymaster #db02/db03操作 redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0 redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0 #db01操作 redis-cli -h db01 -p 26379 Sentinel failover mymaster