redis哨兵部署

Posted wukai66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于redis哨兵部署的主要内容,如果未能解决你的问题,请参考以下文章

使用bitnamiredis-sentinel部署Redis 哨兵模式

使用bitnamiredis-sentinel部署Redis 哨兵模式

redis 简单整理——哨兵部署业务图[二十九]

Redis哨兵模式集群部署

死磕 Redis----- 哨兵:部署哨兵架构

死磕 Redis----- 哨兵:部署哨兵架构