集群环境
节点名称
节点角色
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"