集群环境  
节点名称 
节点角色 
IP地址 
端口 
 
 
\ 
vip 
192.168.100.250 
\ 
 
node01 
master01 
192.168.100.11 
6379 
 
node01 
sentinel01 
192.168.100.11 
26379 
 
node02 
slave02 
192.168.100.12 
6379 
 
node02 
sentinel02 
192.168.100.12 
26379 
 
node03 
slave03 
192.168.100.13 
6379 
 
node03 
sentinel03 
192.168.100.13 
26379 
 
keepalived部署  
分别在三个节点分别创建keepalived目录和redis监测脚本
 
cat >/opt/keepalived/check-redis.sh <<EOF #!/bin/bash ALIVE=`/usr/bin/redis-cli PING` LOGFILE="/opt/redis/keepalived-redis-state.log" if [ "" == "PONG" ]; then     echo "check master  pong" >> $LOGFILE     exit 0 else     echo      exit 1 fi EOF 
 
分别在三个节点创建keepalived配置文件
cat >/opt/keepalived/keepalived.conf <<EOF global_defs {   default_interface ens33 } vrrp_script chk_redis {   script "/container/service/keepalived/assets/check-redis.sh"   weight -20   interval 2 } vrrp_instance VI_1 {   interface ens33   track_interface {     ens33   }   state BACKUP   virtual_router_id 51   priority 150   nopreempt   unicast_peer {     192.168.100.11     192.168.100.12     192.168.100.13   }   virtual_ipaddress {     192.168.100.250   }   authentication {     auth_type PASS     auth_pass hello   }   track_script {     chk_redis   }   notify "/container/service/keepalived/assets/notify.sh" } EOF 
 
分别在三个节点node01、node02、node03运行keepalived容器
docker run --net=host --cap-add=NET_ADMIN \ -e KEEPALIVED_INTERFACE=ens33 \ -e KEEPALIVED_VIRTUAL_IPS="#PYTHON2BASH:['192.168.100.250']" \ -e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.100.11','192.168.100.12','192.168.100.13']" \ -e KEEPALIVED_PASSWORD=hello \ --name keepalived \ --restart always \ -v /opt/keepalived/keepalived.conf:/usr/local/etc/keepalived/keepalived.conf \ -v /opt/keepalived/check-redis.sh:/container/service/keepalived/assets/check-redis.sh \ -d osixia/keepalived:1.4.4 
 
构建redis镜像  
构建redis基础镜像  
下载redis docker镜像 
下载redis配置文件wget http://download.redis.io/redis-stable/redis.conf 
 
创建redis目录,并复制redis配置文件mkdir redis cp redis.conf redis/ 
 
创建Dockerfilecat > redis/Dockerfile <<EOF FROM redis:5.0.1 COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] EOF 
 
构建redis镜像docker build -t redis:5.0.1-build /root/redis/ 
 
 
构建redis-sentinel镜像  
1.创建sentinel目录并复制配置文件
cat > sentinel.conf  <<EOF  daemonize no port 26379 dir "/tmp" sentinel monitor mymaster192.168.100.11 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 EOF 
 
mkdir redis-sentinel cp sentinel.conf redis-sentinel/ 
 
4.创建Dockerfile
cat > redis-sentinel/Dockerfile <<EOF FROM redis:5.0.1 COPY sentinel.conf /usr/local/etc/redis/redis.conf CMD [ "redis-sentinel", "/usr/local/etc/redis/sentinel.conf" ] EOF 
 
5.构建redis镜像
docker build -t redis-sentinel:5.0.1-build /root/redis-sentinel/ 
 
配置私有仓库并上传镜像  
1.启动registry镜像仓库
docker run -d --name registry -p 4000:5000 registry:2 
 
2.指定私有仓库并重启docker服务,这个步骤需要三个节点都要执行
cat > /etc/docker/daemon.json <<EOF {   "insecure-registries": ["192.168.100.11:4000"] } EOF systemctl restart docker 
 
3.上传redis镜像到私有仓库
docker tag redis:5.0.1-build 192.168.100.11:4000/redis:5.0.1-build docker push 192.168.100.11:4000/redis:5.0.1-build 
 
docker tag redis-sentinel:5.0.1-build 192.168.100.11:4000/redis-sentinel:5.0.1-build docker push 192.168.100.11:4000/redis-sentinel:5.0.1 
 
部署redis集群  
分别在三个节点创建redis目录
mkdir -p /opt/redis/conf /opt/redis/data 
 
cat redis-slave.conf bind 192.168.100.11 port 6378 daemonize no dir /data masterauth 123456 requirepass 123456 #master vip and port slaveof 192.168.100.250 6379 appendonly no appendfsync always 
 
node01节点  
创建master节点配置文件和sentinel配置文件
cat >/opt/redis/conf/redis-master.conf <<EOF bind 192.168.100.11 port 6379 daemonize no appendonly no appendfsync always requirepass 123456 masterauth 123456 dir /data EOF 
 
cat >/opt/redis/conf/sentinel.conf  <<EOF  daemonize no port 26379 dir "/tmp" sentinel monitor 192.168.100.11 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 EOF 
 
启动redis master容器
docker run -d \ --net host \ --name redis-master01 \ --restart=always \ -p 6379:6379 \ -v /opt/redis/conf/redis-master.conf:/usr/local/etc/redis/redis.conf \ -v /data/:/data/ \ redis:5.0.1-build 
 
启动sentinel容器
docker run -d \ --net host \ --name redis-sentinel01 \ --restart=always \ -p 6378:6378 \ -v /opt/redis/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf \ redis-sentinel:5.0.1 
 
node02节点  
创建slave节点配置文件和sentinel配置文件
cat >/opt/redis/conf/redis-slave.conf <<EOF bind 192.168.100.12 port 6379 daemonize no dir /data masterauth 123456 requirepass 123456 #master vip and port slaveof 192.168.100.11 6379 appendonly no appendfsync always EOF 
 
cat >/opt/redis/conf/sentinel.conf <<EOF daemonize no port 26379 dir "/tmp" sentinel monitor mymaster 192.168.100.11 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 EOF 
 
启动redis slave容器
docker run -d \ --net host \ --name redis-slave02 \ --restart=always \ -p 6379:6379 \ -v /opt/redis/conf/redis-slave.conf:/usr/local/etc/redis/redis.conf \ -v /data/:/data/ \ 192.168.100.11:4000/redis:5.0.1-build 
 
启动sentinel容器
docker run -d \ --net host \ --name redis-sentinel02 \ --restart=always \ -p 6378:6378 \ -v /opt/redis/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf \ 192.168.100.11:4000/redis-sentinel:5.0.1 
 
node03节点  
创建slave节点配置文件和sentinel配置文件
cat >/opt/redis/conf/redis-slave.conf <<EOF bind 192.168.100.13 port 6379 daemonize no dir /data masterauth 123456 requirepass 123456 #master vip and port slaveof 192.168.100.11 6379 appendonly no appendfsync always EOF 
 
cat >/opt/redis/conf/sentinel.conf <<EOF daemonize no port 26379 dir "/tmp" sentinel monitor mymaster 192.168.100.11 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel auth-pass mymaster 123456 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 EOF 
 
启动redis slave容器
docker run -d \ --net host \ --name redis-slave03 \ --restart=always \ -p 6379:6379 \ -v /opt/redis/conf/redis-slave.conf:/usr/local/etc/redis/redis.conf \ -v /data/:/data/ \ 192.168.100.11:4000/redis:5.0.1-build 
 
启动sentinel容器
docker run -d \ --net host \ --name redis-sentinel03 \ --restart=always \ -p 6378:6378 \ -v /opt/redis/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf \ 192.168.100.11:4000/redis-sentinel:5.0.1 
 
redis集群检查  
在任意节点安装redis-cli进行集群测试, 1.连接redis集群master
[root@node03 ~]# redis-cli -h 192.168.100.11 192.168.100.11:6379> auth 123456 OK 
 
2.查看集群主从复制replication信息
192.168.100.11:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.100.12,port=6378,state=online,offset=120785,lag=1 slave1:ip=192.168.100.13,port=6378,state=online,offset=120785,lag=1 master_replid:abe498d0c1a60e8527d17261804ab4199e7d27b2 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:120928 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:120928 
 
3.写入数据,测试数据已经写入集群
192.168.100.11:6379> set hello acaiblog OK 192.168.100.11:6379> save OK 192.168.100.11:6379> get hello "acaiblog" 
 
4.将node01节点redis-master01容器关闭,观察redis-sentinel01容器日志master角色是否会切换 从下面日志可以看出master01节点down了之后master节点master角色切换到了slave02
1:X 09 Dec 2018 15:45:26.089 # +sdown master mymaster 192.168.100.11 6379 1:X 09 Dec 2018 15:45:26.122 # +new-epoch 1 1:X 09 Dec 2018 15:45:26.126 # +vote-for-leader 5fc64f3faf37acde07de38afee0761e4100f6a7d 1 1:X 09 Dec 2018 15:45:26.161 # +odown master mymaster 192.168.100.11 6379 #quorum 3/2 1:X 09 Dec 2018 15:45:26.161 # Next failover delay: I will not start a failover before Sun Dec  9 15:51:27 2018 1:X 09 Dec 2018 15:45:27.093 # +config-update-from sentinel 5fc64f3faf37acde07de38afee0761e4100f6a7d 192.168.100.12 26379 @ mymaster 192.168.100.11 6379 1:X 09 Dec 2018 15:45:27.093 # +switch-master mymaster 192.168.100.11 6379 192.168.100.12 6378 1:X 09 Dec 2018 15:45:27.094 * +slave slave 192.168.100.13:6378 192.168.100.13 6378 @ mymaster 192.168.100.12 6378 1:X 09 Dec 2018 15:45:27.094 * +slave slave 192.168.100.11:6379 192.168.100.11 6379 @ mymaster 192.168.100.12 6378 1:X 09 Dec 2018 15:46:27.115 # +sdown slave 192.168.100.11:6379 192.168.100.11 6379 @ mymaster 192.168.100.12 6378 
 
5.测试slave02是否可以正常读取数据
[root@node03 ~]# redis-cli -h 192.168.100.12 192.168.100.12:6379> auth 123456 OK 192.168.100.12:6379> get hello "acaiblog"