一、redis数据库哨兵模式
目录
一、redis数据库哨兵模式
1、什么是哨兵模式
2、哨兵的作用
3、哨兵结构组成
4、哨兵故障转移机制
5、哨兵工作、切换原理
6、哨兵主节点选举原则
7、哨兵模式部署
二、redis数据库cluster集群
1、cluster集群优点、数据存储及同步方式
2、cluster集群原理
3、 cluster集群部署
①实验环境
② 群集部署-reids编译准备
③每台服务器创建2个实例并配置
③启动多实例并查看服务
④启动redis群集
⑤验证群集结果
1、什么是哨兵模式
哨兵模式:可以自动切换解决单点故障,但是不能负载均衡,存储能力受限制。
哨兵核心功能:在主从复制的基础上,实现了主节点的自动故障转移
2、哨兵的作用
监控:监控主节点和从节点是否在正常运行
故障自动转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
通知(提醒):哨兵将故障转移结果发送给客户端
3、哨兵结构组成
哨兵节点:一个或多个哨兵节点组成,特殊的redis节点不存储数据
数据节点:主节点和从节点即数据节点
4、哨兵故障转移机制
主观下线:一个哨兵认为主节点有问题,则进行下一步即选举
客观下线:多个哨兵(半数以上)认为主节点有问题(客观下线是主节点上才会有的概念)
①由哨兵节点定期监控主节点是否发生故障
1个从节点每隔1s向哨兵发送ping的命令做心跳检测,主节点在一定时间内不回复或回复有问题则单个从节点认为主节点下线即主观下线,若超过半数的哨兵认为主节点下线了即客观下线真正下线了。
5、哨兵工作、切换原理
哨兵原理:分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障是通过投票机制选新的master并将所有slave连接到新的master上,整个哨兵的集群数量不能少于3个节点(3台服务器)
①哨兵对主从复制进行监控,所有redis数据库节点
②哨兵之间进行相互监控。监控哨兵彼此
③监控目的:哨兵之间检测检测彼此的存好状态,检测主从复制redis数据库是为了实现故障切换
④当master挂掉,哨兵会即及时发现然后进行投票选出一个新的master服务器(哨兵个数要是奇数)。
⑤选出的slave完成从向主的一个切换
⑥完成其他服务器对新的maste的配置指向
6、哨兵主节点选举原则
①过滤掉不健康的(已下线的节点),没有回复哨兵ping响应的从节点
②选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
③选择复制便宜量最大,也就是复制最完整的从节点
7、哨兵模式部署
①试验环境
redis | 端口 | 哨兵 | 端口 |
192.168.30.11 | 6379 | 192.168.30.11 | 26379 |
192.168.30.13 | 6379 | 192.168.30.13 | 26379 |
192.168.30.14 | 6379 | 192.168.30.14 | 26379 |
②哨兵模式基于主从复制,所有要先部署主从复制。主从复制在上一章节redis数据库高可用中有详细步骤,请参考。
③部署完成主从复制之后进行哨兵部署
三个节点配置:
vim /opt/redis-5.0.7/sentinel.conf #编辑哨兵配置文件
protected-mode no #关闭保护机制 17行
port 26379 #配置监听端口 21行
daemonize yes #开启守护进程 26行
logfile “/var/log/sentinel.log” #指定sentinel日志文件位置36行
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.30.11 6379 2 #指定主节点为192.168.30.11 端口号6379 2表示至少2个哨兵同意才能进行故障转移
sentinel down-after-milliseconds mymaster 30000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000(180秒)
④配置完成后启动哨兵模式,注意一定要先启动maste再启动俩个salve。
master:
redis-sentinel sentinel.conf & #先启动master
slave:
redis-sentinel sentinel.conf &
redis-cli -p 26379 info sentinel #启动完成后在maser上查看哨兵信息
⑤验证哨兵的故障迁移功能,关闭master的redis数据库。
/etc/init.d/redis_6379 stop #关闭master的redis数据库
tail -f /var/log/sentinel.log #试试查看slave的日志是否切换了主
⑥验证哨兵模式注意事项:若使用kill -9 直接杀掉master的redis进程可能会导致再次重启redis报错:/var/run/redis_6379.pid exists, process is already running or crashed。此报错为reids的pid文件已经存在导致,强制杀死进程pid文件未删除。只需要将/var/run/redis_6379.pid文件删除再启动即可。
二、redis数据库cluster集群
1、cluster集群优点、数据存储及同步方式
cluster集群优点:读写可以负载均衡、自动故障转移、突破单机存储限制、分布式存储、三主三从
同步的两种方式:master1只给slave1同步数据、master和master同步数据(心跳线)
数据如何存储:使用Hash算法有16384个槽位,每个槽位有512字节。
2、cluster集群原理
3、 cluster集群部署
①实验环境
注意:本文基于三台机器所以只需每台机器2个实例端口不通即可,若是同一台机器则需要每个实例的端口都不一样
master | 端口 | slave | 端口 |
192.168.30.11 | 6001 | 192.168.30.11 | 6002 |
192.168.30.13 | 6001 | 192.168.30.13 | 6002 |
192.168.30.14 | 6001 | 192.168.30.14 | 6002 |
② 群集部署-reids编译准备
三台机器执行:
systemctl stop firewalld #关闭防火墙
setenforce 0 #关闭selinux
yum install gcc gcc-c++ make -y #安装编译工具
#将安装包传输到每台机器的/opt目录下,安装包本人资源中心中redis-5.0.7.tar.gz可自行下载
tar zxvf redis-5.0.7.tar.gz #将安装包解压在当前目录
cd redis-5.0.7 #进入解压后的文件夹中
make #编译为二进制语言
make install prefix=/url/local/redis #写入磁盘指定位置/url/local/redis
③每台服务器创建2个实例并配置
三台机器执行:
cd /etc #进入/etc目录
mkdir reids #创建 redis目录
cd redis #进入redis目录
mkdir -p redis-cluster/redis6001 #创建实例1文件夹
mkdir -p redis-cluster/redis6002 #创建实例2文件夹
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6001 #实例1拷贝主配置文件
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6001 #实例1拷贝客户端、服务端工具
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6002 #实例2拷贝主配置文件
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6002 #实例2拷贝客户端、服务端工具
cd /etc/redis/redis-cluster/redis6001 #进入实例1进行配置文件修改
vim redis.conf #编辑实例1的配置文件
bind 0.0.0.0 #69行,监听所有地址
protected-mode no #88行,修改,关闭保护模式
port 6001 #92行,修改,redis监听端口(同一台机器的2个实例端口号不能相同)
daemonize yes #136行,开启守护进程,以独立进程启动
logfile /var/log/redis_6001.log #172行,指定日志文件目录
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置为实例端口.conf
cluster-node-timeout 15000 #846行,取消注释群集超时时间设置
appendonly yes #700行,修改,开启AOF持久化
#修改完成实例1后修改实例2,除端口号改为6002 日志文件目录改为6002.conf 群集名称文件改为nodes-6002.conf 其余与实例1一样即可。
③启动多实例并查看服务
三台机器执行:
cd /etc/redis/redis-cluster/redis6001 #进入对应实例1目录
redis-server redis.conf #执行启动redis实例1
cd /etc/redis/redis-cluster/redis6002 #进入对应实例2目录
redis-server redis.conf #执行启动redis实例2
ps -elf |grep redis #查看是否为2个redis进程在运行
④启动redis群集
随便一台机器执行:
redis-cli --cluster create 192.168.30.11:6001 192.168.30.13:6001 192.168.30.14:6001 192.168.30.11:6002 192.168.30.13:6002 192.168.30.14:6002 --cluster-replicas 1
#前面三个ip+端口是master服务器,后面三个是slave服务器 --cluster-replicas 1 是指每个主节点有一个从节点
⑤验证群集结果
登录一台reids实例查看主从对应关系及哈希槽位范围
redis-cli -p 6001 -c #登录其中一台主redis -c指集群模式连接可以互相跳转
cluster slots #查看主从对应关系及哈希槽位范围
set ky26 123 #主上设置ky26值为123查看对应备上是否有此键
创建键值时redis-cli报错:(error) MOVED 12706,是因为没有以集群模式连接,测试登录时使用redis-cli -p 6001 -c 即可解决此问题。