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



集群环境

节点名称节点角色IP地址端口
\vip192.168.100.250\
node01master01192.168.100.116379
node01sentinel01192.168.100.1126379
node02slave02192.168.100.126379
node02sentinel02192.168.100.1226379
node03slave03192.168.100.136379
node03sentinel03192.168.100.1326379

keepalived部署

分别在三个节点分别创建keepalived目录和redis监测脚本

1
mkdir /opt/keepalived

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基础镜像

  1. 下载redis docker镜像
    1
    docker pull redis:5.0.1

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"


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回