GVKun编程网logo

docker toolbox的redis 配置主从及哨兵模式保证高可用(docker搭建redis哨兵模式)

23

以上就是给各位分享dockertoolbox的redis配置主从及哨兵模式保证高可用,其中也会对docker搭建redis哨兵模式进行解释,同时本文还将给你拓展(二)使用docker搭建redis主从

以上就是给各位分享docker toolbox的redis 配置主从及哨兵模式保证高可用,其中也会对docker搭建redis哨兵模式进行解释,同时本文还将给你拓展(二)使用 docker 搭建 redis 主从哨兵模式,并整合进 springboot 项目、(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)、167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、2020-05-29:redis 怎么保证高可用,高可用模式有那些?对比下优缺点?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

docker toolbox的redis 配置主从及哨兵模式保证高可用(docker搭建redis哨兵模式)

docker toolbox的redis 配置主从及哨兵模式保证高可用(docker搭建redis哨兵模式)

redis 的缓存中间件安装方法,简单举例如下:

环境: docker toolbox 

一   主从模式
1 搜索redis镜像
  docker search redis
2 拉取镜像
docker pull redis:4.0

3 建立master容器
docker run -p 6379:6379 -v $pwd/data:/data -d redis redis-server --appendonly yes

4 建立slave容器
docker run --name redis-6380 -p 6380:6379 -d redis redis-server
docker run --name redis-6381 -p 6381:6379 -d redis redis-server

5 查看容器IP
docker inspect containerid(容器ID)

6 进入2台从容器,分别设置
docker exec -it containerid(容器ID)bash
redis-cli

设置分别主从命令
SLAVEOF 172.17.0.2 6379

二 Sentinel哨兵
1进入3台容器分别部署sentinel文件

docker exec -it containerid(容器ID)bash

2 建立文件
cd / && touch sentinel.conf && touch log.txt

安装vim
apt-get update
apt-get install vim
3修改sentinel.conf文件内容为
sentinel monitor mymaster 172.17.0.3 6379 1
#添加为后台运行
daemonize yes
#指定日志目录
logfile "/log.txt"

4 运行哨兵
redis-sentinel /sentinel.conf

5 验证
 tail -f /log.txt

至此,部署完毕。

redis的原理及击穿,穿透,高可用等概念自行学习,这里不涉及。

(二)使用 docker 搭建 redis 主从哨兵模式,并整合进 springboot 项目

(二)使用 docker 搭建 redis 主从哨兵模式,并整合进 springboot 项目

其实上一篇的思路做法是百度后参考各种博客文章搭的,但是发现最后还是有问题后,就直接去官网看文档了,于是在之前的熟悉的基础的下,重新搭了一遍,在基于容器网络的情况下,实现主备来回自动切换功能。

1,先上 redis 主备编排文件,master-slave/docker-compose.yml

version: "3"
services:
  master:
    image: redis:latest
    container_name: redis-master
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
    - "6379:6379"
    volumes:
    - "/root/redis/redis-master.conf:/usr/local/etc/redis/redis.conf"
    networks:
    - sentinel-master
  slave1:
    image: redis:latest
    container_name: redis-slave-1
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
    - master
    ports:
    - "6380:6379"
    volumes:
    - "/root/redis/redis-slave-1.conf:/usr/local/etc/redis/redis.conf"
    networks:
    - sentinel-master
  slave2:
    image: redis:latest
    container_name: redis-slave-2
    command: redis-server /usr/local/etc/redis/redis.conf
    depends_on:
    - master
    ports:
    - "6381:6379"
    volumes:
    - "/root/redis/redis-slave-2.conf:/usr/local/etc/redis/redis.conf"
    networks:
    - sentinel-master
networks:
  sentinel-master:

这里还是使用配置文件,加多了两个配置项,用于宣布 ip 和端口给哨兵,防止哨兵取容器内网 ip

redis-master.conf

port 6379
requirepass 123456

#  防止重启后,作为从节点加入集群时认证失败
masterauth 123456

# 宣布给哨兵的ip,如不配置,哨兵会取容器内部ip,这样客户端就无法访问了
slave-announce-ip 192.168.1.254

# 宣布给哨兵的端口
slave-announce-port 6379

redis-slave-1.conf

port 6379
requirepass 123456

slaveof 192.168.1.254 6379
masterauth 123456
slave-announce-ip 192.168.1.254
slave-announce-port 6380

redis-slave-2.conf

port 6379
requirepass 123456

slaveof 192.168.1.254 6379
masterauth 123456
slave-announce-ip 192.168.1.254
slave-announce-port 6381

2,哨兵编排文件,sentinel/docker-compose.yml

# Example sentinel.conf can be downloaded from http://download.redis.io/redis-stable/sentinel.conf
version: "3"
services:
  sentinel1:
    image: redis:latest
    container_name: redis-sentinel-1
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ports:
    - "26379:26379"
    volumes:
    - "/root/redis/sentinel1.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel2:
    image: redis:latest
    container_name: redis-sentinel-2
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ports:
    - "26380:26379"
    volumes:
    - "/root/redis/sentinel2.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel3:
    image: redis:latest
    container_name: redis-sentinel-3
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ports:
    - "26381:26379"
    volumes:
    - "/root/redis/sentinel3.conf:/usr/local/etc/redis/sentinel.conf"
networks:
  default:
    external:
      name: "master-slave_sentinel-master"

sentinel1.conf,sentinel2.conf, sentinel3.conf 初始的内容完全一样,只是会在哨兵启动重写会变得不一样,这个是由哨兵自动完成的

port 26379
dir /tmp
sentinel monitor mymaster 192.168.1.254 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
sentinel deny-scripts-reconfig yes

3,springboot 整合,及测试程序还是一样

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
      - "192.168.1.254:26379"
      - "192.168.1.254:26380"
      - "192.168.1.254:26381"
    host: 192.168.1.254
    password: 123456
    jedis:
      pool:
        min-idle: 8
        max-active: 100
        max-wait: 3000
        max-idle: 100

测试程序,3 个线程模拟并发插入数据,一共 3000 条

@Test
public void testRedisMasterSlave() throws Exception {
	ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
	ExecutorService es = Executors.newFixedThreadPool(3);
	for (int j = 0; j < 3; j++) {
		es.submit(() -> {
			for (int i = 0; i < 1000; i++) {
				try {
					String threadName = Thread.currentThread().getName();
					valueOperations.set(threadName + i, i + "", 30L, TimeUnit.MINUTES);
					TimeUnit.MILLISECONDS.sleep(200L);
				} catch (InterruptedException e) {
					System.out.println("error: " + e.getMessage());
				}
			}
		});
	}
	es.shutdown();
	es.awaitTermination(30L, TimeUnit.MINUTES);
}

准备完成,分别启动 redis( master-slave/docker-compose.yml),哨兵(sentinel/docker-compose.yml)

执行 junit 测试程序,并在中途停掉 redis-master 节点

2019-10-06 21:50:24.199  INFO 128256 --- [pool-1-thread-1] io.lettuce.core.EpollProvider            : Starting without optional epoll library
2019-10-06 21:50:24.201  INFO 128256 --- [pool-1-thread-1] io.lettuce.core.KqueueProvider           : Starting without optional kqueue library
2019-10-06 21:51:11.141  INFO 128256 --- [xecutorLoop-1-6] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /192.168.1.254:6379
2019-10-06 21:51:13.161  WARN 128256 --- [ioEventLoop-4-4] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /192.168.1.254:6379
2019-10-06 21:51:17.440  INFO 128256 --- [xecutorLoop-1-7] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.1.254:6379
2019-10-06 21:51:19.450  WARN 128256 --- [ioEventLoop-4-2] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /192.168.1.254:6379
2019-10-06 21:51:23.741  INFO 128256 --- [xecutorLoop-1-8] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.1.254:6379
2019-10-06 21:51:25.748  WARN 128256 --- [ioEventLoop-4-8] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /192.168.1.254:6379
2019-10-06 21:51:30.840  INFO 128256 --- [xecutorLoop-1-3] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.1.254:6379
2019-10-06 21:51:32.848  WARN 128256 --- [ioEventLoop-4-6] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /192.168.1.254:6379
2019-10-06 21:51:38.041  INFO 128256 --- [xecutorLoop-1-7] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.1.254:6379
2019-10-06 21:51:40.050  WARN 128256 --- [ioEventLoop-4-2] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /192.168.1.254:6379
2019-10-06 21:51:44.241  INFO 128256 --- [xecutorLoop-1-2] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.1.254:6379
2019-10-06 21:51:44.248  INFO 128256 --- [ioEventLoop-4-4] i.l.core.protocol.ReconnectionHandler    : Reconnected to 192.168.1.254:6380

控制台打印的消息由 6379 端口,切换到了 6380 端口,证明哨兵已经完成主备切换了。

接下来再把 redis-master 节点重新启动,查看容器启动日志

2019-10-05T19:05:51.594625998Z 1:S 05 Oct 2019 19:05:51.594 * Before turning into a replica, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
2019-10-05T19:05:51.594679191Z 1:S 05 Oct 2019 19:05:51.594 * REPLICAOF 192.168.1.254:6380 enabled (user request from ''id=4 addr=172.23.0.1:43460 fd=9 name=sentinel-36a0e6b8-cmd age=10 idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=153 qbuf-free=32615 obl=36 oll=0 omem=0 events=r cmd=exec'')
2019-10-05T19:05:51.594683850Z 1:S 05 Oct 2019 19:05:51.594 # CONFIG REWRITE failed: Permission denied
2019-10-05T19:05:51.961959923Z 1:S 05 Oct 2019 19:05:51.961 * Connecting to MASTER 192.168.1.254:6380
2019-10-05T19:05:51.961989715Z 1:S 05 Oct 2019 19:05:51.961 * MASTER <-> REPLICA sync started
2019-10-05T19:05:51.961995348Z 1:S 05 Oct 2019 19:05:51.961 * Non blocking connect for SYNC fired the event.
2019-10-05T19:05:51.962964412Z 1:S 05 Oct 2019 19:05:51.962 * Master replied to PING, replication can continue...
2019-10-05T19:05:51.963959151Z 1:S 05 Oct 2019 19:05:51.963 * Trying a partial resynchronization (request d0c6a5694d17b9337656d0ef009aa580e0743431:1).
2019-10-05T19:05:51.967159605Z 1:S 05 Oct 2019 19:05:51.966 * Full resync from master: bfcd3bb8bbfb2393ded951443e9e2100ed490548:133911
2019-10-05T19:05:51.967200123Z 1:S 05 Oct 2019 19:05:51.966 * Discarding previously cached master state.
2019-10-05T19:05:52.064097244Z 1:S 05 Oct 2019 19:05:52.062 * MASTER <-> REPLICA sync: receiving 51791 bytes from master
2019-10-05T19:05:52.064114578Z 1:S 05 Oct 2019 19:05:52.062 * MASTER <-> REPLICA sync: Flushing old data
2019-10-05T19:05:52.064124761Z 1:S 05 Oct 2019 19:05:52.062 * MASTER <-> REPLICA sync: Loading DB in memory
2019-10-05T19:05:52.064128120Z 1:S 05 Oct 2019 19:05:52.063 * MASTER <-> REPLICA sync: Finished with success

发现节点已经主动找到当前 master 节点 192.168.1.254:6380,并进行全量复制了。

再进入哨兵节点查看 slave 节点信息

127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.1.254:6379"
    3) "ip"
    4) "192.168.1.254"
    5) "port"
    6) "6379"
    7) "runid"
    8) "d4d7ce3f1cc4d5c6cca2345318e4dcfebe12fcce"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "872"
   19) "last-ping-reply"
   20) "872"
   21) "down-after-milliseconds"
   22) "30000"
   23) "info-refresh"
   24) "2519"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "5867007"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.1.254"
   35) "master-port"
   36) "6380"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "1526467"
2)  1) "name"
    2) "192.168.1.254:6381"
    3) "ip"
    4) "192.168.1.254"
    5) "port"
    6) "6381"
    7) "runid"
    8) "2fecd472915d77b55d230c339f5982491ee55d69"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "872"
   19) "last-ping-reply"
   20) "872"
   21) "down-after-milliseconds"
   22) "30000"
   23) "info-refresh"
   24) "6520"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "5940478"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.1.254"
   35) "master-port"
   36) "6380"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "1525639"

发现 6379 节点也已经加入到 slave 节点了,到此哨兵模式高可用方案就算完成了。

(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

参考并感谢

  • 官方文档 https://hub.docker.com/_/redis
  • GitHub https://github.com/antirez/redis
  • happyJared https://blog.csdn.net/qq_28804275/article/details/80938659

下载 redis 镜像 (不带 tag 标签则表示下载 latest 版本)

docker pull redis

从 github 下载最新的 redis.conf, 注意重要参数

# 端口
port 6379
# 密码
requirepass Mypwd@123456
# 支持数据持久化
appendonly yes
# 关闭守护进程
daemonize no
# 默认多少个数据库
databases 16

# 从库时需要增加主库配置
# 主库密码(一个集群密码需要保持一致)
masterauth Mypwd@123456
# 主库地址和端口
slaveof 172.17.0.1 6379

启动 redis6379 主库

docker run -d \
-p 6379:6379 \
--name redis6379 \
--mount type=bind,source=/var/docker/configs/redis/6379/redis.conf,target=/usr/local/etc/redis/redis.conf \
--mount type=bind,source=/var/docker/datas/redis/6379,target=/data \
--restart always \
redis:latest \
redis-server /usr/local/etc/redis/redis.conf

启动 redis6380 从库 (需要修改 redis.conf 的 port 和从服务器相关配置)

docker run -d \
-p 6380:6380 \
--name redis6380 \
--mount type=bind,source=/var/docker/configs/redis/6380/redis.conf,target=/usr/local/etc/redis/redis.conf \
--mount type=bind,source=/var/docker/datas/redis/6380,target=/data \
--restart always \
redis:latest \
redis-server /usr/local/etc/redis/redis.conf

启动 redis6381 从库 (需要修改 redis.conf 的 port 和从服务器相关配置)

docker run -d \
-p 6381:6381 \
--name redis6381 \
--mount type=bind,source=/var/docker/configs/redis/6381/redis.conf,target=/usr/local/etc/redis/redis.conf \
--mount type=bind,source=/var/docker/datas/redis/6381,target=/data \
--restart always \
redis:latest \
redis-server /usr/local/etc/redis/redis.conf

从 github 下载最新的 sentinel.conf, 注意重要参数

# 端口
port 26379
# 关闭守护进程
daemonize no
# 设定监听的redis集群的名称(mymaster)+IP+主库端口+最少从库数量
sentinel monitor mymaster 172.17.0.1 6379 2
# 设定监听的redis集群的密码(集群中主库和从库密码需要保持一致)
sentinel auth-pass mymaster Mypwd@123456

开放 redis 和 sentinel 端口并立即生效

firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=26379/tcp --permanent
firewall-cmd --zone=public --add-port=26380/tcp --permanent
firewall-cmd --zone=public --add-port=26381/tcp --permanent
firewall-cmd --reload

不修改 redis.conf, 通过命令方式使从库加入集群

docker exec -it redis6380 bash
redis-cli -a Mypwd@123456 -p 6380
slaveof 172.17.0.1 6379
config set masterauth Mypwd@123456
docker exec -it redis6381 bash
redis-cli -a Mypwd@123456 -p 6381
slaveof 172.17.0.1 6379
config set masterauth Mypwd@123456

主容器查询集群状态

docker exec -it redis6379 bash
redis-cli -a Mypwd@123456 -p 6379
info Replication

查看哨兵监控情况 (不同的哨兵登录不同的容器使用客户端 26379 26380 26381)

redis-cli -p 26379
# 查看集群主库情况
sentinel master mymaster
# 查看集群从库情况
sentinel slaves mymaster

从库退出集群并保持原先数据 (通过 bash 登录从库容器后,使用 redis-cli 客户端)

slaveof no one

验证哨兵模式 + 集群是否高可用 (通过 bash 登录从库容器后,使用 redis-cli 客户端)

redis-cli -a Mypwd@123456 -p 6379 DEBUG sleep 60

PS: 启动容器之前,需要创建好对应的宿主机的文件目录,宿主机缺少文件会导致容器启动失败

《(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)》CSDN 地址:https://blog.csdn.net/madmarszff/article/details/100902662

《(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)》博客园地址:https://www.cnblogs.com/godzff/p/11530290.html

《(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)》简书地址:

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑

1.nginx服务器根目录问题

docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同

eg:

run一个niginx容器

<span>//80端口被占用,so...</span>
$ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx
$ sudo docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
<span>1801</span>a32aab54        nginx               <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago       Up <span>2</span> minutes        <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-&gt;</span><span>800</span>/tcp   berserk_kare
登录后复制

进入容器内部

<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash
root<span>@1801a32aab54</span><span>:/</span><span># </span>
登录后复制

查看nginx目录

<span># cd /etc/nginx/</span>
conf<span>.d</span>/         koi-utf         mime<span>.types</span>      nginx<span>.conf</span>      uwsgi_params    
fastcgi_params  koi-win         modules/        scgi_params     win-utf  
登录后复制

可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled

继续查看nginx配置

<span># cat /conf.d/default.conf</span><span>server</span> {
    listen       <span>80</span>;
    server_name  localhost;

    <span>#charset koi8-r;</span><span>#access_log  /var/log/nginx/log/host.access.log  main;</span>    location / {
        root   /usr/share/nginx/html;
        <span>index</span><span>index</span>.html <span>index</span>.htm;
    }

    <span>#error_page  404              /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span>
    error_page   <span>500</span><span>502</span><span>503</span><span>504</span>  /<span>50</span>x.html;
    location = /<span>50</span>x.html {
        root   /usr/share/nginx/html;
    }
    <span>#...省略php-fpm配置,好长..</span>
}
登录后复制

根目录配置: root /usr/share/nginx/html;

测试

<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" &gt;index.html</span>
登录后复制

php-fpm配置相关

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

2020-05-29:redis 怎么保证高可用,高可用模式有那些?对比下优缺点?

2020-05-29:redis 怎么保证高可用,高可用模式有那些?对比下优缺点?

Redis 高可用架构如下:
1.Redis Sentinel 集群 + 内网 DNS + 自定义脚本。
2.Redis Sentinel 集群 + VIP + 自定义脚本。
3. 封装客户端直连 Redis Sentinel 端口。
4.JedisSentinelPool,适合 Java。
5.PHP 基于 phpredis 自行封装。
6.Redis Sentinel 集群 + Keepalived/Haproxy。
7.Redis M/S + Keepalived。
8.Redis Cluster。
9.Twemproxy。
10.Codis。

1.Redis Sentinel 集群 + 内网 DNS + 自定义脚本。
优点:
秒级切换;
脚本自定义,架构可控;
对应用透明。
缺点:
维护成本略高;
依赖 DNS,存在解析延时;
Sentinel 模式存在短时间的服务不可用。

2.Redis Sentinel 集群 + VIP + 自定义脚本。
优点:
秒级切换;
脚本自定义,架构可控;
对应用透明。
缺点:
维护成本略高;
Sentinel 模式存在短时间的服务不可用。

3. 封装客户端直连 Redis Sentinel 端口。
优点:
服务探测故障及时;
DBA 维护成本低。
缺点:
依赖客户端支持 Sentinel;
Sentinel 服务器需要开放访问权限;
对应用有侵入性。

4.JedisSentinelPool,适合 Java。

5.PHP 基于 phpredis 自行封装。

6.Redis Sentinel 集群 + Keepalived/Haproxy。
优点:
秒级切换;
对应用透明。
缺点:
维护成本高;
存在脑裂;
Sentinel 模式存在短时间的服务不可用。

7.Redis M/S + Keepalived。
优点:
秒级切换;
对应用透明;
部署简单,维护成本低。
缺点:
需要脚本实现切换功能;
存在脑裂。

8.Redis Cluster。
优点:
组件 all-in-box,部署简单,节约机器资源;
性能比 proxy 模式好;
自动故障转移、Slot 迁移中数据可用;
官方原生集群方案,更新与支持有保障。
缺点:
架构比较新,最佳实践较少;
多键操作支持有限(驱动可以曲线救国);
为了性能提升,客户端需要缓存路由表信息;
节点发现、reshard 操作不够自动化。

9.Twemproxy。
优点:
开发简单,对应用几乎透明;
历史悠久,方案成熟。
缺点:
代理影响性能;
LVS 和 Twemproxy 会有节点性能瓶颈;
Redis 扩容非常麻烦;
Twitter 内部已放弃使用该方案,新使用的架构未开源。

10.Codis。
优点:
开发简单,对应用几乎透明;
性能比 Twemproxy 好;
有图形化界面,扩容容易,运维方便。
缺点:
代理依旧影响性能;
组件过多,需要很多机器资源;
修改了 Redis 代码,导致和官方无法同步,新特性跟进缓慢;
开发团队准备主推基于 Redis 改造的 reborndb。

评论

今天的关于docker toolbox的redis 配置主从及哨兵模式保证高可用docker搭建redis哨兵模式的分享已经结束,谢谢您的关注,如果想了解更多关于(二)使用 docker 搭建 redis 主从哨兵模式,并整合进 springboot 项目、(六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)、167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、2020-05-29:redis 怎么保证高可用,高可用模式有那些?对比下优缺点?的相关知识,请在本站进行查询。

本文标签: