redis在docker中的部署,redis集群的搭建
redis在docker的部署
1.创建data目录存储aof,和rdb文件,并设置权限
2.创建log目录存储logfile日志文件,并设置权限
3.构建镜像(前提:Dockerfile在当前目录下,由于Dockerfile设置了copy,因此当前目录下也需要redis.conf)
4.运行镜像
## 注意:
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
开放防火墙端口
redis集群的搭建
1.以3台机器为例,但是配置3主3从,redis
的tar.gz
包在我的123网盘中
上传
redis
的tar.gz
包到/root
目录下(6台机器都要)为所有节点配置目录
所有节点进行解压
所有节点进行编译安装Redis
书写集群配置文件,注意!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服务都是不同的:
3.加入集群
现在虽然说每个服务都成功启动了,但是彼此之间并没有任何联系。所以下一步要做的就是将6个服务加入至一个集群中,如下操作示例
查看当前集群所有的节点
如果查看的节点不是上面,只有自己ip的connected,则就需要对每个节点开放端口
查看监听端口
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:6379 | 0 - 5461 |
192.168.56.152:6379 | 5461 - 10922 |
192.168.56.153:6379 | 10922 - 16383 |
开始分配:
检查槽位是否分配正确:
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节点上进行写入
它会提示你去192.168.56.153的master上进行写入。
这个就是MOVED重定向。
7.2.-c参数解决MOVED重定向
如何解决这个问题?其实在登录的时候加上参数-c即可,-c参数无所谓你的Redis是否是集群模式,建议任何登录操作都加上,这样即使是Redis集群也会自动进行MOVED重定向
一并对主从进行验证,这条数据是写入至了192.168.56.153的Master中,我们登录192.168.56.151的Slave中进行查看
7.3.故障转移
模拟192.168.56.151
的6379下线宕机,此时应该由192.168.56.152
的6380接管它的工作:
登录集群任意节点查看目前的集群节点信息:
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
的6379,发现他已经自动的进行上线了,并且作为192.168.56.152
中6380的从库
7.5.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 | 返回该插槽的信息 |
评论