redis集群主从切换,jedis客户端如何自动切换访问

大家好,我是redis学习的新人,今天写这篇文章,希望记录一下最近的学习 其实到现在我也不不知道redis具体能做什么,大概是缓存,这个暂时不管,先实现我想要的结果。 这边如何启动redis不讲了,请参考:http://www.runoob.com/redis/redis-tutorial.html redis是支持集群的,所以需要配置redis集群,总的来说,将下载的redis文件复制多份, 修改一下配置就可以实现集群,我自己的总结: 我把我的实例打了个包,希望对大家有帮助

主从配置:
主服务器中的设置:
1:修改bind参数:绑定的服务器地址 (本地:127.0.0.1)

从服务器配置
1. 修改bing参数:绑定服务器地址 (注:不一定与主服务器在一起)
2. 修改port参数:端口号 (注:如果在同一个服务器上,端口号不同来区分)
3. slaveof参数: 设置主服务器的地址以及端口号(设置master的Host以及Port) [注意:
需要顶格写,不能有空格]  ]
4. 如果主服务器设置了密码,从服务器需要修改masterauth参数

配置好了主从服务器(从服务器只读),尝试一下,确实可以实现值的同步

List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
		JedisShardInfo shard1 = new JedisShardInfo("127.0.0.1", "6379");
		JedisShardInfo shard2 = new JedisShardInfo("127.0.0.1", "6380");
		shards.add(shard1);
		shards.add(shard2);
		
		JedisPoolConfig jpc = new JedisPoolConfig();
		jpc.setMaxIdle(10);
		jpc.setMaxTotal(30);
		jpc.setMaxWaitMillis(3*1000);
		
		ShardedJedisPool sjPool = new ShardedJedisPool(jpc, shards);
		ShardedJedis jedis = sjPool.getResource();
		jedis.set("temp", "heeloworld");
		System.out.println("----"+jedis.get("temp")+"-----");

但是这样还不够,毕竟集群真正作用是一个服务器挂了,其他的可以接着用 网上又看到“哨兵”(Redis-Sentinel),详情请见:https://segmentfault.com/a/1190000002680804 因此自己做了一些尝试,确实可以实现该功能。

1.之前已经准备好了主从服务器多个,每个里面添加一个sentinel.conf的文件
2.文件的内容是
####master  sentinel.conf
##sentinel实例之间的通讯端口  default 26379
port 36379
####sentinel需要监控的master信息:<mastername> <masterIP> <masterPort> <quorum>.
####<quorum>应该小于集群中slave的个数,只有当至少<quorum>个sentinel实例提交"master失效" 才会认为master为ODWON("客观"失效) .
sentinel myid 45e995cdd93d2db1e48d563c8b3a4f69caf03274
##**以下地址是主服务器地址,特别留意:主从切换后,此处的地址会改变哟**
sentinel monitor mymaster 127.0.0.1 6379 1 
sentinel down-after-milliseconds mymaster 1000
sentinel config-epoch mymaster 10

接下来就展示一下我的例子

下两张图展示的是两个服务器,一个是6379端口一个是6380端口,
通过info replication命令,可以从role看出服务器的角色:master(主服务器),slave(从服务器)
再下面两张是启动sentinel监听的画面,所占用的端口可以修改sentinel.conf的port属性

输入图片说明

主从服务器都启动,读写数据都没有问题

输入图片说明

这个时候,将主服务器关闭

输入图片说明

这个时候注意从服务器的role从slave变成了master

输入图片说明

最后读取数据也没有问题,而且获取数据的服务器地址从6379,变成了6380,
说明我们的功能实现了,主从切换,客户端请求也切换到获取最新的主服务数据

输入图片说明

注意:想必大家也注意到我的代码中的问题,前面我是用的ShardedJedisPool对象请求数据,
但是到后来,代码里使用的JedisSentinelPool,为什么会有这样一个变化,
是因为ShardedJedisPool对象在主从服务器切换之后,就无法请求到数据了,
但是JedisSentinelPool就可以,具体原理我也不清楚。
最后,这是我的一点点看法,有不对的地方希望大家可以提示我,毕竟我了解的不多,
在这里希望大牛可以给我些指导,在项目中如何使用redis,有没有实例可以给我学习学习,谢谢大家!

猜你喜欢

转载自my.oschina.net/u/2326864/blog/798509