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