前言:自学部署,并不专业,勿喷!!!
1. 服务器环境
服务器名称 | IP | 系统版本 |
主服务器 | 10.30.10.1 | centos7.6 |
从服务器1 | 10.30.10.2 | centos7.6 |
从服务器2 | 10.30.10.3 | centos7.6 |
避坑说明:必须3台服务器数量及以上,符合2n+1(n>=1)台服务器规则,否则哨兵无法自动切换主从。
2. 使用docker搭建rdis一主二从
2.1 拉取redis镜像
说明:请先安装docker,过程忽略。。。。
1.有网情况下可直接在线拉取镜像
docker pull redis
2.无网情况下需要在另一台有网的服务器进行下载
docker pull redis
docker save -o redis.tar redis
再去到需要部署redis无网服务器,将redis.tar进行上传并拉取本地镜像
docker load -i redis.tar
2.2 创建redis的存储,日志,配置文件挂载路径
mkdir -p /home/redis/{data,conf,log}
2.3 拉取redis.conf文件和创建redis.log文件夹并赋予777权限
4.1.1 拉取redis.conf文件
1.有网络情况下可以在线拉取
先切换目录
cd /home/redis/conf
下载
wget http://download.redis.io/redis-stable/redis.conf
2.无网情况下找台有网电脑输入下面的网站即可下载,再上传到需要部署的服务器上
http://download.redis.io/redis-stable/redis.conf
4.1.2 创建redis.log文件
touch /home/redis/log/redis.log
(提示:如果日志文件占用过大,可将其删除后,重新创建,重启redis即可)
4.1.3 赋予redis.conf,redis.log文件权限
chmod 777 /home/redis/conf/redis.conf
chomd 777 /home/redis/logs/redis.log
2.4 修改redis.conf(主)配置文件
# 让外部设备连接
bind 0.0.0.0
# 关闭保护模式
protected-mode no
# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)
daemonize no
# 设置日志文件路径(避坑提示,此路径为容器内的路径,切勿当成宿主路径)
logfile "/etc/redis.log"
# 设置主服务器密码(避坑提示,因为在哨兵模式下当主挂掉后,再重新启动主后,主变成了从,不写入masterauth,原来的主会无密码验证,会导致主从无法复制报错)
masterauth 123456
# 设置redis密码(避坑提示,一定要把三台服务器的redis密码设置成一致的,不然无法自动切换主从,因为假如主服务器挂掉后,会有一台从redis变成主,此时另外一台redis从会拿sentinel配置文件里面的sentinel auth-pass mymaster 123456 去验证密码,此sentinel auth-pass mymaster对应redis.conf配置文件里面的requirepass)
requirepass 123456
2.5 修改redis.conf(从)配置文件,两个从机同如下修改
# 让外部设备连接
bind 0.0.0.0
# 关闭保护模式
protected-mode no
# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)
daemonize no
# 设置日志文件路径(避坑提示,此路径为容器内的路径,切勿当成宿主路径)
logfile "/etc/redis.log"
# 设置主 IP 端口(避坑提示,此段必须写在 masterauth 123456 上面,不然无法启动redis)
slaveof 10.30.10.1 6379
# 设置主服务器密码
masterauth 123456
# 设置redis密码(避坑提示,一定要把三台服务器的redis密码设置成一致的,不然无法自动切换主从,因为假如主服务器挂掉后,会有一台从redis变成主,此时另外一台redis从会拿sentinel配置文件里面的sentinel auth-pass mymaster 123456 去验证密码,此sentinel auth-pass mymaster对应redis.conf配置文件里面的requirepass)
requirepass 123456
2.6 docker启动redis镜像,3台服务器同样执行以下启动命令
启动镜像命令
温馨提示:请先记得把防火墙6379端口打开
docker run --name redis \--restart=always \-p 6379:6379 \-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \-v /home/redis/data:/data \-v /home/redis/log/redis.log:/etc/redis.log \-d redis redis-server /etc/redis/redis.conf
解析
#设置容器名称
--name redis
#设置端口,前为宿主端口,后为容器端口(避坑提示,从机端口必须是6379,否则出现无法自动切换主从)
-p 6379:6379
#设置redis跟随docker启动后进行自动启动
--restart=always
#挂载redis.conf文件,方便修改配置文件
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf
#挂载存储文件
-v /home/redis/data:/data
#挂载日志文件,方便查看日志进行运维
-v /home/redis/log/redis.log:/etc/redis.log
#指定redis镜像名称并带配置文件进行启动
-d redis redis-server /etc/redis/redis.conf
2.7 验证主从和复制功能
1.验证主从
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
主应显示如下,能看到两个从机state=online
# Replication
role:master
connected_slaves:2
slave0:ip=10.30.10.2,port=6379,state=online
slave1:ip=10.30.10.3,port=6379,state=online
从应显示如下,能看到连接主机成功
# Replication
role:slave
master_host:10.30.10.1
master_port:6379
master_link_status:up
2.验证复制功能是否正常
在主机插入数据
127.0.0.1:6379>set a test
127.0.0.1:6379>get a
返回 test,则正常
在两个从机获取
127.0.0.1:6379>get a
反回test,则说明主从复制功能正常
3. 搭建哨兵模式
三台服务器都进行以下相同操作
3.1 创建redis-sentinel配置文件路径
mkdir -p /home/sentinel/conf
3.2 创建和修改配置文件
切换目录
cd /home/sentinel/conf
1.服务器有网情况下,可在线下载配置文件
wget http://download.redis.io/redis-stable/sentinel.conf
2.服务器无网情况下,可电脑输入网站下载,并上传到服务器/
http://download.redis.io/redis-stable/sentinel.conf
修改配置文件名称
mv sentinel.conf redis-sentinel.conf
修改配置文件内容
#允许让外部设备连接
bind 0.0.0.0
#关闭保护模式
protected-mode no
#关闭守护进程
daemonize no
#设置日志路径
logfile "/etc/sentinel.log"
#mymaster代表服务器的名称可⾃定义,设置主服务器IP,端口,哨兵票数
sentinel monitor mymaster 10.30.10.1 6379 2
#在 sentinel monitor mymaster 10.30.10.1 6379 2 下插入,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
#修改超时时间,单位毫秒,设置个3秒就好,1000毫秒等于1秒
sentinel down-after-milliseconds mymaster 3000
3.3 启动sentinel容器
启动镜像命令
避坑提醒:必须把先防火墙开放26379端口,然后启动顺序为先主后从
docker run --restart=always \--privileged=true \--name redis-sentinel \-p 26379:26379 \-v /home/sentinel/conf:/etc/redis/conf/ \--net host \-d redis \redis-sentinel /etc/redis/conf/redis-sentinel.conf
解析
#设置sentinel跟随docker启动后进行自动启动
--restart=always
#设置容器名称
--name redis
#很重要啊!!!这个是给容器root权限,容器需要给宿主挂载的redis-sentinel.conf文件修改内容,有权限才行,不然会报错
--privileged=true
#给容器命名
--name redis-sentinel
#设置端口
-p 26379:26379
#设置redis-sentinel的配置文件目录路径,避坑提醒:千万别写文件路径,写了文件会导致主从切换不成功,直接挂载目录即可
/home/sentinel/conf:/etc/redis/conf/
#设置容器内部的网络跟主机的网络共享
--net host
#指定redis镜像,并带配置文件进行启动
-d redis \redis-sentinel /etc/redis/conf/redis-sentinel.conf
4. 验证
4.1 验证sentinel状态,redis-sentinel.conf文件是否已修改
不进入容器快捷查看,三台服务器都查看
docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"
返回以下这条信息,主IP和端口正确,两个从,sentinels=3则表示myid未冲突,状态正常
master0:name=mymaster,status=ok,address=10.30.10.1:6379,slaves=2,sentinels=3
直接查看redis-sentinel.conf
因为sentinel启动后会自动写入配置文件,拉到最下面可看到生成的myid,以及另外两台服务器的IP和端口,以及他们的哨兵myid
如果有问题,可进入容器查看日志
docker exec -it redis-sentinel bash
cat /etc/sentinel.log
正常的日志可以看到另外两台服务器的redis,IP,端口。另外两台服务器哨兵的id,IP,端口
4.2 模拟主服务器故障后主从切换
停止主服务器redis服务
docker stop redis
查看两台从服务器的redis信息
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
其中一台返回显示信息role:master,并且slave连接着一个,代表主从切换成功
查看两台从服务器的sentinel状态
docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"
正常返回以下其中一条信息,发现从服务器10.30.20.1已变成了主
master0:name=mymaster,status=ok,address=10.30.20.1:6379,slaves=2,sentinels=3
启动被停掉的原主服务器
docker start redis
查看原主服务器redis信息
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
正常返回信息显示role:slave