一、持久化策略
上篇提到Redis和memcached对比,还具有持久化功能,Redis支持两种持久化策略:
策略 | 描述 | 优点 | 缺点 |
---|---|---|---|
rdb | 默认模式,可以在指定间隔时间内生成数据快照,默认保存到dump.rdb文件中,每次重启会从该文件中读取 | 数据保存在子进程中,对主进程影响小;rdb是紧凑型文件,恢复数据效率高于aof | 保存点之间redis崩溃,可能会丢失数据;子进程fork时,数据量过大导致的性能低下 |
aof | 执行修改数据的操作,直接同步到数据库文件中 | 数据安全性高 | 文件大小大于rdb,效率较慢 |
开启aof需要修改配置文件:
# 开启aof
appendonly yes
# 保存的文件名
appendfilename "appendonly.aof"
二、主从复制
Redis支持一主多从,保证节点的高可用,节点有多个复制品(replica)构成,其中一个为主(master),其余的为从(slave)
主从复制可以对主节点数据备份,提升容灾能力。在Redis中,主节点一般用作写数据,从节点只具备读数据功能,因而实现读写分离,提高集群性能
1. 主从环境搭建
我们需要使用多个redis来模拟多台服务器,在redis安装目录/usr/local/redis
新建一个replica
目录,并在其中创建master
、slave1
、slave2
目录
mkdir replica
cd replica
mkdir master
mkdir slave1
mkdir slave2
将redis下的bin
目录分别复制到三个目录中
cp -r bin ./replica/master
cp -r bin ./replica/slave1
cp -r bin ./replica/slave2
2. 修改主从配置
目前主机的端口为:6379
修改两个从机的配置,一个设置为6380
,一个设置为6381
:
# 端口
port 6380
# 主机ip和端口
replicaof 192.168.42.4 6379
3. 启动三个redis
编写shell脚本:
vi start.sh
内容为:
cd /usr/local/redis/replica/master/bin
./redis-server redis.conf
cd /usr/local/redis/replica/slave1/bin
./redis-server redis.conf
cd /usr/local/redis/replica/slave2/bin
./redis-server redis.conf
赋予权限并执行:
chmod 777 start.sh
./start.sh
查看进程:
![](https://i-blog.csdnimg.cn/blog_migrate/174b8f8dfcadf3fbd99abf169051db23.png)
三个redis都正常启动完成了
4. 测试主从
4.1 主机写数据
我们通过主机写数据,进入主机的客户端:
cd /usr/local/redis/replica/master/bin/
./redis-cli
写入数据:
set info hello
![](https://i-blog.csdnimg.cn/blog_migrate/e221fd73f264598eb9b02a02cdbede73.png)
还可以使用info
命令查看主机的状态:
![](https://i-blog.csdnimg.cn/blog_migrate/5270354e8ae8cb6c2b157bc9f34e52ed.png)
可以看到两个从机已经确立了主从关系
4.2 从机读数据
进入从机的客户端,使用-p
指定6380
端口:
cd /usr/local/redis/replica/slave1/bin
./redis-cli -p 6380
读取数据:
get info
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/5bdb129bc66e529fb59fa886ca5d206e.png)
4.3 主机宕机
将主机关闭,客户端中使用shutdown
:
shutdown
进程查看,已经关闭了:
![](https://i-blog.csdnimg.cn/blog_migrate/13d58a5774385db91eb55704eb37ffab.png)
此时使用从机获取刚刚的数据依然有效:
![](https://i-blog.csdnimg.cn/blog_migrate/5db663c59b25c0facaae7cb49ea72a50.png)
三、哨兵
主从复制可以实现主机节点宕机后,依然可以获取从节点的数据,可用性确实提高了,但是从节点只能读不能写,这也是一个致命的问题。哨兵就是为了解决从机不可写而产生的,一旦发现主机宕机,那么哨兵将通过检举,提升一台从机为主机,因而使之拥有写能力,哨兵可以配置多台
1. 配置文件
将redis解压完的目录下的sentinel.conf
文件复制三份到上面三个redis中
![](https://i-blog.csdnimg.cn/blog_migrate/dffdfa3ae8914c4b21c3404c084b6bc0.png)
cp ./sentinel.conf /usr/local/redis/replica/master/bin/
cp ./sentinel.conf /usr/local/redis/replica/slave1/bin/
cp ./sentinel.conf /usr/local/redis/replica/slave2/bin/
修改内容为:
# 改端口 ,推荐使用2+对应redis的端口
port 26379
# 后台进程
daemonize yes
# 出错日志存放路径
logfile “/usr/local/redis/replica/master/26379.log”
# 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
sentinel monitor mymaster 192.168.93.10 6379 2
# 改端口 ,推荐使用2+对应redis的端口
port 26380
# 后台进程
daemonize yes
# 出错日志存放路径
logfile “/usr/local/redis/replica/slave1/26380.log”
# 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
sentinel monitor mymaster 192.168.93.10 6379 2
# 改端口 ,推荐使用2+对应redis的端口
port 26381
# 后台进程
daemonize yes
# 出错日志存放路径
logfile “/usr/local/redis/replica/slave2/26381.log”
# 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
sentinel monitor mymaster 192.168.93.10 6379 2
2. 启动哨兵
在启动哨兵之前,记得先把redis启动
./redis-sentinel ./sentinel.conf
3. 测试
接着把主机关闭:
![](https://i-blog.csdnimg.cn/blog_migrate/52996489050db3a05b4720eb199c1c41.png)
在从机中查看状态,可以看到上升为主机了:
![](https://i-blog.csdnimg.cn/blog_migrate/65f2a073976ab2759a1e15649f3f5dcc.png)
接着测试下写功能:
![](https://i-blog.csdnimg.cn/blog_migrate/c6db9392f93183634491d9eebbf902cf.png)
四、集群
哨兵解决了从节点不可写的问题,但没能解决负载均衡,集群解决了写操作的负载均衡,并可以水平扩展,在Redis中,超过1/2的节点不可用,那么整个集群就不可用了,所以我们都是搭建奇数台Redis服务器
1. 环境搭建
复制三份redis的bin
目录到三个文件夹下:
cd /usr/local/redis
mkdir cluster
cp -r bin cluster/cluster-7001
cp -r bin cluster/cluster-7002
cp -r bin cluster/cluster-7003
cp -r bin cluster/cluster-7004
cp -r bin cluster/cluster-7005
cp -r bin cluster/cluster-7006
2. 修改配置文件
将redis.conf
配置文件修改以下内容:
port 7001
# 取消注释,开启集群功能
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
daemonize yes
protected-mode no
pidfile /var/run/redis_7001.pid
port 7002
# 取消注释,开启集群功能
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 15000
daemonize yes
protected-mode no
pidfile /var/run/redis_7002.pid
port 7003
# 取消注释,开启集群功能
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 15000
daemonize yes
protected-mode no
pidfile /var/run/redis_7003.pid
剩余的4-6也进行配置
3. 启动Redis
-bash-4.2# pwd
/usr/local/redis/cluster
vi start-cluster.sh
内容为:
./cluster-7001/redis-server ./cluster-7001/redis.conf
./cluster-7002/redis-server ./cluster-7002/redis.conf
./cluster-7003/redis-server ./cluster-7003/redis.conf
./cluster-7004/redis-server ./cluster-7004/redis.conf
./cluster-7005/redis-server ./cluster-7005/redis.conf
./cluster-7006/redis-server ./cluster-7006/redis.conf
修改执行权限:
chmod 777 ./start-cluster.sh
启动Redis:
./start-cluster.sh
进程查询:
![](https://i-blog.csdnimg.cn/blog_migrate/8fb7df4a01613ded741a09af26e0a0dc.png)
4. 启动集群
上面只是启动了Redis,但想让多个Redis建立集群关系,还需使用下面命令(Redis5以上):
./redis-cli --cluster create 192.168.42.4:7001 192.168.42.4:7002 192.168.42.4:7003 192.168.42.4:7004 192.168.42.4:7005 192.168.42.4:7006 --cluster-replicas 1
--cluster-replicas 2 表示1台主机对应1台从机
执行后,输入yes
:
![](https://i-blog.csdnimg.cn/blog_migrate/837305e110574e79cd211ffaf96735d4.png)
5. 测试
进入客户端,注意加上-c
:
./redis-cli -p 7001 -c
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/bbbe70580474381b9e19cdcb9f5baa9d.png)
以上就是Redis的基本使用和配置