VMware: VMwareworkstation_full_12.1.0.2487.1453173744.exe
CentOS 7: CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# mkdir /soft && cd /soft [root@localhost soft]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz [root@localhost soft]# tar xzf redis-4.0.10.tar.gz [root@localhost soft]# mv redis-4.0.10 /usr/local/redis-4.0.10 && cd /usr/local/redis-4.0.10
[root@localhost redis-4.0.10]# make cd src && make all make[1]: 进入目录“/usr/local/redis-4.0.10/src” CC Makefile.dep make[1]: 离开目录“/usr/local/redis-4.0.10/src” make[1]: 进入目录“/usr/local/redis-4.0.10/src” rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark (cd ../deps && make distclean) make[2]: 进入目录“/usr/local/redis-4.0.10/deps” (cd hiredis && make clean) > /dev/null || true (cd linenoise && make clean) > /dev/null || true (cd lua && make clean) > /dev/null || true (cd jemalloc && [ -f Makefile ] && make distclean) > /dev/null || true (rm -f .make-*) make[2]: 离开目录“/usr/local/redis-4.0.10/deps” (rm -f .make-*) echo STD=-std=c99 -pedantic -DREDIS_STATIC='' >> .make-settings echo WARN=-Wall -W -Wno-missing-field-initializers >> .make-settings echo OPT=-O2 >> .make-settings echo MALLOC=jemalloc >> .make-settings echo CFLAGS= >> .make-settings echo LDFLAGS= >> .make-settings echo REDIS_CFLAGS= >> .make-settings echo REDIS_LDFLAGS= >> .make-settings echo PREV_FINAL_CFLAGS=-std=c99 -pedantic -DREDIS_STATIC='' -Wall -W -Wno-missing-field-initializers -O2 -g -ggdb -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src -DUSE_JEMALLOC -I../deps/jemalloc/include >> .make-settings echo PREV_FINAL_LDFLAGS= -g -ggdb -rdynamic >> .make-settings (cd ../deps && make hiredis linenoise lua jemalloc) make[2]: 进入目录“/usr/local/redis-4.0.10/deps” (cd hiredis && make clean) > /dev/null || true (cd linenoise && make clean) > /dev/null || true (cd lua && make clean) > /dev/null || true (cd jemalloc && [ -f Makefile ] && make distclean) > /dev/null || true (rm -f .make-*) (echo "" > .make-cflags) (echo "" > .make-ldflags) MAKE hiredis cd hiredis && make static make[3]: 进入目录“/usr/local/redis-4.0.10/deps/hiredis” gcc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb net.c make[3]: gcc:命令未找到 make[3]: *** [net.o] 错误 127 make[3]: 离开目录“/usr/local/redis-4.0.10/deps/hiredis” make[2]: *** [hiredis] 错误 2 make[2]: 离开目录“/usr/local/redis-4.0.10/deps” make[1]: [persist-settings] 错误 2 (忽略) CC adlist.o /bin/sh: cc: 未找到命令 make[1]: *** [adlist.o] 错误 127 make[1]: 离开目录“/usr/local/redis-4.0.10/src” make: *** [all] 错误 2
gcc
[root@localhost redis-4.0.10]# yum install gcc [root@localhost redis-4.0.10]# make cd src && make all make[1]: 进入目录“/usr/local/redis-4.0.10/src” CC Makefile.dep make[1]: 离开目录“/usr/local/redis-4.0.10/src” make[1]: 进入目录“/usr/local/redis-4.0.10/src” CC adlist.o In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 #include <jemalloc/jemalloc.h> ^ 编译中断。 make[1]: *** [adlist.o] 错误 1 make[1]: 离开目录“/usr/local/redis-4.0.10/src” make: *** [all] 错误 2
注:如果在make的时候不指定内存管理方式,使用
make MALLOC=libc
指令。malloc是管理内存碎片的。
[root@localhost redis-4.0.10]# make MALLOC=libc [root@localhost redis-4.0.10]# make & make install
[root@localhost redis-4.0.10]# mkdir conf-cluster && cd conf-cluster [root@localhost conf-cluster]# touch {9000..9002}.conf
port 9000 bind 192.168.1.100 daemonize yes cluster-enabled yes cluster-node-timeout 15000 appendonly yes pidfile /var/run/redis_9000.pid cluster-config-file nodes-9000.conf
[root@localhost conf-cluster]# redis-server 9000.conf [root@localhost conf-cluster]# redis-server 9001.conf [root@localhost conf-cluster]# redis-server 9002.conf
[root@localhost conf-cluster]# ps -ef | grep redis //redis节点是否启动成功 [root@localhost conf-cluster]# netstat -tnlp | grep redis //监听节点端口
创建集群时需要用Ruby 运行
redis-trib.rb
[root@localhost conf-cluster]# yum -y install ruby ruby-devel rubygems rpm-build [root@localhost conf-cluster]# gem install redis ERROR: Could not find a valid gem 'redis' (>= 0), here is why: Unable to download data from https://rubygems.org/ - no such name (https://rubygems.org/latest_specs.4.8.gz)
修改 RubyGems
镜像
[root@localhost conf-cluster]# gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ https://gems.ruby-china.org/ added to sources https://rubygems.org/ removed from sources
[root@localhost conf-cluster]# gem install redis Fetching: redis-4.0.1.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
解决办法是 先安装rvm,再把ruby版本提升
参考:
https://blog.csdn.net/qq_37595946/article/details/77800147
https://ruby-china.org/wiki/rvm-guide
[root@localhost conf-cluster]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 [root@localhost conf-cluster]# curl -L get.rvm.io | bash -s stable [root@localhost conf-cluster]# source /etc/profile.d/rvm.sh [root@localhost conf-cluster]# rvm list known [root@localhost conf-cluster]# rvm install 2.5.1 --disable-binary
DNS
Checking fallback: https://ftp.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2
# Generated by NetworkManager + 8.8.8.8 nameserver 192.168.1.1
[root@localhost conf-cluster]# rvm use 2.5.1 [root@localhost conf-cluster]# rvm remove 2.2.0
[root@localhost conf-cluster]# gem install redis Fetching: redis-4.0.1.gem (100%) Successfully installed redis-4.0.1 Parsing documentation for redis-4.0.1 Installing ri documentation for redis-4.0.1 Done installing documentation for redis after 0 seconds 1 gem installed
[root@localhost conf-cluster]# /usr/local/redis-4.0.10/src/redis-trib.rb create --replicas 1 192.168.1.100:9000 192.168.1.100:9001 192.168.1.100:9002 >>> Creating cluster *** ERROR: Invalid configuration for cluster creation. *** Redis Cluster requires at least 3 master nodes. *** This is not possible with 3 nodes and 1 replicas per node. *** At least 6 nodes are required.
集群至少需要3主3从6台服务器或进程
注: 复制虚拟机,记得修改虚拟机的MAC地址
[root@localhost conf-cluster]# redis-server {9000..9002}.conf
[root@localhost conf-cluster]# /usr/local/redis-4.0.10/src/redis-trib.rb create --replicas 1 192.168.1.100:9000 192.168.1.100:9001 192.168.1.100:9002 192.168.1.101:9000 192.168.1.101:9001 192.168.1.101:9002 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.1.100:9000 192.168.1.101:9000 192.168.1.100:9001 Adding replica 192.168.1.101:9002 to 192.168.1.100:9000 Adding replica 192.168.1.100:9002 to 192.168.1.101:9000 Adding replica 192.168.1.101:9001 to 192.168.1.100:9001 M: 40d42fcd808b073c839d0b767eb296853a1995ed 192.168.1.100:9000 slots:0-5460 (5461 slots) master M: e1b5627a3f06d9dbf6ae75e26a3dfc3127018940 192.168.1.100:9001 slots:10923-16383 (5461 slots) master S: 8a84e184bad311182898e7ee3f21280ed094a527 192.168.1.100:9002 replicates 7d002ccb55e1fac7ec6ae57b3ee710806bbe1b0d M: 7d002ccb55e1fac7ec6ae57b3ee710806bbe1b0d 192.168.1.101:9000 slots:5461-10922 (5462 slots) master S: f77cc08cac4bc93c642820afb6ec9b42710e2f0a 192.168.1.101:9001 replicates e1b5627a3f06d9dbf6ae75e26a3dfc3127018940 S: 407848979110a89f8804cf61a61c4386779a1a85 192.168.1.101:9002 replicates 40d42fcd808b073c839d0b767eb296853a1995ed 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.1.100:9000) M: 40d42fcd808b073c839d0b767eb296853a1995ed 192.168.1.100:9000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 8a84e184bad311182898e7ee3f21280ed094a527 192.168.1.100:9002 slots: (0 slots) slave replicates 7d002ccb55e1fac7ec6ae57b3ee710806bbe1b0d S: 407848979110a89f8804cf61a61c4386779a1a85 192.168.1.101:9002 slots: (0 slots) slave replicates 40d42fcd808b073c839d0b767eb296853a1995ed S: f77cc08cac4bc93c642820afb6ec9b42710e2f0a 192.168.1.101:9001 slots: (0 slots) slave replicates e1b5627a3f06d9dbf6ae75e26a3dfc3127018940 M: e1b5627a3f06d9dbf6ae75e26a3dfc3127018940 192.168.1.100:9001 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 7d002ccb55e1fac7ec6ae57b3ee710806bbe1b0d 192.168.1.101:9000 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
注:
如果一直卡在Waiting for the cluster to join...
请确保每台机器防火墙开启redis客户端端口及集群总线端口。
例:
如redis端口为9000,则集群总线端口为19000;
集群总线端口为redis客户端连接的端口 + 10000
[root@localhost ~]# firewall-cmd --zone=public --add-port=9000/tcp --permanent [root@localhost ~]# firewall-cmd --zone=public --add-port=19000/tcp --permanent ...
[root@localhost ~]# firewall-cmd --reload
[root@localhost conf-cluster]# firewall-cmd --list-ports 9000/tcp 9001/tcp 9002/tcp 19000/tcp 19001/tcp 19002/tcp
[root@localhost conf-cluster]# redis-cli -h 192.168.1.100 -c -p 9000 192.168.1.100:9000>
必须要加:-c 参数
[root@localhost conf-cluster]# redis-cli -h 192.168.1.100 -c -p 9000 192.168.1.100:9000> set title testcluster OK
在192.168.1.101 9002节点连接,获取数据。直接Redirected 从192.168.1.100:9000 获取数据。
[root@localhost conf-cluster]# redis-cli -h 192.168.1.101 -c -p 9002 192.168.1.101:9002> get title -> Redirected to slot [2217] located at 192.168.1.100:9000 "testcluster"
redis集群环境配置成功!!!
如果重启服务器后,再次执行redis-trib.rb会报错如下错误:
[ERR] Node 192.168.1.80:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决方法:
删除配置的cluster-config-file
pidfile
和生成的dump.rdb
,然后重启redis服务,最后启动集群
[root@localhost conf-cluster]# redis-cli -h 192.168.1.100 -c -p 9000 shutdown
http://shift-alt-ctrl.iteye.com/blog/2284890
https://www.cnblogs.com/subendong/p/7417601.html