redis哨兵模式

记录一下使用

搭建redis主从哨兵

先搭建3台主从redis
--slaveof redis-9955 6379
如果放在不同的机器上使用--slaveof ip prot
建一个docker-compose.yml ,然后docker-compose up -d

version: '3.1'
services:
  master:
    image: redis
    container_name: redis-9955
    ports:
      - 9955:6379
    volumes:
      - $PWD/redis-9955/data:/data

  slave1:
    image: redis
    container_name: redis-9956
    ports:
      - 9956:6379
    volumes:
      - $PWD/redis-9956/data:/data
    command: redis-server --slaveof redis-9955 6379

  slave2:
    image: redis
    container_name: redis-9957
    ports:
      - 9957:6379
    volumes:
      - $PWD/redis-9957/data:/data
    command: redis-server --slaveof redis-9955 6379

接下来搭建哨兵服务

  1. 准备3个sentinel.conf文件(启动容器时要用)
    3个文件只要改个端口,其他的不用动
    哨兵会自己更新你的master ip和端口
# 端口
port 26379

# 是否后台启动
daemonize yes

# pid文件路径
pidfile /var/run/redis-sentinel.pid

# 日志文件路径
logfile "/var/log/sentinel.log"

# 定义工作目录
dir /tmp

# mymster名字可自定义,java连接要用。ip如果不是一台机器就换docker外的ip吧。至少2个Sentinel认为主Redis挂了才换别的slave,
sentinel monitor mymaster 172.17.0.3 6379 2

# 如果mymaster 10秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 10000

# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1

# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000

# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes

再来个docker-compose.yml启动容器

version: '3.1'
services:
  sentinel1:
    image: redis
    container_name: sentinel-26379
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel-26379.conf:/usr/local/etc/redis/sentinel.conf

  sentinel2:
    image: redis
    container_name: sentinel-26380
    ports:
      - 26380:26380
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel-26380.conf:/usr/local/etc/redis/sentinel.conf

  sentinel3:
    image: redis
    container_name: sentinel-26381
    ports:
      - 26381:26381
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel-26381.conf:/usr/local/etc/redis/sentinel.conf


springboot连接

就是使用redis作者提出的Redlock算法,Redisson是redlock算法的java实现
Redisson支持单机、主从、哨兵、集群。(就是全部都支持)
依赖

<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.3.2</version>
        </dependency>

配置连接类

@Configuration
public class RedisLockCluster {
    /*//第一种使用java类配置redis集群连接
    @Bean
    public Config redisConfig(){
        Config config =new Config();
        config.useSentinelServers().addSentinelAddress("哨兵的ip和port,不要写成了redis的")
                .setMasterName("mymaster")
                .setDatabase(0);
        return config;
    }
    @Bean
    public RedissonClient redissonClient(){
        return Redisson.create(redisConfig());
    }*/

    //使用配置文件yml来连接redis集群
    @Autowired
    private Environment env;

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() throws IOException {
        return Redisson.create(
                Config.fromYAML(new ClassPathResource("redisson.yml").getInputStream())
        );
    }

}

第二种配置文件的方式连接就建一个redisson.yml,也需要上面下半部分的代码

sentinelServersConfig:
  idleConnectionTimeout: 10000
  pingTimeout: 1000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  reconnectionTimeout: 3000
  failedAttempts: 3
  subscriptionsPerConnection: 5
  clientName: null
  loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
  slaveSubscriptionConnectionMinimumIdleSize: 1
  slaveSubscriptionConnectionPoolSize: 50
  slaveConnectionMinimumIdleSize: 10
  slaveConnectionPoolSize: 64
  masterConnectionMinimumIdleSize: 10
  masterConnectionPoolSize: 64
  readMode: "SLAVE"
  sentinelAddresses:
    - "redis://1.1.1.1:26379"
    - "redis://1.1.1.1:26380"
    - "redis://1.1.1.1:26381"
# 这个mymaster就是你自己取的名字
  masterName: "mymaster"
  database: 0
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false

然后就完了呗

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容