[Redis] 在一台服务器上模拟集群搭建

本贴最后更新于 2302 天前,其中的信息可能已经时异事殊

一台机模拟 Cluster

Redis 集群中至少应该有三个节点(由投票机制决定的,节点的 fail 是通过集群中超过半数的节点检测失效时才生效)。要保证集群的高可用,需要每个节点有一个备份机。

Redis 集群至少需要 6 台服务器。

目的:

1.使用一台虚拟机运行6个redis实例。 2.需要修改redis的端口号7001-7006

1.环境准备

系统方面,我使用的是 Centos6.9

1.1 安装 redis 3.0.0

准备好 redis-3.0.0.tar.gz,

tar -xvf redis-3.0.0.tar.gz
cd redis-3.0.0
make
sudo make install PREFIX=/usr/local/redis

执行完后,/usr/local/redis/下应该就有 redis 相关命令了,

-rwxr-xr-x 1 root root 22193 Jul 1 11:16 redis-check-aof -rwxr-xr-x 1 root root 4588878 Jul 1 11:16 redis-benchmark -rwxr-xr-x 1 root root 45403 Jul 1 11:16 redis-check-dump -rwxr-xr-x 1 root root 4691793 Jul 1 11:16 redis-cli -rwxr-xr-x 1 root root 6450193 Jul 1 11:16 redis-sentinel -rwxr-xr-x 1 root root 6450193 Jul 1 11:16 redis-server -rw-r--r-- 1 root root 41402 Jul 1 12:27 redis.conf -rw-r--r-- 1 root root 769 Jul 1 14:08 nodes.conf

有了这些文件之后,我们就可以简单的来测试一下了。

1.2 运行 redis

需要先修改 redis.conf,将 daemonize 设为 yes,设置为后台运行

sudo vi /usr/local/redis/redis.conf

找到 daemonize,修改为 yes,保存退出,然后就可以运行 redis

cd /usr/local/redis/
sudo ./redis-server redis.conf

检查一下

ps -ef | grep -i redis

有以下内容则表示正常启动了

root 5190 0.1 0.3 33936 1712 ? Ssl 18:23 0:00 ./redis-server *:6379

这里没启成功的话,检查一下权限,权限不够启不起来的

1.3 测试 redis

执行 redis 目录下的 redis-cli 就可以了

cd /usr/local/redis/
sudo ./redis-cli [-h IP] -p 6379
-h:连接的服务器的地址 -p:服务的端口号

用本地 127.0.0.1 的话就不需要加-h IP 了。

127.0.0.1:6379> set str1 hello OK 127.0.0.1:6379> get str1 "hello" 127.0.0.1:6379> quit

这样就可以了,能存能取。

然后我们停掉这个 redis

sudo ./redis-cli -p 6379 shutdown

1.4 设置多节点

在一台机上部署集群的话,我们需要在一台机上弄 6 个 redis-server,
执行

cd /usr/local/
mkdir redis-cluster
sudo cp -r redis redis-cluster/redis01
这里需要检查一下redis01里有没有 dump.rdb,有的话就删了。
sudo cp -r redis01/ redis02
sudo cp -r redis01/ redis03
sudo cp -r redis01/ redis04
sudo cp -r redis01/ redis05
sudo cp -r redis01/ redis06

在这里还需要再复制一个文件 ,就从 redis 的源码包里取

sudo cp redis-3.0.0/src/redis-trib.rb /usr/local/redis-cluster/

复制完之后,每个 redis 的配置文件都要修改以下内容:

1.enable cluster cluster-enabled yes 2.修改端口 port 7001(按照123456这样分)

每个都弄好之后,我们就要启动他们了,怎么启动呢。可以写个脚本

sudo vi /usr/local/redis-cluster/start-all.sh

cd redis01 ./redis-server redis.conf cd .. cd redis02 ./redis-server redis.conf cd .. cd redis03 ./redis-server redis.conf cd .. cd redis04 ./redis-server redis.conf cd .. cd redis05 ./redis-server redis.conf cd .. cd redis06 ./redis-server redis.conf cd ..

保存退出后,赋予权限,

sudo chmod +x start-all.sh

执行

sudo ./start-all.sh

检查一下

ps -ef | grep -i redis

root 33946 1 0 14:07 ? 00:00:06 ./redis-server *:7001 [cluster] root 33950 1 0 14:07 ? 00:00:05 ./redis-server *:7002 [cluster] root 33954 1 0 14:07 ? 00:00:06 ./redis-server *:7003 [cluster] root 33956 1 0 14:07 ? 00:00:05 ./redis-server *:7004 [cluster] root 33962 1 0 14:07 ? 00:00:05 ./redis-server *:7005 [cluster] root 33964 1 0 14:07 ? 00:00:06 ./redis-server *:7006 [cluster] llq 34348 32038 0 15:47 pts/4 00:00:00 grep -i redis

有上面这些进程就代表成功了。下面可以做集群搭建了

2.集群搭建

2.1 安装软件

官方提供的脚本,是要用 ruby 执行的,所以需要安装 ruby

sudo yum install ruby
sudo yum install rubygems
sudo gem install redis-3.0.0.gem

这个 redis-3.0.0.gem 文件,从网上可以下载,也可以选择直接指定版本安装

gem install redis --version 3.0.0
注意:gem install redis --version 3.0.0 失败的话,需要修改一下 gem 的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/

gem 安装完 redis 后,可以开始运行 ruby 脚本了。

2.2 运行集群

同样的,我们写个脚本,把命令保存起来,下次就不用再敲了。

cd /usr/local/redis-cluster
vi setup-cluster.sh

./redis-trib.rb create --replicas 1 192.168.200.128:7001 192.168.200.128:7002 192.168.200.128:7003 192.168.200.128:7004 192.168.200.128:7005 192.168.200.128:7006

同时顺便写个关闭集群的脚本

vi shutdown-all.sh

redis01/redis-cli -p 7001 shutdown redis01/redis-cli -p 7002 shutdown redis01/redis-cli -p 7003 shutdown redis01/redis-cli -p 7004 shutdown redis01/redis-cli -p 7005 shutdown redis01/redis-cli -p 7006 shutdown

好了,两个脚本都要赋予执行权限

sudo chmod +x shutdown-all.sh setup-cluster.sh
sudo ./setup-cluster.sh

具体跑的内容找不到了,随便贴一段,中间需要我们输入 yes 确认集群配置,yes 之后就完成了。

>>> Creating cluster Connecting to node 192.168.200.128:7001: OK Connecting to node 192.168.200.128:7002: OK Connecting to node 192.168.200.128:7003: OK Connecting to node 192.168.200.128:7004: OK Connecting to node 192.168.200.128:7005: OK Connecting to node 192.168.200.128:7006: OK >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.200.128:7001 192.168.200.128:7002 192.168.200.128:7003 Adding replica 192.168.200.128:7004 to 192.168.200.128:7001 Adding replica 192.168.200.128:7005 to 192.168.200.128:7002 Adding replica 192.168.200.128:7006 to 192.168.200.128:7003 M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.200.128:7001 slots:0-5460 (5461 slots) master M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.200.128:7002 slots:5461-10922 (5462 slots) master M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.200.128:7003 slots:10923-16383 (5461 slots) master S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.200.128:7004 replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.200.128:7005 replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01 S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.200.128:7006 replicates 2935007902d83f20b1253d7f43dae32aab9744e6 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join..... >>> Performing Cluster Check (using node 192.168.200.128:7001) M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.200.128:7001 slots:0-5460 (5461 slots) master M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.200.128:7002 slots:5461-10922 (5462 slots) master M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.200.128:7003 slots:10923-16383 (5461 slots) master M: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.200.128:7004 slots: (0 slots) master replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 M: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.200.128:7005 slots: (0 slots) master replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01 M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.200.128:7006 slots: (0 slots) master replicates 2935007902d83f20b1253d7f43dae32aab9744e6 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@localhost redis-cluster]#

下面我们可以写下代码测试一下集群

3 Jedis 测试集群

3.1 添加依赖

这里不写 maven 工程创建的了,自己搞定哈。
创建完 maven 工程后,在 pom.xml 中添加依赖

<!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!-- 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>

创建一个 TestJedis.java,运行一下看看。

public class TestJedis { @Test public void testJedisCluster() throws Exception { //创建一个HostAndPort的Set集合 Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.200.128",7001)); nodes.add(new HostAndPort("192.168.200.128",7002)); nodes.add(new HostAndPort("192.168.200.128",7003)); nodes.add(new HostAndPort("192.168.200.128",7004)); nodes.add(new HostAndPort("192.168.200.128",7005)); nodes.add(new HostAndPort("192.168.200.128",7006)); //创建一个JedisCluster对象,参数是HostAndPort的Set集合 JedisCluster jedisCluster = new JedisCluster(nodes); //使用JedisCluster对象查询 jedisCluster.set("jedis-cluster", "hello world"); System.out.println(jedisCluster.get("jedis-cluster")); //关闭jediscluster jedisCluster.close(); } }

到这里,简单的 redis 伪集群搭建就结束了。

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 13 关注
  • Jedis
    7 引用 • 11 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...