redis简介
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
单点redis 安装
必须使用root用户,不然会出现权限问题
1、上传redis-2.8.19.tar.gz
2、解压 tar -zxvf redis-2.8.19.tar.gz -C apps/
3、重命名 mv redis-2.8.19/ redis
4、进入目录 cd redis/
5、make test 如果最后结果如下则没有错误
\o/ All tests passed without errors! Cleanup: may take some time... OK make[1]: Leaving directory `/home/hadoop/apps/redis/src'
6、编译 sudo make,编译中会出现警告,可以忽略
7、安装 sudo make install,会出现建议执行test,可以忽略
8、查看默认安装的命令 ls /usr/local/bin/ | grep redis
9、启动,由于/usr/local/bin/默认就在系统环境变量,所以直接可以执行redis-server就可以默认启动了,或者 nohup redis-server &后台启动
10、 查看redis服务进程 ps | grep redis
11、启动客户端 redis-cli
12、输入info,此时可以查看redis相关信息,至此redis单机版已经安装成功
13、停止服务redis-cli shutdown
redis主从配置
Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构. 可以避免Redis单点故障,构建读写分离架构,满足读多写少的应用场景.
Redis复制功能的几个重要方面
1. 一个Master可以有多个Slave;
2. Redis使用异步复制。从2.8开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replication stream)被处理进度;
3. 不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构;
4. 复制在Master端是非阻塞模式的,这意味着即便是多个Slave执行首次同步时,Master依然可以提供查询服务;
5.复制在Slave端也是非阻塞模式的:如果你在redis.conf做了设置,Slave在执行首次同步的时候仍可以使用旧数据集提供查询;你也可以配置为当Master与Slave失去联系时,让Slave返回客户端一个错误提示;
6. 当Slave要删掉旧的数据集,并重新加载新版数据时,Slave会阻塞连接请求(一般发生在与Master断开重连后的恢复阶段);
7.复制功能可以单纯地用于数据冗余(dataredundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability):比如说,繁重的 SORT 命令可以交给附属节点去运行。
8. 可以通过修改Master端的redis.conf来避免在Master端执行持久化操作(Save),由Slave端来执行持久化。
9、默认情况下redis数据库充当slave角色时是只读的不能进行写操作。
具体安装配置
1、上面安装的redis作为master,在另外一台机器上安装一个redis
2、配置从节点有两种方式,一种是使用配置文件redis.conf,另外一种是使用客户端命令
命令行测试
通过命令行slaveof <masterip> <masterport>
INFO replication 查看当前redis的相关副本信息
# Replication #当前角色为slave role:slave #master的地址为m1 master_host:m1 #master的端口为6379 master_port:6379 #master没有启动所以这里为down,否则为up master_link_status:down
通过配置文件(redis.conf)指定
在从节点修改配置文件添加slaveof <masterip> <masterport>
# sections of this file) with a sensible value depending on your needs. # 3) Replication is automatic and does not need user intervention. After a # network partition slaves automatically try to reconnect to masters # and resynchronize with them. # slaveof m1 6379 # If the master is password protected (using the "requirepass" configuration # directive below) it is possible to tell the slave to authenticate before # starting the replication synchronization process, otherwise the master will # refuse the slave request.
带配置文件启动redis服务
redis-server redis.conf
此处也启动master redis服务
使用 INFO replication查看master 和 slave节点的相关信息
查看master节点的信息
127.0.0.1:6379> INFO replication # Replication #角色master role:master #1 slave 连接 connected_slaves:1 # slave的相关信息 slave0:ip=192.168.19.101,port=6379,state=online,offset=141,lag=0 master_repl_offset:141 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:140
查看slave的相关信息
127.0.0.1:6379> INFO replication # Replication #角色slave role:slave #masetr m1 master_host:m1 #端口 6379 master_port:6379 # 已连接上master则显示up master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_repl_offset:239 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379>
测试数据
在master端设置数据
127.0.0.1:6379> set key value
在slave查看
127.0.0.1:6379> get key "value"
ok,redis主从节点已经配置好了
Redis哨兵模式
如果我们在使用主从复制的情况下,Master服务器进行了down机的情况,我们的系统就不能再进行写的操作,所以此时redis在2.6版本引入了哨兵模式,但是并不稳定,2.8版本之后哨兵模式才稳定了起来。
顾名思义Redis的哨兵模式就是对redis系统进行实时的监控,其主要功能有下面两点
1.监测主数据库和从数据库是否正常运行。
2.当我们的主数据库出现故障的时候,可以自动将从数据库转换为主数据库,实现自动的切换。
具体安装配置
1、上面我们已经安装了两台redis服务一台master和一台slave,现在需要安装另外一台slave
2、安装成功后修改redis.conf配置配置文件
3、redis-server redis.conf启动redis服务
4、查看maser主节点的信息 INFO replication
127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=192.168.19.101,port=6379,state=online,offset=2381,lag=0 slave1:ip=192.168.19.102,port=6379,state=online,offset=2381,lag=0 master_repl_offset:2381 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:2380 127.0.0.1:6379>
5、修改哨兵模式配置文件
此处只修改一下几个参数
#哨兵使用的端口 port 26379 # 哨兵日志所在的目录 dir /home/hadoop/apps/redis/logs #对应的分别是名称 ip 端口 至少选举通过的票数 # 名称 master节点 端口 票数 sentinel monitor mymaster m1 6379 1 # 代表主节点多少毫秒没有响应就表示主节点挂掉了 sentinel down-after-milliseconds mymaster 5000 #哨兵进程重新配置从slave中选举一个master,有多少个通节点可以和新的master进行数据同步,为了避免所有的从节点不能进行查询服务应该设置一个小的数 sentinel parallel-syncs mymaster 2
注意票数不能大于slave的数量
6、启动哨兵进程
nohup redis-server sentinel.conf --sentinel &
7、查看哨兵信息,redis-cli -h m3 -p 26379 info sentinel, -h指定哨兵启动所在的机器的地址,哨兵可以启动多个,这里只启动一个
[hadoop@m3 redis]$ redis-cli -h m3 -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 #master 正常,所以status为ok master0:name=mymaster,status=ok,address=192.168.19.100:6379,slaves=2,sentinels=1
8、停止master,查看
[hadoop@m3 redis]$ redis-cli -h m3 -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 #master 停止,所以status为sdown master0:name=mymaster,status=sdown,address=192.168.19.100:6379,slaves=2,sentinels=1
此时master ip是192.168.19.100
9、停止master后不会立即切换的,因为默认超时时间是180000,3分钟,所以需要等三分钟后再次查看状态信息
10、3分钟后,查看状态
[hadoop@m3 redis]$ redis-cli -h m3 -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=mymaster,status=ok,address=192.168.19.102:6379,slaves=2,sentinels=1
此时master ip是192.168.19.102
错误1
运行 make test时报错
You need tcl 8.5 or newer in order to run the Redis test
解决办法,安装新的tcl sudo yum install -y tcl
错误2
make install报下面错误:
install: cannot create regular file `/usr/local/bin/redis-server’: Permission denied
原因是没有使用root用户,导致权限问题,使用root用户权限即可
错误3
/bin/sh: cc: command not found
原因是没有编译的时候需要gcc环境,因此只要安装gcc即可
错误4
error: #error “Newer version of jemalloc required”
原因是分配器问题,指定分分配器即可
make MALLOC=libc