一、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"));
}
}