Docker-redis集群

搭建前准备

#关闭selinux
setenforce 0

关闭防火墙

systemctl stop firewalld.service

禁止firewall开机启动

systemctl disable firewalld.service 

1.安装docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件源缓存
yum makecache fast 
yum -y install docker-ce
# 开机自启动
systemctl enable docker
systemctl start docker

2.建议更换docker的镜像源:

1.修改或创建daemon.json文件:vi /etc/docker/daemon.json
 
将以下配置写入到文件中,保存并退出(不会操作的百度下vi命令吧):
 
{
 
"registry-mirrors": ["http://hub-mirror.c.163.com"]
 
}
 
2.重启docker:systemctl restart docker.service

3.搭建3主3从 共6节点

for port in $(seq 7002 7007);do

mkdir -p node-${port}/{conf,data,log}
touch node-${port}/conf/redis.conf
touch node-${port}/log/redis${port}.log
cat << EOF >node-${port}/conf/redis.conf
##节点端口
port 6379       
##允许任何来源
bind 0.0.0.0          
## 是为了禁止公网访问redis cache,加强redis安全的。它启用的条件,有两个:1) 没有bind IP 2) 没有设置访问密码 启用后只能够通过lookback ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回相应的错误信息 
protected-mode no
##cluster集群模式
cluster-enabled yes
##用来保存集群状态信息,可以自定义配置名。
cluster-config-file nodes.conf   
## 如果要最大的可用性,值设置为0。定义slave和master失联时长的倍数,如果值为0,则只要失联slave总是尝试failover,而不管与master失联多久。-----如果不加该参数,集群中的节点宕机后不会进行高可用恢复!!!!!
cluster-replica-validity-factor 0
# 定义slave多久(秒)ping一次master,如果超过repl-timeout指定的时长都没有收到响应,则认为master挂了
repl-ping-replica-period 1
##超时时间
cluster-node-timeout 5000   
##节点映射端口
cluster-announce-port 6379        
##节点总线端口
cluster-announce-bus-port 16379    
##实际为各节点网卡分配ip
#cluster-announce-ip 192.168.XX.XX 
##redis密码
requirepass  China         
##表示m秒内数据集存在n次修改时,自动触发bgsave
## 手动执行save该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
## 显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,Redis提供了第二种方式----bgsave
## 执行bgsave命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
## 基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
## 执行执行 flushall 命令,也会产生dump.rdb文件,但里面是空的.
#关闭RDB功能的话,配置这个即可以,其他save要注释掉
#save 300 10 
save ""
##它是数据文件。当采用快照模式备份(持久化)时,Redis 将使用它保存数据,将来可以使用它恢复数据。
#dbfilename dump.rdb    
##持久化模式
appendonly yes
#appendfilename appendonly.aof
aof-use-rdb-preamble yes
# 文件达到64m时进行重写,然后如果文件大小增长了一倍,也会触发重写。
auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100
##AOF 文件和 Redis 命令是同步频率的,假设配置为 always,其含义为当 Redis 执行命令的时候,则同时同步到 AOF 文件,这样会使得 Redis 同步刷新 AOF 文件,造成缓慢。而采用 evarysec 则代表
## 每秒同步一次命令到 AOF 文件。
appendfsync everysec            
pidfile redis.pid
# 后台运行 ---- docker中使用后台运行将无法启动容器(应该是容器无法检测后台运行进程)
# daemonize yes
EOF	
# 修改第一个匹配到的port 6379 为 port $port
sed -i "0,/port 6379/s//port $port/" node-${port}/conf/redis.conf
sed -i "0,/announce-port 6379/s//announce-port $port/" node-${port}/conf/redis.conf
sed -i "0,/bus-port 16379/s//bus-port 1$port/" node-${port}/conf/redis.conf
done

4.安装docker-redis

# 创建用于redis集群的虚拟网卡(也可以自定义子网)
docker network create redis-net
# 查看网关IP1
docker network inspect  redis-net  | grep "Gateway" |  grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o
# 查看网关IP2
docker network inspect  redis-net  | grep "Gateway"
# 运行节点容器
for port in `seq 7002 7007`; do 
docker run -it -p ${port}:${port} \
--restart always \
--name=redis-${port} \
--net redis-net  \
--privileged=true  \
-v `pwd`/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v  `pwd`/node-${port}/data:/data  \
-d redis:latest redis-server /usr/local/etc/redis/redis.conf; 
 done
# 查看redis运行情况
docker ps -a |grep redis

5.查看各个redisIP

docker network inspect  redis-net  | grep -E "IPv4Address|Name"

6.返回结果

        "Name": "redis-net",
                "Name": "redis-6385",
                "IPv4Address": "172.18.0.7/16",
                "Name": "redis-6382",
                "IPv4Address": "172.18.0.4/16",
                "Name": "redis-6380",
                "IPv4Address": "172.18.0.2/16",
                "Name": "redis-6383",
                "IPv4Address": "172.18.0.5/16",
                "Name": "redis-6381",
                "IPv4Address": "172.18.0.3/16",
                "Name": "redis-6384",
                "IPv4Address": "172.18.0.6/16",

7.建立Redis集群

# 进入docker redis-7007
docker exec -it  $(docker ps -qn 1) bash
# 创建集群
redis-cli -p 7007 --cluster create 172.18.0.2:7002 172.18.0.3:7003 172.18.0.4:7004 172.18.0.5:7005 172.18.0.6:7006 172.18.0.7:7007 -a China --cluster-replicas 1

查看集群状态

redis-cli -c -p 7007  -a  China cluster info

返回结果

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_ping_sent:566
cluster_stats_messages_pong_sent:568
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:1135
cluster_stats_messages_ping_received:568
cluster_stats_messages_pong_received:567
cluster_stats_messages_received:1135

查看集群各个节点信息

 redis-cli -c -p 7007 -a China cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
76b5c213dfcb8112c4270db8deadd9faced1189f 172.18.0.7:6379@16379 myself,slave e3092bff97ffea51806dafc7031450ffb1195129 0 1598411316000 2 connected
a35caec7a5e3fe8631f006752565063ea9354785 172.18.0.4:6379@16379 master - 0 1598411317000 3 connected 10923-16383
89c88b527dec0e531c83dbd095bac00d88d33c39 172.18.0.6:6379@16379 slave 1e40c530cc4d1b4cc52cbfc9ed9efe52ef28fb72 0 1598411316072 1 connected
e3092bff97ffea51806dafc7031450ffb1195129 172.18.0.3:6379@16379 master - 0 1598411317000 2 connected 5461-10922
7438a2db04ec7a97094c2b8a4542d7c68b847008 172.18.0.5:6379@16379 slave a35caec7a5e3fe8631f006752565063ea9354785 0 1598411317584 3 connected
1e40c530cc4d1b4cc52cbfc9ed9efe52ef28fb72 172.18.0.2:6379@16379 master - 0 1598411316000 1 connected 0-5460

Dokcer-redis集群新增节点

#新增一主一从
for port in $(seq 7008 7009);do
mkdir -p node-${port}/{conf,data,log}
touch node-${port}/conf/redis.conf
touch node-${port}/log/redis${port}.log
cat << EOF >node-${port}/conf/redis.conf
##节点端口
port 6379       
##允许任何来源
bind 0.0.0.0          
## 是为了禁止公网访问redis cache,加强redis安全的。它启用的条件,有两个:1) 没有bind IP 2) 没有设置访问密码 启用后只能够通过lookback ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回相应的错误信息 
protected-mode no
##cluster集群模式
cluster-enabled yes
##用来保存集群状态信息,可以自定义配置名。
cluster-config-file nodes.conf   
## 如果要最大的可用性,值设置为0。定义slave和master失联时长的倍数,如果值为0,则只要失联slave总是尝试failover,而不管与master失联多久。-----如果不加该参数,集群中的节点宕机后不会进行高可用恢复!!!!!
cluster-replica-validity-factor 0
# 定义slave多久(秒)ping一次master,如果超过repl-timeout指定的时长都没有收到响应,则认为master挂了
repl-ping-replica-period 1
##超时时间
cluster-node-timeout 5000   
##节点映射端口
cluster-announce-port 6379        
##节点总线端口
cluster-announce-bus-port 16379    
##实际为各节点网卡分配ip
#cluster-announce-ip 192.168.XX.XX 
##redis密码
requirepass  China         
##表示m秒内数据集存在n次修改时,自动触发bgsave
## 手动执行save该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
## 显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,Redis提供了第二种方式----bgsave
## 执行bgsave命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
## 基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
## 执行执行 flushall 命令,也会产生dump.rdb文件,但里面是空的.
#关闭RDB功能的话,配置这个即可以,其他save要注释掉
#save 300 10 
save ""
##它是数据文件。当采用快照模式备份(持久化)时,Redis 将使用它保存数据,将来可以使用它恢复数据。
#dbfilename dump.rdb    
##持久化模式
appendonly yes
#appendfilename appendonly.aof
aof-use-rdb-preamble yes
# 文件达到64m时进行重写,然后如果文件大小增长了一倍,也会触发重写。
auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100
##AOF 文件和 Redis 命令是同步频率的,假设配置为 always,其含义为当 Redis 执行命令的时候,则同时同步到 AOF 文件,这样会使得 Redis 同步刷新 AOF 文件,造成缓慢。而采用 evarysec 则代表
## 每秒同步一次命令到 AOF 文件。
appendfsync everysec            
pidfile redis.pid
# 后台运行 ---- docker中使用后台运行将无法启动容器(应该是容器无法检测后台运行进程)
# daemonize yes
logfile "node-${port}/log/redis${port}.log"
EOF	
# 修改第一个匹配到的port 6379 为 port $port
sed -i "0,/port 6379/s//port $port/" node-${port}/conf/redis.conf
sed -i "0,/announce-port 6379/s//announce-port $port/" node-${port}/conf/redis.conf
sed -i "0,/bus-port 16379/s//bus-port 1$port/" node-${port}/conf/redis.conf
done

运行新增节点容器

# 运行节点容器
for port in `seq 7008 7009`; do 
docker run -it -p ${port}:${port} \
--restart always \
--name=redis-${port} \
--net redis-net  \
--privileged=true  \
-v `pwd`/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v  `pwd`/node-${port}/data:/data  \
-d redis:latest redis-server /usr/local/etc/redis/redis.conf; 
 done

登陆redis7007 新增节点

# 登陆redis7007
docker exec -it redis-7007 bash
# 新增主节点 
# 说明:为一个指定集群添加节点,需要先连到该集群的任意一个节点IP(172.18.0.7:7007),再把新节点加入。该2个参数的顺序有要求:新加入的节点放前
redis-cli -c -a China --cluster add-node 172.18.0.8:7008 172.18.0.7:7007

成功结果

root@c9f5ce54a903:/data# redis-cli -c -p 7007 -a China --cluster add-node 172.18.0.8:7008 172.18.0.7:7007
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 172.18.0.9:7009 to cluster 172.18.0.7:7007
>>> Performing Cluster Check (using node 172.18.0.7:7007)
S: a1dc21e356f983ce8f6af9ffd63e5819f6168f34 172.18.0.7:7007
   slots: (0 slots) slave
   replicates 4a6116ea0bd3e13e603fc93a96e639b1b257e873
M: 4a6116ea0bd3e13e603fc93a96e639b1b257e873 172.18.0.3:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 9d257e1f3be993ab6cc418bee526ad8833e1b371 172.18.0.4:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 5ae566444b78ebc3d077c4fb7f17578b9725045f 172.18.0.2:7002
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 16a5ada35a648750daabdb91afa54ba6c62a26c4 172.18.0.8:7008
   slots: (0 slots) master
S: 149b52decbb11b3fbf4199e97da5058bfae4af15 172.18.0.5:7005
   slots: (0 slots) slave
   replicates 9d257e1f3be993ab6cc418bee526ad8833e1b371
S: aa7977e699159e0042a2cec003e4e163ed8c6af2 172.18.0.6:7006
   slots: (0 slots) slave
   replicates 5ae566444b78ebc3d077c4fb7f17578b9725045f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.18.0.9:7009 to make it join the cluster.
[OK] New node added correctly.

新增从节点

# 新增从节点
# 16a5ada35a648750daabdb91afa54ba6c62a26c4 是主节点的 Node-ID  如果不指定 --cluster-master-id 会随机分配到任意一个主节点。
redis-cli -c  -a China --cluster add-node 172.18.0.9:7009 172.18.0.7:7007 --cluster-slave --cluster-master-id  16a5ada35a648750daabdb91afa54ba6c62a26c4

提示添加成功

root@c9f5ce54a903:/data# redis-cli -c  -a China --cluster add-node 172.18.0.9:7009 172.18.0.7:7007 --cluster-slave --cluster-master-id  16a5ada35a648750daabdb91afa54ba6c62a26c4
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 172.18.0.9:7009 to cluster 172.18.0.7:7007
>>> Performing Cluster Check (using node 172.18.0.7:7007)
S: a1dc21e356f983ce8f6af9ffd63e5819f6168f34 172.18.0.7:7007
   slots: (0 slots) slave
   replicates 4a6116ea0bd3e13e603fc93a96e639b1b257e873
M: 4a6116ea0bd3e13e603fc93a96e639b1b257e873 172.18.0.3:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 9d257e1f3be993ab6cc418bee526ad8833e1b371 172.18.0.4:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 5ae566444b78ebc3d077c4fb7f17578b9725045f 172.18.0.2:7002
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 16a5ada35a648750daabdb91afa54ba6c62a26c4 172.18.0.8:7008
   slots: (0 slots) master
S: 149b52decbb11b3fbf4199e97da5058bfae4af15 172.18.0.5:7005
   slots: (0 slots) slave
   replicates 9d257e1f3be993ab6cc418bee526ad8833e1b371
S: aa7977e699159e0042a2cec003e4e163ed8c6af2 172.18.0.6:7006
   slots: (0 slots) slave
   replicates 5ae566444b78ebc3d077c4fb7f17578b9725045f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.18.0.9:7009 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 172.18.0.8:7008.
[OK] New node added correctly.

重新分配哈希槽

redis-cli --cluster reshard  172.18.0.7:7007  -a China

输入需要迁移的槽点数

root@c9f5ce54a903:/data#  redis-cli -c  -a China --cluster reshard  172.18.0.4:7004
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 172.18.0.4:7004)
M: 9d257e1f3be993ab6cc418bee526ad8833e1b371 172.18.0.4:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 28cfd99f6a93f49cbb8d9eff8ed6bc77d201d494 172.18.0.9:7009
   slots: (0 slots) slave
   replicates 16a5ada35a648750daabdb91afa54ba6c62a26c4
M: 16a5ada35a648750daabdb91afa54ba6c62a26c4 172.18.0.8:7008
   slots: (0 slots) master
   1 additional replica(s)
M: 4a6116ea0bd3e13e603fc93a96e639b1b257e873 172.18.0.3:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: aa7977e699159e0042a2cec003e4e163ed8c6af2 172.18.0.6:7006
   slots: (0 slots) slave
   replicates 5ae566444b78ebc3d077c4fb7f17578b9725045f
S: a1dc21e356f983ce8f6af9ffd63e5819f6168f34 172.18.0.7:7007
   slots: (0 slots) slave
   replicates 4a6116ea0bd3e13e603fc93a96e639b1b257e873
M: 5ae566444b78ebc3d077c4fb7f17578b9725045f 172.18.0.2:7002
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 149b52decbb11b3fbf4199e97da5058bfae4af15 172.18.0.5:7005
   slots: (0 slots) slave
   replicates 9d257e1f3be993ab6cc418bee526ad8833e1b371
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? 16a5ada35a648750daabdb91afa54ba6c62a26c4
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all

Ready to move 1000 slots.
  Source nodes:
    M: 9d257e1f3be993ab6cc418bee526ad8833e1b371 172.18.0.4:7004
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    M: 4a6116ea0bd3e13e603fc93a96e639b1b257e873 172.18.0.3:7003
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: 5ae566444b78ebc3d077c4fb7f17578b9725045f 172.18.0.2:7002
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
  Destination node:
    M: 16a5ada35a648750daabdb91afa54ba6c62a26c4 172.18.0.8:7008
       slots: (0 slots) master
       1 additional replica(s)
  Resharding plan:

Dokcer-redis集群删除节点

# 说明:指定集群中任意节点IP、端口 和node_id 来删除一个节点,从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
# f6a6957421b80409106cb36be3c7ba41f3b603ff 是Node-ID
redis-cli -a China --cluster del-node ip:port f6a6957421b80409106cb36be3c7ba41f3b603ff
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值