Dubbo redis集群高可用测试 Java访问,集群重建

Redis 集群的使用测试(Jedis 客户端的使用)
1、 Jedis 客户端建议升级到最新版(当前为 2.7.3) ,这样对 3.0.x 集群有比较好的支持。
https://github.com/xetorthio/jedis
http://mvnrepository.com/artifact/redis.clients/jedis

2代码
edu-common-parent
edu-demo-redis-cluster

edu-demo-redis->src/test/java->wusc.edu.demo.redis->RedisTest.java

package wusc.edu.demo.redis;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
/**
 *
 * @描述: Redis集群测试 .
 */
public class RedisClusterTest {
   private static final Log log = LogFactory.getLog(RedisClusterTest.class);
   public static void main(String[] args) {
      // 数据库链接池配置
      JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(50);
        config.setMinIdle(20);
        config.setMaxWaitMillis(6 * 1000);
        config.setTestOnBorrow(true);

      // Redis集群的节点集合
      Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
      jedisClusterNodes.add(new HostAndPort("192.168.229.204", 7111));
      jedisClusterNodes.add(new HostAndPort("192.168.229.205", 7112));
      jedisClusterNodes.add(new HostAndPort("192.168.229.206", 7113));
      jedisClusterNodes.add(new HostAndPort("192.168.229.207", 7114));
      jedisClusterNodes.add(new HostAndPort("192.168.229.208", 7115));
      jedisClusterNodes.add(new HostAndPort("192.168.229.209", 7116));

      // 根据节点集创集群链接对象
      //JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);
      // 集群各节点集合,超时时间,最多重定向次数,链接池
      JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 2000, 100, config);
      int num = 1000;
      String key = "wusc";
      String value = "";
      for (int i=1; i <= num; i++){
         // 存数据
         jedisCluster.set(key+i, "WuShuicheng"+i);
         // 取数据
         value = jedisCluster.get(key+i);
         log.info(key+i + "=" + value);
         // 删除数据
         //jedisCluster.del(key+i);
         //value = jedisCluster.get(key+i);
         //log.info(key+i + "=" + value);
      }
   }
}

Run as->Java Application

登录集群验证

[root@master1 ~]# /usr/local/redis3/bin/redis-cli -c -p 7111
127.0.0.1:7111> get wusc1
-> Redirected to slot [15665] located at 192.168.229.209:7116
"WuShuicheng1"
192.168.229.209:7116> get wusc999                             <-进行了重定向
-> Redirected to slot [10657] located at 192.168.229.208:7115
"WuShuicheng999"
192.168.229.208:7115>                                          <-进行了重定向


实际项目中与spring进行结合
edu-demo-redis->src/main/resources/spring/spring-redis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!-- Jedis链接池配置,注意:Jedis版本建议升级到最新(当前最新版为2.7.3) -->
   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
      <property name="maxTotal" value="100" />
      <property name="maxIdle" value="20" />
      <property name="minIdle" value="10" />
      <property name="blockWhenExhausted" value="true"></property>
      <property name="maxWaitMillis" value="3000" />
      <property name="testOnBorrow" value="false" />
      <property name="testOnReturn" value="false" />
      <property name="testWhileIdle" value="true" />
      <property name="minEvictableIdleTimeMillis" value="60000" />
      <property name="timeBetweenEvictionRunsMillis" value="30000" />
      <property name="numTestsPerEvictionRun" value="-1" />
   </bean>

   <!-- JedisCluster -->
   <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
      <constructor-arg index="0">
         <set>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.204" />
               <constructor-arg index="1" value="7111" type="int" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.205" />
               <constructor-arg index="1" value="7112" type="int" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.206" />
               <constructor-arg index="1" value="7113" type="int" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.207" />
               <constructor-arg index="1" value="7114" type="int" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.208" />
               <constructor-arg index="1" value="7115" type="int" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
               <constructor-arg index="0" value="192.168.229.209" />
               <constructor-arg index="1" value="7116" type="int" />
            </bean>
         </set>
      </constructor-arg>
      <constructor-arg index="1" value="2000" type="int"></constructor-arg>
      <constructor-arg index="2" value="100" type="int"></constructor-arg>
      <constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>
   </bean>

</beans>

测试spring取值
edu-demo-redis->src/test/java->wusc.edu.demo.redis->RedisClusterSpringTest.java
Run as -> Java Application



# cp redis-trib.rb /usr/local/bin/redis-trib
# redis-trib create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116
192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113

2、查看当前集群各节点的状态
[root@edu-redis-01 7111]# /usr/local/redis3/bin/redis-cli -c -p 7111
127.0.0.1:7111> cluster nodes

3、使用 demo 应用向集群写入 1000 个键值数据
使用 /usr/local/redis3/bin/redis-cli -c -p 711X 命令登录各节点,使用 keys * 查看各节点的所有
key


--------------------------------------------------------------------
Redis 集群的高可用性测试
--------------------------------------------------------------------
一、Redis 集群特点
1、集群架构特点:
(1)所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽;
(2)节点的 fail 是通过集群中超过半数的节点检测失效时才生效;
(3)客户端与 redis 节点直连,不需要中间 proxy 层。客户端不需要连接集群所有节点,连接集群中任何一
个可用节点即可;
(4)redis-cluster 把所有的物理节点映射到[0-16383]个 slot(哈希槽)上,cluster 负责维护
   node<->slot<->value 。

2、集群选举容错:
(1)节点失效选举过程是集群中所有 master 参与,如果半数以上 master 节点与当前被检测 master 节点通
信检测超时(cluster-node-timeout),就认为当前 master 节点挂掉;
(2):什么时候整个集群不可用(cluster_state:fail)?
    A:如果集群任意 master 挂掉,且当前 master 没有 slave。集群进入 fail 状态,也可以理解成集群的
slot 映射[0-16383]不完整时进入 fail 状态。 ps : redis-3.0.0.rc1 加入 cluster-require-full
coverage 参数,默认关闭,打开集群兼容部分失败;
    B:如果集群超过半数以上 master 挂掉,无论是否有 slave 集群进入 fail 状态。ps:当集群不可用时,
所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

4、运行 demo 应用,获取所有的键值数据
如果有空值则停止

5、模拟集群节点宕机(实现故障转移,可重点看视频解说)
(1)Jedis 客户端循环操作集群数据(模拟用户持续使用系统)
(2)查看 Redis 集群当前状态(用于接下来做节点状态变化对比)
 节点状态 fail? 表示正在判断是否失败
 节点状态 fail 表示节点失败,对应的 slave 节点提升为 master

(5)再查看集群状态变化# /usr/local/src/redis-3.0.3/src/redis-trib.rb check 192.168.229.209:7116
由上可见,7114 节点替换 7111,由 slave 变成了 master
此时再执行 demo 应用获取所有的键值数据,依然正常,说明 slave 替换 master 成功,集群正常。

6、恢复 fail 节点
(1)启动 7111
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf
(2)查看集群状态
127.0.0.1:7116>cluster nodes

由上可见,7114 节点替换 7111,由 slave 变成了 master
此时再执行 demo 应用获取所有的键值数据,依然正常,说明 slave 替换 master 成功,集群正常。

6、恢复 fail 节点
(1)启动 7111
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf
(2)查看集群状态

7、总结:
优点:
 在 master 节点下线后,slave 节点会自动提升为 master 节点,保存集群持续提供服务;
 fail 节点恢复后,会自动添加到集群中,变成 slave 节点;
缺点:
 由于 redis 的复制使用异步机制,在自动故障转移的过程中,集群可能会丢失写命令。然而 redis 几
乎是同时执行(将命令恢复发送给客户端,以及将命令复制到 slave 节点)这两个操作,所以实际中,命令
丢失的窗口非常小。




三、集群高可用测试(重建集群步骤)
1、重建集群,步骤:
(1)关闭集群的各节点;查询集群各个节点
1.1查询集群信息
[root@slave3 ~]# /usr/local/redis3/bin/redis-cli -c -p 7116
127.0.0.1:7116> cluster nodes
5804331faa018ee945faf40b9e80b13d14157488 192.168.229.204:7111 slave c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 0 1584433795941 4 connected
dca8a5ab378f99fb2245b9063853f5c91bf2ed43 192.168.229.208:7115 master - 0 1584433796949 2 connected 5461-10922
c6dc785b0c0a3ebcc5a5561601a587eff85c4185 192.168.229.206:7113 slave b1565d8e0541389a815bfdedd320060a73ea34b3 0 1584433794936 6 connected
c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 192.168.229.207:7114 master - 0 1584433793931 1 connected 0-5460
69778143d0208880e52ac0015fa67c3986efd867 192.168.229.205:7112 slave dca8a5ab378f99fb2245b9063853f5c91bf2ed43 0 1584433797955 5 connected
b1565d8e0541389a815bfdedd320060a73ea34b3 192.168.229.209:7116 myself,master - 0 0 3 connected 10923-16383
127.0.0.1:7116>

1.2销毁所有线程
master1 / master2/ master3 / slave1 / slave2 / slave3
[root@master1 ~]# ps -ef | grep redis
[root@master1 ~]# kill -9 7986

2删除各节点数据目录下的文件
2.1删除各节点数据目录下的 nodes.conf、appendonly.aof、dump.rdb;
[root@master1 ~]# cd /usr/local/redis3/cluster/7111/
appendonly.aof  dump.rdb  nodes.conf  redis-7111.conf
[root@master1 7111]# rm -rf appendonly.aof dump.rdb nodes.conf

2.2重新启用所有的节点
启动redis集群

192.168.229.204 master1
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf

192.168.229.205 master2
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf

192.168.229.206 master3
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf

192.168.229.207 slave1
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf

192.168.229.208 slave2
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf

192.168.229.209 slave3
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf

3执行集群创建命令(只需要在其中一个节点上执行一次则可)

[root@master1 ~]# /usr/local/src/redis-3.0.3/src/redis-trib.rb create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113
报错如下
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
        from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/src/redis-3.0.3/src/redis-trib.rb:25:in `<main>'
安装facter可以不执行,好像没有关系。
[root@master1 ~]# ansible all -m shell -a 'rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm'
[root@master1 ~]# ansible all -m shell -a 'yum install -y facter'
这一步骤切换Ruby版本
scl enable rh-ruby23 bash
[root@master1 ~]# /usr/local/src/redis-3.0.3/src/redis-trib.rb create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113

验证
[root@master1 ~]# redis-cli -c -p 7111
127.0.0.1:7111> cluster nodes
e52f68a39ccf1503359070cbc31098748e1e6a5d 192.168.229.208:7115 master - 0 1584435921994 2 connected 5461-10922
7d6ef610c1bf5a4012c52f4ce58c28a84887be49 192.168.229.204:7111 myself,slave f5ddf6833e97a52abbd45ced5f045a86458676ef 0 0 4 connected
bc0db940ae10d4bfb6754155bbe53fb460cd9ee4 192.168.229.206:7113 slave b21d1b22744ec8d16f2ef9d816dde0b59e45eed9 0 1584435920988 6 connected
b21d1b22744ec8d16f2ef9d816dde0b59e45eed9 192.168.229.209:7116 master - 0 1584435924010 3 connected 10923-16383
0989cc50bb191efc0b826e23c22aeb3e7f00f0ca 192.168.229.205:7112 slave e52f68a39ccf1503359070cbc31098748e1e6a5d 0 1584435923002 5 connected
f5ddf6833e97a52abbd45ced5f045a86458676ef 192.168.229.207:7114 master - 0 1584435925016 1 connected 0-5460
127.0.0.1:7111>
获取所有的key
127.0.0.1:7111> keys *

可以运行src/test/java ->wusc.edu.demo.redis中的如下四个文件,前提需要修改Redis地址
RedisTest.java
RedisClusterTest.java
RedisClusterSpringTest.java
RedisClusterFailoverTest.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值