Redis主从复制及集群

redis主从复制

步骤

  1. 复制一份redis.conf文件并修改名称,如:cp redis.conf redis6380.conf
  2. 修改redis6380.conf文件中的
  • 端口号
  • 进程id号(pidfile /var/run/redis6380.pid)
  • slaveof:主从复制信息
  • 存放aof、rdb文件的目录。

启动从服务器:bin/redis-cli –p 6380

redis集群(redisCluster)


redis-cluster投票:容错(过半机制 )

 

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点,下面是三个server分16384个哈希槽

 

集群的搭建

集群中至少应有三个节点(投票系统决定)。保证高可用每个节点需要有个备份节点。至少需要6个节点。

可以在一台虚拟机上搭建6个redis实例。可以模拟集群。

在local目录下建立redis-cluster 里面装6个redis

Mkdir redis-cluster

第一步:创建6个redis实例。修改redis的端口号7001-7006

cp -r redisuen  redis-cluster/redis01

第二步:修改redis的端口号。和开启集群配置。如果节点中包含dump.rdb需要删除。保证每个节点是干净的节点。

开启集群:

第三步:启动每个redis实例

一个一个启动太麻烦 写一个批注解

Vim startall.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 ..

 

授权 chmod u+x startall.sh

启动 ./startall.sh

查看端口

ps aux | grep redis

第四步:搭建集群。需要使用一个工具Ruby脚本。

  • 安装ruby环境

#yum install ruby

#yum install rubygems

  • 安装ruby脚本运行时需要的库。 Redis-3.0.00.gem(需要自己准备)

# gem install redis-3.0.0.gem

Successfully installed redis-3.0.0

1 gem installed

  • 把redis源码包的src下的ruby脚本文件复制到集群目录下。

[root@localhost redis-3.0.0]# cd src

# ll *.rb

# cp redis-trib.rb /usr/local/redis-cluster/

4、使用redis-trib.rb搭建集群

执行

[root@linux-redis redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.183.130:7001 192.168.183.130:7002 192.168.183.130:7003 192.168.183.130:7004 192.168.183.130:7005 192.168.183.130:7006
>>> Creating cluster
Connecting to node 192.168.183.130:7001: OK
Connecting to node 192.168.183.130:7002: OK
Connecting to node 192.168.183.130:7003: OK
Connecting to node 192.168.183.130:7004: OK
Connecting to node 192.168.183.130:7005: OK
Connecting to node 192.168.183.130:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.183.130:7001
192.168.183.130:7002
192.168.183.130:7003
Adding replica 192.168.183.130:7004 to 192.168.183.130:7001
Adding replica 192.168.183.130:7005 to 192.168.183.130:7002
Adding replica 192.168.183.130:7006 to 192.168.183.130:7003
M: 5aec995c128afd47d6376e855d8abc1ebd80e27c 192.168.183.130:7001
   slots:0-5460 (5461 slots) master
M: 515bdb2a855486498b41a823ccb42ffe2ba1a114 192.168.183.130:7002
   slots:5461-10922 (5462 slots) master
M: 20f4886a46127ffd2800f29a7c515067d41d883a 192.168.183.130:7003
   slots:10923-16383 (5461 slots) master
S: 28fe17feea97b10032296dd401610778950311e6 192.168.183.130:7004
   replicates 5aec995c128afd47d6376e855d8abc1ebd80e27c
S: ddc71632db6d24cefe880efd8b7756c68af491c3 192.168.183.130:7005
   replicates 515bdb2a855486498b41a823ccb42ffe2ba1a114
S: 7def39cba79309c611865c673f80bc071591e5b5 192.168.183.130:7006
   replicates 20f4886a46127ffd2800f29a7c515067d41d883a
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.183.130:7001)
M: 5aec995c128afd47d6376e855d8abc1ebd80e27c 192.168.183.130:7001
   slots:0-5460 (5461 slots) master
M: 515bdb2a855486498b41a823ccb42ffe2ba1a114 192.168.183.130:7002
   slots:5461-10922 (5462 slots) master
M: 20f4886a46127ffd2800f29a7c515067d41d883a 192.168.183.130:7003
   slots:10923-16383 (5461 slots) master
M: 28fe17feea97b10032296dd401610778950311e6 192.168.183.130:7004
   slots: (0 slots) master
   replicates 5aec995c128afd47d6376e855d8abc1ebd80e27c
M: ddc71632db6d24cefe880efd8b7756c68af491c3 192.168.183.130:7005
   slots: (0 slots) master
   replicates 515bdb2a855486498b41a823ccb42ffe2ba1a114
M: 7def39cba79309c611865c673f80bc071591e5b5 192.168.183.130:7006
   slots: (0 slots) master
   replicates 20f4886a46127ffd2800f29a7c515067d41d883a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

如果出错,请删除节点下面的dump.rdb和nodes.conf文件,如果还是不行,整个数据库执行flushdb

完成

如果搭建真正使用服务器的集群,只需要在一台服务器上执行命令即可。需要注意每台服务器的防火墙需要关闭。

搭在多台上,性能比较高

集群的客户端

Redis-cli:

随便找一个redis,客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

[root@localhost redis-cluster]# redis05/redis-cli -h 192.168.183.130 -p 7005 -c

-h:服务器的ip地址

-p:服务的端口号

-c:连接集群。算法存储,需要跳转到对应的端口去

redisDeskTopManager(Redis可视化工具):不支持集群之间的跳转。可以连接集群中某一节点。

如果是redis集群,数据库只有一个。

Jedis连接集群

需要使用JedisCluster对象。自带连接池。项目中单例使用即可。


//创建一个JedisCluster对象。构造方法是一个set,set中是一个HostAndPort对象的集合。
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.183.130", 7001));
nodes.add(new HostAndPort("192.168.183.130", 7002));
nodes.add(new HostAndPort("192.168.183.130", 7003));
nodes.add(new HostAndPort("192.168.183.130", 7004));
nodes.add(new HostAndPort("192.168.183.130", 7005));
nodes.add(new HostAndPort("192.168.183.130", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);

//直接使用JedisCluster对象操作redis
jedisCluster.set("name", "hello redis cluster");
String string = jedisCluster.get("name");
System.out.println(string);
		
//系统结束之前关闭JedisCluster
jedisCluster.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章