0
点赞
收藏
分享

微信扫一扫

【打工日常】一键部署三主三从的docker-redis集群

一、项目介绍

1.项目简述
Redis支持三种集群方案:主从复制模式,Sentinel(哨兵)模式,Cluster模式

2.项目功能
A.主从复制。可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。主从里面分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
a.优点:主机会自动将数据同步到从机,可以进行读写分离;Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力;
b.缺点:不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复(也就是要人工介入);主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性;如果多个Slave断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要Slave启动,就会发送sync 请求和主机全量同步,当多个Slave重启的时候,可能会导致MasterIO剧增从而宕机。Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;

B.哨兵模式。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器;当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机;
a.优点:哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。主从可以自动切换,系统更健壮,可用性更高(可以看作自动版的从复制)。
b.缺点:Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

C.Cluster模式。是一种分布式集群模式,它允许将数据分散存储在多个节点上,从而提供了横向扩展、高可用性和更大存储容量。
新模式解决了什么?
a.分布式数据存储:Redis将数据划分为多个槽(slot),这些槽分布在不同的节点上。每个节点负责管理一部分槽中的数据,这样数据可以分布在多个节点上,避免了单节点存储容量的限制。
b.自动数据分片:Redis使用哈希槽来分片数据,客户端根据键的哈希值将数据路由到正确的节点。这使得数据的分片和路由是自动的,不需要手动管理数据分片。
c.高可用性:Redis提供了内置的高可用性机制。数据会在多个节点之间复制,每个槽位都会有一个主节点和多个从节点。如果主节点失效,系统会自动选举一个从节点作为新的主节点,确保数据的可用性。

二、redis集群说明

本次脚本部署的是基于docker的redis三主三从cluster模式集群

1.把三个redis_node文件传到三台服务器

2.给脚本加上执行权限
chmod + x ./*.sh

3.执行脚本
./create_redis_node1.sh
./create_redis_node2.sh
./create_redis_node3.sh

4.创建主从集群关系(--cluster-replicas 1 : 表示为每个master创建一个slave节点)

a.先进入容器:docker exec -it redis-node-1 /bin/bash

b.执行创建集群命令(ip根据实际的来改)
redis-cli -p 6379 -a 123456  --cluster create 192.168.1.130:6379 192.168.1.130:6389 192.168.1.131:6380 192.168.1.131:6390 192.168.1.132:6381 192.168.1.132:6391 --cluster-replicas 1

c.查看集群信息
redis-cli -p 6379 -a 123456
cluster nodes

6.测试连接
redis-cli -c -p 6379 -a 123456
set test "123456"
get test

三、redis的node节点脚本内容

注意:create_redis_node*.sh是用于安装的,rm_redis_node*.sh是用来一键删除的。
(ip根据实际的来改,镜像根据自己实际的来改)

create_redis_node1.sh

#!/bin/bash
echo "开始安装,本次安装路径为/data/redis"
#ip_address=$(ip addr show ens33 | grep "inet " | awk '{print $2}' | cut -d/ -f1)
#formatted_date=$(date +'%Y-%m-%d')
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.导入当前的镜像
#(外网可以直接下载redis的包)
#(docker pull redis:latest)
echo "导入镜像"
docker load -i ./redis6.2.6.tar
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#2.创建挂载目录
echo "创建挂载目录以及配置文件"
mkdir -p /data/redis6379/{data,conf,log}&& ls -l /data/redis6379 && touch /data/redis6379/conf/6379.conf&& ls -l /data/redis6379/conf
mkdir -p /data/redis6389/{data,conf,log}&& ls -l /data/redis6389 && touch /data/redis6379/conf/6389.conf&& ls -l /data/redis6389/conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#3.赋权目录并对配置文件写入内容
echo "创建挂载目录以及配置文件"
chmod 755-R /data/redis6379
echo "#端口号
port 6379
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6379.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6379/conf/6379.conf

chmod 755-R /data/redis6389
echo "#端口号
port 6389
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6389.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6389/conf/6389.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#4.docker启动当前节点redis_node1主从节点
echo "docker启动当前节点redis_node1主从节点"

docker run -d  --name redis-node-1--net host --privileged=true \
-v /data/redis6379/data:/data -v /data/redis6379/conf/6379.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf

docker run -d  --name redis-node-1-1--net host --privileged=true \
-v /data/redis6389/data:/data -v /data/redis6389/conf/6389.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#5.docker启动后打印日志
echo "等待10秒打印日志"
sleep 10
echo "打印redis-node-1"
docker ps -a |grep redis-node-1&& docker logs redis-node-1
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "打印redis-node-1-1"
docker ps -a |grep redis-node-1-1&& docker logs redis-node-1-1
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "运行情况"
docker ps -a
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "脚本执行完成"

rm_redis_node1.sh

#!/bin/bash
echo 开始执行
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.删除容器
echo "删除容器"
docker rm -f redis-node-1-1&& docker rm -f redis-node-1&& docker rmi redis:6.2.6&& docker ps -a && docker images
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#2.删除文件
echo "删除冗余文件"
rm -rf /data/redis*&& ls -l /data
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo 脚本执行完成

create_redis_node2.sh

#!/bin/bash
echo "开始安装,本次安装路径为/data/redis"
#ip_address=$(ip addr show ens33 | grep "inet " | awk '{print $2}' | cut -d/ -f1)
#formatted_date=$(date +'%Y-%m-%d')
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.导入当前的镜像
#(外网可以直接下载redis的包)
#(docker pull redis:latest)
echo "导入镜像"
docker load -i ./redis6.2.6.tar
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#2.创建挂载目录
echo "创建挂载目录以及配置文件"
mkdir -p /data/redis6380/{data,conf,log}&& ls -l /data/redis6380 && touch /data/redis6380/conf/6380.conf&& ls -l /data/redis6380/conf
mkdir -p /data/redis6390/{data,conf,log}&& ls -l /data/redis6390 && touch /data/redis6390/conf/6390.conf&& ls -l /data/redis6390/conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#3.赋权目录并对配置文件写入内容
echo "创建挂载目录以及配置文件"
chmod 755-R /data/redis6380
echo "#端口号
port 6380
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6380.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6380/conf/6380.conf

chmod 755-R /data/redis6390
echo "#端口号
port 6390
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6390.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6390/conf/6390.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#4.docker启动当前节点redis_node2主从节点
echo "docker启动当前节点redis_node2主从节点"

docker run -d  --name redis-node-2--net host --privileged=true \
-v /data/redis6380/data:/data -v /data/redis6380/conf/6380.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf

docker run -d  --name redis-node-2-1--net host --privileged=true \
-v /data/redis6390/data:/data -v /data/redis6390/conf/6390.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#5.docker启动后打印日志
echo "等待10秒打印日志"
sleep 10
echo "打印redis-node-1"
docker ps -a |grep redis-node-2&& docker logs redis-node-2
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "打印redis-node-1-1"
docker ps -a |grep redis-node-2-1&& docker logs redis-node-2-1
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "运行情况"
docker ps -a
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "脚本执行完成"

rm_redis_node2.sh

#!/bin/bash
echo 开始执行
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.删除容器
echo "删除容器"
docker rm -f redis-node-2-1&& docker rm -f redis-node-2&& docker rmi redis:6.2.6&& docker ps -a && docker images
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#2.删除文件
echo "删除冗余文件"
rm -rf /data/redis*&& ls -l /data
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo 脚本执行完成

create_redis_node3.sh

#!/bin/bash
echo "开始安装,本次安装路径为/data/redis"
#ip_address=$(ip addr show ens33 | grep "inet " | awk '{print $2}' | cut -d/ -f1)
#formatted_date=$(date +'%Y-%m-%d')
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.导入当前的镜像
#(外网可以直接下载redis的包)
#(docker pull redis:latest)
echo "导入镜像"
docker load -i ./redis6.2.6.tar
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#2.创建挂载目录
echo "创建挂载目录以及配置文件"
mkdir -p /data/redis6381/{data,conf,log}&& ls -l /data/redis6381 && touch /data/redis6381/conf/6381.conf&& ls -l /data/redis6381/conf
mkdir -p /data/redis6391/{data,conf,log}&& ls -l /data/redis6391 && touch /data/redis6381/conf/6391.conf&& ls -l /data/redis6391/conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""

#3.赋权目录并对配置文件写入内容
echo "创建挂载目录以及配置文件"
chmod 755-R /data/redis6381
echo "#端口号
port 6381
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6381.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6381/conf/6381.conf

chmod 755-R /data/redis6391
echo "#端口号
port 6391
#aof持久化
appendonly yes
#开启集群
cluster-enabled yes
#集群配置文件 
cluster-config-file 6391.conf
#集群超时时间
cluster-node-timeout 5000
#数据库登录密码
requirepass 123456 
#主从复制密码
masterauth 123456  ">/data/redis6391/conf/6391.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#4.docker启动当前节点redis_node3主从节点
echo "docker启动当前节点redis_node3主从节点"

docker run -d  --name redis-node-3--net host --privileged=true \
-v /data/redis6381/data:/data -v /data/redis6381/conf/6381.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf

docker run -d  --name redis-node-3-1--net host --privileged=true \
-v /data/redis6391/data:/data -v /data/redis6391/conf/6391.conf:/etc/redis/redis.conf \
--restart=always --privileged=true redis:6.2.6/etc/redis/redis.conf
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""


#5.docker启动后打印日志
echo "等待10秒打印日志"
sleep 10
echo "打印redis-node-1"
docker ps -a |grep redis-node-3&& docker logs redis-node-3
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "打印redis-node-1-1"
docker ps -a |grep redis-node-3-1&& docker logs redis-node-3-1
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "运行情况"
docker ps -a
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo "脚本执行完成"

rm_redis_node3.sh

#!/bin/bash
echo 开始执行
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#1.删除容器
echo "删除容器"
docker rm -f redis-node-3-1&& docker rm -f redis-node-3&& docker rmi redis:6.2.6&& docker ps -a && docker images
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
#2.删除文件
echo "删除冗余文件"
rm -rf /data/redis*&& ls -l /data
echo "=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>"
echo ""
echo 脚本执行完成




举报

相关推荐

0 条评论