1、在安装RVM之前先导入公钥,在RVM官网可以查到公钥。然后才可下载RVM
gpg --keyserver hkp://pgp.mit.edu --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
2、redis的集群管理工具redis-trib.rb依赖ruby环境。所以安装RVM,方便安装高版本的ruby,centos yum库中自带的ruby版本较低。
curl -L get.rvm.io | bash -s stable
3、安装ruby 2.5.8
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.5.8
4安装redis依赖
gem install redis
5、下载redis到电脑并使用xshell上传到centos的usr/local/redis目录
下载地址
https://download.redis.io/releases/redis-6.2.6.tar.gz
mkdir usr/local/redis
6、新建集群文件夹,并复制安装包
mkdir usr/local/redisCluster
7、编译安装redis
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6/
make MALLOC=libc
make install
8、复制集群管理工具redis-trib.rb到redisCluster下
cp -f ./redis-6.2.6/src/redis-trib.rb ./
9、在redisCluster目录下新建6个文件夹,名字为8001到8006,将修改过后的redis.conf分别往6个目录中复制一份,并修改如下,端口号要分别指定,我这8001到8006,比如第一个修改如下,其余五个就端口号不同
port 8001
#bind 127.0.0.1 -::1
cluster-enabled yes
cluster-config-file nodes-8001.conf
protected-mode no
daemonize yes
requirepass 123@456
masterauth 123@456
10、保留快照方便回退。开放对应的6个端口,开放你redis实例端口号+10000的端口,重启linux
11、启动6个redis,查看6个redis实例运行状态
redis-server ../8001/redis.conf
ps -ef |grep redis
12、redis 5以上版本直接redis-cli启动。5以下用集群管理工具启动。
./redis-cli -a 123@456 --cluster create 118.31.120.118:8001 118.31.120.118:8002 118.31.120.118:8003 118.31.120.118:8004 118.31.120.118:8005 118.31.120.118:8006 --cluster-replicas 1
./redis-cli -a 123@456 --cluster create 118.31.120.118:8001 118.31.120.118:8002 118.31.120.118:8003 118.31.120.118:8004 118.31.120.118:8005 118.31.120.118:8006 --cluster-replicas 1
集群开启成功,登录任一redis实例,查看集群状态和集群节点信息
redis-cli -p 8001 -a 123@456 -c
cluster info
===========================
集群如果部署失败,想要重来,直接根据PID KILL掉就行
ps -ef |grep redis
kill -9 pid XXX
==============================
登录一个实例set get测试下
伪集群成功。
==================================
本地电脑RDM连接访问查看刚才新增的键值对,应该是在8003和8004中,因为8003是主节点,8004是8003的从节点
====================================================
使用jedis连接集群获取键值对信息,成功
/**
* 集群环境下Jedis操作
*/
public class Cluster {
private static JedisCluster jedis;
static {
// 添加集群的服务节点Set集合
Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>();
// 添加节点
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8001));
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8002));
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8003));
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8004));
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8005));
hostAndPortsSet.add(new HostAndPort("118.31.120.118", 8006));
// Jedis连接池配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大空闲连接数, 默认8个
jedisPoolConfig.setMaxIdle(100);
// 最大连接数, 默认8个
jedisPoolConfig.setMaxTotal(500);
//最小空闲连接数, 默认0
jedisPoolConfig.setMinIdle(0);
// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒
//对拿到的connection进行validateObject校验
jedisPoolConfig.setTestOnBorrow(true);
//public JedisCluster(Set<HostAndPort> jedisClusterNode, int connectionTimeout, int soTimeout,
// int maxAttempts, String password, final GenericObjectPoolConfig poolConfig)
jedis = new JedisCluster(hostAndPortsSet, 2000, 2000, 5, "123@456", jedisPoolConfig);
}
/**
* 测试key:value数据
* 集群中flushDB、keys废弃
*/
@Test
public void testKey() throws InterruptedException {
// System.out.println("清空数据:" + jedis.flushAll());
System.out.println("判断某个键是否存在:" + jedis.exists("runoobkey"));
String runoobkey = jedis.get("runoobkey");
System.out.println("获取某个键的值:" + runoobkey);
System.out.println("新增<'username','xiaohai'>的键值对:" + jedis.set("username", "xiaohai"));
System.out.println("新增<'runoobkey','666'>的键值对:" + jedis.set("runoobkey", "666"));
// System.out.println("新增<'password','123'>的键值对:" + jedis.set("password", "123"));
System.out.println("是否存在:" + jedis.exists("username"));
System.out.println("查看键username所存储的值的类型:" + jedis.type("username"));
// System.out.println("新增<'password','password'>的键值对:" + jedis.set("password", "123456"));
// Set<String> keys = jedis.hkeys("*");
// System.out.println("系统中所有的键如下:"+keys);
// System.out.println("删除键password:" + jedis.del("password"));
// System.out.println("判断键password是否存在:" + jedis.exists("password"));
// System.out.println("设置键username的过期时间为10s:" + jedis.expire("username", 10));
// TimeUnit.SECONDS.sleep(2); // 线程睡眠2秒System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));
// System.out.println("查看键username的剩余生存时间:" + jedis.ttl("username"));
// System.out.println("移除键username的生存时间:" + jedis.persist("username"));
// System.out.println("查看键username的剩余生存时间:" + jedis.ttl("username"));
}
=========
set集群中有过的键值对,可以成功,如删掉username再set就可以,修改已有的也可以。但是set新的username2就显示获取不到连接
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
。。。
在服务器上直接set get是能够成功的,所以应该是java代码的问题