Docker 搭建自定义网络段
推荐使用自定义网络段的原因:因为docker容器之间默认通信方式使用的是桥接模式,每次重启容器会分配新的IP地址,这会导致每次重启Redis Master Node都需要重新修改Slave Node相对应的IP地址,过于繁琐。
创建自定义网络段: docker network create --subnet=172.17.0.0/16 mynetwork
查看网络段: docker network ls
查看网络使用情况:docker network inspect mynetwork
根据查看网络使用情况,用没有使用过的ip进行分配地址
Slave Node :172.18.0.2 、 172.18.0.3
Mater IP地址 :172.18.0.4
哨兵IP地址:172.18.0.5 、172.18.0.6、 172.18.0.7
拉取Redis5.0镜像文件
查看Redis版本:docker search redis
拉取镜像:docker pull redis:5.0
创建Redis集群文件目录
mkdir /usr/local/program/rediscluster/redis1/data
mkdir /usr/local/program/rediscluster/redis1/conf
mkdir /usr/local/program/rediscluster/redis2/data
mkdir /usr/local/program/rediscluster/redis2/conf
mkdir /usr/local/program/rediscluster/redis3/data
mkdir /usr/local/program/rediscluster/redis3/conf
mkdir /usr/local/program/rediscluster/redis4
mkdir /usr/local/program/rediscluster/redis5
mkdir /usr/local/program/rediscluster/redis6
目录redis1,redis2,redis3用于存放主从配置文件,redis4、redis5、redis6用于存放哨兵配置文件(根据个人习惯自定义)
配置redis.conf文件
首先去redis官网https://redis.io/download下载一份linux的Reis文件,然后进行解压,修改redis.conf文件
Master Node 配置如下:
port 6379
# 0.0.0.0表示所有主机都可以连接到redis,127.0.0.1表示本机可连
bind 0.0.0.0
#打开AOF持久化
appendonly yes
#推荐配置
appendfsync everysec
#设置密码
requirepass 123456
将修改好的master redis.conf文件放置之前创建好的目录/usr/local/program/rediscluster/redis1/conf下
Salve Node配置如下:
bind 0.0.0.0
#打开AOF持久化
appendonly yes
#配置连接Master Node(有如下声明则当前redis为从节点)
replicaof 172.18.0.4 6379
#推荐配置
appendfsync everysec
#设置密码
requirepass 123456
#master有设置密码,配置连接master的登录密码
masterauth 123456
将修改好的slaev redis.conf文件上传至阿里云ubutu创建好的目录
/usr/local/program/rediscluster/redis2/conf
/usr/local/program/rediscluster/redis3/conf
创建Redis启动容器,加载配置文件并持久化数据
docker run -d --privileged=true -p 6001:6379 -v /usr/local/program/rediscluster/redis1/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/program/rediscluster/redis1/conf/data:/data --name redis1 --network=mynetwork --ip 172.18.0.2 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes
docker run -d --privileged=true -p 6002:6379 -v /usr/local/program/rediscluster/redis2/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/program/rediscluster/redis2/conf/data:/data --name redis1 --network=mynetwork --ip 172.18.0.3 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes
docker run -d --privileged=true -p 6003:6379 -v /usr/local/program/rediscluster/redis3/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/program/rediscluster/redis3/conf/data:/data --name redis1 --network=mynetwork --ip 172.18.0.4 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes
参数说明:
–privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf:映射配置文件
-v /docker/redis/data:/data:映射数据目录
–appendonly yes:开启数据持久化
-d :以守护进程开启
redis-server /etc/redis/redis.conf:指定配置文件启动redis-server进程
测试Redis主从是否搭建成功
- 连接容器,进入容器内部
docker exec -it redis1 redis-cli -a 123456 - 输入info replication 命令查看主从信息
- 连接Master 查看 docker exec -it redis3 redis-cli -a 123456
到这里主从搭建成功
开始搭建哨兵
拷贝一份sentinel.conf进行文件进行修改
#配置端口
port 26379
bind 0.0.0.0
##设置为no,如果创建容器启动没有用-d则改成YES,两者二选一
daemonize no
#主机名称 ip 端口 投票选取次数
sentinel monitor mymaster 172.18.0.4 6379 2
#连接master的密码,这个必须在配置sentinel monitor mymaster的下面,不然会报错
sentinel auth-pass mymaster 123456
#从节点的数量
sentinel parallel-syncs mymaster 2
#主节点连接失效的timeout时间,视为宕机
sentinel failover-timeout mymaster 30000
将修改好的文件分别上传到目录
/usr/local/program/rediscluster/redis4
/usr/local/program/rediscluster/redis5
/usr/local/program/rediscluster/redis6
创建Docker 哨兵 容器服务
docker run -it --name sentinel1 --network=mynetwork --ip 172.18.0.5 -p 20000:26379 -v /usr/local/program/rediscluster/redis4:/data -d redis:5.0 redis-sentinel sentinel.conf
docker run -it --name sentinel2 --network=mynetwork --ip 172.18.0.6 -p 20001:26379 -v /usr/local/program/rediscluster/redis5:/data -d redis:5.0 redis-sentinel sentinel.conf
docker run -it --name sentinel3 --network=mynetwork --ip 172.18.0.7 -p 20002:26379 -v /usr/local/program/rediscluster/redis6:/data -d redis:5.0 redis-sentinel sentinel.conf
验证哨兵是否配置成功
docker logs -f sentinel1
说明:只有监听到master,并且同时能寻找到slave和其他集群里的哨兵才算配置成功
注:如果只有master没有监听到slave和其他哨兵的情况,则要检查配置redis主从的地址和sentinel的地址是否在同一个网段内,并且sentinel.conf是否正确配置了master的地址和端口,如果master有配置密码,则sentinel.conf也必须配置连接master认证的密码sentinel auth-pass
实验
关闭Master查看slave是否升级为master
docker stop redis3
查看sentinel日志
docker logs -f sentinel1
通过选举将redis2升级为了Master Node,可以进入redis2容器内,再用info replication进行查看
到此为止,主从+哨兵配置完成,由于配置了自定义网段,再也不用担心重启容器IP改变的问题咯!!