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.gz2.解压缩tar -zxvf redis-4.0.10.tar.gz3.切换redis源码目录cd redis-4.0.104.编译源文件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 * 查看所有keytype key 查看key类型expire key seconds 设置过期时间ttl key 查看key过期剩余时间 -2表示key已经不存在了persist key 取消key的过期时间 -1表示key存在,没有过期时间?exists key 判断key存在 存在返回1 否则0del 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 发送到指定的频道 channelSUBSCRIBE 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 yesport 6379logfile /data/6379/redis.logdir /data/6379appendonly yesappendfsync 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数据实例
[ s18cluster]# redis-server redis-7000.conf [ s18cluster]# redis-server redis-7001.conf [ s18cluster]# redis-server redis-7002.conf [ s18cluster]# redis-server redis-7003.conf [ s18cluster]# redis-server redis-7004.conf [ 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添加环境变量:
[ 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