• redis--基础以及--集群架构


    Redis简介:

     Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。

    Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

    为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。同时,Redis支持数据的持久化,你可以每隔一段时间将数据集转存到磁盘上(snapshot),或者在日志尾部追加每一条操作命令(append only file,aof)。

    Redis同样支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的事物支持、发布订阅 ( pub/sub)、管道(pipeline)和虚拟内存(vm)等 。
    Redis具有丰富的客户端,支持现阶段流行的大多数编程语言。

    1.Redis安装流程

    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    tar -xvf redis-4.0.10.tar.gz 
    cd redis-4.0.10
    make
    make install
    nohup redis-server &
    注:redis-server默认启动端口是6379,没有密码
    如果不使用默认配置文件,启动时可以加上配置文件
    nohup redis-server  /redis-2.8.17/redis.conf &
    redis-cli -p  ###进入redis##指定端口

    1.2.Redis 客户端验证

    127.0.0.1:6379> ping
    PONG
    ##设置键值
    127.0.0.1:6379> set var "hello word"                   
    OK 
    ##获取键值
    127.0.0.1:6379> get var                               
    "hello word"
    ##删除键值
    127.0.0.1:6379> del var
    ##设定有效期
    127.0.0.1:6379> setex var 10 "hello word"
    ##用EXPIRE key s 设定过期时间  毫秒用PEXPIRE 
    127.0.0.1:6379> EXPIRE test11 300
    ###用TTL key 查看过期时间  毫秒用PTTL
    127.0.0.1:6379> TTL test11
    ###用PERSIST key 取消过期时间
    127.0.0.1:6379> PERSIST test11
    序号	Redis keys命令及描述
    1	DEL key
    该命令用于在 key 存在是删除 key。
    2	DUMP key 
    序列化给定 key ,并返回被序列化的值。
    3	EXISTS key 
    检查给定 key 是否存在。
    4	EXPIRE key seconds
    为给定 key 设置过期时间。
    5	EXPIREAT key timestamp 
    EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
    6	PEXPIRE key milliseconds 
    设置 key 的过期时间亿以毫秒计。
    7	PEXPIREAT key milliseconds-timestamp 
    设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
    8	KEYS pattern 
    查找所有符合给定模式( pattern)的 key 。例如keys * 返回所有的key
    9	MOVE key db 
    将当前数据库的 key 移动到给定的数据库 db 当中。
    10	PERSIST key 
    移除 key 的过期时间,key 将持久保持。
    11	PTTL key 
    以毫秒为单位返回 key 的剩余的过期时间。
    12	TTL key 
    以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
    13	RANDOMKEY 
    从当前数据库中随机返回一个 key 。
    14	RENAME key newkey 
    修改 key 的名称
    15	RENAMENX key newkey 
    仅当 newkey 不存在时,将 key 改名为 newkey 。
    16	TYPE key 
    返回 key 所储存的值的类型。
    

      

    1.3.Redis关闭程序

    redis-cli shutdown
    systemctl stop redis              ####如果yum安装的用启动程序关闭
    注:如果设置上密码后,单纯的redis-cli是关不掉的,必须加上ip、port、passwd
    redis-cli -h host -p port -a passwd shutdown
    

    1.4.退出客户端

    localhost:6379> QUIT
    

    1.5.设立密码,并访问连接

    打开redis.conf找到requirepass,去掉默认,修改
    requirepass test111
    nohup  redis-server /data/ops/app/redis-4.0.10/redis.conf &  ##指定配置文件
    redis-cli -h 127.0.0.1 -p 6379 -a test111  ##当设置密码后就得这样输入
    auth test111
    OK 如果想远程机子访问这个redis需要改配置文件redis.conf protected-mode no ##改为no #bind 127.0.0.1 ###注释只本地访问 ###改完重启redis后就可以访问了 # redis-cli -h 10.240.17.103 -p 6379 -a test111 ##远程访问

    1.6.查看redis数据统计信息 

    1.5 查看redis数据库统计信息
    
    在cli下执行info
    
    相关含义:
    
    Mrds:6379> info
    
    # Server
    
    redis_version:2.8.19 ###redis版本号
    
    redis_git_sha1:00000000 ###git SHA1
    
    redis_git_dirty:0 ###git dirty flag
    
    redis_build_id:78796c63e58b72dc
    
    redis_mode:standalone ###redis运行模式
    
    os:Linux 2.6.32-431.el6.x86_64 x86_64 ###os版本号
    
    arch_bits:64 ###64位架构
    
    multiplexing_api:epoll ###调用epoll算法
    
    gcc_version:4.4.7 ###gcc版本号
    
    process_id:25899 ###服务器进程PID
    
    run_id:eae356ac1098c13b68f2b00fd7e1c9f93b1c6a2c ###Redis的随机标识符(用于sentinel和集群)
    
    tcp_port:6379 ###Redis监听的端口号
    
    uptime_in_seconds:6419 ###Redis运行时长(s为单位)
    
    uptime_in_days:0 ###Redis运行时长(天为单位)
    
    hz:10
    
    lru_clock:10737922 ###以分钟为单位的自增时钟,用于LRU管理
    
    config_file:/etc/redis/redis.conf ###redis配置文件
    
    # Clients
    
    connected_clients:1 ###已连接客户端的数量(不包括通过从属服务器连接的客户端)
    
    client_longest_output_list:0 ###当前连接的客户端中最长的输出列表
    
    client_biggest_input_buf:0 ###当前连接的客户端中最大的输出缓存
    
    blocked_clients:0 ###正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 需监控
    
    # Memory
    
    used_memory:2281560 ###由 Redis 分配器分配的内存总量,以字节(byte)为单位
    
    used_memory_human:2.18M ###以更友好的格式输出redis占用的内存
    
    used_memory_rss:2699264 ###从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致
    
    used_memory_peak:22141272 ### Redis 的内存消耗峰值(以字节为单位)
    
    used_memory_peak_human:21.12M ###以更友好的格式输出redis峰值内存占用
    
    used_memory_lua:35840 ###LUA引擎所使用的内存大小
    
    mem_fragmentation_ratio:1.18 ###used_memory_rss 和 used_memory 之间的比率
    
    mem_allocator:jemalloc-3.6.0
    
    ###在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。
    
    当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。
    
    # Persistence
    
    loading:0 ###记录服务器是否正在载入持久化文件
    
    rdb_changes_since_last_save:0 ###距离最近一次成功创建持久化文件之后,经过了多少秒
    
    rdb_bgsave_in_progress:0 ###记录了服务器是否正在创建 RDB 文件
    
    rdb_last_save_time:1420023749 ###最近一次成功创建 RDB 文件的 UNIX 时间戳
    
    rdb_last_bgsave_status:ok ###最近一次创建 RDB 文件的结果是成功还是失败
    
    rdb_last_bgsave_time_sec:0 ###最近一次创建 RDB 文件耗费的秒数
    
    rdb_current_bgsave_time_sec:-1 ###如果服务器正在创建 RDB 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数
    
    aof_enabled:1 ###AOF 是否处于打开状态
    
    aof_rewrite_in_progress:0 ###服务器是否正在创建 AOF 文件
    
    aof_rewrite_scheduled:0 ###RDB 文件创建完毕之后,是否需要执行预约的 AOF 重写操作
    
    aof_last_rewrite_time_sec:-1 ###最近一次创建 AOF 文件耗费的时长
    
    aof_current_rewrite_time_sec:-1 ###如果服务器正在创建 AOF 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数
    
    aof_last_bgrewrite_status:ok ###最近一次创建 AOF 文件的结果是成功还是失败
    
    aof_last_write_status:ok
    
    aof_current_size:176265 ###AOF 文件目前的大小
    
    aof_base_size:176265 ###服务器启动时或者 AOF 重写最近一次执行之后,AOF 文件的大小
    
    aof_pending_rewrite:0 ###是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行
    
    aof_buffer_length:0 ###AOF 缓冲区的大小
    
    aof_rewrite_buffer_length:0 ###AOF 重写缓冲区的大小
    
    aof_pending_bio_fsync:0 ###后台 I/O 队列里面,等待执行的 fsync 调用数量
    
    aof_delayed_fsync:0 ###被延迟的 fsync 调用数量
    
    # Stats
    
    total_connections_received:8466 ###服务器已接受的连接请求数量
    
    total_commands_processed:900668 ###服务器已执行的命令数量
    
    instantaneous_ops_per_sec:1 ###服务器每秒钟执行的命令数量
    
    total_net_input_bytes:82724170
    
    total_net_output_bytes:39509080
    
    instantaneous_input_kbps:0.07
    
    instantaneous_output_kbps:0.02
    
    rejected_connections:0 ###因为最大客户端数量限制而被拒绝的连接请求数量
    
    sync_full:2
    
    sync_partial_ok:0
    
    sync_partial_err:0
    
    expired_keys:0 ###因为过期而被自动删除的数据库键数量
    
    evicted_keys:0 ###因为最大内存容量限制而被驱逐(evict)的键数量。
    
    keyspace_hits:0 ###查找数据库键成功的次数。
    
    keyspace_misses:500000 ###查找数据库键失败的次数。
    
    pubsub_channels:0 ###目前被订阅的频道数量
    
    pubsub_patterns:0 ###目前被订阅的模式数量
    
    latest_fork_usec:402 ###最近一次 fork() 操作耗费的毫秒数
    
    # Replication
    
    role:master ###如果当前服务器没有在复制任何其他服务器,那么这个域的值就是 master ;否则的话,这个域的值就是 slave 。注意,在创建复制链的时候,一个从服务器也可能是另一个服务器的主服务器
    
    connected_slaves:2 ###2个slaves
    
    slave0:ip=192.168.65.130,port=6379,state=online,offset=1639,lag=1
    
    slave1:ip=192.168.65.129,port=6379,state=online,offset=1639,lag=0
    
    master_repl_offset:1639
    
    repl_backlog_active:1
    
    repl_backlog_size:1048576
    
    repl_backlog_first_byte_offset:2
    
    repl_backlog_histlen:1638
    
    # CPU
    
    used_cpu_sys:41.87 ###Redis 服务器耗费的系统 CPU
    
    used_cpu_user:17.82 ###Redis 服务器耗费的用户 CPU
    
    used_cpu_sys_children:0.01 ###后台进程耗费的系统 CPU
    
    used_cpu_user_children:0.01 ###后台进程耗费的用户 CPU
    
    # Keyspace
    
    db0:keys=3101,expires=0,avg_ttl=0 ###keyspace 部分记录了数据库相关的统计信息,比如数据库的键数量、数据库已经被删除的过期键数量等。对于每个数据库,这个部分都会添加一行以下格式的信息
    

    1.7 其他命令

    ##查看记录数
    127.0.0.1:6379> dbsize
    ##查看所有KEY
    127.0.0.1:6379> KEYS *
    ##列出所有客户端连接
    127.0.0.1:6379> CLIENT LIST
    ##关闭ip:port的客户端
    127.0.0.1:6379> CLIENT KILL 127.0.0.1:11902
    ##清空所有数据库的所有key
    127.0.0.1:6379> FLUSHALL
    ##清空当前数据库中所有key
    127.0.0.1:6379> FLUSHDB
    ##返回最后一次成功保存数据到磁盘的时间,以UNIX时间戳格式表示
    127.0.0.1:6379> LASTSAVE
    ##返回当前服务器时间,以UNIX时间戳格式表示
    127.0.0.1:6379> TIME
    ##连接到其他数据库(默认数据库是0)
    127.0.0.1:6379> SELECT 1
    ##将当前数据库的 key 移动到指定的数据库
    127.0.0.1:6379> MOVE test2 1
    

    1.8./etc/redis.conf

    daemonize no      是否以后台daemon方式运行
    timeout 0         请求超时时间
    maxclients 10000  最大连接数
     
    maxmemory <bytes>              最大内存
    maxmemory-policy volatile-lru  达到最大内存时的LRU驱逐策略
    maxmemory-samples 3            随机抽取n个key执行LRU
    hash-max-ziplist-entries 512   Map内部不超过多少个成员时会采用线性紧凑格式存储
    hash-max-ziplist-value 64      Map内成员值长度不超过多少字节会采用线性紧凑格式存储
    类似的还有,list-max-ziplist-entries 512,list-max-ziplist-value 64等等
     
    slowlog-log-slower-than 10000  slow log计入时间,microseconds(1000000)
    slowlog-max-len 128            slow log计入条数
    
    查看最大连接数
    127.0.0.1:6379> config get maxclients
    1) "maxclients"
    2) "10000"
    运行过程中调整参数
    127.0.0.1:6379> config set maxclients 10001
    

    2.数据持久化

     众所周知,redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。

    为了解决这个问题,redis提供了持久化功能——RDB和AOF。通俗的讲就是将内存中的数据写入硬盘中。

         一、持久化之全量写入:RDB

    more redis.conf 
    save 900 1
    save 300 10
    save 60 10000
    dbfilename "dump.rdb"          #持久化文件名称
    dir "/data/dbs/redis/6381"    #持久化数据文件存放的路径

    上面是redis配置文件里默认的RDB持久化设置,前三行都是对触发RDB的一个条件,例如第一行的意思是每900秒钟里redis数据库有一条数据被修改则触发RDB,依次类推;只要有一条满足就会调用BGSAVE进行RDB持久化。第四行dbfilename指定了把内存里的数据库写入本地文件的名称,该文件是进行压缩后的二进制文件,通过该文件可以把数据库还原到生成该文件时数据库的状态。第五行dir指定了RDB文件存放的目录。

          配置文件修改需要重启redis服务,我们还可以在命令行里进行配置,即时生效,服务器重启后需重新配置

    bin/redis-cli
    127.0.0.1:6379> CONFIG GET save         #查看redis持久化配置
    1) "save"
    2) "900 1 300 10 60 10000"
    
    127.0.0.1:6379> CONFIG SET save "21600 1000" #修改redis持久化配置
    OK
    

          而RDB持久化也分两种:SAVE和BGSAVE

          SAVE是阻塞式的RDB持久化,当执行这个命令时redis的主进程把内存里的数据库状态写入到RDB文件(即上面的dump.rdb)中,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。

          BGSAVE属于非阻塞式的持久化,它会创建一个子进程专门去把内存中的数据库状态写入RDB文件里,同时主进程还可以处理来自客户端的命令请求。但子进程基本是复制的父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。

    (本人在生产中就碰到过这问题,redis本身内存使用率就60%,总的内存使用率在百分之七八十左右,持久化的时候立马飙到百分之一百三十多,告警邮件是每天几十封/(ㄒoㄒ)/~~ 最后根据需求选择了AOF持久化)

           二、持久化之增量写入:AOF

           与RDB的保存整个redis数据库状态不同,AOF是通过保存对redis服务端的写命令(如set、sadd、rpush)来记录数据库状态的,即保存你对redis数据库的写操作,以下就是AOF文件的内容

    复制代码
     1 [redis@iZ]$ more appendonly.aof 
     2 *2
     3 $6
     4 SELECT
     5 $1
     6 0
     7 *3
     8 $3
     9 SET
    10 $47
    11 DEV_USER_LEGAL_F9683BE0E27F1A06C0CB869CEC7E3B22
    12 $11
    13 ¬
    14 *3
    15 $3
    16 SET
    17 $47
    复制代码

           先让我们看看如何配置AOF

    复制代码
    1 [redis@iZ]$ more ~/redis/conf/redis.conf
    2 dir "/data/dbs/redis/6381"           #AOF文件存放目录
    3 appendonly yes                       #开启AOF持久化,默认关闭
    4 appendfilename "appendonly.aof"      #AOF文件名称(默认)
    5 appendfsync no                       #AOF持久化策略
    6 auto-aof-rewrite-percentage 100      #触发AOF文件重写的条件(默认)
    7 auto-aof-rewrite-min-size 64mb       #触发AOF文件重写的条件(默认)
    复制代码

          要弄明白上面几个配置就得从AOF的实现去理解,AOF的持久化是通过命令追加、文件写入和文件同步三个步骤实现的。当reids开启AOF后,服务端每执行一次写操作(如set、sadd、rpush)就会把该条命令追加到一个单独的AOF缓冲区的末尾,这就是命令追加;然后把AOF缓冲区的内容写入AOF文件里。看上去第二步就已经完成AOF持久化了那第三步是干什么的呢?这就需要从系统的文件写入机制说起:一般我们现在所使用的操作系统,为了提高文件的写入效率,都会有一个写入策略,即当你往硬盘写入数据时,操作系统不是实时的将数据写入硬盘,而是先把数据暂时的保存在一个内存缓冲区里,等到这个内存缓冲区的空间被填满或者是超过了设定的时限后才会真正的把缓冲区内的数据写入硬盘中。也就是说当redis进行到第二步文件写入的时候,从用户的角度看是已经把AOF缓冲区里的数据写入到AOF文件了,但对系统而言只不过是把AOF缓冲区的内容放到了另一个内存缓冲区里而已,之后redis还需要进行文件同步把该内存缓冲区里的数据真正写入硬盘上才算是完成了一次持久化。而何时进行文件同步则是根据配置的appendfsync来进行:

          appendfsync有三个选项:always、everysec和no:

    1、选择always的时候服务器会在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,可以看成你每执行一个redis写入命令就往AOF文件里记录这条命令,这保证了数据持久化的完整性,但效率是最慢的,却也是最安全的;

    2、配置成everysec的话服务端每执行一次写操作(如set、sadd、rpush)也会把该条命令追加到一个单独的AOF缓冲区的末尾,并将AOF缓冲区写入AOF文件,然后每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,这个模式兼顾了效率的同时也保证了数据的完整性,即使在服务器宕机也只会丢失一秒内对redis数据库做的修改;

    3、将appendfsync配置成no则意味redis数据库里的数据就算丢失你也可以接受,它也会把每条写命令追加到AOF缓冲区的末尾,然后写入文件,但什么时候进行文件同步真正把数据写入AOF文件里则由系统自身决定,即当内存缓冲区的空间被填满或者是超过了设定的时限后系统自动同步。这种模式下效率是最快的,但对数据来说也是最不安全的,如果redis里的数据都是从后台数据库如mysql中取出来的,属于随时可以找回或者不重要的数据,那么可以考虑设置成这种模式。

         

          相比RDB每次持久化都会内存翻倍,AOF持久化除了在第一次启用时会新开一个子进程创建AOF文件会大幅度消耗内存外,之后的每次持久化对内存使用都很小。但AOF也有一个不可忽视的问题:AOF文件过大。你对redis数据库的每一次写操作都会让AOF文件里增加一条数据,久而久之这个文件会形成一个庞然大物。还好的是redis提出了AOF重写的机制,即我们上面配置的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size。AOF重写机制这里暂不细述,之后本人会另开博文对此解释,有兴趣的同学可以看看。我们只要知道AOF重写既是重新创建一个精简化的AOF文件,里面去掉了多余的冗余命令,并对原AOF文件进行覆盖。这保证了AOF文件大小处于让人可以接受的地步。而上面的auto-aof-rewrite-percentage和auto-aof-rewrite-min-size配置触发AOF重写的条件。       

          Redis 会记录上次重写后AOF文件的文件大小,而当前AOF文件大小跟上次重写后AOF文件大小的百分比超过auto-aof-rewrite-percentage设置的值,同时当前AOF文件大小也超过auto-aof-rewrite-min-size设置的最小值,则会触发AOF文件重写。以上面的配置为例,当现在的AOF文件大于64mb同时也大于上次重写AOF后的文件大小,则该文件就会被AOF重写。

          最后需要注意的是,如果redis开启了AOF持久化功能,那么当redis服务重启时会优先使用AOF文件来还原数据库。

     

    1. Redis主从同步

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制。

    2. 配置主从同步

    Mater Slave的模式,从Slave向Master发起SYNC命令。

    可以是1 Master 多Slave,可以分层,Slave下可以再接Slave,可扩展成树状结构。

    2.1 配置Mater,Slave

    配置非常简单,只需在slave的设定文件中指定master的ip和port

    Master: test166

    修改设定文件,服务绑定到ip上

    1
    2
    # vi /etc/redis.conf
    bind 10.86.255.166

    重启Redis

    # systemctl restart redis

    1
    # less /etc/redis.conf

    Slave: test167

    修改设定文件,指定Master

    1
    2
    3
    slaveof <masterip> <masterport>    指定master的ip和port
    masterauth <master-password>       master有验证的情况下
    slave-read-only yes                设置slave为只读模式

    也可以用命令行设定:

    1
    2
    redis 127.0.0.1:9999> slaveof localhost 6379
    OK

    2.2 同期情况确认

    Master:

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> INFO replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=10.86.255.167,port=6379,state=online,offset=309,lag=1
    ……

     Slave:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    127.0.0.1:6379> INFO replication
    # Replication
    role:slave
    master_host:10.86.255.166
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:7
    master_sync_in_progress:0
    slave_repl_offset:365
    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

    同期正常时:

    master_link_status:up

    master_repl_offset和slave_repl_offset相等,

    master_last_io_seconds_ago10秒内。

    2.3 Slave升级为Master

    Master不可用的情况下,停止Master,将Slave的设定无效化后,Slave升级为Master

    1
    2
    3
    4
    5
    6
    7
    redis 127.0.0.1:9999> SLAVEOF NO ONE
     OK
     
    redis 127.0.0.1:9999> info
    ......
    role:master
    ......

    2.4 Health Check

    Slave按照repl-ping-slave-period的间隔(默认10秒),向Master发送ping。

    如果主从间的链接中断后,再次连接的时候,2.8以前按照full sync再同期。2.8以后,因为有backlog的设定,backlog存在master的内存里,重新连接之前,如果redis没有重启,并且offset在backlog保存的范围内,可以实现从断开地方同期,不符合这个条件,还是full sync

    用monitor命令,可以看到slave在发送ping

    1
    2
    3
    127.0.0.1:6379> monitor
    OK
    1448515184.249169 [0 10.86.255.166:6379] "PING"

    2.5 设置Master的写行为

    2.8以后,可以在设定文件中设置,Master只有当有N个Slave处于连接状态时,接受写操作

    1
    2
    min-slaves-to-write 3
    min-slaves-max-lag 10

    3. Redis HA管理工具

    redis-sentinel 能监视同期的状态,发现Master down的时候,会进行failover,将Slave升级为Master,启动后会自动更新sentinel设定文件,发生failover时,会自动修改sentinel和redis的设定文件

    环境:

    Master: 10.86.255.167 :6379    sentinel:26379

    Slave1: 10.86.255.166 :6379    sentinel:26379

    Slave2: 10.86.255.167 :7379    sentinel:36379

    Sentinel的设定文件在/etc/redis-sentinel.conf,对failover的动作等可以进行一些定义,本次主要验证Sentinel的动作,设定文件可以根据具体情况自行调整 

    3.1 设定Master,Slave

    参照上文设定Master,Slave,并确认Mater和2个Slave的同期状态正常

    3.2 Master上设定Sentinel

    1
    2
    3
    # vi /etc/redis-sentinel.conf
    daemonize yes
    sentinel monitor mymaster <master ip> 6379 2

    启动sentinel

    1
    2
    3
    # redis-sentinel /etc/redis-sentinel.conf
    # redis-server /etc/redis-sentinel.conf --sentinel

    确认

    1
    2
    # redis-cli -p 26379
    127.0.0.1:26379> INFO sentinel

    确认Master信息

    1
    127.0.0.1:26379> sentinel masters

    确认Slave信息

    1
    127.0.0.1:26379> sentinel slaves mymaster

    3.3 Slave上设定Sentinel

    在slave1上设定sentinel

    1
    2
    3
    # vi /etc/redis-sentinel.conf
    daemonize yes
    sentinel monitor mymaster <master ip> 6379 2

    启动slave1

    1
    # redis-sentinel /etc/redis-sentinel.conf

    在slave2上设定sentinel

    1
    2
    3
    4
    # less /etc/redis-sentinel_36379.conf
    daemonize yes
    port 36379
    sentinel monitor mymaster <master ip> 6379 2

    启动slave2

    1
    # redis-sentinel /etc/redis-sentinel_36379.conf

    3.4 动作确认

    停止Master

    1
    127.0.0.1:6379> SHUTDOWN

    确认日志发生fail over

    1
    # tail /var/log/redis/sentinel.log

    确认Slave2变成Master,Slave1是Slave

    1
    test167:7379> info replication

    1
    test166:6379> info replication

    启动刚才停掉的Master,确认变为Slave

    1
    10.86.255.167:6379> info replication

    3.5 Sentinel命令

    1
    2
    3
    4
    5
    6
    127.0.0.1:26379> sentinel masters
    127.0.0.1:26379> sentinel slaves mymaster
    127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
    127.0.0.1:26379> SENTINEL reset mymaster
    127.0.0.1:26379> SENTINEL failover mymaster
    127.0.0.1:26379> SENTINEL flushconfig mymaster
    daemonize yes
    pidfile /data/ops/app/redis-2.8.17_yunping_6381/redis.pid
    port 6381
    tcp-backlog 20000
    timeout 0
    tcp-keepalive 0
    loglevel notice
    logfile "/data/ops/app/redis-2.8.17_yunping_6381/redis.log"
    databases 16
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir ./
    slave-serve-stale-data yes
    slave-read-only yes
    repl-disable-tcp-nodelay no
    slave-priority 100
    maxmemory 2GB
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-entries 512
    list-max-ziplist-value 64
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes
    rename-command CONFIG ""
    rename-command EVAL ""
    生产环境
  • 相关阅读:
    SharePoint 2010 User Profile Sync Service自动停止
    如何区别多个svchost.exe?
    Log Parser分析IIS log的一个简单例子
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Windows中右键点击文件夹, 结果找不到共享选项卡, 怎么办?
    介绍SOS中的SaveModule命令
    SharePoint中Draft版本的文档不会收到document added的Alert Email
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例
    门户网站
    C#基础—— check、lock、using语句归纳
  • 原文地址:https://www.cnblogs.com/zhaobin-diray/p/9318921.html
Copyright © 2020-2023  润新知