redis-cluster 部署需要以下几个步骤:
1.ruby环境安装(要求2.2.2 以上版本)
curl -O -L https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.gz //下载ruby压缩包,或者自行下载通过ftp上传
tar -zxf ruby-2.2.7.tar.gz //解压
cd ruby-2.2.7/ //进入解压目录
./configure --prefix=/usr/local/ruby-2.2.7
make && make install
ln -s /usr/local/ruby-2.2.7/bin/ruby /usr/bin/ruby //设置快捷方式【如果报以下错误ln: failed to create symbolic link ‘/usr/bin/ruby’: File exists .进入/usr/bin/目录rm -f ruby 快捷方式,重新设置】
如果报以下错误ln: failed to create symbolic link ‘/usr/bin/ruby’: File exists .进入/usr/bin/目录rm -f ruby 快捷方式,重新设置】
2.rubygems 安装
yum安装: yum install rubygems
或者
离线安装:
$tar -zxvf rubygems-2.6.12.tgz
$ cd /home/cmfchina/rubygems
$ tar -zxvf rubygems-2.6.12.tgz
3.redis接口安装
gem install redis
4.redis安装和配置:
tar -zxf redis-4.0.1.tar.gz
cd redis-4.0.1
make
redis.conf配置参数如下,拷贝下来后自行将端口(下面配置端口为7002)替换成指定端口:
#7000-7005
port 7001
#开启集群
cluster-enabled yes
#保存节点配置,自动创建,自动更新
#cluster-config-file nodes.conf
#集群超时时间,节点超过这个时间没反应就断定是宕机
cluster-node-timeout 5000
#存储方式,aof,将写操作记录保存到日志中,默认不开启
appendonly no
#后台启动
daemonize yes
#在redis3.2之后,redis增加了protected-mode,在这个模式下,即使注释掉了bind 127.0.0.1,再访问redisd时候还是报错,修改办法:
protected-mode no
redis 安装好后,可以将常用命令设置快捷方式,简要命令如下,其他的可以自行替换:
ln -s /home/redis/redis-4.0.1/src/redis-server /usr/bin/redis-server
带配置文件启动redis节点,命令如下【redis-cluster要求至少6节点,3主3从】:
redis-server 7001/redis.conf
redis-server 7002/redis.conf
redis-server 7003/redis.conf
redis-server 7004/redis.conf
redis-server 7005/redis.conf
redis-server 7006/redis.conf
5.集群加入
做集群命令【地址不要用127.0.0.1 否则jedis客户端会出:Could not get a resource from the pool异常】:
ruby、rubygems、redis接口包安装好后,分别启动redis节点
ruby redis-trib.rb create --replicas 1 192.168.32.128:7001 192.168.32.128:7002 192.168.32.128:7003 192.168.32.128:7004 192.168.32.128:7005 192.168.32.128:7006
此致,环境安装完成。
1、jedis客户端连接【要求jedis版本2.9.0以上,要求虚拟机防火墙开放了对应的端口或者直接关闭虚拟机防火墙】,关闭命令如下:
CentOs7防火墙关闭命令如下,其他版本的话可以百度查询:
systemctl stop firewalld.service
systemctl disable firewalld.service
以下为java测试代码:
public static void main(String[] args) {
try {
jedisCluster();
}catch (Exception e){
e.printStackTrace();
}
}
public static void jedisCluster() throws IOException {
// 数据库链接池配置
// JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxTotal(100);
// config.setMaxIdle(50);
// config.setMinIdle(20);
// config.setMaxWaitMillis(6 * 1000);
// config.setTestOnBorrow(true);
// Redis集群的节点集合
Set nodes = new HashSet();
nodes.add(new HostAndPort("192.168.32.128", 7001));
nodes.add(new HostAndPort("192.168.32.128", 7002));
nodes.add(new HostAndPort("192.168.32.128", 7003));
nodes.add(new HostAndPort("192.168.32.128", 7004));
nodes.add(new HostAndPort("192.168.32.128", 7005));
nodes.add(new HostAndPort("192.168.32.128", 7006));
//JedisCluster对象,在系统中是单例存在
// JedisCluster jedisCluster = new JedisCluster(nodes, 2000, 100,config);
JedisCluster jedisCluster = new JedisCluster(nodes);
// String str = jedisCluster.get("test234234444444444444421");
// System.out.println(str);
jedisCluster.set("s888888", "hello world");
String result = jedisCluster.get("s888888");
System.out.println(result);
// System.out.println(jedisCluster.get("test234234444444444444421"));
jedisCluster.close();
}
}
验证通过:
D:\Java\jdk1.8.0_131\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:9714,suspend=y,server=n -javaagent:C:\Users\think\.IntelliJIdea2018.1\system\captureAgent\debugger-agent.jar=file:/C:/Users/think/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "D:\Java\jdk1.8.0_131\jre\lib\charsets.jar;D:\Java\jdk1.8.0_131\jre\lib\deploy.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_131\jre\lib\javaws.jar;D:\Java\jdk1.8.0_131\jre\lib\jce.jar;D:\Java\jdk1.8.0_131\jre\lib\jfr.jar;D:\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_131\jre\lib\jsse.jar;D:\Java\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_131\jre\lib\plugin.jar;D:\Java\jdk1.8.0_131\jre\lib\resources.jar;D:\Java\jdk1.8.0_131\jre\lib\rt.jar;E:\git\tools\tools-core\target\classes;E:\m2\repository\org\apache\commons\commons-pool2\2.4.2\commons-pool2-2.4.2.jar;E:\m2\repository\redis\clients\jedis\2.9.0\jedis-2.9.0.jar;E:\git\tools\tools-utils\target\classes;E:\m2\repository\org\xerial\sqlite-jdbc\3.8.11.1\sqlite-jdbc-3.8.11.1.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2018.1.4\lib\idea_rt.jar" com.lfxfs.tools.core.JedisPoolTest
Connected to the target VM, address: '127.0.0.1:9714', transport: 'socket'
hello world
Disconnected from the target VM, address: '127.0.0.1:9714', transport: 'socket'
Process finished with exit code 0
推荐使用treenms进行集群可视化管理:界面截图如下:
注意事项:
1.如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码
2.如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
3.各个节点的密码都必须一致,否则Redirected就会失败
config set masterauth abc
config set requirepass abc
config rewrite
参考:
1.错误描述:ERR Slot 741 is already busy (Redis::CommandError)错误解决:
解决办法:https://blog.csdn.net/qiushisoftware/article/details/78837855
2.错误描述:treenms管理客户端下载地址
解决办法:https://pan.baidu.com/s/1C1Id-QM-dI7-5OJ7MZAw2w
3.错误描述:使用redis客户端可以连接集群,但使用JedisCluster连接redis集群Could not get a resource from the pool
解决办法:
https://www.cnblogs.com/mengjinluohua/p/6193962.html