美文网首页
docker redis 1主2从+3哨兵

docker redis 1主2从+3哨兵

作者: 街头民工 | 来源:发表于2021-05-11 14:47 被阅读0次
  • 创建:redis.conf
# 为了方便,所有密码可以都设置相同的
requirepass yourPassword
# 为了方便,所有密码可以都设置相同的            
masterauth masterPassword           
#关闭保护模式
protected-mode no
#开启后,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里
appendonly yes
  • 在/data/redis-data路经下创建三个文件夹,node1,node2,node3 并且把redis.conf分别复制到三个文件夹中各一份。

  • 运行主节点容器(主)

docker run --name redis1 -v /data/redis-data/node1/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 -p 26379:26379  redis redis-server /usr/local/etc/redis/redis.conf
  • 生成容器后运行:
docker inspect 容器id
image.png
  • node2和node3文件夹内配置修改文件redis.conf
# 为了方便,所有密码可以都设置相同的
requirepass yourPassword      
# 为了方便,所有密码可以都设置相同的      
masterauth masterPassword           
#关闭保护模式
protected-mode no
#主容器获得
replicaof 172.18.0.2 6379
appendonly yes
  • (从)运行从节点俩容器
docker run --name redis2 -v /data/redis-data/node2/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6380:6379 -p 26380:26380  redis redis-server /usr/local/etc/redis/redis.conf
docker run --name redis3 -v /data/redis-data/node3/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6381:6379 -p 26381:26381  redis redis-server /usr/local/etc/redis/redis.conf
  • 分别进入三台容器运行:
docker exec -it redis1 bash
redis-cli
info Replication
image.png
  • 我们会看到每台服务器都是主节点,这时候,我们要在第二个容器和三个容器内修改一下
#第二台
docker exec -it redis2 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
#第三台
docker exec -it redis3 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
  • 这时候我们在回到第一台容器看看,出现了两台丛节点
docker exec -it redis1 bash
redis-cli
info Replication
image.png
  • 测试一下 在主节点设置,从节点是否同步。从节点只有读的权限,没有写的权限


    image.png

sentinel 配置[redis哨兵]

  • 在node1,node2,node3文件夹下分别创建sentinel.conf文件
#node1/sentinel.conf  [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26379 
dir "/data"
logfile "26379.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
#node2/sentinel.conf  [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26380
dir "/data"
logfile "26380.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
#node3/sentinel.conf  [port:指定哨兵监听端口,dir:#sentinel工作目录,logfile:#日志文件,sentinel monitor nameL#启动哨兵(名称:name) 监听master,daemonize:#后台运行]
port 26381
dir "/data"
logfile "26381.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****开始redis.conf配置的密码
sentinel failover-timeout nameh 180000
daemonize yes
  • 然后分别把不同的sentinel.conf 拷贝到相对应的容器内
docker cp /data/redis-data/node1/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node2/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node3/sentinel.conf 容器ID:/data
  • 分别进入容器内/data 路径下,看是否有sentinel.conf 文件 如果存在就启动:
    redis-sentinel sentinel.conf

  • 如果想开是否启动成功可以

apt-get update

apt-get install procps

ps -ef
image.png
  • 再测试一下, 停止主节点容器看其他节点容器会顶替主节点吗?先停掉第一台,等30秒。


    image.png
  • 第二台容器已经显示主节点挂掉了,稍等一下再看看。


    image.png
  • 第二台选择又提示主节点启动了,目前第二台还是从节点,那应该是随机把第三台变成了主节点。去看下。


    image.png
  • 第三台显示成为主节点。到此结束。

PHP 链接哨兵

参考文档:https://segmentfault.com/a/1190000011185598

image.png
#前提是php安装了redis扩展
$redis = new Redis();  
//连接sentinel服务 host为ip,port为端口
$redis->connect("host", "port");
//获取主库列表及其状态信息
$result = $redis->rawCommand('SENTINEL', 'masters');
print_r($result);

//根据所配置的主库redis名称获取对应的信息
//master_name应该由运维告知(也可以由上一步的信息中获取)
$result1 = $redis->rawCommand('SENTINEL', 'master', $master_name);
print_r($result1);

//根据所配置的主库redis名称获取其对应从库列表及其信息
$result2 = $redis->rawCommand('SENTINEL', 'slaves', $master_name);
print_r($result2);

//获取特定名称的redis主库地址
$result3 = $redis->rawCommand('SENTINEL', 'get-master-addr-by-name', $master_name);
print_r($result3);

相关文章

网友评论

      本文标题:docker redis 1主2从+3哨兵

      本文链接:https://www.haomeiwen.com/subject/ltogdltx.html