redis 集群搭建和java简单操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31156277/article/details/88090927

一、redis 集群搭建

redis3.0 以前,提供了Sentinel工具来监控各Master的状态,如果Master异常,则会做主从切换,将Slave作为master,将master做为slave。其配置也较复杂,且表现一般。

redis3.0以后已经支持集群容错功能,并且非常简单


1.1 素材准备

  • centos7 (集群搭建,至少三个master。需要虚拟机搭建出6个节点)
  • 使用192.168.91.101 ~ 192.168.91.106 这6个虚拟机进行搭建(如果可以,也可以在1和多个节点上完成,不用准备6个节点,如果6个节点,可以不用修改端口)
  • redis3.2.9 已经安装完成(可以对节点进行clone操作,来获取多个节点)。 安装过程可以参考文章

1.2 shell 工具

补充:在对6个节点进行操作的时候,可以使用shell下面的工具来同时操作6个节点的相同操作
在这里插入图片描述---

相同部分的操作在此输入命令


1.2 搭建步骤

  • ①分别在6个节点上创建一个相同的目录(注意:如果可以直接在redis安装目录直接操作即可,不用再重新复制redis.conf进行下面操作)
mkdir -p /usr/local/redis-cluster
  • ②根据节点顺序,分别在每个节点的 redis-cluster 目录下创建一个目录。
# 注意创建的的目录要和IP对应。
mkdir 7001  ~ mkdir 7006
  • ③ 将redis的配置文件 redis.conf 进行复制一份,放在在 700* (注:* 表示1-6)目录下。修改内容如下
# 设置daemonize 为yes
daemonize yes
# 设置端口号 port 700*
port 7001
# bind  192.168.91.101 绑定当前机器的IP
bind  192.168.91.101
# dir /usr/local/redis-cluster/700*/ 指定数据文件位置
dir /usr/local/redis-cluster/7001/
# 启动集群模式
cluster-enabled yes
# 配置# cluster-config-file nodes-7001.conf
cluster-config-file nodes-7001.conf
#appendonly yes
appendonly yes

注意: 注意700的配置( 表示 1-6)


  • ④安装集群相关插件(由于redis集群需要使用ruby命令,所以需要安装ruby)
yum -y install ruby
yum -y install rubygems
# 安装redis和ruby的接口
gem install redis 

redis requires ruby version 2.2.2的解决方案 >>

CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby

解决办法是 先安装rvm,再把ruby版本提升至2.3.3

#1.安装RVM
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

curl -sSL https://get.rvm.io | bash -s stable
# 或者使用 curl -L get.rvm.io | bash -s stable 
find / -name rvm -print

source /usr/local/rvm/scripts/rvm

#2. 查看rvm库中已知的ruby版本:
rvm list known

#3. 安装一个ruby版本
rvm install 2.4.1

#4. 使用一个ruby版本
rvm use 2.4.1

#5. 设置默认版本
rvm use 2.4.1 --default

#6. 卸载一个已知版本
rvm remove 2.0.0

#7.查看一个版本
ruby --version

#8. 再安装redis就可以了
gem install redis
  • ⑤启动redis,并查看状态
#/usr/local/redis-3.2.9/src/redis-server /usr/local/redis-cluster/700*/redis.conf
/usr/local/redis-3.2.9/src/redis-server /usr/local/redis-cluster/7001/redis.conf
ps -el | grep redis 查看是否启动成功
  • ⑥到redis目录下去执行 redis-trib.rb 命令(创建集群)
#命令 /usr/local/redis-3.2.9/src 在这个下面

# 在一个节点上执行即可
./redis-trib.rb create --replicas 1 192.168.91.101:7001 192.168.91.102:7002 192.168.91.103:7003 192.168.91.104:7004   192.168.91.105:7005  192.168.91.106:7006

如果出现错误: [ERR] Sorry, can’t connect to node 192.168.91.101:7001

修改vim /usr/local/redis-cluster/700*/redis.conf 中的bind 属性,将bind 127.0.0.01 绑定成具体的IP.
然后再kill reids 进程后,再启动/usr/local/redis-3.2.9/src/redis-server /usr/local/redis-cluster/700*/redis.conf

注意修改的是集群下面的conf。修改配置文件后需要kill 进程后重启。


在这里插入图片描述在这里插入图片描述
通过上面步骤就完成了集群的搭建

  • ⑦ 验证
/usr/local/redis-3.2.9/src/redis-cli -c -h 192.168.91.101 -p 7001
cluster nodes

在这里插入图片描述在这里插入图片描述
通过上述步骤,集群的搭建就表示成功了。


1.4 补充

  • 启动命令
/usr/local/redis-3.2.9/src/redis-server /usr/local/redis-cluster/700*/redis.conf
  • 登录客户端
    /usr/local/redis-3.2.9/src/redis-cli -c -h 192.168.91.101 -p 7001
    cluster nodes

  • /usr/local/redis-cluster/700* 下面存在相关信息。启动nodes-7002.conf 携带了集群信息。如果要修改器群,将该文件删除后从新创建集群即可(./redis-trib.rb create --replicas 1 192.168.91.101:7001 192.168.91.102:7002 192.168.91.103:7003 192.168.91.104:7004 192.168.91.105:7005 192.168.91.106:7006)

在这里插入图片描述


二、通过java操作redis集群

2.1 简单代码

package com.uzong.cluster;
 
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
 
public class MyRedisCluster {
	public static void main(String[] args) {
		
		Set<HostAndPort> clusterNodes = new HashSet<HostAndPort>();
		clusterNodes.add(new HostAndPort("192.168.91.101", 7001));
		clusterNodes.add(new HostAndPort("192.168.91.102", 7002));
		clusterNodes.add(new HostAndPort("192.168.91.103", 7003));
		clusterNodes.add(new HostAndPort("192.168.91.104", 7004));
		clusterNodes.add(new HostAndPort("192.168.91.105", 7005));
		clusterNodes.add(new HostAndPort("192.168.91.106", 7006));
		
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxTotal(50);//最大连接个数
		jedisPoolConfig.setMaxIdle(10);//最大空闲连接个数
		jedisPoolConfig.setMaxWaitMillis(-1);//获取连接时的最大等待毫秒数,若超时则抛异常。-1代表不确定的毫秒数
		jedisPoolConfig.setTestOnBorrow(true);//获取连接时检测其有效性 
	    JedisCluster jedisCluster = new JedisCluster(clusterNodes,15000,100,
	    		jedisPoolConfig);//第二个参数:超时时间     第三个参数:最大尝试重连次数	    
	    Map<String,String> map=new HashMap<String,String>();
	    jedisCluster.set("name", "uzong");
	    System.out.println(jedisCluster.get("name"));
		jedisCluster.close();//关闭jedisCluster	
	}
}


2.2 加入Spring容器管理

applicationContext-cluster.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<context:property-placeholder location="classpath:redis.properties" />
	<context:component-scan base-package="com.x.redis.dao">
	</context:component-scan>
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="${redis.maxIdle}" />
		<property name="maxTotal" value="${redis.maxActive}" />
		<property name="maxWaitMillis" value="${redis.maxWait}" />
		<property name="testOnBorrow" value="${redis.testOnBorrow}" />
	</bean>

	<bean id="hostport1" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.101" />
		<constructor-arg name="port" value="7001" />
	</bean>
	<bean id="hostport2" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.102" />
		<constructor-arg name="port" value="7002" />
	</bean>
	<bean id="hostport3" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.103" />
		<constructor-arg name="port" value="7003" />
	</bean>
	<bean id="hostport4" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.104" />
		<constructor-arg name="port" value="7004" />
	</bean>
	<bean id="hostport5" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.105" />
		<constructor-arg name="port" value="7005" />
	</bean>
	<bean id="hostport6" class="redis.clients.jedis.HostAndPort">
		<constructor-arg name="host" value="192.168.91.106" />
		<constructor-arg name="port" value="7006" />
	</bean>

	<bean id="redisCluster" class="redis.clients.jedis.JedisCluster">
		<constructor-arg name="nodes">
			<set>
				<ref bean="hostport1" />
				<ref bean="hostport2" />
				<ref bean="hostport3" />
				<ref bean="hostport4" />
				<ref bean="hostport5" />
				<ref bean="hostport6" />
			</set>
		</constructor-arg>
		<constructor-arg name="timeout" value="6000" />
		<constructor-arg name="poolConfig">
			<ref bean="jedisPoolConfig" />
		</constructor-arg>
	</bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redis.clients.jedis.JedisCluster;

public class ClusterTest {

	public static JedisCluster jedisCluster;
	
	public void set(String key, String value) {
		jedisCluster.set(key, value);
	}
	public static void main(String[] args) {
        ApplicationContext ac =  new ClassPathXmlApplicationContext("classpath:/applicationContext-cluster.xml");
        jedisCluster = (JedisCluster)ac.getBean("redisCluster");
		System.out.println(jedisCluster.get("name"));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31156277/article/details/88090927
今日推荐