了解有关在Java上构建Redis集群的更多信息——用于扩展和高可用性。本文分享学习自【优锐课】。
什么是Redis群集?
可伸缩性和可用性是任何企业级数据库的两个最重要的品质。
你完全可以准确预测数据库将消耗的最大资源量,这是非常不寻常的,因此,为了应对需求异常高的时期,必须具有可伸缩性。但是,可伸缩性在没有可用性的情况下是无用的,这确保了用户始终可以在需要时访问数据库中的信息。
Redis是一个内存数据结构存储,可用于实现非关系键值数据库。但是,Redis的准系统安装并未立即提供最佳性能。
为了提高Redis部署的可伸缩性和可用性,你可以使用Redis Cluster,这是一种在不同Redis节点之间自动分片数据的方法。Redis Cluster将一个很大的Redis数据库分解为较小的水平分区,这些分区称为分片,分别存储在单独的服务器上。
这使得Redis数据库能够容纳更多的请求,因此具有更大的可伸缩性。而且,由于即使集群中的某些节点发生故障,数据库也可以继续运行,因此可用性得以提高。
在3.0版之前,Redis Cluster使用异步复制。实际上,这意味着,如果Redis Cluster中的主服务器在向其所有从服务器发送写操作之前崩溃,则可以将未接收到该写操作的一个从设备升级为主服务器,这将导致写操作丢失。
从3.0版开始,Redis Cluster还具有WAIT命令形式的同步复制选项,该选项会阻止当前客户端,直到成功完成所有写命令为止。尽管这还不足以保证强大的一致性,但这确实使数据传输过程更加安全。
如何运行Redis集群
有两种方法可以启动和运行Redis Cluster:简便方法和困难方法。
简单的方法涉及使用create-cluster
bash脚本,你可以在Redis安装的utils/create-cluster
目录中找到该脚本。以下两个命令将创建一个具有6个节点,3个主节点和3个从节点的默认集群:
create-cluster start
create-cluster create
创建集群后,即可与其进行交互。默认情况下,集群中的第一个节点从端口30001开始。使用以下命令停止集群:
create-cluster stop
运行Redis Cluster的困难方法包括为集群设置自己的配置文件。Redis Cluster的所有实例必须至少包含三个主节点。
以下是单个节点的示例配置文件:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
顾名思义,启用集群的选项启用集群模式。cluster-config-file
选项包含给定节点的配置文件路径。
要创建具有三个主节点和三个从节点的测试Redis群集实例,请在终端中执行以下命令:
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
在这六个目录中的每个目录中,使用上面给出的示例配置文件创建redis.conf配置文件。然后,将你的redis-server可执行文件复制到cluster-test目录中,并使用它在终端的六个不同选项卡中启动六个不同的节点。
在Java上连接到Redis集群
与基本的Redis安装一样,Redis Cluster无法立即使用Java编程语言。好消息是,有一些框架使你可以轻松地将Redis Cluster和Java一起使用。
Redisson是Redis的Java客户端,它包括Java中的许多常见构造,包括各种对象,集合,锁和服务。由于Redisson以分布式方式重新实现这些构造,因此它们可以在多个应用程序和服务器之间共享,从而使它们可以与Redis Cluster等工具一起使用。
以下代码演示了Redis集群与Redis集群的用法:
package redis.demo;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
/**
* Redis Sentinel Java example
*
*/
public class Application
{
public static void main( String[] args )
{
Config config = new Config();
config.useClusterServers()
.addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380");
RedissonClient redisson = Redisson.create(config);
// operations with Redis based Lock
// implements java.util.concurrent.locks.Lock
RLock lock = redisson.getLock("simpleLock");
lock.lock();
try {
// do some actions
} finally {
lock.unlock();
}
// operations with Redis based Map
// implements java.util.concurrent.ConcurrentMap
RMapmap = redisson.getMap("simpleMap");
map.put("mapKey", "This is a map value");
String mapValue = map.get("mapKey");
System.out.println("stored map value: " + mapValue);
redisson.shutdown();
}
}
Redisson是一个开放源代码客户端,它使Java程序员能够以最小的压力和复杂性来使用Redis,从而极大地简化了开发过程并使之更加熟悉。
谢谢阅读!
更深入的探讨欢迎留言或私信,还可以和你分享更多Java学习资料!
抽丝剥茧 细说架构那些事——【优锐课】