集群环境
节点名称 节点角色 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监测脚本
复制 1 2 3 4 5 6 7 8 9 10 11 12 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配置文件
复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 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容器
复制 1 2 3 4 5 6 7 8 9 10 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镜像 2.下载redis配置文件
复制 1 wget http://download.redis.io/redis-stable/redis.conf
3.创建redis目录,并复制redis配置文件
复制 1 2 mkdir redis cp redis.conf redis/
4.创建Dockerfile
复制 1 2 3 4 5 cat > 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
5.构建redis镜像
复制 1 docker build -t redis:5.0.1-build /root/redis/
构建redis-sentinel镜像 1.创建sentinel目录并复制配置文件
复制 1 2 3 4 5 6 7 8 9 10 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
复制 1 2 mkdir redis-sentinel cp sentinel.conf redis-sentinel/
4.创建Dockerfile
复制 1 2 3 4 5 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镜像
复制 1 docker build -t redis-sentinel:5.0.1-build /root/redis-sentinel/
配置私有仓库并上传镜像 1.启动registry镜像仓库
复制 1 docker run -d --name registry -p 4000:5000 registry:2
2.指定私有仓库并重启docker服务,这个步骤需要三个节点都要执行
复制 1 2 3 4 5 6 cat > /etc/docker/daemon.json <<EOF { "insecure-registries": ["192.168.100.11:4000"] } EOF systemctl restart docker
3.上传redis镜像到私有仓库
复制 1 2 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
复制 1 2 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目录
复制 1 mkdir -p /opt/redis/conf /opt/redis/data
复制 1 2 3 4 5 6 7 8 9 10 11 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配置文件
复制 1 2 3 4 5 6 7 8 9 10 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
复制 1 2 3 4 5 6 7 8 9 10 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容器
复制 1 2 3 4 5 6 7 8 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容器
复制 1 2 3 4 5 6 7 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配置文件
复制 1 2 3 4 5 6 7 8 9 10 11 12 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
复制 1 2 3 4 5 6 7 8 9 10 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容器
复制 1 2 3 4 5 6 7 8 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容器
复制 1 2 3 4 5 6 7 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配置文件
复制 1 2 3 4 5 6 7 8 9 10 11 12 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
复制 1 2 3 4 5 6 7 8 9 10 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容器
复制 1 2 3 4 5 6 7 8 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容器
复制 1 2 3 4 5 6 7 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
复制 1 2 3 [root@node03 ~]# redis-cli -h 192.168.100.11 192.168.100.11:6379> auth 123456 OK
2.查看集群主从复制replication信息
复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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.写入数据,测试数据已经写入集群
复制 1 2 3 4 5 6 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 2 3 4 5 6 7 8 9 10 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是否可以正常读取数据
复制 1 2 3 4 5 [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"
签名:这个人很懒,什么也没有留下!