centos7安装部署redis+哨兵

主从复制:

Redis持久化保证了即使redis服务重启也不会丢失数据因为redis服务重启后会将硬盘上持久化的数据恢复到内存中但是当redis服务器的硬盘损坏了可能会导致数据丢失如果通过redis的主从复制机制就可以避免这种单点故障,说明主redis中的数据有两个副本replication即从slave1和从slave2即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

sentienl 哨兵:

Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
A、Master 状态监测
B、如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave
C、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

ip划分:

Redis-master:172.16.47.10
Redis -slave1:172.16.47.20
Redis -slave2:172.16.47.30

Redis-sentinel1:172.16.47.11
Redis-sentinel2:172.16.47.21
Redis-sentinel3:172.16.47.31

1、redis主从复制

1.1、准备三台安装好了redis的机器,或者单机多实例也可以;(以下操作可同时在三台机器上执行)
[root@redis-master ~]# mkdir -p /home/macro/tools
[root@redis-master ~]# yum -y install gcc gcc-c++
[root@redis-master ~]# cd /home/macro/tools
[root@redis-master tools]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz
[root@redis-master tools]# ls
redis-4.0.1.tar.gz
[root@redis-master tools]# tar -zxf redis-4.0.1.tar.gz
[root@redis-master tools]# cd redis-4.0.1
[root@redis-master redis-4.0.1]# make && make install

//提示以下信息即安装正确;
Hint: It’s a good idea to run ‘make test’ ;)

make[1]: Leaving directory /home/macro/tools/redis-4.0.1/src' cd src && make install make[1]: Entering directory/home/macro/tools/redis-4.0.1/src’
CC Makefile.dep
make[1]: Leaving directory /home/macro/tools/redis-4.0.1/src' make[1]: Entering directory/home/macro/tools/redis-4.0.1/src’

Hint: It’s a good idea to run ‘make test’ ;)

INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install

make[1]: Leaving directory `/home/macro/tools/redis-4.0.1/src’

1.2、主库上修改配置文件redis.conf;
[root@redis-master redis-4.0.1]# vim redis.conf
bind 127.0.0.1 //添加你当前ip,令远程服务器可以访问
protected-mode no //表示关闭保护模式(默认yes表示开启保护模式)
prot 6379 //redis的默认服务端口
daemonize yes //表示后台启动,默认是no
requirepass 123456 //连接验证
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
//以上这3个选项都屏蔽,则rdb禁用
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入? 主进程不停止 容易造成数据不一致
rdbcompression yes // 导出的rdb文件是否压缩,如果rdb的大小很大的话建议这么做
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径

1.3、修改从库上的配置文件redis.conf;(可同时在两台从库主机上配置)
[root@redis-slave1 redis-4.0.1]# vim redis.conf
slaveof 172.16.47.10 6379 //配置主库ip地址,端口
masterauth 123456 //连接主库认证
requirepass 123456 //连接验证

1.4、启动redis并查看状态;
//三台redis显示以下信息即启动成功;
[root@redis-master redis-4.0.1]# ./src/redis-server redis.conf
1044:C 03 Jan 15:47:18.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1044:C 03 Jan 15:47:18.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1044, just started
1044:C 03 Jan 15:47:18.480 # Configuration loaded

[root@redis-slave1 redis-4.0.1]# ./src/redis-server redis.conf
1030:C 03 Jan 15:47:46.894 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1030:C 03 Jan 15:47:46.894 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1030, just started
1030:C 03 Jan 15:47:46.894 # Configuration loaded

[root@redis-slave2 redis-4.0.1]# ./src/redis-server redis.conf
1058:C 03 Jan 15:49:24.842 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1058:C 03 Jan 15:49:24.842 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1058, just started
1058:C 03 Jan 15:49:24.842 # Configuration loaded

[root@redis-master redis-4.0.1]# ./src/redis-cli
127.0.0.1:6379> info
//通过info查看状态,输出以上信息即主从以完成配置

1.5、测试主从复制功能;
"1.png"
//通过以上图片不难发现在主库上设置一个test的键值,在从库检查发现在主库上设置的键值已经同步到了从库,到此为止主从复制就已经配置完成了。

2、Sentinel 哨兵

2.1、配置三台哨兵同时修改sentinel.conf ;
[root@redis-sentinel redis-4.0.1]# vim sentinel.conf
将sentinel monitor mymaster 127.0.0.1 6379 2
修改为:sentinel monitor mymaster 172.16.47.10 6379 2
mymaster //监控名称 127.0.0.1 //监控ip 6379 //端口 2 //挂了几台后重新选举master
protected-mode no //关闭保护模式(默认是yes)
sentinel auth-pass mymaster 123456

2.2、查看哨兵的状态;
[root@redis-master redis-4.0.1]# ./src/redis-cli -h 172.16.47.11 -p 26379 info sentinel
Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.47.10:6379,slaves=2,sentinels=3
"2.png"
//通过上面的信息发现哨兵已经启用了

2.3、测试关闭master和slave1后,哨兵会不会选出新的master;
[root@redis-master redis-4.0.1]# ./src/redis-cli -a 123456 shutdown
[root@redis-slave1 redis-4.0.1]# ./src/redis-cli -a 123456 shutdown
//通过观察状态,在我们关闭master和slave1后,哨兵为我们选取出新的master

"3.png"
//在slave2这台机器上发现已经从从库变成了主库,到此哨兵的配置就完成了;

附录:

内存释放机制:

noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。//默认值
allkeys-lru:在主键空间中,优先移除最近未使用的key。
volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
allkeys-random:在主键空间中,随机移除某个key。
volatile-random:在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

数据备份与恢复

1.启动redis
进入redis目录
redis-cli -a 123456
2.数据备份
redis 127.0.0.1:6379> SAVE //一般情况下不会使用save,因为在save会造成阻塞save操作在Redis主线程中工作,因此会阻塞其他请求操作,应该避免使用
该命令将在 redis 备份目录中创建dump.rdb文件。
3.恢复数据
1、获取备份目录
redis 127.0.0.1:6379> CONFIG GET dir
1) “dir”
2) “/home/macro/tools/redis-4.01/bin”   
以上命令 CONFIG GET dir 输出的 redis 备份目录为 /home/macro/tools/redis-4.01/bin。
2、停止redis服务
3、拷贝备份文件到 /home/macro/tools/redis-4.01/bin目录下
4、重新启动redis服务

持久化

RDB持久化方式:

默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照。
当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write

AOF持久化方式:

开启AOF持久化后,你所执行的每一条指令,都会被记录到appendonly.aof文件中。但事实上,并不会立即将命令写入到硬盘文件中,而是写入到硬盘缓存,在接下来的策略中,配置多久来从硬盘缓存写入到硬盘文件。所以在一定程度一定条件下,还是会有数据丢失,不过你可以大大减少数据损失。redis默认使用everysec,就是说每秒持久化一次,而always则是每次操作都会立即写入aof文件中。而no则是不主动进行同步操作,是默认30s一次。当然always一定是效率最低的,个人认为everysec就够用了,数据安全性能又高。Redis也允许我们同时使用两种方式,再重启redis后会从aof中恢复数据,因为aof比rdb数据损失小嘛。

appendonly yes //开启AOF持久化,默认为no
appendfsync always //每次有数据修改发生时都会写入AOF文件。
appendfsync everysec //每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no //从不同步。高效但是数据不会被持久化。
二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)