基于docker实现keepalived+redis+sentinel高可用集群

集群环境

节点名称 节点角色 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监测脚本

mkdir /opt/keepalived
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基础镜像

  1. 下载redis docker镜像
    docker pull redis:5.0.1
  2. 下载redis配置文件
    wget http://download.redis.io/redis-stable/redis.conf
  3. 创建redis目录,并复制redis配置文件
    mkdir redis
    cp redis.conf redis/
  4. 创建Dockerfile
    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镜像
    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"
文章作者: 慕容峻才
文章链接: https://www.acaiblog.top/基于docker实现redis高可用集群/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿才的博客
微信打赏
支付宝打赏