172.30.2.223 master
172.30.2.133 slave
172.30.2.225 slave
每个节点上部署一个redis实例和一个哨兵实例
redis实例端口 6379
哨兵实例端口 9999
从原有服务器上导出镜像
docker save harbor.neuqsoft.com/common/redis:3.2.5 > redis.tar
cd /
sudo mkdir work_nosql
sudo chown -R ubuntu:ubuntu /work_nosql/
cd /work_nosql
mkdir redis
cd redis
mkdir bin dockerfile conf data logs backup
cd /work_nosql
docker load < redis.tar
cd /work_nosql/redis/bin
vim startredis.sh
脚本内容:
#!/bin/bash
set -e
#############################################################################################################
docker run -d -p 6379:6379 --name redisserver --restart=always \
-v /work_nosql/redis/logs:/var/log/redis/ \
-v /work_nosql/redis/data:/data \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
-h redisserver harbor.neuqsoft.com/common/redis:3.2.5 \
chmod +x ./startredis.sh
./startredis.sh
docker ps -a 发现状态一直是restarting
docker logs -f --tail 200 redisserver查看日志,报如下错误:
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 163
>>> 'logfile "/var/log/redis/redis-server.log"'
Can't open the log file: Permission denied
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 163
>>> 'logfile "/var/log/redis/redis-server.log"'
Can't open the log file: Permission denied
6、解决启动报错问题
执行:
docker run -it --name temp -v /work_nosql/redis/logs:/var/log/redis/ harbor.neuqsoft.com/common/redis:3.2.5 /bin/bash
进入临时容器,处理日志文件权限问题:
cd /var/log
chown -R root:root ./redis
cd /var/log/redis
echo '' > redis-server.log
chmod 777 ./redis-server.log
exit
docker rm -f temp
docker cp redisserver:/usr/local/etc/redis/redis.conf /work_nosql/redis/conf
修改启动脚本,增加目录映射-v /work_nosql/redis/conf/redis.conf:/etc/redis/redis.conf ,并把/etc/redis/redis.conf追加到镜像后,使用此配置文件启动。便于后期修改配置文件对redis调优
#!/bin/bash
set -e
#############################################################################################################
docker run -d -p 6379:6379 --name redisserver --restart=always \
-v /work_nosql/redis/logs:/var/log/redis/ \
-v /work_nosql/redis/data:/data \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
-v /work/redis/conf/redis.conf:/etc/redis/redis.conf \
-h redisserver harbor.neuqsoft.com/common/redis:3.2.5 \
/etc/redis/redis.conf
docker rm -f redisserver
cd /work_nosql/redis/bin
./startredis.sh
此时redis单点部署完成,但是从外面不能访问,需要修改/work/redis/conf下redis.conf文件
cd /work/redis/conf
vi redis.conf
输入/bind一直按N,直至找到bind 127.0.0.1 将这个注释掉
vi redis.conf
输入/protected-mod一直按N,直至找到protected-mod yes 将yes修改为no
docker restart redisserver 重启redis服务
按着部署主节点的方式部署其他两个slave节点
cd /work_nosql/redis/conf/
vim redis.conf
查看并修改以下参数配置:
port 6379
slave-read-only yes
appendonly yes
cluster-enabled no (只有集群cluster模式部署时此参数才设置为yes,否则redis实例不能单独运行插入数据)
重启 docker restart redisserver
cd /work_nosql/redis/conf/
vim redis.conf
查看以下参数配置:
port 6379
slave-read-only yes
appendonly yes
slaveof 172.30.2.223 6379 表明该节点是主节点的salve(主节点的ip和端口)
cluster-enabled no (只有集群cluster模式部署时此参数才设置为yes,否则redis实例不能单独运行插入数据)
重启 docker restart redisserver
验证是否主从:
在主节点上插入数据,在从节点上能看到,说明主从搭建成功,接下来需要搭建哨兵集群
mkdir /work_nosql/redis_sen
cd /work_nosql/redis
cp -r ./* /work_nosql/redis_sen/
cd /work_nosql/redis_sen/conf/
mv redis.conf redis.conf.bak
vim redis.conf
插入如下信息:
port 9999
dir "/tmp"
##sentinel监控的redis的名字、IP和端口,最后一个数字是sentinel做决策的时候需要投赞同票的最少的sentinel的数量。(172.30.2.223为master的ip)
sentinel monitor mymaster 172.30.2.223 6379 2
##选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel current-epoch 1
###logfile "/logs/log_sentinel_9999.log"
修改启动脚本:
cd /work_nosql/redis_sen/bin
vim startredis.sh
最后脚本如下:
#!/bin/bash
set -e
#############################################################################################################
docker run -d -p 9999:9999 --name redissenserver --restart=always \
-v /work_nosql/redis_sen/logs:/var/log/redis/ \
-v /work_nosql/redis_sen/data:/data \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
-v /work_nosql/redis_sen/conf/redis.conf:/etc/redis/redis.conf \
-h redisserver harbor.neuqsoft.com/common/redis:3.2.5 \
/etc/redis/redis.conf --sentinel \
启动: ./startredis.sh
查看日志发现报错:
Sentinel config file /etc/redis/redis.conf is not writable: Permission denied. Exiting...
解决:
docker rm -f redissenserver
docker run -it --name temp -v /work_nosql/redis_sen/conf/redis.conf:/etc/redis/redis.conf harbor.neuqsoft.com/common/redis:3.2.5 /bin/bash
cd /etc/redis
chown -R root:root ./*
chmod 777 ./*
exit
docker rm -f temp
docker rm -f redissenserver
cd /work_nosql/redis_sen/bin
./startredis.sh
每个节点都需要安装哨兵
/work_nosql/redis/conf下redis.conf增加:
-----配置redis Slave密码为123456
requirepass 123456
-----由于slave需要和master交互,在slave上需配置master的密码验证
masterauth 123456
配置完成后重启所有节点的redis服务。这时候主从复制没问题。但是如果主节点挂了之后不会自动选举,因为哨兵也需要配置验证的密码
/work_nosql/redis_sen/conf下redis.conf增加:
----master为你的自定义哨兵集群master字符串
sentinel auth-pass master 123456
重启所有的哨兵服务
附上详细搭建的过程