Java上的Redis集群以实现扩展和高可用性

了解有关在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 ClusterJava一起使用。

RedissonRedisJava客户端,它包括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
        RMap<String, String> map = 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学习资料!


抽丝剥茧 细说架构那些事——【优锐课】


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章