redis安装及使用
本次安装环境:
centos6.8
redis-3.2.1
1、安装redis
下载redis-3.2.1.tar.gz
tar -xzf redis-3.2.1.tar.gz
mkdir /opt/redis
cp -rf /root/redis-3.2.1/* /opt/redis/
cd /opt/redis
make
make test #注意此时报错:"You need tcl 8.5 or newer in order to run the Redis test",处理方法:yum -y install tcl
cd src
make install
mkdir /opt/redis/bin
mkdir /opt/redis/etc
mv /opt/redis/redis.conf /opt/redis/etc/
cd /opt/redis/src
mv redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /opt/redis/bin/
至此redis的安装基本完成
2、调试
cd /opt/redis/bin
./redis-server #直接运行redis服务,测试是否可正常运行,查看端口是否正常监听,燃火ctrl-c中断
vi redis.conf #修改配置文件,常用配置信息见附录
/opt/redis/bin/redis-server /opt/redis/etc/redis.conf #通过配置文件启动redis
3、redis客户端的基本操作
redis-cli #不加任何参数,默认连接本地redis服务
redis-cli -h host -p port -a password #用于连接远端redis服务
redis-cli -n 库号 #进入编号为n的redis库中,redis默认有16个库号
select 库号 #进入redis后切换到其他库
ping #返回pong,该命令用于检测redis是否启动
keys * #查看当前redis库中所有key
set name yinlong #name为key,yinlong为value,set命令为创建一个key并存入相应的value
get name #get命令查询name这个key中的存入的value值
mget key1 kye2... #一次返回多个key的value
getrange name 0 2 #通过范围取值key的内容,此时返回'yin'
del name #del为删除name这个key
rename name name1 #给key重新命名,rename key newkey
type name #type key,获取key的数据类型
hmset long name 'yinlong' age '26' #创建一个hash,long为key,之后为键值对,可跟多个
hgetall long #获取long这个key中的所有hash值
hget long name #获取long这个key中的name的hash值
hdel long name #删除long这个key中的name的hash值
lpush class yinlong xiale tianyuan #lpush为创建一个列表并从左部插入新元素,class为key
rpush class shuaige #rpush为在class列表的右部插入新元素
lrange class 0 100 #查看class列表中从0到100的值
lindex class 7 #以索引的方式返回class列表中的值
lpop class #从列表中移除并返回第一个元素
rpop class #从列表中移除并返回最后一个元素
sadd shu lunyu mengzi daxue #sadd可以新建一个集合(set),shu为key后跟集合内的元素
smembers shu #查看shu集合内的元素
srem shu lunyu #移除集合中一个或多个元素
zadd wangzhan 1 ali 3 baidu 4 sina #zadd可以新建一个有序集合,wangzhan为key,后跟1(score)和ali(value)
zrange wangzhan 0 10 (withscores) #查看有序集合中的元素,可选择是否显示scores
zrem wangzhan ali #移除有序集合中的元素,可跟多个
4、redis主从同步、主从切换
此时环境状态:
A主机:192.168.137.50 master
B主机:192.168.137.51 slave
主从同步配置:
修改A主机配置文件:
bind 127.0.0.1 192.168.137.50 #使A机器redis可以监听192.168.137.50
通过配置文件启动A主机:
/opt/redis/bin/redis-server /opt/redis/etc/redis.conf
修改B主机配置文件:
bind 127.0.0.1 192.168.137.51
slaveof 192.168.137.50 6379 #开启slave模式,后跟master地址和端口
masterauth wang123 #master有密码的话,输入链接密码
通过配置文件启动B主机:
/opt/redis/bin/redis-server /opt/redis/etc/redis.conf
此时可通过客户端分别连接A、B主机的redis,使用info命令查看redis状态:
A主机:
role:master
connected_slaves:1
slave0:ip=192.168.137.51,port=6379,state=online,offset=43,lag=0
B主机:
role:slave
master_host:192.168.137.50
master_port:6379
master_link_status:up
若查看主从失败优先考录防火墙原因
在B主机执行keys *发现已经将A主机上的数据通过过来,进行测试:
A主机set name erzhu ------>B主机get name ------>'yinlong'
B主机set name1 erzhu -------->(error) READONLY You can't write against a read only slave.
说明主从同步已正常工作,且B主机只有读权限
主从自动切换配置:
redis中自带了sentinel(哨兵),其特点如下:
监控:不断地检查主服务器和从服务器的运行状态
通知:当主或从服务器出问题时sentinel可通过API向管理员或其他应用发送通知
自动故障迁移:当主发生故障时sentinel可自动将一个从提升为主,并且其它的从自动将切换新主
sentinel配置:(redis安装文件中自带了sentinel运行文件和配置文件)
mkdir /opt/redis/tmp
cp /opt/redis/sentinel.conf /opt/redis/etc/
vi /opt/redis/etc/sentinel.conf #配置文件主要参数及功能见附录
dir /opt/redis/tmp #设置工作目录
sentinel monitor master 192.168.137.51 6379 1
sentinel down-after-milliseconds master 10000
/opt/redis/bin/redis-sentinel /opt/redis/etc/sentinel.conf #启动sentinel服务
验证是否实现自动主从切换:
先验证A为主、B为从
杀掉A主机redis进程
观察sentinel输出信息:
+promoted-slave slave 192.168.137.51:6379 192.168.137.51 6379 @ mymaster 192.168.137.50 6379
将从晋升为主
此时查看B主机redis状态,发现以成为master,且可以插入新数据
再次开启A主机redis
观察sentinel输出信息:
+convert-to-slave slave 192.168.137.50:6379 192.168.137.50 6379 @ mymaster 192.168.137.51 6379
发现A主机redis启动,自动将A主机添加为B主机的从服务器
进入A主机redis查看状态为slave,无法插入新数据
5、redis集群
特点:无中心化,多节点共享数据。不支持处理多个key的命令,因为数据会在多个节点间移动,会导致不可预料的问题。
redis集群官方推荐最小规模为3主3从,注意集群中每台redis节点至少要有一台相应的从节点,否则当该节点故障时集群将无法正常使用。
搭建集群:本次试验采用最小规模的3主3从,环境如下:
A(主)192.168.137.50 6379
B(主)192.168.137.51 6379
C(主)192.168.137.52 6379
A(从)192.168.137.51 7000
B(从)192.168.137.52 7000
C(从)192.168.137.50 7000
集群搭建前准备:
yum -y install ruby-devel rubygems rpm-build #安装ruby环境,redis-trib.rb依赖ruby环境
安装ruby2.2.2或以上版本
gem install redis
创建redis主机:(分别在三台主机上创建redis配置文件,本次以一台为例)
cd /opt/redis/etc
vi redis_master.conf #此处只列出重要选项,可根据情况自行添加
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
dir /opt/redis/db
cluster-enabled yes #开启集群
cluster-config-file nodes_6379.conf #集群的配置文件首次启动自动生成
cluster-node-timeout 5000 #请求超时,设置5秒即可
appendonly yes #aof日志开启,有需要就开启,它会每次写操作都记录一条日志
logfile "/opt/redis/log/redis.log"
bind 192.168.137.50 #注意此IP不能绑定127.0.0.1,否则加入集群不成功
dbfilename dump_6379.rdb
appendfilename "appendonly_6379.aof"
vi redis_slave.conf
daemonize yes
pidfile /var/run/redis_7000.pid
port 7000
dir /opt/redis/db
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 5000
appendonly yes
logfile "/opt/redis/log/redis.log"
bind 192.168.137.50
dbfilename dump_7000.rdb
appendfilename "appendonly_7000.aof"
启动所有redis实例:
/opt/redis/bin/redis-server /opt/redis/etc/redis_master.conf
/opt/redis/bin/redis-server /opt/redis/etc/redis_slave.conf
ps -elf|grep redis
创建集群:
/opt/redis/src/redis-trib.rb create 192.168.137.50:6379 192.168.137.51:6379 192.168.137.52:6379 #将三台主加入集群
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.51:7000 192.168.137.50:6379 #分别将三台从按照对应关系加入
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.52:7000 192.168.137.51:6379
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.50:7000 192.168.137.52:6379
/opt/redis/src/redis-trib.rb check 192.168.137.50:6379 #随便指定一台redis主机即可查看集群中所有主机的状态
此时redis集群搭建完毕,该工具会自动分配槽点,连接任意一台主redis都可以对数据进行操作。但若存储该数据的槽点不在连接的主机上,该主机会返回对应的主机信息,并不会直接返回数据。
附录:
redis配置文件:
daemonize no #默认不是以守护进程的方式启动,可改成yes
pidfile /var/run/redis.pid #以守护进程的方式启动时pid文件位置
port 6379 #指定redis监听的端口,默认6379
bind 127.0.0.1 #绑定的主机ip
timeout 300 #连接redis服务的超时时间,指定为0则表示关闭此功能
loglevel verbose #指定日志级别,debug、verbose、notice、warning,默认为verbose
logfile "/redis/redis.log" #指定redis日志的存放位置,默认为标准输出
databases 16 #设置数据库的数量,默认数据库为0
save <seconds> <changes> #指定多长时间内有多少次更新则会将数据写入硬盘,可设置多个策略,默认值如下
save 900 1
save 300 10
save 60 10000
rdbcompression yes #存储至本地数据库时是否压缩数据,默认为yes,redis采用LZF压缩
dbfilename dump.rdb #指定本地数据库名,默认为dump.rdb
dir /opt/redis/db #指定本地数据库存放位置
slaveof <masterip> <masterport> #设置本机为slave服务时,指定master的ip及port
masterauth <master-password> #本机为slave,当master设置密码时连接所需密码
requirepass 密码 #设置redis的密码
maxclients 128 #同一时间最大客户连接数,默认0不限制
maxmemory <bytes> #redis最大内存限制,默认0不限制,当达到最大内存时只能读不能写
appendonly no #是否在每次更新数据后进行日志记录,默认为no
appendfilename appendonly.aof #指定更新日志文件名,默认为appendonly.aof
appendfsync everysec #日志更新条件, no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
vm-enabled no #是否启动虚拟内存机制,默认no
vm-swap-file /tmp/redis.swap #虚拟文件路径,默认/tmp/redis.swap,不可多个redis实例共享
vm-max-memory 0 #所有大于该值的数据会存入虚拟内存,为0时所有数据都会存入虚拟内存
vm-page-size 32 #redis的swap文件分成很多page,这里设置page的大小,一般为32或64
vm-pages 134217728 #设置page的数量,磁盘上每8个page消耗1byte内存
vm-max-threads 4 #访问swap文件的线程数,不要超过cpu核心数,为0则为串行操作
glueoutputbuf yes #向客户端应答时是否把较小的包合并为一个包发送,默认为开启
hash-max-zipmap-entries 512 #指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-value 64 #同上为一组功能
activerehashing yes #是否激活重置哈希,默认开启
include /path/to/local.conf #指定包含的其他配置文件
sentinel配置文件:
bind 0.0.0.0 #在一些云主机上屏蔽掉了IPv6,所以加上这一项可只监听IPv4
port xxxooo #端口
sentinel monitor master 127.0.0.1 6379 2 #指定要监控的主IP、端口,2表示有几个sentinel监控到主出问题时才判定down
sentinel down-after-milliseconds master 30000 #指定sentinel监控到主异常多长时间才判定down,单位毫秒
sentinel failover-timeout master 180000 #指定在该之间内未完成主从切换则认为本次failover失败
sentinel parallel-syncs master 1 #指定failover过程中同时重新配置的slave的个数,该值最好取小
sentinel notification-script #指定sentinel检测到异常时执行的脚本
sentinel auth-pass master password #password为redis有密码时添加访问密码