redis4搭建高可用集群

                                    redis4搭建高可用集群详解

一 、前提准备 

yum install gcc

yum install gcc-c++

yum install tcl

yum install  zlib-devel

yum install  openssl-devel

安装  redis-4.0.11,在make 的时候可能报错 , 只需执行make MALLOC=libc 即可。

安装  最新版本 ruby 

二、复制6个redis 实例 并修改 redis-conf文件。

[root@localhost opt]# cd dzx-redis-cluster/
[root@localhost dzx-redis-cluster]# ll
total 28
drwxrwxr-x. 6 root root 4096 Aug  9 19:58 redis-7000
drwxrwxr-x. 6 root root 4096 Aug  9 20:13 redis-7001
drwxrwxr-x. 6 root root 4096 Aug  9 20:14 redis-7002
drwxrwxr-x. 6 root root 4096 Aug  9 19:58 redis-7003
drwxrwxr-x. 6 root root 4096 Aug  9 20:13 redis-7004
drwxrwxr-x. 6 root root 4096 Aug  9 20:14 redis-7005
-rwxr--r--. 1 root root  588 Aug  9 19:19 start.sh
bind 192.168.42.xx
port 7000     #每个redis-conf 分别修改为对应的端口号 如7000,7001,7002,7003,7004,7005
cluster-enabled yes 
#每个redis-conf 分别修改为对应的nodes-7000.conf、nodes-7001.conf、nodes-7002.conf、nodes-#7003.conf、nodes-7004.conf、nodes-7005.conf
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes

三、分别启动各个redis实例并创建集群

[root@localhost redis-7000]# ./src/redis-server ./redis.conf
[root@localhost redis-7001]# ./src/redis-server ./redis.conf
[root@localhost redis-7002]# ./src/redis-server ./redis.conf
[root@localhost redis-7003]# ./src/redis-server ./redis.conf
[root@localhost redis-7004]# ./src/redis-server ./redis.conf
[root@localhost redis-7005]# ./src/redis-server ./redis.conf

(1)创建集群的时候需要用到ruby命令,因此需要安装ruby。

在ruby官网http://www.ruby-lang.org/en/downloads/下载最新版本  ruby-2.5.1.tar.gz,因为redis4创建集群时ruby 版本必须大于2.2以上

$ tar -xvzf ruby-2.5.1.tgz.gz    
$ cd ruby-2.5.1
$ ./configure
$ make
$ sudo make install
$ruby -v
ruby 2.5.1……

安装完成之后  执行  gem  install redis ,可能会报如下错误,此时不要慌,按照以下方式便可以解决问题。

错误1:

ERROR: Loading command: install (LoadError)

cannot load such file -- zlib

ERROR: While executing gem ... (NoMethodError)

undefined method `invoke_with_build_args' for nil:NilClass
这是缺少zlib依赖,需要安装zlib库

错误2:
ERROR: While executing gem ... (Gem::Exception)

Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

提示缺少openssl库,这两个库可以通过yum安装,但是安装了需要集成到ruby中。

先解决错误一,解决办法分为两步:

(2)安装zlib库

yum install zlib-devel

  集成zlib库到ruby环境

cd /opt/ruby-2.5.1
cd ext/zlib
ruby extconf.rb
//在操作下一步之前需要修改Makefile文件中的zlib.o: $(top_srcdir)/include/ruby.h,将$(top_srcdir)修改为../..如下
//zlib.o: ../../include/ruby.h
//这一步如果不修改,make时会爆出另外一个错误
//make:*** No rule to make target `/include/ruby.h', needed by `zlib.o'.  Stop
make && make install

(3)另一个缺少openssl库的错误,可以用同样的问题解决。

安装openssl库

yum install openssl-devel

不要只用yum install openssl来安装,否则会缺少pcre等相关库,执行ruby extconf.rb会提示找不到ssl.h文件。

checking for t_open() in -lnsl... no

checking for socket() in -lsocket... no

checking for openssl/ssl.h... no

集成openssl库到ruby

cd /data/ruby-2.4.2
cd ext/openssl
ruby extconf.rb
//同样修改Makefile中的$(top_srcdir)为../..

[root@node01 openssl]# make && make install

成功之后,再次运行gem install redis,出现以下界面:

Fetching: redis-4.0.1.gem (100%)

Successfully installed redis-4.0.1

Parsing documentation for redis-4.0.1

Installing ri documentation for redis-4.0.1

Done installing documentation for redisafter 1 seconds

1 gem installed

gem install redis安装成功。

四、创建集群及测试集群

(1)执行ruby脚本创建集群

./redis-trib.rb create --replicas 1 192.168.42.xx:7000 192.168.42.xx:7001 \ 192.168.42.xx:7002 192.168.42.xx:7003 192.168.42.xx:7004 192.168.42.xx:7005

Can I set the above configuration? (type 'yes' to accept):输入yes

看到这句话[OK] All 16384 slots covered.意味着集群中的16384个槽至少有一个主节点在处理,说明集群创建成功。

(2)测试集群

[root@elk01 redis-cluster]# redis-cli -c -h 192.168.42.xx -p 7000  #登录集群,-c参数是必需
127.0.0.1:7000> CLUSTER info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:115
cluster_stats_messages_pong_sent:125
cluster_stats_messages_sent:240
cluster_stats_messages_ping_received:120
cluster_stats_messages_pong_received:115
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:240
127.0.0.1:7000> CLUSTER nodes
82b493cdc4d76f3ff4dbe91240290e2c3939f1ef 127.0.0.1:7002@17002 master - 0 1509010649120 2 connected 5461-10922
71a66eff2283d417373e90ed372d2de8703bf226 127.0.0.1:7004@17004 slave 23df12c2bafde34f5bdd53d3463ad20b8ab507d2 0 1509010648118 4 connected
44976e464ce8146f7a6932faad2f4ad3c9bdd06d 127.0.0.1:7006@17006 slave 7b9d9f8378cb0b27134cae105ccd59146d386739 0 1509010650123 6 connected
2c80b6ac34a9d6c38ff425e4cb830ba579740831 127.0.0.1:7005@17005 slave 82b493cdc4d76f3ff4dbe91240290e2c3939f1ef 0 1509010651126 5 connected
7b9d9f8378cb0b27134cae105ccd59146d386739 127.0.0.1:7003@17003 master - 0 1509010649000 3 connected 10923-16383
23df12c2bafde34f5bdd53d3463ad20b8ab507d2 192.168.9.216:7001@17001 myself,master - 0 1509010649000 1 connected 0-5460
127.0.0.1:7000> set testKey success
OK
127.0.0.1:7000> get testKey 
"success"
[root@elk01 redis-cluster]# redis-cli -c -h 192.168.42.xx -p 7003
127.0.0.1:7003> get testKey
"success"

(3)下次在重新创建集群可能会报以下错误

[ERR] Node 192.168.42.xx:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0. 


 

将每个节点下aof、rdb、nodes.conf本地备份文件删除; 
172.168.42.xx:7001> flushdb 或者 flushall #清空当前数据库(可省略) 
重新启动每个redis 节点之后再执行脚本,成功执行;

五、开放端口

此时,利用 jedis 或者 redis desktop manager  还是连接不上 redis 集群服务的,需要开放各个redis节点的端口号。


firewall-cmd --query-port=7000/tcp #如果返回结果为no,那么证明7000端口确实没有开启。
firewall-cmd --add-port=7000/tcp  #将7000端口开启,返回success。
#然后再执行上一条命令,返回yes,证明端口已经成功开启。


firewall-cmd --add-port=7001/tcp  #将7001端口开启,返回success。
firewall-cmd --add-port=7002/tcp  #将7002端口开启,返回success。
firewall-cmd --add-port=7003/tcp  #将7003端口开启,返回success。
firewall-cmd --add-port=7004/tcp  #将7004端口开启,返回success。
firewall-cmd --add-port=7005/tcp  #将7005端口开启,返回success。

六、spring boot 集成 redis集群

 redis:
      database: 0
      host: 192.168.42.93
      port: 7000
      password:
      cluster:
        nodes: 192.168.42.xx:7000,192.168.42.xx:7001,192.168.42.xx:7002,
192.168.42.xx:7003,192.168.42.xx:7004,192.168.42.xx:7005
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    public void testRedis() {
        redisTemplate.opsForValue().set("5","okokokok");
       System.out.println( redisTemplate.opsForValue().get("5"));
    }

猜你喜欢

转载自blog.csdn.net/qq_31905135/article/details/81563464