Linux笔记(Redis)

2 篇文章 0 订阅

详细介绍
一、编译安装redis步骤

  1. 下载redis源码

     wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    
  2. 解压缩

     tar -zxf redis-4.0.10.tar.gz
    
  3. 切换redis源码目录

     cd redis-4.0.10.tar.gz
    
  4. 编译源文件

     make 
    
  5. 编译好后,src/目录下有编译好的redis指令

  6. make install 安装到指定目录,默认在/usr/local/bin
    redis可执行文件

     ./redis-benchmark //用于进行redis性能测试的工具
     ./redis-check-dump //用于修复出问题的dump.rdb文件
     ./redis-cli //redis的客户端
     ./redis-server //redis的服务端
     ./redis-check-aof //用于修复出问题的AOF文件
     ./redis-sentinel //用于集群管理
    

启动redis服务端

启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:
redis-server redis.conf
默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。

使用redis客户端

#执行客户端命令即可进入
./redis-cli  
#测试是否连接上redis
127.0.0.1:6379 > ping
返回pong代表连接上了
//用set来设置key、value
127.0.0.1:6379 > set name "chaoge"
OK
//get获取name的值
127.0.0.1:6379 > get name
"chaoge"

二、发布订阅
在这里插入图片描述

  1. 发布订阅的命令

     PUBLISH channel msg
         将信息 message 发送到指定的频道 channel
     SUBSCRIBE channel [channel ...]
         订阅频道,可以同时订阅多个频道
     UNSUBSCRIBE [channel ...]
         取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
     PSUBSCRIBE pattern [pattern ...]
         订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所    有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有    以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
     PUNSUBSCRIBE [pattern [pattern ...]]
         退订指定的规则, 如果没有参数则会退订所有规则
     PUBSUB subcommand [argument [argument ...]]
         查看订阅与发布系统状态
     注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
    
  2. 订阅一个或者多个符合模式的频道

    窗口1,启动两个redis-cli窗口,均订阅 wang*频道(channel)

     127.0.0.1:6379> PSUBSCRIBE wang*
     Reading messages... (press Ctrl-C to quit)
     1) "psubscribe"
     2) "wang*"
     3) (integer) 1
     1) "pmessage"
     2) "wang*"
     3) "wangbaoqiang"
     4) "jintian zhennanshou "
    

    窗口2,启动redis-cli窗口,均订阅wang*频道

     127.0.0.1:6379> PSUBSCRIBE wang*
     Reading messages... (press Ctrl-C to quit)
     1) "psubscribe"
     2) "wang*"
     3) (integer) 1
     1) "pmessage"
     2) "wang*"
     3) "wangbaoqiang"
     4) "jintian zhennanshou "
    

    窗口3,发布者消息

     [root@web02 ~]# redis-cli
     127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
     (integer) 2
    

三、持久化

  1. RDB持久化:(将数据转化成二进制)

     1.配置文件设置
     	[redis-rdb.conf]
     	port 6379
     	daemonize yes
     	logfile /data/6379/redis.log   # 日志存储路径
     	dir /data/6379  			   # 指明redis的数据文件放在哪 
     	dbfilename redis-rdb.rdb       # (持久化的数据)会放在/data/6379下
     	save 900 1                     # rdb机制每900秒有1个修改记录
     	save 300 10                    # rdb机制每300秒有10个修改记录
     	save 60  10000                 # rdb机制每60秒有10000个修改记录
     2.实现过程
     	set name liyouxiu
     	set age 18
     	save   // 会在/data/6379 /下生成redis-rdb.rdb的文件
    
  2. AOF持久化:(记录服务器所有变更操作命令,追加到日志文件中)

     1.配置文件设置
     	appendonly yes
     	appendfsync always 		# 总是修改类的操作
     	appendfsync everysec  	# 每秒做一次持久化
     	appendfsync no  		# 依赖系统自带的缓存大小机制
     	
     	[redis-aof.conf]
     	port 6379
     	daemonize yes
     	logfile /data/6379/redis.log   # 日志存储路径
     	dir /data/6379  			   # 指明redis的数据文件放在哪 
     	appendonly yes
     	appendfsync everysec  		   # 每秒做一次持久化
    
  3. redis不重启,切换RDB备份到AOF备份

     1.redis-server redis-rdb.conf  // 这是在rdb持久化模式下
     2.切换rdb到aof
     	redis-cli
     	CONFIG set appendonly yes  # 用命令激活aof持久化(临时生效,注意写入到临时文件)
     	CONFIG SET save ""  # 关闭rdb持久化
     3.将aof持久化写入到配置文件
    

四、主从同步(主库是可读可写,从库只能读)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 配置文件格式

     [redis-6379.conf]
     port  6379
     daemonize yes
     pidfile /data/6379/redis.pid
     loglevel notice
     logfile "/data/6379/redis.log"
     dbfilename dump.rdb
     dir /data/6379
     protected-mode no
    
  2. 使用

    1.准备三个redis配置文件(只是端口不同)
    2.在redis-6380.conf,redis-6381.conf中添加:
    	slaveof 127.0.0.1 6379   # 指明主库的身份ip  echo "slaveof 127.0.0.1 6379" >> redis-6381.conf
    3.启动三个数据库实例
    
  3. redis主从复制,故障手动切换

     1.若杀死6379主库
     2.redis-cli -p 6380
     3.slaveof no one  // 不属于任何人的从库,自己以自己为主库
     4.redis-cli -p 6381
     5.SLAVEOF 127.0.0.1 6380  // 认端口号为6380的库为主人
    

五、redis 哨兵(保护redis主从集群,正常运转,当主库挂掉之后,自动从主库中挑选新的主库,进行同步)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 准备三个redis数据库实例,(三个配置文件,通过端口区分)

  2. 准备三个redis哨兵的配置文件

     touch redis-sentinel-26379.conf
     touch redis-sentinel-26380.conf
     touch redis-sentinel-26381.conf
     [redis-sentinel-26379.conf]
      port  26379	
      daemonize yes  // 后台运行
      dir /var/redis/data/
      logfile "26379.log"
      sentinel monitor mymaster 127.0.0.1 6379 2  // 2代表2个哨兵同意就确定主机已挂
      sentinel down-after-milliseconds mymaster 30000  // 若30秒后主库还未回复我,就换其他从机为主机
      sentinel parallel-syncs mymaster 1
      sentinel failover-timeout mymaster 180000
     
     其他两个配置:
     	sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
     	sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf
    
  3. 起动三个哨兵

     redis-sentinel redis-sentinel-26379.conf
     redis-sentinel redis-sentinel-26380.conf
     redis-sentinel redis-sentinel-26381.conf
    
  4. 检查哨兵通信状态

     redis-cli -p 26379 info sentinel
    
  5. 若杀死6379 进程的redis

     哨兵将6381默认为了主机
     若再重启6379,它会默认成从机
    

redis高可用故障实验

  1. 大致思路

    杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
    重新恢复旧的“master”节点,查看此时的redis身份

  2. 首先查看三个redis的进程状态

     ps -ef|grep redis
    

    检查三个节点的复制身份状态

    第一个

     [root@master tmp]# redis-cli -p 6381 info replication
    

    Replication

     role:slave
     master_host:127.0.0.1
     master_port:6380
    

    第二个

     [root@master tmp]# redis-cli -p 6380 info replication
    

    Replication

     role:master
     connected_slaves:2
     slave0:ip=127.0.0.1,port=6381,state=online,offset=54386,lag=0
     slave1:ip=127.0.0.1,port=6379,state=online,offset=54253,lag=0
    

    第三个

     [root@master tmp]# redis-cli -p 6379 info replication
    

    Replication

     role:slave
     master_host:127.0.0.1
     master_port:6380
    
  3. 此时,干掉master!!!然后等待其他两个节点是否能自动被哨兵sentienl,切换为master节点

     ps -ef|grep 6380   #干掉master进程
    
  4. 此时查看两个slave的状态

    精髓就是查看一个参数

     master_link_down_since_seconds:13
    

    稍等片刻之后,发现slave节点成为master节点!!

     [root@master tmp]# redis-cli -p 6379 info replication
    

    Replication

     role:master
     connected_slaves:1
     slave0:ip=127.0.0.1,port=6381,state=online,offset=41814,lag=1
    

六、 redis-cluster(分布式存储)

redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上

  1. 数据分布原理图

    在这里插入图片描述
    redis-cluster集群架构

    • 多个服务端,负责读写,彼此通信,redis指定了16384个槽。
    • 多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。
      ruby的脚本自动就把分配槽位这事做了

    分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
    常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。

  2. 常见分区规则:

    • 节点取余分区

      例如按照节点取余的方式,分三个节点
      1~100的数据对3取余,可以分为三类	
        	余数为0
        	余数为1
        	余数为2
      那么同样的分4个节点就是hash(key)%4			
      节点取余的优点是简单,客户端分片直接是哈希+取余
      
    • 一致性哈希分区

    • 虚拟槽分区(redis-cluster采用的方式)

        Redis Cluster采用虚拟槽分区
        虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
        Redis Cluster槽的范围是0 ~ 16383。
        槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
        每个节点负责一定数量的槽。
      
  3. 使用步骤

    步骤一、通过配置,redis.conf开启redis-cluster

    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes   #开启集群模式
    cluster-config-file nodes-7000.conf  #集群内部的配置文件
    cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
    

    redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。

    每个节点仅仅是端口运行的不同!

    [root@yugo /opt/redis/config 17:12:30]#ls
    redis-7000.conf  redis-7002.conf  redis-7004.conf
    redis-7001.conf  redis-7003.conf  redis-7005.conf
    

    #确保每个配置文件中的端口修改!!

    步骤二、运行redis实例

    创建6个节点的redis实例

     1855  2018-10-24 15:46:01 redis-server redis-7000.conf
     1856  2018-10-24 15:46:13 redis-server redis-7001.conf
     1857  2018-10-24 15:46:16 redis-server redis-7002.conf
     1858  2018-10-24 15:46:18 redis-server redis-7003.conf
     1859  2018-10-24 15:46:20 redis-server redis-7004.conf
     1860  2018-10-24 15:46:23 redis-server redis-7005.conf
    

    起6个服务

    redis-server redis-7000.conf
    redis-server redis-7001.conf
    redis-server redis-7002.conf
    redis-server redis-7003.conf
    redis-server redis-7004.conf
    redis-server redis-7005.conf
    

    步骤三、开启redis-cluster

    下载、编译、安装Ruby
    安装rubygem redis
    安装redis-trib.rb命令

    第一步、安装ruby
    	#下载ruby源码包
    		wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
    	#解压缩ruby源码包
    		tar -zxvf ruby-2.3.1.tar.gz
    	#编译且安装
    		./configure --prefix=/opt/ruby/
    		make && make install
    第二步、配置ruby环境变量
    	vim /etc/profile
    	写入如下配置
    		PATH=$PATH:/opt/ruby/bin
    第三步、安装ruby操作redis包
    	wget http://rubygems.org/downloads/redis-3.3.0.gem
    	gem install -l redis-3.3.0.gem
    第四步、安装redis-trib.rb命令
    	[root@yugo /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/
    

    步骤四、一键开启redis-cluster集群

    #每个主节点,有一个从节点,代表--replicas 1
    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    #集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系
    

    步骤五、查看集群状态

    redis-cli -p 7000 cluster info  
    redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息
    集群主节点状态
    redis-cli -p 7000 cluster nodes | grep master
    集群从节点状态
    redis-cli -p 7000 cluster nodes | grep slave
    

    步骤六、写入redis-cluster集群数据

    安装完毕后,检查集群状态

    [root@yugo /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:10468
    cluster_stats_messages_pong_sent:10558
    cluster_stats_messages_sent:21026
    cluster_stats_messages_ping_received:10553
    cluster_stats_messages_pong_received:10468
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:21026
    

    步骤七、测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数

    127.0.0.1:7000> set name chao     
    -> Redirected to slot [5798] located at 127.0.0.1:7001       
    OK
    127.0.0.1:7001> exit
    [root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000
    127.0.0.1:7000> ping
    PONG
    127.0.0.1:7000> keys *
    (empty list or set)
    127.0.0.1:7000> get name
    -> Redirected to slot [5798] located at 127.0.0.1:7001
    "chao"
    
  4. redis-python api

    1、对redis的单实例进行连接操作

    python3

    import redis
    r = redis.StrictRedis(host='localhost', port=6379, db=0,password='root')
    r.set('lufei', 'guojialei')
    >True
    r.get('lufei')
    >'bar'
    

    2、sentinel集群连接并操作

    [root@db01 ~]# redis-server /data/6380/redis.conf
    [root@db01 ~]# redis-server /data/6381/redis.conf
    [root@db01 ~]# redis-server /data/6382/redis.conf 
    [root@db01 ~]# redis-sentinel /data/26380/sentinel.conf &
    

    导入redis sentinel

     from redis.sentinel import Sentinel  
     # 指定sentinel的地址和端口号
     sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)  
     # 测试,获取以下主库和从库的信息
     sentinel.discover_master('mymaster')  
     sentinel.discover_slaves('mymaster')  
     # 配置读写分离
     # 写节点
     master = sentinel.master_for('mymaster', socket_timeout=0.1)  
     # 读节点
     slave = sentinel.slave_for('mymaster', socket_timeout=0.1)  
     # 读写分离测试   key     
     master.set('oldboy', '123')  
     slave.get('oldboy')  
     
      >'123'
    

    redis cluster的连接并操作(python2.7.2以上版本才支持redis cluster,我们选择的是3.5)
    https://github.com/Grokzen/redis-py-cluster

    3、python连接rediscluster集群测试

    使用python3

     from rediscluster import StrictRedisCluster  
     startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]  
     # Note: decode_responses must be set to True when used with python3  
     rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)  
     rc.set("foo", "bar")  
     >True   
     >'bar'
    

可能需要的命令:

  1. tail -f appendonly.aof // 实时监控 appendonly.aof内容变化

  2. sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf // (替换内容还未写入到文件)s:替换, g:gloab全局 (将redis-6379.conf文件中6379替换为6380写入redis-6380.conf 文件中)
    sed -i "s/6379/6380/g" redis-6379.conf > redis-6380.conf // 将替换内容写入到文件

  3. pkill redis-server // 杀掉所有与redis-server相关的进程

   redis-cli -p 6379 info  // 查看数据库详细信息
   redis-cli -p 6379 info replication  // 检查数据库主从信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值