Redis主从集群以及sentinel集群安装和配置总结

来源:互联网 发布:windows日志看不懂 编辑:程序博客网 时间:2024/06/07 00:24

 1.   单机单实例或多实例安装

单实例的安装步骤很简单

(1)首先去redis官网上下载最新的稳定版本(可以直接去redis中文官网http://www.redis.cn/download.html

wget http://download.redis.io/releases/redis-4.0.1.tar.gz

(2)下载的是压缩包,解压

tar xzf redis-4.0.1.tar.gz
(3) 加压出来的其实还是未编译链接的文件,redis是C实现的,需要执行编译链接最后才生成可执行文件。
cd redis-4.0.1
make
(4)服务端和客户端启动程序都在src目录下
启动服务端
src/redis-server
启动客户端
src/redis-cli
--这样就可以在客户端上进行读写操作了
(5)修改配置文件
daemonize yes
port 6380
pidfile /home/itzxyy/zrf/redis-4.0.1/pid/redis_6380.pid
logfile /home/itzxyy/zrf/redis-4.0.1/log/redis_6380.log
dbfilename dump_6380.rdb
dir /home/itzxyy/zrf/redis-4.0.1/redisdb/
其中daemonize设置服务进程是否为后台进程,pidfile保存进程id,目的是防止重复启动相同端口的服务实例,后面试图启动同个实例进程时会先检查pid文件是否存在,如果存在则读取里面的进程id,并检查系统中是否存在这个pid的进程,如果存在则退出,否则则重新写入新的pid,并且写的时候对pid文件进行加锁防止其他进程竞争,dbfilename和dir就是持久化文件的文件名和保存目录路径,注意还有个配置bind 默认是bind 127.0.0.1,也就是只接受本机上的客户端的连接访问,如果允许其他主机上的客户端访问,则可改成空或者0.0.0.0

单机多实例部署配置也比较简单,多搞一份config文件,修改部分内容(主要是端口号以及和端口号有关的命名),再启动一个实例进程即可。

 

2.   多实例主从配置(哨兵配置)

(1)去另外一台主机照上述流程安装redis,拷贝主节点的配置文件,这个配置其实也挺简单,只要修改一个配置项就行

slaveof 132.121.127.31 6379

--其他配置在目录结构相同的情况下可以保持不变,正常的启动命令

(2)如果需要增加哨兵集群监控,拷贝一份正常配置文件重命名为redis-sentinel-26380.conf并修改以下配置:
port 26380
pidfile /home/itzxyy/zrf/redis-4.0.1/pid/redis_26380.pid
logfile /home/itzxyy/zrf/redis-4.0.1/log/redis_26380.log
dbfilename dump_26380.rdb

增加以下关于哨兵的四行配置项(如果要监控多个主实例,则每个主实例都要四行配置项)

sentinel monitor mymaster 132.121.127.31 6380 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster180000

 

--然后执行redis-sentinel redis-sentinel-26379.conf把哨兵进程启起来。然后试着把监控的主节点kill掉,你会发现哨兵会发现然后把备节点切换成主节点,mastername保持不变。但是指向的实例发生改变。

如果这时候 把之前kill掉的旧主实例启起来,那么就旧实例会自动变成新主实例的从实例,并且redis会把slaveof 新主实例ip 端口回写到旧实例的配置文件中。如果这时候再去手工把新主实例进程kill掉,那么sentinel就会发现到,把新的从节点切换成备节点,并且把slaveof 新主实例ip 端口这行配置去掉。

有点需要注意的是,redis会经常动态地把当前的配置状态回写到配置文件中,有时候运行是你再去看配置文件时会发现已经和刚启动时差很多。

比如sentinel的配置文件运行时是这样的:

sentinel myid70c035923fd5e3f269abb4b7cc44deb97bxxxxx

sentinel monitor master-132.121.127.31:6379132.121.127.31 6379 2

sentinel config-epochmaster-132.121.127.31:6379 2

sentinel leader-epochmaster-132.121.127.31:6379 2

 

sentinel known-slavemaster-132.121.127.31:6379 132.121.127.32 6379

sentinel known-sentinelmaster-132.121.127.31:6379 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453exxxxxx

sentinel known-sentinelmaster-132.121.127.31:6379 132.121.127.32 2638172e17db4ba728668468e4ef9273b94f6a07xxxx

sentinel monitor master-132.121.127.31:6381132.121.127.31 6381 2

 

sentinel config-epochmaster-132.121.127.31:6381 0

sentinel leader-epochmaster-132.121.127.31:6381 0

sentinel known-slavemaster-132.121.127.31:6381 132.121.127.32 6381

 

# Generated by CONFIG REWRITE

sentinel known-sentinelmaster-132.121.127.31:6381 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453e4bdfxxxxxx

sentinel known-sentinel master-132.121.127.31:6381132.121.127.32 26381 72e17db4ba728668468e4ef9273b94f6a07xxxxx

sentinel monitor master-132.121.127.31:6380132.121.127.31 6380 2

sentinel config-epochmaster-132.121.127.31:6380 0

sentinel leader-epochmaster-132.121.127.31:6380 0

sentinel known-slavemaster-132.121.127.31:6380 132.121.127.32 6380

sentinel known-sentinelmaster-132.121.127.31:6380 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453e4bdfxxxx

sentinel known-sentinelmaster-132.121.127.31:6380 132.121.127.32 26381 72e17db4ba728668468e4ef9273b94f6a07xxxxx

sentinel current-epoch 2

--其实就是增加了sentinel进程启动后发现sentinel集群中其他sentinel节点的信息(包括id,监控的主从节点的关系),其中监控的主从节点的关系信息很重要,是上述主备之间能自动切换的保障。有个有意思的问题,我发现启动后,下面三行配置项居然被删掉了

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster180000

--有个解释:要是参数配置的是默认值,在sentinel运行时该参数会在配置文件文件里被删除掉,直接不显示


3. sentinel API操作

publicShardedJedisSentinelPool createShardedJedisSentinelPool(Set<HostAndPort>hostInfo,

                            Set<String>sentinels) {

                   // TODO Auto-generated methodstub

                   ShardedJedisSentinelPoolshardedJedisSentinelPool = new ShardedJedisSentinelPool(hostInfo, sentinels);

                   returnshardedJedisSentinelPool;

         }

        

         Set<HostAndPort> hostInfo = newHashSet<HostAndPort>();

                   HostAndPort hostAndPort1 =new HostAndPort("132.121.127.31",6379);

                   HostAndPort hostAndPort2 =new HostAndPort("132.121.127.31",6380);

                   HostAndPort hostAndPort3 =new HostAndPort("132.121.127.31",6381);

                   hostInfo.add(hostAndPort1);

                   hostInfo.add(hostAndPort2);

                   hostInfo.add(hostAndPort3);

                   String[] sentinelList ={"132.121.127.32:26379","132.121.127.32:26380","132.121.127.32:26381"};

                   Set<String> sentinels =new HashSet<String>(Arrays.asList(sentinelList));

                   ShardedJedisSentinelPool pool= redisDao.createShardedJedisSentinelPool(hostInfo, sentinels);

                   Jedis jedis =pool.getResource(args[0]);

                   System.out.println(jedis.getClient().getHost()+jedis.getClient().getPort());

                   jedis.set(args[0], args[1]);

                   jedis.close();

   pool.close();

--其中ShardedJedisSentinelPool的实现请看《如何简单地实现易用的ShardedJedisSentinelPool


原创粉丝点击