zoukankan      html  css  js  c++  java
  • 通过哨兵机制实现Redis主从配置以及java调用

    Redis版本:3.0.7

    操作环境:Linux

    一、redis 主从配置的作用是什么

      redis主从配置,配置master 只能为写,slave只能为读,在客户端对poolconnect请求时候,,会将读请求转到slave上面,写请求转到master上面,同时,master和slave有同步功能,这就实现了(数据层)读写分离对上层(逻辑层)透明的正常逻辑。无需再通过中间件或者代码进行读写分析实现。

     二、如何实现主从配置

      以一台服务器,配置两个端口号为例子做介绍

      redis实现主从配置最关键的两个两个配置文件是redis.conf和sentinel.conf,分别配合redis-server和redis-sentinel使用;下面做详细讲解。

      主配置文件:

      redis.conf:

     1 #开启后台运行模式
     2 daemonize yes
     3 #指定进程id存放位置,也可以用默认的
     4 pidfile /usr/local/webserver/redis/run/redis.pid
     5 #指定端口号
     6 port 6379
     7 
     8 
     9 tcp-backlog 511
    10 
    11 timeout 0
    12 
    13 tcp-keepalive 0
    14 
    15 loglevel notice
    16 
    17 logfile ""
    18 
    19 databases 16
    20 
    21 save 900 1
    22 save 300 10
    23 save 60 10000
    24 
    25 stop-writes-on-bgsave-error yes
    26 
    27 rdbcompression yes
    28 
    29 rdbchecksum yes
    30 
    31 dbfilename dump.rdb
    32 #指定数据存放位置,也可以用默认的
    33 dir /usr/local/webserver/redis/db
    34 
    35 slave-serve-stale-data yes
    36 #从redis只能读
    37 slave-read-only yes
    38 
    39 repl-diskless-sync no
    40 
    41 repl-diskless-sync-delay 5
    42 
    43 repl-disable-tcp-nodelay no
    44 
    45 slave-priority 100
    46 #本redis密码
    47 requirepass 123456
    48 #主redis密码
    49 masterauth "123456"
    50 
    51 appendonly yes
    52 
    53 appendfilename "appendonly.aof"
    54 
    55 appendfsync everysec
    56 
    57 no-appendfsync-on-rewrite no
    58 
    59 auto-aof-rewrite-percentage 100
    60 auto-aof-rewrite-min-size 64mb
    61 
    62 aof-load-truncated yes
    63 
    64 lua-time-limit 5000
    65 
    66 slowlog-max-len 128
    67 
    68 latency-monitor-threshold 0
    69 
    70 notify-keyspace-events ""
    71 
    72 hash-max-ziplist-entries 512
    73 hash-max-ziplist-value 64
    74 
    75 list-max-ziplist-entries 512
    76 list-max-ziplist-value 64
    77 
    78 set-max-intset-entries 512
    79 
    80 zset-max-ziplist-entries 128
    81 zset-max-ziplist-value 64
    82 
    83 hll-sparse-max-bytes 3000
    84 
    85 activerehashing yes
    86 
    87 client-output-buffer-limit normal 0 0 0
    88 client-output-buffer-limit slave 256mb 64mb 60
    89 client-output-buffer-limit pubsub 32mb 8mb 60
    90 
    91 hz 10
    92 
    93 aof-rewrite-incremental-fsync yes

      sentinel.conf(哨兵机制):

     1 port 26379
     2 dir "/usr/local/webserver/redis/db"
     3 # 守护进程模式
     4 daemonize yes
     5 # 指明日志文件名
     6 logfile "./sentinel.log"
     7 #设置监控的主redis的ip以及端口号,以及投票最低数
     8 sentinel monitor mymaster 127.0.0.1 6379 1
     9 sentinel down-after-milliseconds mymaster 5000
    10 sentinel failover-timeout mymaster 18000
    11 sentinel auth-pass mymaster 123456

     从配置文件:

      redis.conf:

     1 daemonize yes
     2 
     3 pidfile /usr/local/webserver/redis-slave1/run/redis.pid
     4 
     5 port 63791
     6 
     7 
     8 tcp-backlog 511
     9 
    10 timeout 0
    11 
    12 tcp-keepalive 0
    13 
    14 loglevel notice
    15 
    16 logfile ""
    17 
    18 databases 16
    19 
    20 save 900 1
    21 save 300 10
    22 save 60 10000
    23 
    24 stop-writes-on-bgsave-error yes
    25 
    26 rdbcompression yes
    27 
    28 rdbchecksum yes
    29 
    30 dbfilename dump.rdb
    31 
    32 dir /usr/local/webserver/redis-slave1/db
    33 
    34 slave-serve-stale-data yes
    35 
    36 slave-read-only yes
    37 
    38 repl-diskless-sync no
    39 
    40 repl-diskless-sync-delay 5
    41 
    42 repl-disable-tcp-nodelay no
    43 
    44 slave-priority 100
    45 
    46 requirepass 123456
    47 masterauth "123456"
    48 
    49 appendonly yes
    50 
    51 appendfilename "appendonly.aof"
    52 
    53 appendfsync everysec
    54 
    55 no-appendfsync-on-rewrite no
    56 
    57 auto-aof-rewrite-percentage 100
    58 auto-aof-rewrite-min-size 64mb
    59 
    60 aof-load-truncated yes
    61 
    62 lua-time-limit 5000
    63 
    64 slowlog-max-len 128
    65 
    66 latency-monitor-threshold 0
    67 
    68 notify-keyspace-events ""
    69 
    70 hash-max-ziplist-entries 512
    71 hash-max-ziplist-value 64
    72 
    73 list-max-ziplist-entries 512
    74 list-max-ziplist-value 64
    75 
    76 set-max-intset-entries 512
    77 
    78 zset-max-ziplist-entries 128
    79 zset-max-ziplist-value 64
    80 
    81 hll-sparse-max-bytes 3000
    82 
    83 activerehashing yes
    84 
    85 client-output-buffer-limit normal 0 0 0
    86 client-output-buffer-limit slave 256mb 64mb 60
    87 client-output-buffer-limit pubsub 32mb 8mb 60
    88 
    89 hz 10
    90 
    91 aof-rewrite-incremental-fsync yes
    92 
    93 #指定主redis以及相应的端口号
    94 slaveof 127.0.0.1 6379

      sentinel.conf:

     1 #sentinel端口
     2 port 263791
     3 #工作路径,注意路径不要和主重复
     4 dir "/usr/local/webserver/redis-slave1/db"
     5 # 守护进程模式
     6 daemonize yes
     7 # 指明日志文件名
     8 logfile "./sentinel.log"
     9 #哨兵监控的master,主从配置一样,
    10 sentinel monitor mymaster 127.0.0.1 6379 1
    11 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
    12 sentinel down-after-milliseconds mymaster 5000
    13 #若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
    14 sentinel failover-timeout mymaster 18000
    15 #设置master和slaves验证密码
    16 sentinel auth-pass mymaster 123456

    同理,如果要实现多个从配置,可以按照以上从配置方式多定义几个端口号就可以了。

    在进行自动故障转移的时候,选中为主redis的redis.conf文件会将原来slaveof那一行去掉,并重新在从redis配置文件中指定主redis的信息

    三、java中调用

     1 import java.util.HashSet;
     2 import java.util.Set;
     3 
     4 import redis.clients.jedis.Jedis;
     5 import redis.clients.jedis.JedisSentinelPool;
     6 
     7 public class RedisSentinelTest {
     8 
     9     @SuppressWarnings("deprecation")
    10     public static void main(String[] args) {
    11 
    12         Set<String> sentinels = new HashSet<String>();
    13         String hostAndPort1 = "127.0.0.1:26379";
    14         String hostAndPort2 = "127.0.0.1:26380";
    15         sentinels.add(hostAndPort1);
    16         sentinels.add(hostAndPort2);
    17 
    18         String clusterName = "mymaster";
    19         String password = "123456";
    20 
    21         JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName,sentinels,password);
    22 
    23         Jedis jedis = null;
    24         try {
    25             jedis = redisSentinelJedisPool.getResource();
    26 //            jedis.set("key", "value");
    27             System.out.println(jedis.get("key"));
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30         } finally {
    31             redisSentinelJedisPool.returnBrokenResource(jedis);
    32         }
    33 
    34         redisSentinelJedisPool.close();
    35     }
    36 
    37 }
  • 相关阅读:
    忙碌的一月
    SharePoint Portal Server 2003书籍计划最新进展
    如何判断Assembly是Debug还是Release?
    C#和C++的一个有意思的差别
    Enterprise Development Reference Architecture(ShadowFax)
    一个“轻量级”的SharePoint文档流转WebPart
    11月25日下午14:00,CSDN在线SharePoint TechTalk
    到北京后的第一篇随笔
    SOA & Messaging Patterns
    操作SharePoint Object Model完成两项操作的文档
  • 原文地址:https://www.cnblogs.com/yanduanduan/p/6654691.html
Copyright © 2011-2022 走看看