Redis集群的搭建
首先下载redis.conf配置文件
并在配置文件中修改:
bind 0.0.0.0 //需要将配置文件中的其他bind给注释掉,然后添加这个, 表示允许任何ip进行连接
protected-mode no //需要关闭保护模式,在默认yes开启状态下, 是无法被外界连接的, 其次在关闭保护模式后,哨兵才能正常连接你
requirepass "" //将密码设置成空,默认密码是: requirepass "123456"
//在Redis的一主二从配置中,如果主机(master)配置了requirepass参数需要密码登录,那么从机(slave)就需要设置masterauth来设置校验密码,比较麻烦。
//如果主机不需要密码登录,那么从机就不需要设置masterauth参数,否则主机会拒绝从机的访问请求
然后创建三个目录并分别存放redis的配置文件:6389, 6390,6391 //此时这三个文件中都已经存在了配置文件-
-
-
-
然后通过原始的redis镜像创建三个redis容器:6389,6390,6391,并将本地所创建的三个目录挂载到redis容器中,并加载所映射的配置文件,重复创建三个就可以了,每次只需要修改其映射端口:
docker run --name redis89 -p 6389:6379 -v D:\新建文件夹\6389:/etc/redis -d redis redis-server /etc/redis/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6389
docker run --name redis90 -p 6390:6379 -v D:\新建文件夹\6390:/etc/redis -d redis redis-server /etc/redis/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6390
docker run --name redis91 -p 6391:6379 -v D:\新建文件夹\6391:/etc/redis -d redis redis-server /etc/redis/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6391参数说明:
1,注意一定不要挂载data目录,否则在开启集群的时候会报错
2,在挂载的时候,配置文件就已经放入到了容器内部的/etc/redis中了,所以在后面可以直接通过redis-server /etc/redis/redis.conf加载redis.conf配置文件
3,注意:这里6391目录是本地目录地址,在window环境中,我的地址是:D:\新建文件夹\6391
4,这里你所创建的这个redis容器正好只能通过192.168.0.179:6389来访问,所以可以使用replica-announce-ip和replica-announce-port就是告诉哨兵指定要使用这个ip和端口来连接我这个从节点, 这两个属性只是redis配置文件中的一个声明的作用,它并不会对redis容器内部产生影响,容器内部的服务端口还是6379,这样你在后面搭建哨兵集群后,哨兵才能正确的获取到你这个容器的ip地址和端口号
-
-
-
然后进入redis的配置文件中,将AOF关闭: appendonly no
并将RDB开启: 将save ""给注释掉, 最开始我们不是将所有的save给注释掉,然后取消了save ""的注释吗,这样在容器运行的时候,就不会触发RDB了, 现在想要开启就只需要将save ""注释掉-
-
-
-
-
然后进入6390和6391文件夹,修改配置文件:
replicaof 192.168.0.179 6389 //表示连接6389这台机器,成为6389的子节点,也就是成为6389的小弟
//slave中文为奴隶的意思-
-
-
-
神奇的一幕来了,我在6389中设置数据aa: set aa zhan
此时在6390和6391中都能查询到aa这个数据
我在6389的客户端中输入: info replication //查看内部的从节点信息-
-
注意: 此时在从节点中写数据的话会报错:"READONLY You can't write against a read only replica."
意思是从节点只有读的权限,没有写的权限
哨兵集群的搭建:
首先我们已经有了三个redis容器,就是一主二从不是已经搭建完成了吗, 注意在三个redis配置文件中都修改replica-announce-ip和replica-announce-port的值,告诉Sentinel哨兵实例,你读取我这个redis节点的时候,所能使用的ip和端口
当然你也可以在创建redis容器的时候,直接修改配置文件的值,这下面只是我给你举的一个例子
例如:算了,怕你看不懂,全写出来吧
docker run --name redis1 -p 6389:6379 -v /redis1:/etc/redis/conf -d redis redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6389
docker run --name redis2 -p 6390:6379 -v /redis2:/etc/redis/conf -d redis redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6390
docker run --name redis3 -p 6391:6379 -v /redis3:/etc/redis/conf -d redis redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6391
//这里你所创建的这个redis容器正好只能通过192.168.0.179:6389来访问
//所以可以使用replica-announce-ip和replica-announce-port就是告诉哨兵指定要使用这个ip和端口来连接我这个从节点, 这两个属性只是redis配置文件中的一个声明的作用,它并不会对redis容器内部产生影响,容器内部的服务端口还是6379
然后在搭建哨兵集群之前,同样需要先设置对应的sentinel.conf配置文件,并放在目录中和所创建的容器进行挂载
将sentinel.conf放在本地的D:\新建文件夹\redis\Sentinel\s1目录中
如果你想要创建5个sentinel哨兵实例的话,直接创建五个目录用来存放sentinel实例的配置文件,
在创建sentinal.conf配置文件,添加内容如下:
port 27001 #设置监听端口,也就是Sentinel实例运行的端口。 我总共会创建三个sentinel实例,其他两个实例的端口分别为27002和27003
sentinel monitor mymaster 192.168.0.179 6389 3 #后面的ip和端口为主节点的连接地址, 并为该sentinel集群起名为mymaster, 主要用来监控主节点的
#这个2就是判断是否下线的指定数量,一共三个sentinal, 有两个认为下线了,则一定是下线了
#其次Sentinel实例可以直接从所监控的master节点中得到所有的slave节点信息sentinel down-after-milliseconds mymaster 5000 #这个表示当5秒没有响应sentinel实例就会认为所监控的主节点主观下线, 默认值是30秒
sentinel failover-timeout mymaster 5000 #这个是选举失败的情况下,多久重新进行选举
最后开始创建sentinel实例,主要都是用来监控主节点的:
docker run --name sentinel01 -p 27001:27001 -v D:\新建文件夹\redis\Sentinel\s1:/etc/redis/sentinel -d redis redis-sentinel /etc/redis/sentinel/sentinel.conf //这里加载的是sentinel.conf配置文件
docker run --name sentinel02 -p 27002:27002 -v D:\新建文件夹\redis\Sentinel\s2:/etc/redis/sentinel -d redis redis-sentinel /etc/redis/sentinel/sentinel.conf
docker run --name sentinel03 -p 27003:27003 -v D:\新建文件夹\redis\Sentinel\s3:/etc/redis/sentinel -d redis redis-sentinel /etc/redis/sentinel/sentinel.conf
docker run --name sentinel04 -p 27004:27004 -v D:\新建文件夹\redis\Sentinel\s4:/etc/redis/sentinel -d redis redis-sentinel /etc/redis/sentinel/sentinel.conf
docker run --name sentinel05 -p 27005:27005 -v D:\新建文件夹\redis\Sentinel\s5:/etc/redis/sentinel -d redis redis-sentinel /etc/redis/sentinel/sentinel.conf
就相当于启动容器并执行sentinel.conf配置文件
所有的sentinel实例主要用来监测主节点, 并在配置文件中已经定义了当有多少个sentinel实例认为主节点下线,主节点就一定下线了
这里定义的是3个,一般这里定义的数量要超过sentinel实例的一半,这样判断起来才准确,
其次所创建的sentinel实例随便多少个,不过最好要有三个,这样判断主节点是否下线才会比较准确,
哨兵日志解读:
1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.1:6390 172.30.0.1 6390 @ mymaster 192.168.0.179 6389
1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.6:6390 172.30.0.6 6390 @ mymaster 192.168.0.179 6389
1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.7:6390 172.30.0.7 6390 @ mymaster 192.168.0.179 6389最开始我没有在redis容器的配置文件中设置replica-announce-ip和replica-announce-port的值,导致哨兵实例在读取redis容器信息的时候,不知道具体使用哪一个ip, 搞不懂这里的6389端口居然有三个ip地址,最终报错,搞半天
-
-
-
-
-
-
然后再启动哨兵实例,日志显示:
+monitor master mymaster 192.168.0.179 6389 quorum 2 //开始监控主节点
+slave slave 192.168.0.179 6390 192.168.0.179 6390 @ mymaster 192.168.0.179 6389 //开始添加端口为6390的从节点
+slave slave 192.168.0.179 6391 192.168.0.179 6391 @ mymaster 192.168.0.179 6389 //开始添加端口为6391的从节点-
-
-
-
-
然后当关闭主节点后,哨兵实例的日志显示:
+switch-master mymaster 192.168.0.179 6389 192.168.0.179 6390 //成功选举端口6390的slave节点成为新的master节点
+slave slave 192.168.0.179:6391 192.168.0.179 6391 @ mymaster 192.168.0.179 6390 //开始添加从节点信息,这里将6391添加到主节点6390中去
+slave slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390 //这里将所宕机的6389添加成从节点
+sdown slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390 //发现6389端口的设备处于下线状态
-
-
-
-
-
然后启动之前所关闭的6389端口的容器,会发现哨兵实例的日志显示:
1:X 30 Jul 2024 12:00:08.251 # -sdown slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390 //-sdown表示发现6389端口的设备已经重新上线了
1:X 30 Jul 2024 12:00:18.256 * +convert-to-slave slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390 //这里就是在修改6389设备的配置文件,让6389成为6390的从节点
总结:redis集群和哨兵集群的一次性搭建
目录结构:
自己看吧:
第一级目录
-
-
-
-
第二级目录
-
-
-
第三级目录
docker-compose.yml文件的内容:
version: "3.2"
services:
redis1:
image: redis
volumes:
- "D:/新建文件夹/redis/redis/6389:/etc/redis/conf" #不能挂载data目录,否则搭建的时候报错
ports: #挂载配置文件目录
- "6389:6379"
command: redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6389 #加载配置文件,并声明哨兵实例所能使用的ip和端口redis2:
image: redis
volumes:
- "D:/新建文件夹/redis/redis/6390:/etc/redis/conf"
ports:
- "6390:6379"
command: redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6390redis3:
image: redis
volumes:
- "D:/新建文件夹/redis/redis/6391:/etc/redis/conf"
ports:
- "6391:6379"
command: redis-server /etc/redis/conf/redis.conf --replica-announce-ip 192.168.0.179 --replica-announce-port 6391
sentinel1: #创建哨兵实例
image: redis
volumes:
- "D:/新建文件夹/redis/Sentinel/s1:/etc/redis/sentinel"
ports:
- "27001:27001"
command: redis-sentinel /etc/redis/sentinel/sentinel.confsentinel2:
image: redis
volumes:
- "D:/新建文件夹/redis/Sentinel/s2:/etc/redis/sentinel"
ports:
- "27002:27002"
command: redis-sentinel /etc/redis/sentinel/sentinel.conf
sentinel3:
image: redis
volumes:
- "D:/新建文件夹/redis/Sentinel/s3:/etc/redis/sentinel"
ports:
- "27003:27003"
command: redis-sentinel /etc/redis/sentinel/sentinel.conf