联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:18888888888 QQ:88888

redis在docker中的部署,redis集群的搭建

redis在docker中的部署,redis集群的搭建

redis在docker的部署

1.创建data目录存储aof,和rdb文件,并设置权限

mkdir -p /docker/redis/data
sudo chown -R 999:999 /docker/redis/data

2.创建log目录存储logfile日志文件,并设置权限

mkdir -p /docker/redis/log
sudo chown -R 999:999 /docker/redis/log

3.构建镜像(前提:Dockerfile在当前目录下,由于Dockerfile设置了copy,因此当前目录下也需要redis.conf)

docker build -t redis:8.0 .   #redis镜像名,:8.0标签,可自己设置 .表示当前目录下的Dockerfile

4.运行镜像

docker run -d --name redis -p 6379:6379 -v /docker/redis/data:/data -v /docker/redis/log:/var/log/redis redis:8.0
## 注意:
1.redis.conf必须在和Dockerfile一块下
2.我们可以在redis.conf中对redis的配置进行修改

Dockerfile的设置

vi Dockerfile

######插入数据
FROM redis:8.0
#设置工作目录
WORKDIR /data
# 复制自定义配置文件到容器内
COPY redis.conf /usr/local/etc/redis/redis.conf
# 设置Redis监听的端口(默认端口6379)
EXPOSE 6379
# 启动 Redis 服务器
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

redis.conf的设置(可自己添加)

vi redis.conf

######插入数据
#开启保护模式,bind下才可以访问
protected-mode yes
#bind,绑定哪个主机可以访问0.0.0.0默认全部可以,这个绑定虚拟机的地址
bind 0.0.0.0
# 设置密码
requirepass foobared
# 启用 AOF 持久化
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
#设置当前工作目录,可供持久化,和日志
dir /data
#设计日志文件
logfile /var/log/redis/redis-server.log

开放防火墙端口

#1.查看是否开启防火墙
systemctl status firewalld
#2.查看防火墙开放的端口
sudo firewall-cmd --list-ports
#3.开放端口
sudo firewall-cmd --add-port=6379/tcp --permanent
#4.重新加载
sudo firewall-cmd --reload
#5.查看端口是否开放
sudo firewall-cmd --list-ports

redis集群的搭建

1.以3台机器为例,但是配置3主3从,redistar.gz包在我的123网盘中

  1. 上传redistar.gz包到/root目录下(6台机器都要)

  2. 为所有节点配置目录

    mkdir -p /usr/local/redis_cluster/redis_63{79,80}/{conf,pid,logs}

  3. 所有节点进行解压

    cd /root
    tar -zxvf redis-6.2.1.tar.gz -C /usr/local/redis_cluster/

  4. 所有节点进行编译安装Redis

    cd /usr/local/redis_cluster/redis-6.2.1/
    make && make install 

  5. 书写集群配置文件,注意!Redis普通服务会有2套配置文件,一套为普通服务配置文件,一套为集群服务配置文件,我们这里是做的集群,所以书写的集群配置文件,共6份

    cp redis.conf ../redis_6379/conf/redis.cnf
    vi /usr/local/redis_cluster/redis_6379/conf/redis.cnf
    
    # 把全部替换为如下配置
    # 守护进行模式启动
    daemonize yes
     
    # 设置数据库数量,默认数据库为0
    databases 16
     
    # 绑定地址,需要修改
    bind 192.168.56.151 127.0.0.1
     
    # 绑定端口,需要修改
    port 6379
     
    # pid文件存储位置,文件名需要修改
    pidfile /usr/local/redis_cluster/redis_6379/pid/redis_6379.pid
     
    # log文件存储位置,文件名需要修改
    logfile /usr/local/redis_cluster/redis_6379/logs/redis_6379.log
     
    # RDB快照备份文件名,文件名需要修改
    dbfilename redis_6379.rdb
     
    # 本地数据库存储目录,需要修改
    dir /usr/local/redis_cluster/redis_6379
     
    # 集群相关配置
    # 是否以集群模式启动
    cluster-enabled yes
     
    # 集群节点回应最长时间,超过该时间被认为下线
    cluster-node-timeout 15000
     
    # 生成的集群节点配置文件名,文件名需要修改
    cluster-config-file nodes_6379.conf
     
    # redis密码
    masterauth 123456
    requirepass 123456
    
    
    # 将redis_6379下的cnf文件拷贝到redis_6380目录下
    cp ../redis_6379/conf/redis.cnf ../redis_6380/conf/redis.cnf
    vi /usr/local/redis_cluster/redis_6380/conf/redis.cnf
    # 替换端口
    :%s/6379/6380/g
    
    
    # 将redis_6379和redis_6380下的cnf文件拷贝到其他节点下
    scp /usr/local/redis_cluster/redis_6379/conf/redis.cnf 用户名@另一台服务器IP:/usr/local/redis_cluster/redis_6379/conf/
    # 再修改对应bind!!!!
    scp /usr/local/redis_cluster/redis_6380/conf/redis.cnf 用户名@另一台服务器IP:/usr/local/redis_cluster/redis_6380/conf/
    # 再修改对应bind!!!!

2.启动集群

每个节点上执行以下2条命令进行服务启动

redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf
redis-server /usr/local/redis_cluster/redis_6380/conf/redis.cnf

查看集群是否启动成功

ps -ef|grep redis

同时,查看一下集群节点配置文件,会发现生成了一组集群信息,每个Redis服务都是不同的:

cat /usr/local/redis_cluster/redis_6379/nodes_6379.conf
# c8a8c7d52e6e7403e799c75302b6411e2027621b :0@0 myself,master - 0 0 0 connected
# vars currentEpoch 0 lastVoteEpoch 0
 
cat /usr/local/redis_cluster/redis_6380/nodes_6380.conf
# baa10306639fcaca833db0d521235bc9593dbeca :0@0 myself,master - 0 0 0 connected
# vars currentEpoch 0 lastVoteEpoch 0
 
# 第一段信息是这个Redis服务作为集群节点的一个身份编码
# 别名为集群的node-id

3.加入集群

现在虽然说每个服务都成功启动了,但是彼此之间并没有任何联系。所以下一步要做的就是将6个服务加入至一个集群中,如下操作示例

redis-cli -h 192.168.56.151 -p 6379 -a 123456
node1:6379> cluster meet 192.168.56.152 6379
node1:6379> cluster meet 192.168.56.153 6379
node1:6379> cluster meet 192.168.56.151 6380
node1:6379> cluster meet 192.168.56.152 6380
node1:6379> cluster meet 192.168.56.153 6380

查看当前集群所有的节点

node1:6379> cluster nodes
 
214dc5a10149091047df1c61fd3415d91d6204ea 192.168.0.130:6379@16379 master - 0 1617291123000 1 connected
baa10306639fcaca833db0d521235bc9593dbeca 192.168.0.120:6380@16380 master - 0 1617291120000 3 connected
7a151f97ee9b020a3c954bbf78cd7ed8a674aa70 192.168.0.140:6379@16379 master - 0 1617291123000 2 connected
bae708f7b8df32edf4571c72bbf87715eb45c169 192.168.0.130:6380@16380 master - 0 1617291124175 4 connected
fd1dde2a641727e52b4e82cfb351fe3c17690a17 192.168.0.140:6380@16380 master - 0 1617291124000 0 connected
c8a8c7d52e6e7403e799c75302b6411e2027621b 192.168.0.120:6379@16379 myself,master - 0 1617291121000 5 connected

如果查看的节点不是上面,只有自己ip的connected,则就需要对每个节点开放端口

sudo firewall-cmd --add-port=6379/tcp --permanent
sudo firewall-cmd --add-port=6380/tcp --permanent
sudo firewall-cmd --permanent --add-port=16379/tcp
sudo firewall-cmd --permanent --add-port=16380/tcp
sudo firewall-cmd --reload
# 再meet连接,然后查看是否启动成功

查看监听端口

[root@vbox ~] netstat -lnpt | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1591/redis-server 1 
tcp        0      0 192.168.56.151:6379     0.0.0.0:*               LISTEN      1591/redis-server 1 
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      1597/redis-server 1 
tcp        0      0 192.168.56.151:6380     0.0.0.0:*               LISTEN      1597/redis-server 1 
tcp        0      0 127.0.0.1:16379         0.0.0.0:*               LISTEN      1591/redis-server 1 
tcp        0      0 192.168.56.151:16379    0.0.0.0:*               LISTEN      1591/redis-server 1 
tcp        0      0 127.0.0.1:16380         0.0.0.0:*               LISTEN      1597/redis-server 1 
tcp        0      0 192.168.56.151:16380    0.0.0.0:*               LISTEN      1597/redis-server 1

4.主从配置

6个服务之间并没有任何主从关系,所以现在进行主从配置,记录下上面cluster nodes命令输出的node-id信息,只记录主节点(这里主节点为端口6379的节点):

192.168.56.151:6379> CLUSTER NODES
84e450a94fd944964d2c2a43a2686eb137cdc5b0 192.168.56.153:6380@16380 master - 0 1758334169597 5 connected
5c128749e9755aed67141d725e0025e97678ef9f 192.168.56.152:6379@16379 master - 0 1758334167000 2 connected
957456a042add3f8f63d704c4beac1b482a6297e 192.168.56.151:6379@16379 myself,master - 0 1758334165000 1 connected
441093aa7310c594127b9df1857ef6aa9d871cb4 192.168.56.152:6380@16380 master - 0 1758334168590 4 connected
aaacadd40bd39265a386b3dced3cc6aef8777de6 192.168.56.153:6379@16379 master - 0 1758334167000 3 connected
ebbec8169eb112b1f5661fc8df35687f4e1ad2b5 192.168.56.151:6380@16380 master - 0 1758334167573 0 connected

# 记录主节点的node-id
# 然后主从节点映射,这里映射为
# 192.168.56.152:6380->192.168.56.151:6379
# 192.168.56.153:6380->192.168.56.152:6379
# 192.168.56.151:6380->192.168.56.153:6379

# 进行主从映射
$ redis-cli -h 192.168.56.152 -p 6380 -a 123456
node1:6380> cluster replicate 957456a042add3f8f63d704c4beac1b482a6297e

$ redis-cli -h 192.168.56.153 -p 6380  -a 123456
node2:6380> cluster replicate 5c128749e9755aed67141d725e0025e97678ef9f

$ redis-cli -h 192.168.56.151 -p 6380  -a 123456
node3:6380> cluster replicate aaacadd40bd39265a386b3dced3cc6aef8777de6


# 查看集群节点信息,可以看到主从信息,myself为当前登录的服务
$ redis-cli -h 192.168.56.151 -p 6379  -a 123456
192.168.56.151:6379> cluster nodes
84e450a94fd944964d2c2a43a2686eb137cdc5b0 192.168.56.153:6380@16380 slave 5c128749e9755aed67141d725e0025e97678ef9f 0 1758334942000 2 connected
5c128749e9755aed67141d725e0025e97678ef9f 192.168.56.152:6379@16379 master - 0 1758334942357 2 connected
957456a042add3f8f63d704c4beac1b482a6297e 192.168.56.151:6379@16379 myself,master - 0 1758334937000 1 connected
441093aa7310c594127b9df1857ef6aa9d871cb4 192.168.56.152:6380@16380 slave 957456a042add3f8f63d704c4beac1b482a6297e 0 1758334942000 1 connected
aaacadd40bd39265a386b3dced3cc6aef8777de6 192.168.56.153:6379@16379 master - 0 1758334941351 3 connected
ebbec8169eb112b1f5661fc8df35687f4e1ad2b5 192.168.56.151:6380@16380 slave aaacadd40bd39265a386b3dced3cc6aef8777de6 0 1758334943365 3 connected

5.分配槽位

共16384个槽位,分配槽位情况如下

节点槽位数量
192.168.56.151:63790 - 5461
192.168.56.152:63795461 - 10922
192.168.56.153:637910922 - 16383

开始分配:

redis-cli -h 192.168.56.151 -p 6379  -a 123456 cluster addslots {0..5461}
redis-cli -h 192.168.56.152 -p 6379  -a 123456 cluster addslots {5462..10922}
redis-cli -h 192.168.56.153 -p 6379  -a 123456 cluster addslots {10923..16383}

检查槽位是否分配正确:

redis-cli -h 192.168.56.151 -p 6379  -a 123456

192.168.56.151:6379> cluster nodes
84e450a94fd944964d2c2a43a2686eb137cdc5b0 192.168.56.153:6380@16380 slave 5c128749e9755aed67141d725e0025e97678ef9f 0 1758335508000 2 connected
5c128749e9755aed67141d725e0025e97678ef9f 192.168.56.152:6379@16379 master - 0 1758335510839 2 connected 5462-10922
957456a042add3f8f63d704c4beac1b482a6297e 192.168.56.151:6379@16379 myself,master - 0 1758335505000 1 connected 0-5461
441093aa7310c594127b9df1857ef6aa9d871cb4 192.168.56.152:6380@16380 slave 957456a042add3f8f63d704c4beac1b482a6297e 0 1758335507000 1 connected
aaacadd40bd39265a386b3dced3cc6aef8777de6 192.168.56.153:6379@16379 master - 0 1758335508824 3 connected 10923-16383
ebbec8169eb112b1f5661fc8df35687f4e1ad2b5 192.168.56.151:6380@16380 slave aaacadd40bd39265a386b3dced3cc6aef8777de6 0 1758335509829 3 connected
# 可以看到插槽的分配

6.检查状态

使用以下命令检查集群状态是否ok,如果槽位全部分配完毕应该是ok,不然的话就检查你分配槽位时是否输错了数量:

redis-cli -h 192.168.56.151 -p 6379  -a 123456

192.168.56.151:6379> CLUSTER info
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:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1823
cluster_stats_messages_pong_sent:1678
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:3506
cluster_stats_messages_ping_received:1678
cluster_stats_messages_pong_received:1828
cluster_stats_messages_received:3506

7.上述操作其实已经完成集群的搭建了,现在学习一些新的语法

7.1.MOVED重定向

现在我们在192.168.56.151的master节点上进行写入

redis-cli -h 192.168.56.151 -p 6379  -a 123456
 
192.168.56.151:6379> set k1 v1
(error) MOVED 12706 192.168.56.153:6379

它会提示你去192.168.56.153的master上进行写入。

这个就是MOVED重定向。

7.2.-c参数解决MOVED重定向

如何解决这个问题?其实在登录的时候加上参数-c即可,-c参数无所谓你的Redis是否是集群模式,建议任何登录操作都加上,这样即使是Redis集群也会自动进行MOVED重定向

redis-cli -c -h 192.168.56.151 -p 6379  -a 123456
 
192.168.56.151:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.56.153:6379
OK

一并对主从进行验证,这条数据是写入至了192.168.56.153的Master中,我们登录192.168.56.151的Slave中进行查看

redis-cli -h 192.168.56.151 -p 6380  -a 123456 -c
 
192.168.56.151:6380> keys *
1) "k1"

7.3.故障转移

模拟192.168.56.151的6379下线宕机,此时应该由192.168.56.152的6380接管它的工作:

redis-cli -h 192.168.56.151 -p 6379  -a 123456 shutdown

登录集群任意节点查看目前的集群节点信息:

redis-cli -h 192.168.56.152 -p 6379  -a 123456 -c

192.168.56.152:6379> cluster nodes
aaacadd40bd39265a386b3dced3cc6aef8777de6 192.168.56.153:6379@16379 master - 0 1758336546961 3 connected 10923-16383
ebbec8169eb112b1f5661fc8df35687f4e1ad2b5 192.168.56.151:6380@16380 slave aaacadd40bd39265a386b3dced3cc6aef8777de6 0 1758336545000 3 connected
5c128749e9755aed67141d725e0025e97678ef9f 192.168.56.152:6379@16379 myself,master - 0 1758336544000 2 connected 5462-10922
957456a042add3f8f63d704c4beac1b482a6297e 192.168.56.151:6379@16379 master,fail - 1758336483223 1758336478110 1 disconnected
441093aa7310c594127b9df1857ef6aa9d871cb4 192.168.56.152:6380@16380 master - 0 1758336546000 6 connected 0-5461
84e450a94fd944964d2c2a43a2686eb137cdc5b0 192.168.56.153:6380@16380 slave 5c128749e9755aed67141d725e0025e97678ef9f 0 1758336545000 2 connected

# 可以看到 192.168.56.151:6379 disconnected 了,并且 192.168.56.152:6380 自动升级为主节点,并且插槽也转移了

7.4.恢复工作

重启192.168.56.151的6379

# 在 192.168.56.151 上执行
redis-server /usr/local/redis_cluster/redis_6379/conf/redis.cnf

登录192.168.56.151的6379,发现他已经自动的进行上线了,并且作为192.168.56.152中6380的从库

redis-cli -h 192.168.56.151 -p 6379  -a 123456

192.168.56.151:6379> CLUSTER NODES
441093aa7310c594127b9df1857ef6aa9d871cb4 192.168.56.152:6380@16380 master - 0 1758337031115 6 connected 0-5461
ebbec8169eb112b1f5661fc8df35687f4e1ad2b5 192.168.56.151:6380@16380 slave aaacadd40bd39265a386b3dced3cc6aef8777de6 0 1758337034142 3 connected
84e450a94fd944964d2c2a43a2686eb137cdc5b0 192.168.56.153:6380@16380 slave 5c128749e9755aed67141d725e0025e97678ef9f 0 1758337032000 2 connected
957456a042add3f8f63d704c4beac1b482a6297e 192.168.56.151:6379@16379 myself,slave 441093aa7310c594127b9df1857ef6aa9d871cb4 0 1758337032000 6 connected
5c128749e9755aed67141d725e0025e97678ef9f 192.168.56.152:6379@16379 master - 0 1758337033000 2 connected 5462-10922
aaacadd40bd39265a386b3dced3cc6aef8777de6 192.168.56.153:6379@16379 master - 0 1758337033136 3 connected 10923-16383

7.5.cluster命令

以下是集群中常用的可执行命令,命令执行格式为:

cluster 下表命令

命令如下,未全,如果想了解更多请执行cluster help操作:

命令描述
INFO返回当前集群信息
MEET <ip> <port> [<bus-port>]添加一个节点至当前集群
MYID返回当前节点集群ID
NODES返回当前节点的集群信息
REPLICATE <node-id>将当前节点作为某一集群节点的从库
FAILOVER [FORCE|TAKEOVER]将当前从库升级为主库
RESET [HARD|SOFT]重置当前节点信息
ADDSLOTS <slot> [<slot> ...]为当前集群节点增加一个或多个插槽位,推荐在bash shell中执行,可通过{int..int}指定多个插槽位
DELSLOTS <slot> [<slot> ...]为当前集群节点删除一个或多个插槽位,推荐在bash shell中执行,可通过{int..int}指定多个插槽位
FLUSHSLOTS删除当前节点中所有的插槽信息
FORGET <node-id>从集群中删除某一节点
COUNT-FAILURE-REPORTS <node-id>返回当前集群节点的故障报告数量
COUNTKEYSINSLOT <slot>返回某一插槽中的键的数量
GETKEYSINSLOT <slot> <count>返回当前节点存储在插槽中的key名称
KEYSLOT <key>返回该key的哈希槽位
SAVECONFIG保存当前集群配置,进行落盘操作
SLOTS返回该插槽的信息

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册