• redis哨兵部署


    redis介绍

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
    redis是c语言编写的,支持数据持久化,是key-value类型数据库。
    应用在缓存,队列系统中
    redis支持数据备份,也就是master-slave模式

    redis一秒可以执行10万个命令

    redis为什么这么快?

    1.是完全基于内存数据库

    2.redis是完全用c写的单线程的数据库

    redis如何安装

    1.yum安装

    安装:yum install redis -y

    卸载:yum remove redis -y

    启动:systemctl start redis

    查看监听端口:netstat -tunlp

    2.redis编译安装(注意删除安装的redis)

    编译安装三部曲

    1.下载redis源码
    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    2.解压缩tar -zxvf redis-4.0.10.tar.gz
    3.切换redis源码目录cd redis-4.0.10
    4.编译源文件make
    5.编译好后,src/目录下有编译好的redis指令
    6.make install 安装到指定目录,默认在/usr/local/bin

    添加环境变量:vim /etc/profile

    path= “/usr/local/bin”

    重新加载变量文件:source /etc/profile

    grep -v "^$" redis.conf |grep -v "^#" 去注释#

    4.更改redis的配置文件,启动redis,支持密码和端口

    touch redis.s18.conf 内容如下:

    bind 192.168.91.128 # 连接ip protected-mode yes # 开启redis安全模式 port 6800 # 端口 daemonize yes #redis后台启动 pidfile /var/run/redis_6379.pid loglevel notice logfile "" requirepass 123456 #密码

    启动:redis-server redis.s18.conf

    检测端口:netstat -tunlp

    5.登陆redis客户端

    redis-cli -h 192.168.91.128 -p 6800

    参数解释 -h指定主机地址 -p指定redis端口

    登陆之后通过auth指令 验证密码

     

    redis可执行文件

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

    redis数据类型

    redis是一种高级的key:value存储系统,其中value支持五种数据类型
    字符串(strings)
    散列(hashes)
    列表(lists)
    集合(sets)
    有序集合(sorted sets)

    redis存放的数据是key,然后通过value来取值

    keys *         查看所有key
    type key     查看key类型
    expire key seconds   设置过期时间
    ttl key     查看key过期剩余时间       -2表示key已经不存在了
    persist key 取消key的过期时间   -1表示key存在,没有过期时间

    exists key     判断key存在   存在返回1   否则0
    del keys     删除key   可以删除多个
    dbsize         计算key的数量

    set key名 value名

    set kevins 凯文

    ger kevins 取值

    1.strings类型

    • set  设置key

    • get 获取key

    • append key 追加string

    • mset 设置多个键值对

    • mget 获取多个键值对

    • del 删除key

    • incr key 递增+1

    • decr key 递减-1

     

    redis发布订阅

    发布订阅的命令

    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同时在线。

     

    redis持久化RDB与AOF**

    1.当进程挂掉,只要内存数据被释放,redis的 数据默认是会丢

    2.redis支持数据持久化,两种模式

    rdb持久化,是基于内存数据快照的方式,通过save指令,强制快照到数据本地,存储为一个二进制文件

    3.开启rdb功能,需要修改redis.conf文件

    内容如下:

    daemonize yes

    port 6379

    logfile /data/6379/redis.log

    dir /data/6379

    dbfilename dbmp.rdb

    bind 127.0.0.1

    save 900 1

    save 300 10

    save 30 10000

    4.开启redis服务端,支持rdb功能

    redis-server redis-rdb.conf

    5.登陆redis,写入数据,手动执行save触发持久化,会生成一个二进制的数据文件 dbmp.rdb,在/data/6379/redis.log目录下

    redis持久化之RDB实践

    1.将修改类的redis命令,记录到一个日志中,以保证数据不丢,下次重启,再执行这个文件,数据就回来

    2.开启rdb模式,修改redis-aof.conf配置如下:

    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    appendonly yes
    appendfsync everysec

    3.指定aof配置文件启动

    redis-server redis-aof.conf

     

    redis 持久化方式有哪些?有什么区别?

    rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能

    aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

     

    redis在不重启的状态下,切换rdb持久化到aof持久化

    1.准备一个支持rdb数据

    配置文件redis-new-rdb.conf如下:

    daemonize yes

    port 6379

    logfile /data/6379/redis.log

    dir /data/6379

    dbfilename dbmp.rdb

    bind 127.0.0.1

    save 900 1

    save 300 10

    save 30 10000库

     

    2.通过命令切换到aof功能,临时生效

    CONFIG set appendonly yes   #开启AOF功能
    CONFIG SET save "" #关闭RDB功能

    3.还得修改redis的配置文件,让他下次重启也是aof模式

    修改redis-new-rdb.conf 配置如下:

    daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 appendonly yes appendfsync everysec

    4.redis已经切换到aof模式

     

    redis主从同步

    1.redis是支持多实例的数据库 ,在一台机器上,可以运行多个隔离的数据库环境

    实现多实例就是准备多个配置文件

    替换:sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf

    准备3个配置文件,实现,一主两从的redis数据架构

    准备的3个配置文件,仅仅是端口的区分就行

    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


    port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no

    slaveof 127.0.0.1 6379


    port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no

    slaveof 127.0.0.1 6379


    追加命令:echo "slaveof 127.0.0.1 6379" >> redis-6381.conf

    三个同样的文件

    建立文件夹:mkdir -p /data/{6379,6380,6381}

    分别启动三个redis数据库实例

    redis-server redis-6379.conf

    redis-server redis-6380.conf redis-server redis-6381.conf

    查看三个数据库的身份信息,检测主从状态

    进入:redis-cli -p 6379

    输入:info

    查看Replication结果:

    role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=1 master_replid:8ebe1c8b3f2211e1be132332d7548d059cffc954 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:280 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:280

     

    测试写入主库 6379数据,查看两个从库的信息,确认6380,6381

    演示干掉主库,手动切换主从故障

    1.手动检查进程,杀死主库,演示故障

    2.手动切换某一个从库,换成主库身份

    就是redis-cli -p 6380 登陆6380后,输入 slaveof on one,去掉自己的slave身份

    3.将6381重新指引到6380位从库,

    redis-cli -p 6381登陆6381后,输入slaveof 127.0.0.1 6380

    4.手动改配置文件

     

    自动的redis主从切换,是哨兵功能

    /opt/s18redis目录下

    1.环境配置 准备3个redis数据库实例

    准备3个配置文件

    redis-6379.conf

    port 6379
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/var/redis/data/"

    redis-6380.conf

    port 6380
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/" 
    slaveof 127.0.0.1 6379      // 从属主节点

    redis-6381.conf

    port 6381
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/" 
    slaveof 127.0.0.1 6379      // 从属主节点

    建立文件夹:mkdir -p /data/{6379,6380,6381}

    检测身份信息:redis-cli -p 6370 进入后输入:info

     

    此时再准备三个哨兵,就是三个值班的,检测redis主从状态

    三个哨兵配置文件如下:

    redis-26379.conf

    port 26379  
    dir /var/redis/data/
    logfile "26379.log"
    
    // 当前Sentinel节点监控 127.0.0.1 6379 这个主节点
    // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
    // s18ms是主节点的别名
    sentinel monitor s18ms 127.0.0.1 6379 2
    
    //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
    sentinel down-after-milliseconds s18ms 30000
    
    //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
    sentinel parallel-syncs s18ms 1
    
    //故障转移超时时间为180000毫秒
    sentinel failover-timeout s18ms 180000
    daemonize yes 

    redis-26380.conf

    port 26380 dir /var/redis/data/ logfile "26380.log"

    sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000

    sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes

     

    redis-26381.conf

    port 26381 dir /var/redis/data/ logfile "26381.log"

    sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000

    sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes

    分别启动三个哨兵

    536 redis-sentinel redis-26379.conf 537 redis-sentinel redis-26380.conf 538 redis-sentinel redis-26381.conf

    查看哨兵信息:

    redis-cli -p 26379

    输入:info sentinel

    此时哨兵已经正确,三个哨兵,检测者一主两从:

    sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=s18ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

     

    自动主从故障切换演练

    1.干掉3679,查看6380和6381的身份信息

    2.正确是 哨兵会选举6380为新的master,然后为6380为6381新salve

    3.当6379重新复活之后,会自动添加到主从架构之中

     

    redis-cluster的集群搭建

    1.环境准备,准备6个节点(6批马儿),指的就是启动6个redis数据库实例

    6个节点仅仅是端口不同

    redis-7000.conf

    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-7001.conf

    port 7001
    daemonize yes
    dir "/opt/redis/data"
    logfile "7001.log"
    dbfilename "dump-7001.rdb"
    cluster-enabled yes
    cluster-config-file nodes-7001.conf
    cluster-require-full-coverage no

    redis-7002.conf

    redis-7003.conf

    redis-7004.conf

    redis-7005.conf

    分别启动6个redis数据实例

    [root@localhost s18cluster]# redis-server redis-7000.conf [root@localhost s18cluster]# redis-server redis-7001.conf [root@localhost s18cluster]# redis-server redis-7002.conf [root@localhost s18cluster]# redis-server redis-7003.conf [root@localhost s18cluster]# redis-server redis-7004.conf [root@localhost s18cluster]# redis-server redis-7005.conf

    检查集群状态

    redis-cli -p 7000

    进行redis-cluster集群槽位分配

    redis官方提供了ruby语言的脚本,进行自动槽位分配

    perl python ruby都是脚本语言

    1.安装准备ruby语言的环境,用于自动化创建redis集群

    #下载ruby
    wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
    
    #安装ruby
    tar -xvf ruby-2.3.1.tar.gz
    ./configure --prefix=/opt/ruby/
    make && make install
    #准备一个ruby命令#准备一个gem软件包管理命令
    #拷贝ruby命令到path下/usr/local/ruby
    cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin

    2.编译安装完成后,添加环境变量

    把bin添加环境变量:

    [root@localhost bin]# pwd /opt/ruby/bin

    vim /etc/profile

    source /etc/profile

    3.通过ruby的软件包管理工具安装redis模块(gem就是类似python的pip工具)

    在opt/s18cluster/目录下

    wget http://rubygems.org/downloads/redis-3.3.0.gem
    # 通过gem安装这个redis包
    gem install -l redis-3.3.0.gem
    #查看gem有哪些包
    gem list -- check redis gem

    4.找到ruby创建redis集群的脚本工具

    命令:find /opt -name redis-trib.rb

    结果:/opt/redis-4.0.10/src/redis-trib.rb

    5.此时就可以通过ruby来创建redis的集群,分配槽点

    一键开启redis-cluster集群

    #每个主节点,有一个从节点,代表--replicas 1
    /opt/redis-4.0.10/src/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

    6.集群已经创建成功

    redis-cli -p 7000 -c #-c是集群的模式

    127.0.0.1:7000> set name kevins -> Redirected to slot [5798] located at 127.0.0.1:7001 OK

  • 相关阅读:
    apt update ,apt upgrade 和 apt dist-upgrade 的区别
    CVE-2018-8639 简单利用 win7
    如何拆解性能测试需求
    博客搬家啦
    驱动开发学习一
    驱动开发基础之数据结构
    c++容器加迭代器和python装饰器的对比
    c++简单学习
    windows下z3安装
    switch反汇编
  • 原文地址:https://www.cnblogs.com/wukai66/p/12142119.html
Copyright © 2020-2023  润新知