以下部分想看懂得有一定的redis基础,且步骤是连贯的,错一步都不行。redis运行多个实例,不懂得自行百度。
1. redis主从同步
原理:
- 从服务器向主服务器发送 SYNC 命令。
- 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
- 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
- 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
-------------
1、在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
2、同步开始之后,通过主库命令传播的方式,主动的复制方式实现
3、2.8以后实现PSYNC的机制,实现断线重连
2. redis主从同步实验
2.1 准备三个redis数据库配置文件
背景: 一主两从
6380为主,6381和6382 为从
cd /opt/redis_conf
vim redis-6380.conf
写入以下配置
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
再创建两个配置文件6381和6382
sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf
创建数据文件目录
[root@qishi666 redis_conf]# mkdir -p /data/6380
[root@qishi666 redis_conf]# mkdir -p /data/6381
[root@qishi666 redis_conf]# mkdir -p /data/6382
2.2 启动redis数据库
[root@qishi666 redis_conf]# redis-server redis-6380.conf
[root@qishi666 redis_conf]# redis-server redis-6381.conf
[root@qishi666 redis_conf]# redis-server redis-6382.conf
2.3 确保这三个redis数据库是完全独立的数据库
2.4 给两个从服务器配置文件再添加一行配置(很重要)
在6381和6382配置文件添加这一行配置,表示指定主服务器为6380
slaveof 127.0.0.1 6380
2.5 重启数据库
pkill redis
redis-server /opt/redis_conf/redis-6380.conf
redis-server /opt/redis_conf/redis-6381.conf
redis-server /opt/redis_conf/redis-6382.conf
2.6 查看主从数据库状态
redis-cli -p 6380 info
redis-cli -p 6380 info replication
2.7 添加数据进行测试
在从服务器上不可以写入:
2.8 手动进行主从复制故障切换
2.8.1 关闭6381的从库身份
redis-cli -p 6381
info replication
slaveof no one
2.8.2 将6382设为6381的从库
6382连接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
3. redis哨兵
3.1 sentinel主要功能如下:
- 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识
- 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
- 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
3.2 redis sentinel配置步骤
3.2.1 配置三个redis数据库, 一主两从
redis-6380.conf
redis-6381.conf
redis-6382.conf
3.2.2 启动三个redis数据库,确保主从复制正常运行
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
redis-cli -p 6382 info replication
3.2.3 配置三个哨兵
cd /opt/redis_conf
vim redis-sentinel-26380.conf
vim redis-sentinel-26381.conf
vim redis-sentinel-26382.conf
写入以下配置文件
port 26380
dir /data/26380
logfile "26380.log"
sentinel monitor qishimaster 127.0.0.1 6380 2
sentinel down-after-milliseconds qishimaster 30000
sentinel parallel-syncs qishimaster 1
sentinel failover-timeout qishimaster 180000
daemonize yes
哨兵配置文件详解:
# Sentinel节点的端口
port 26379
dir /var/redis/data/
logfile "26379.log"
# sentinel announce-ip 127.0.0.1 # 宣告哨兵IP, 此配置只有当使用非127.0.0.1的IP配置哨兵无法成功时加上,同时redis三个服务端也需要同步修改IP
# 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
# 2代表判断主节点失败至少需要2个Sentinel节点节点同意
# mymaster是主节点的别名
sentinel monitor mymaster 127.0.0.1 6379 2
# 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000
# 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster 1
# 故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000
daemonize yes
创建存放哨兵文件的目录
mkdir -p /data/{26380,26381,26382}
如果发现哨兵没有正常启动,必须把IP改为127.0.0.1
如果你是在三个不同的机器上,只能用机器对外访问的IP,那就需要添加这一个配置
sentinel announce-ip 127.0.0.1
3.2.4 启动三个哨兵
[root@qishi666 redis_conf]# redis-sentinel redis-26380.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26381.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26382.conf
3.2.5 此时查看哨兵是否成功通信
3.2.6 如果出现问题,没有配置成功,没有显示前面这几条配置成功的信息,就推倒重来
从配置主从同步开始做!!!!!
3.2.7 验证redis高可用故障切换
大致思路
- 杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
- 重新恢复旧的“master”节点,查看此时的redis身份
首先查看三个redis的进程状态
4 redis集群概念
4.1 为什么需要用到集群
全量数据, 量很大,一台机器没有办法全部处理完,所以需要多台机器同时处理,才能达到我们想要的效果
就类似于一大车货物,通过5辆马车来运输
4.2 redis集群槽位概念
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
Redis Cluster槽的范围是0~16383。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽。
5. redis集群配置
5.1 准备六个节点
cd /opt/jq
vim redis-7000.conf
vim redis-7001.conf
vim redis-7002.conf
vim redis-7003.conf
vim redis-7004.conf
vim redis-7005.conf
写入配置
port 7000
daemonize yes
dir "/data/jq/7000"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
这6个节点配置文件都一样,仅仅是端口的不同
[root@qishi666 jq]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
[root@qishi666 jq]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf
[root@qishi666 jq]# sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf
[root@qishi666 jq]# sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf
[root@qishi666 jq]# sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
创建这六个节点的文件目录
mkdir -p /data/jq/{7000,7001,7002,7003,7004,7005}
5.2 启动这六个节点
cd /opt/jq
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
5.3 随便进入一个redis交互模式,写入数据,发现无法写入
报错,没有分配哈希槽
5.4 准备ruby环境,安装ruby并执行redis-trib.rb脚本
分配redis集群状态,以及槽位分配,互联网企业,豆瓣公司开源的一个工具
1 下载、编译、安装Ruby
# 下载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
cd ruby-2.3.1/
./configure --prefix=/opt/ruby/
make && make install
5.5 配置ruby环境
5.5.1 配置ruby环境变量
vim /etc/profile
在PATH=后面添加ruby的环境变量路径
PATH=/opt/ruby/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
再刷新配置文件 source /etc/profile
5.5.2 安装rubygem redis
wget http://rubygems.org/downloads/redis-3.3.0.gem
5.5.3 使用gem安装redis-3.3.0.gem工具
gem install -l redis-3.3.0.gem
5.7 一键开启redis-cluster集群
5.7.1 一条命令开启集群
redis-cli --cluster create --cluster-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
# 每个主节点,有一个从节点,代表--replicas 1
# 集群自动分配主从关系 7000、7001、7002为主 7003、7004、7005为从
5.7.2 查看集群状态
5.8 进入集群状态
redis-cli -p 7000 -c