redis主从复制
步骤
- 复制一份redis.conf文件并修改名称,如:cp redis.conf redis6380.conf
- 修改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();