redis cluster集群部署(centos7.4+redis4.0.9) weir 2018-03-29 23:06:07.0 redis cluster 5292 redis cluster集群是redis分布式高可用、主从复制和读写分离,主备切换、水平扩充。从而实现高并发亿级流量T级海量数据十万加QPS的官方解决方案,可以说目前市面上开源的最靠谱的解决方案。 192.168.38.17:6001 192.168.38.17:6002 192.168.38.18:6003 192.168.38.18:6004 192.168.38.19:6005 192.168.38.19:6006 我用了三台,生产环境最好是6台(最少,每台内存8G就好) 1.创建目录 [root@t7 home]# mkdir -p /etc/redis-cluster [root@t7 home]# mkdir -p /home/redis/log [root@t7 home]# [root@t7 redis-4.0.9]# mkdir -p /var/redis/6001 [root@t7 redis-4.0.9]# mkdir -p /var/redis/6002 另外两台也要创建 2.安装 官网下载: redis-4.0.9.tar.gz 我用的是最新的 解压并进入直接:make && make test && make install 这里遇到两个问题解决是需要命令:yum install -y tcl yum install gcc make make MALLOC=libc 最好先执行这三个命令再: [root@t7 redis-4.0.9]# make && make test && make install 官网安装命令很简单不知道对于新手来说被坑了多少次! 3.拷贝配置文件到: [root@t7 redis-4.0.9]# cp redis.conf /etc/redis/ 每个文件里面要修改的内容(需要6份6001---6006): port 6001 cluster-enabled yes cluster-config-file /etc/redis-cluster/node-6001.conf cluster-node-timeout 15000 daemonize yes pidfile /var/run/redis_6001.pid dir /var/redis/6001 logfile /home/redis/log/6001.log bind 192.168.38.17 appendonly yes 4.启动脚本(/etc/init.d/下面(6001---6006)): #!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. # chkconfig: 2345 90 10 # description: Redis is a persistent key-value database REDISPORT=6001 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/redis-${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac 其实不一样的就是6001,6002.。。。这些数字 5.启动(6个都要启动,没有权限可以用chmod +x redis*): [root@t9 init.d]# ./redis_6006 start 6.开始搭建集群 6.1安装ruby 要求2.2以上所以 yum有可能安装的版本不较低,需要手动安装 在一台上面安装就可以了 ruby-2.5.1.tar.gz 解压 ./configure -prefix=/usr/local/ruby make && make install 安装ruby最坑默认的yum安装ruby版本太低,最新版的要求2.2以上,所以要手动安装。 cd /usr/local/ruby cp bin/ruby /usr/bin cp bin/gem /usr/bin gem install redis cp /home/redis-4.0.9/src/redis-trib.rb /usr/local/bin/ 6.2部署集群 redis-trib.rb create --replicas 1 192.168.38.17:6001 192.168.38.17:6002 192.168.38.18:6003 192.168.38.18:6004 192.168.38.19:6005 192.168.38.19:6006 [root@t7 ruby]# redis-trib.rb create --replicas 1 192.168.38.17:6001 192.168.38.17:6002 192.168.38.18:6003 192.168.38.18:6004 192.168.38.19:6005 192.168.38.19:6006 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.38.17:6001 192.168.38.18:6003 192.168.38.19:6005 Adding replica 192.168.38.18:6004 to 192.168.38.17:6001 Adding replica 192.168.38.19:6006 to 192.168.38.18:6003 Adding replica 192.168.38.17:6002 to 192.168.38.19:6005 M: 518e9b64079b17242f409224897ba9c1d2531055 192.168.38.17:6001 slots:0-5460 (5461 slots) master S: 7350a24a4ab4db07ca6be8ebf82004e69c9e70ac 192.168.38.17:6002 replicates ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 M: 001cd811047758b9030580931ab1a1c793810548 192.168.38.18:6003 slots:5461-10922 (5462 slots) master S: de079007c0aa9fb26d3fb314d677fe09646dbaef 192.168.38.18:6004 replicates 518e9b64079b17242f409224897ba9c1d2531055 M: ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 192.168.38.19:6005 slots:10923-16383 (5461 slots) master S: efc7539bf40ec22b3161c19bf910d5f6aa06fad0 192.168.38.19:6006 replicates 001cd811047758b9030580931ab1a1c793810548 Can I set the above configuration? (type 'yes' to accept): Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join... >>> Performing Cluster Check (using node 192.168.38.17:6001) M: 518e9b64079b17242f409224897ba9c1d2531055 192.168.38.17:6001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: de079007c0aa9fb26d3fb314d677fe09646dbaef 192.168.38.18:6004 slots: (0 slots) slave replicates 518e9b64079b17242f409224897ba9c1d2531055 M: ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 192.168.38.19:6005 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 7350a24a4ab4db07ca6be8ebf82004e69c9e70ac 192.168.38.17:6002 slots: (0 slots) slave replicates ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 M: 001cd811047758b9030580931ab1a1c793810548 192.168.38.18:6003 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: efc7539bf40ec22b3161c19bf910d5f6aa06fad0 192.168.38.19:6006 slots: (0 slots) slave replicates 001cd811047758b9030580931ab1a1c793810548 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. 这就ok了 7.检查 [root@t7 ruby]# redis-trib.rb check 192.168.38.17:6001 >>> Performing Cluster Check (using node 192.168.38.17:6001) M: 518e9b64079b17242f409224897ba9c1d2531055 192.168.38.17:6001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: de079007c0aa9fb26d3fb314d677fe09646dbaef 192.168.38.18:6004 slots: (0 slots) slave replicates 518e9b64079b17242f409224897ba9c1d2531055 M: ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 192.168.38.19:6005 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 7350a24a4ab4db07ca6be8ebf82004e69c9e70ac 192.168.38.17:6002 slots: (0 slots) slave replicates ab2d9ca0c41f5a3f27c37d7c910bb5ff5d882935 M: 001cd811047758b9030580931ab1a1c793810548 192.168.38.18:6003 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: efc7539bf40ec22b3161c19bf910d5f6aa06fad0 192.168.38.19:6006 slots: (0 slots) slave replicates 001cd811047758b9030580931ab1a1c793810548 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@t7 ruby]# ———————————————————————————————————— [root@t7 ruby]# redis-cli -h 192.168.38.17 -p 6001 192.168.38.17:6001> set weir1 v1 OK 192.168.38.17:6001> set weir2 v2 (error) MOVED 8725 192.168.38.18:6003 192.168.38.17:6001> [root@t8 init.d]# redis-cli -h 192.168.38.18 -p 6003 192.168.38.18:6003> set weir2 v2 OK 192.168.38.18:6003> getweir2 (error) ERR unknown command 'getweir2' 192.168.38.18:6003> get weir2 "v2" 192.168.38.18:6003> get weir1 (error) MOVED 4726 192.168.38.17:6001 192.168.38.18:6003> ))))))))))))))))))))))))))))))))))))))))) 192.168.38.17:6001> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.38.18,port=6004,state=online,offset=1301,lag=1 master_replid:b4131cc64ddef868a5c7daa8894e8d38f011f871 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1301 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1301 192.168.38.17:6001> [root@t8 init.d]# redis-cli -h 192.168.38.18 -p 6004 192.168.38.18:6004> readonly OK 192.168.38.18:6004> get weir1 "v1" 192.168.38.18:6004> ++++++++++++++++++++++++++++++++++++ [root@t7 ruby]# redis-cli -h 192.168.38.17 -p 6001 -c 192.168.38.17:6001> set weir3 v3 -> Redirected to slot [12852] located at 192.168.38.19:6005 OK 192.168.38.19:6005> [root@t9 init.d]# redis-cli -h 192.168.38.19 -p 6006 -c 192.168.38.19:6006> get weir1 -> Redirected to slot [4726] located at 192.168.38.17:6001 "v1" 192.168.38.17:6001> 下面放一点java代码大家可以先玩玩: private static JedisCluster jedis; static { // 添加集群的服务节点Set集合 Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>(); // 添加主节点 hostAndPortsSet.add(new HostAndPort("192.168.38.17", 6001)); hostAndPortsSet.add(new HostAndPort("192.168.38.19", 6005)); hostAndPortsSet.add(new HostAndPort("192.168.38.18", 6003)); // 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); jedis = new JedisCluster(hostAndPortsSet, jedisPoolConfig); }