由于我团队开发的在线坐席系统,即将面对线上每周3000W的下行投放客户,产品的咨询量可能会很大,基于前期,200W的投放时,前10分钟,大概800问题量,平均一个客户大概8个问题,也就是说每分钟10个客户,折算3000W的话,就是每分钟150客户。系统容量应该问题不是太大,考虑一下极端情况(叠加效应),或者留下富余5倍,也就不到800吧,我们的生产环境,需要扩容消费者服务器,redis作为调度,需要扩容,由现在的一主从升级到一个集群(3对主从的cluster)。
这里大概记录下我们开发环境的redis集群的配置和安装过程,这些属于运维的工作,但是也是系统架构的范畴,这些若没有实战的经验,不要和我说什么架构设计。。。我就是搞这个的,我要对我的系统负责,但是又不会出现系统的过度设计。
有三台机器,准备搭建redis集群环境,redis的版本是3.2.8,源码安装,安装过程略去。
10.90.7.2
10.90.7.10
10.90.2.102
每个上面部署两个redis的实例,端口配置信息如下:
10.90.7.2 7000/7010
10.90.7.10 7001/7011
10.90.2.102 7002/7012
三台的redis的配置采用近乎一样的配置,除了因为端口的不同造成的一点点差异。这里拿10.90.7.2的配置7000为例:
在/opt/redis-3.2.8下面创建目录tkcluster。将/opt/redis-3.2.8下面的redis.conf文件copy到tkcluster目录下,重命名为7000.conf,修改的内容如下,其他的采用默认值。
bind 10.90.7.2 protected-mode no port 7000 daemonize yes pidfile /var/run/redis_7000.pid appendonly yes appendfilename "appendonly7000.aof" cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 15000 notify-keyspace-events Ex
配置完后,copy一下7000.conf到7010.conf,将上述相应的7000改成7010的参数即可完成7010.conf的配置。为了方便启动redis-server。写一个简单shell脚本:
#!/bin/bash /opt/redis-3.2.8/src/redis-server 7000.conf echo "status from 7000: $?" sleep 5 /opt/redis-3.2.8/src/redis-server 7010.conf echo "status from 7010: $?"
运行一下后,成功。得到文件列表:
[root@localhost tkcluster]# ll 总计 116 -rw-r--r-- 1 root root 46695 11-21 15:11 7000.conf -rw-r--r-- 1 root root 46684 11-21 15:11 7010.conf -rw-r--r-- 1 root root 54 11-22 19:10 appendonly7000.aof -rw-r--r-- 1 root root 0 11-22 18:43 appendonly7010.aof -rw-r--r-- 1 root root 90 11-22 19:10 dump.rdb -rw-r--r-- 1 root root 739 11-22 18:43 nodes-7000.conf -rw-r--r-- 1 root root 739 11-22 18:43 nodes-7010.conf -rwxr-xr-x 1 root root 166 11-21 14:59 stcluster.sh
检查下,集群创建的指令是否能工作:
[root@bogon src]# ./redis-trib.rb --help
/usr/bin/env: ruby: 没有那个文件或目录
系统里面没有ruby这个环境,需要安装一下。
这个过程有点让人头疼,开始,在10.90.7.10的机器上进行安装,通过yum,下面是我遇到的问题
[root@bogon src]# yum install -y ruby
源找到了,很快安装成功。继续尝试:
[root@bogon src]# ./redis-trib.rb --help /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError) from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require' from ./redis-trib.rb:25:in `<main>'
这个错误,呵呵,熟悉ruby的话,很容易看出来,是ruby的环境需要访问redis,但是系统里面没有ruby的redis客户端程序,需要安装一下ruby的redis客户端插件。
[root@bogon src]# gem install redis Fetching: redis-4.0.1.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
这个错误,是因为ruby版本太低,需要升级,采用下面的方式可以完成:
[root@bogon src]# curl -L get.rvm.io | bash -s stable % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 194 100 194 0 0 194 0 0:00:01 --:--:-- 0:00:01 249 100 24090 100 24090 0 0 24090 0 0:00:01 0:00:01 --:--:-- 25304 Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc curl: (22) The requested URL returned error: 503 Could not download 'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'. curl returned status '22'. Creating group 'rvm' Installing RVM to /usr/local/rvm/ Installation of RVM in /usr/local/rvm/ is almost complete: * First you need to add all users that will be using rvm to 'rvm' group, and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`. * To start using RVM you need to run `source /etc/profile.d/rvm.sh` in all your open shell windows, in rare cases you need to reopen all shell windows.
执行完成后,按照上面的提示,首先推出ssh,然后再登陆ssh。然后执行source /etc/profile.d/rvm.sh指令。接下来执行一下rvm list known指令,看看当前查看rvm库中已知的ruby版本

[root@bogon redis-3.2.8]# rvm list known # MRI Rubies [ruby-]1.8.6[-p420] [ruby-]1.8.7[-head] # security released on head [ruby-]1.9.1[-p431] [ruby-]1.9.2[-p330] [ruby-]1.9.3[-p551] [ruby-]2.0.0[-p648] [ruby-]2.1[.10] [ruby-]2.2[.7] [ruby-]2.3[.4] [ruby-]2.4[.1] ruby-head # for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2 # JRuby jruby-1.6[.8] jruby-1.7[.27] jruby[-9.1.13.0] jruby-head # Rubinius rbx-1[.4.3] rbx-2.3[.0] rbx-2.4[.1] rbx-2[.5.8] rbx-3[.84] rbx-head # Opal opal # Minimalistic ruby implementation - ISO 30170:2012 mruby-1.0.0 mruby-1.1.0 mruby-1.2.0 mruby-1[.3.0] mruby[-head] # Ruby Enterprise Edition ree-1.8.6 ree[-1.8.7][-2012.02] # Topaz topaz # MagLev maglev[-head] maglev-1.0.0 # Mac OS X Snow Leopard Or Newer macruby-0.10 macruby-0.11 macruby[-0.12] macruby-nightly macruby-head # IronRuby ironruby[-1.1.3] ironruby-head [root@bogon redis-3.2.8]#
查看后,看到前面有ruby的版本比较多,高于2.0.0的有4个,选一个即可。这里就选择2.3.4吧。
[root@bogon redis-3.2.8]# rvm install 2.3.4 Searching for binary rubies, this might take some time. Found remote file https://rvm_io.global.ssl.fastly.net/binaries/centos/7/x86_64/ruby-2.3.4.tar.bz2 Checking requirements for centos. Installing requirements for centos. Installing required packages: bison, bzip2, libyaml-devel...... Requirements installation successful. ruby-2.3.4 - #configure ruby-2.3.4 - #download % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 25.2M 100 25.2M 0 0 149k 0 0:02:53 0:02:53 --:--:-- 165k No checksum for downloaded archive, recording checksum in user configuration. ruby-2.3.4 - #validate archive ruby-2.3.4 - #extract ruby-2.3.4 - #validate binary ruby-2.3.4 - #setup ruby-2.3.4 - #gemset created /usr/local/rvm/gems/ruby-2.3.4@global ruby-2.3.4 - #importing gemset /usr/local/rvm/gemsets/global.gems.............................. ruby-2.3.4 - #generating global wrappers........ Error running 'run_gem_wrappers_regenerate', please read /usr/local/rvm/log/1511253510_ruby-2.3.4/gemset.wrappers.global.log ruby-2.3.4 - #gemset created /usr/local/rvm/gems/ruby-2.3.4 ruby-2.3.4 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list ruby-2.3.4 - #generating default wrappers......... Error running 'run_gem_wrappers_regenerate', please read /usr/local/rvm/log/1511253510_ruby-2.3.4/gemset.wrappers.default.log
在这个地方,我的10.90.7.10的机器总是报错。。。
执行启用新的ruby版本:
[root@bogon redis-3.2.8]# rvm use 2.3.4 Using /usr/local/rvm/gems/ruby-2.3.4 Error loading RubyGems plugin "/usr/local/rvm/gems/ruby-2.3.4@global/gems/executable-hooks-1.3.2/lib/rubygems_plugin.rb": /lib64/libcrypto.so.10: version `OPENSSL_1.0.2' not found (required by /usr/local/rvm/rubies/ruby-2.3.4/lib/ruby/2.3.0/x86_64-linux/openssl.so) - /usr/local/rvm/rubies/ruby-2.3.4/lib/ruby/2.3.0/x86_64-linux/openssl.so (LoadError) Error loading RubyGems plugin "/usr/local/rvm/gems/ruby-2.3.4@global/gems/gem-wrappers-1.3.2/lib/rubygems_plugin.rb": /lib64/libcrypto.so.10: version `OPENSSL_1.0.2' not found (required by /usr/local/rvm/rubies/ruby-2.3.4/lib/ruby/2.3.0/x86_64-linux/openssl.so) - /usr/local/rvm/rubies/ruby-2.3.4/lib/ruby/2.3.0/x86_64-linux/openssl.so (LoadError)
这个错误是找openssl 1.0.2的依赖,需要安装。我以源码来安装这个吧。先从执行:
[root@bogon openssl-1.0.2l]# wget wget https://www.openssl.org/source/openssl-1.0.2.tar.gz
下载完毕后,解压安装:

[root@bogon openssl-1.0.2]# ./config -fPIC --prefix=/usr/local/openssl/ enable-shared Operating system: x86_64-whatever-linux2 Configuring for linux-x86_64 Configuring for linux-x86_64 no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) no-gmp [default] OPENSSL_NO_GMP (skip dir) no-jpake [experimental] OPENSSL_NO_JPAKE (skip dir) no-krb5 [krb5-flavor not specified] OPENSSL_NO_KRB5 no-libunbound [experimental] OPENSSL_NO_LIBUNBOUND (skip dir) no-md2 [default] OPENSSL_NO_MD2 (skip dir) no-rc5 [default] OPENSSL_NO_RC5 (skip dir) no-rfc3779 [default] OPENSSL_NO_RFC3779 (skip dir) no-sctp [default] OPENSSL_NO_SCTP (skip dir) no-ssl-trace [default] OPENSSL_NO_SSL_TRACE (skip dir) no-store [experimental] OPENSSL_NO_STORE (skip dir) no-unit-test [default] OPENSSL_NO_UNIT_TEST (skip dir) no-zlib [default] no-zlib-dynamic [default] IsMK1MF=0 CC =gcc CFLAG =-fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -fPIC -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM EX_LIBS =-ldl CPUID_OBJ =x86_64cpuid.o BN_ASM =x86_64-gcc.o x86_64-mont.o x86_64-mont5.o x86_64-gf2m.o rsaz_exp.o rsaz-x86_64.o rsaz-avx2.o EC_ASM =ecp_nistz256.o ecp_nistz256-x86_64.o DES_ENC =des_enc.o fcrypt_b.o AES_ENC =aes-x86_64.o vpaes-x86_64.o bsaes-x86_64.o aesni-x86_64.o aesni-sha1-x86_64.o aesni-sha256-x86_64.o aesni-mb-x86_64.o BF_ENC =bf_enc.o CAST_ENC =c_enc.o RC4_ENC =rc4-x86_64.o rc4-md5-x86_64.o RC5_ENC =rc5_enc.o MD5_OBJ_ASM =md5-x86_64.o SHA1_OBJ_ASM =sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o sha1-mb-x86_64.o sha256-mb-x86_64.o RMD160_OBJ_ASM= CMLL_ENC =cmll-x86_64.o cmll_misc.o MODES_OBJ =ghash-x86_64.o aesni-gcm-x86_64.o ENGINES_OBJ = PROCESSOR = RANLIB =/usr/bin/ranlib ARFLAGS = PERL =/usr/bin/perl SIXTY_FOUR_BIT_LONG mode DES_UNROLL used DES_INT used RC4_CHUNK is unsigned long e_os2.h => include/openssl/e_os2.h making links in crypto... make[1]: 进入目录“/opt/redis/openssl-1.0.2/crypto” crypto.h => ../include/openssl/crypto.h opensslv.h => ../include/openssl/opensslv.h opensslconf.h => ../include/openssl/opensslconf.h ebcdic.h => ../include/openssl/ebcdic.h symhacks.h => ../include/openssl/symhacks.h ossl_typ.h => ../include/openssl/ossl_typ.h constant_time_test.c => ../test/constant_time_test.c making links in crypto/objects... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/objects” objects.h => ../../include/openssl/objects.h obj_mac.h => ../../include/openssl/obj_mac.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/objects” making links in crypto/md4... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/md4” md4.h => ../../include/openssl/md4.h md4test.c => ../../test/md4test.c md4.c => ../../apps/md4.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/md4” making links in crypto/md5... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/md5” md5.h => ../../include/openssl/md5.h md5test.c => ../../test/md5test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/md5” making links in crypto/sha... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/sha” sha.h => ../../include/openssl/sha.h shatest.c => ../../test/shatest.c sha1test.c => ../../test/sha1test.c sha256t.c => ../../test/sha256t.c sha512t.c => ../../test/sha512t.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/sha” making links in crypto/mdc2... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/mdc2” mdc2.h => ../../include/openssl/mdc2.h mdc2test.c => ../../test/mdc2test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/mdc2” making links in crypto/hmac... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/hmac” hmac.h => ../../include/openssl/hmac.h hmactest.c => ../../test/hmactest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/hmac” making links in crypto/ripemd... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ripemd” ripemd.h => ../../include/openssl/ripemd.h rmdtest.c => ../../test/rmdtest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ripemd” making links in crypto/whrlpool... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/whrlpool” whrlpool.h => ../../include/openssl/whrlpool.h wp_test.c => ../../test/wp_test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/whrlpool” making links in crypto/des... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/des” des.h => ../../include/openssl/des.h des_old.h => ../../include/openssl/des_old.h destest.c => ../../test/destest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/des” making links in crypto/aes... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/aes” aes.h => ../../include/openssl/aes.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/aes” making links in crypto/rc2... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/rc2” rc2.h => ../../include/openssl/rc2.h rc2test.c => ../../test/rc2test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/rc2” making links in crypto/rc4... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/rc4” rc4.h => ../../include/openssl/rc4.h rc4test.c => ../../test/rc4test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/rc4” making links in crypto/idea... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/idea” idea.h => ../../include/openssl/idea.h ideatest.c => ../../test/ideatest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/idea” making links in crypto/bf... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/bf” blowfish.h => ../../include/openssl/blowfish.h bftest.c => ../../test/bftest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/bf” making links in crypto/cast... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/cast” cast.h => ../../include/openssl/cast.h casttest.c => ../../test/casttest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/cast” making links in crypto/camellia... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/camellia” camellia.h => ../../include/openssl/camellia.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/camellia” making links in crypto/seed... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/seed” seed.h => ../../include/openssl/seed.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/seed” making links in crypto/modes... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/modes” modes.h => ../../include/openssl/modes.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/modes” making links in crypto/bn... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/bn” bn.h => ../../include/openssl/bn.h bntest.c => ../../test/bntest.c exptest.c => ../../test/exptest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/bn” making links in crypto/ec... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ec” ec.h => ../../include/openssl/ec.h ectest.c => ../../test/ectest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ec” making links in crypto/rsa... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/rsa” rsa.h => ../../include/openssl/rsa.h rsa_test.c => ../../test/rsa_test.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/rsa” making links in crypto/dsa... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/dsa” dsa.h => ../../include/openssl/dsa.h dsatest.c => ../../test/dsatest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/dsa” making links in crypto/ecdsa... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ecdsa” ecdsa.h => ../../include/openssl/ecdsa.h ecdsatest.c => ../../test/ecdsatest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ecdsa” making links in crypto/dh... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/dh” dh.h => ../../include/openssl/dh.h dhtest.c => ../../test/dhtest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/dh” making links in crypto/ecdh... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ecdh” ecdh.h => ../../include/openssl/ecdh.h ecdhtest.c => ../../test/ecdhtest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ecdh” making links in crypto/dso... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/dso” dso.h => ../../include/openssl/dso.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/dso” making links in crypto/engine... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/engine” engine.h => ../../include/openssl/engine.h enginetest.c => ../../test/enginetest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/engine” making links in crypto/buffer... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/buffer” buffer.h => ../../include/openssl/buffer.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/buffer” making links in crypto/bio... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/bio” bio.h => ../../include/openssl/bio.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/bio” making links in crypto/stack... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/stack” stack.h => ../../include/openssl/stack.h safestack.h => ../../include/openssl/safestack.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/stack” making links in crypto/lhash... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/lhash” lhash.h => ../../include/openssl/lhash.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/lhash” making links in crypto/rand... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/rand” rand.h => ../../include/openssl/rand.h randtest.c => ../../test/randtest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/rand” making links in crypto/err... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/err” err.h => ../../include/openssl/err.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/err” making links in crypto/evp... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/evp” evp.h => ../../include/openssl/evp.h evp_test.c => ../../test/evp_test.c evptests.txt -> ../../test/evptests.txt make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/evp” making links in crypto/asn1... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/asn1” asn1.h => ../../include/openssl/asn1.h asn1_mac.h => ../../include/openssl/asn1_mac.h asn1t.h => ../../include/openssl/asn1t.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/asn1” making links in crypto/pem... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/pem” pem.h => ../../include/openssl/pem.h pem2.h => ../../include/openssl/pem2.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/pem” making links in crypto/x509... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/x509” x509.h => ../../include/openssl/x509.h x509_vfy.h => ../../include/openssl/x509_vfy.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/x509” making links in crypto/x509v3... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/x509v3” x509v3.h => ../../include/openssl/x509v3.h v3nametest.c => ../../test/v3nametest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/x509v3” making links in crypto/conf... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/conf” conf.h => ../../include/openssl/conf.h conf_api.h => ../../include/openssl/conf_api.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/conf” making links in crypto/txt_db... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/txt_db” txt_db.h => ../../include/openssl/txt_db.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/txt_db” making links in crypto/pkcs7... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/pkcs7” pkcs7.h => ../../include/openssl/pkcs7.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/pkcs7” making links in crypto/pkcs12... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/pkcs12” pkcs12.h => ../../include/openssl/pkcs12.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/pkcs12” making links in crypto/comp... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/comp” comp.h => ../../include/openssl/comp.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/comp” making links in crypto/ocsp... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ocsp” ocsp.h => ../../include/openssl/ocsp.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ocsp” making links in crypto/ui... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ui” ui.h => ../../include/openssl/ui.h ui_compat.h => ../../include/openssl/ui_compat.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ui” making links in crypto/krb5... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/krb5” krb5_asn.h => ../../include/openssl/krb5_asn.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/krb5” making links in crypto/cms... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/cms” cms.h => ../../include/openssl/cms.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/cms” making links in crypto/pqueue... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/pqueue” pqueue.h => ../../include/openssl/pqueue.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/pqueue” making links in crypto/ts... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/ts” ts.h => ../../include/openssl/ts.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/ts” making links in crypto/srp... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/srp” srp.h => ../../include/openssl/srp.h srptest.c => ../../test/srptest.c make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/srp” making links in crypto/cmac... make[2]: 进入目录“/opt/redis/openssl-1.0.2/crypto/cmac” cmac.h => ../../include/openssl/cmac.h make[2]: 离开目录“/opt/redis/openssl-1.0.2/crypto/cmac” make[1]: 离开目录“/opt/redis/openssl-1.0.2/crypto” making links in ssl... make[1]: 进入目录“/opt/redis/openssl-1.0.2/ssl” ssl.h => ../include/openssl/ssl.h ssl2.h => ../include/openssl/ssl2.h ssl3.h => ../include/openssl/ssl3.h ssl23.h => ../include/openssl/ssl23.h tls1.h => ../include/openssl/tls1.h dtls1.h => ../include/openssl/dtls1.h kssl.h => ../include/openssl/kssl.h srtp.h => ../include/openssl/srtp.h ssltest.c => ../test/ssltest.c heartbeat_test.c => ../test/heartbeat_test.c make[1]: 离开目录“/opt/redis/openssl-1.0.2/ssl” making links in engines... make[1]: 进入目录“/opt/redis/openssl-1.0.2/engines” making links in engines/ccgost... make[2]: 进入目录“/opt/redis/openssl-1.0.2/engines/ccgost” make[2]: 对“links”无需做任何事。 make[2]: 离开目录“/opt/redis/openssl-1.0.2/engines/ccgost” make[1]: 离开目录“/opt/redis/openssl-1.0.2/engines” making links in apps... make[1]: 进入目录“/opt/redis/openssl-1.0.2/apps” make[1]: 对“links”无需做任何事。 make[1]: 离开目录“/opt/redis/openssl-1.0.2/apps” making links in test... make[1]: 进入目录“/opt/redis/openssl-1.0.2/test” make[1]: 对“links”无需做任何事。 make[1]: 离开目录“/opt/redis/openssl-1.0.2/test” making links in tools... make[1]: 进入目录“/opt/redis/openssl-1.0.2/tools” make[1]: 对“links”无需做任何事。 make[1]: 离开目录“/opt/redis/openssl-1.0.2/tools” generating dummy tests (if needed)... make[1]: 进入目录“/opt/redis/openssl-1.0.2/test” make[1]: 对“generate”无需做任何事。 make[1]: 离开目录“/opt/redis/openssl-1.0.2/test” Configured for linux-x86_64. [root@bogon openssl-1.0.2]
然后进行make操作,生成可执行文件。 完成后,看看当前的版本。openssl安装后,执行redis-trib还是报错。。。
到此为止,因为这个过程我反复尝试各种修正openssl的操作,都报错,应该是我的这个机器环境什么地方出问题了,不折腾这个了,既然redis配置的是集群的环境,那么,我在另外的一台机器上处理,应该也没有什么问题。
接下来的,配置操作是在10.90.7.2的服务器上进行的,一切换一种方式进行操作,这次主要是基于源码的安装。
源码安装ruby 2.4.2。从 http://www.ruby-lang.org/en/downloads/下载需要的版本。 解压后,进入ruby目录,分别进行./configure,./make, ./make install
查看版本信息,得到下面的内容,说明安装成功。
[root@localhost ~]# ruby -v ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
继续执行redis-trib.rb指令。
[root@localhost src]# ./redis-trib.rb --help /usr/local/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError) from /usr/local/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require' from ./redis-trib.rb:25:in `<main>'
这个错误和上面的基于yum安装的一个错误,缺少ruby版本的redis。依然下载源码安装。https://rubygems.org/downloads/redis-4.0.1.gem下载完毕后,用gem进行安装。
[root@localhost opt]# gem install redis-4.0.1.gem 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 opt]#
再次执行redis-trib指令,检查redis-trib是否可以操作集群。
[root@localhost src]# ./redis-trib.rb Usage: redis-trib <command> <options> <arguments ...> create host1:port1 ... hostN:portN --replicas <arg> check host:port info host:port fix host:port --timeout <arg> reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg> rebalance host:port --weight <arg> --auto-weights --use-empty-masters --timeout <arg> --simulate --pipeline <arg> --threshold <arg> add-node new_host:new_port existing_host:existing_port --slave --master-id <arg> del-node host:port node_id set-timeout host:port milliseconds call host:port command arg arg .. arg import host:port --from <arg> --copy --replace help (show this help) For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster. [root@localhost src]#
这次,说明redis的起集群的操作成功,下一步准备集群创建。
查看目前启动的几台redis机器信息(info)
[root@localhost src]# ./redis-trib.rb info 10.90.7.2:7001 [ERR] Sorry, can't connect to node 10.90.7.2:7001 [root@localhost src]# ./redis-trib.rb info 10.90.7.2:7000 10.90.7.2:7000 (54941737...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]# [root@localhost src]# ./redis-trib.rb info 10.90.7.2:7010 10.90.7.2:7010 (79ebc53a...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]# [root@localhost src]# ./redis-trib.rb info 10.90.7.10:7001 10.90.7.10:7001 (7fd72f31...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]# ./redis-trib.rb info 10.90.7.10:7011 10.90.7.10:7011 (d5a0fa35...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]# ./redis-trib.rb info 10.90.2.102:7002 10.90.2.102:7002 (8d539663...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]# ./redis-trib.rb info 10.90.2.102:7012 10.90.2.102:7012 (175061fa...) -> 0 keys | 0 slots | 0 slaves. [OK] 0 keys in 1 masters. 0.00 keys per slot on average. [root@localhost src]#
创建redis集群,通过redis-trib命令实现:
[root@localhost src]# ./redis-trib.rb create --replicas 1 10.90.7.2:7000 10.90.7.2:7010 10.90.7.10:7001 10.90.7.10:7011 10.90.2.102:7002 10.90.2.102:7012 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 10.90.7.2:7000 10.90.7.10:7001 10.90.2.102:7002 Adding replica 10.90.7.10:7011 to 10.90.7.2:7000 Adding replica 10.90.7.2:7010 to 10.90.7.10:7001 Adding replica 10.90.2.102:7012 to 10.90.2.102:7002 M: 549417379f072c2f9551c1e662fbf0ef3ecc73eb 10.90.7.2:7000 slots:0-5460 (5461 slots) master S: 79ebc53a5193dac898ec01fe2c5b0023990a379b 10.90.7.2:7010 replicates 7fd72f31bf4faaae4f30cec6ac8ae1ab9cdaa597 M: 7fd72f31bf4faaae4f30cec6ac8ae1ab9cdaa597 10.90.7.10:7001 slots:5461-10922 (5462 slots) master S: d5a0fa35859c40e8588bf8648e036ab152bcece7 10.90.7.10:7011 replicates 549417379f072c2f9551c1e662fbf0ef3ecc73eb M: 8d53966305162f6f0e53714f22e554a38f74d67b 10.90.2.102:7002 slots:10923-16383 (5461 slots) master S: 175061fa6addecc8eaaf9b999372a9d5a8964d44 10.90.2.102:7012 replicates 8d53966305162f6f0e53714f22e554a38f74d67b 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 10.90.7.2:7000) M: 549417379f072c2f9551c1e662fbf0ef3ecc73eb 10.90.7.2:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 79ebc53a5193dac898ec01fe2c5b0023990a379b 10.90.7.2:7010 slots: (0 slots) slave replicates 7fd72f31bf4faaae4f30cec6ac8ae1ab9cdaa597 S: d5a0fa35859c40e8588bf8648e036ab152bcece7 10.90.7.10:7011 slots: (0 slots) slave replicates 549417379f072c2f9551c1e662fbf0ef3ecc73eb M: 7fd72f31bf4faaae4f30cec6ac8ae1ab9cdaa597 10.90.7.10:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 8d53966305162f6f0e53714f22e554a38f74d67b 10.90.2.102:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 175061fa6addecc8eaaf9b999372a9d5a8964d44 10.90.2.102:7012 slots: (0 slots) slave replicates 8d53966305162f6f0e53714f22e554a38f74d67b [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
指令查看redis集群信息:
[root@localhost src]# ./redis-cli -c -h 10.90.7.2 -p 7000 10.90.7.2:7000> info # Server redis_version:3.2.8 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:6319bd4d85613682 redis_mode:cluster os:Linux 2.6.18-274.el5 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.1.2 process_id:29047 run_id:428293cc0d9842e0ba2f3917322a0deb136196ee tcp_port:7000 uptime_in_seconds:100413 uptime_in_days:1 hz:10 lru_clock:1399317 executable:/opt/redis-3.2.8/src/redis-server config_file:/opt/redis-3.2.8/tkcluster/7000.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:2418464 used_memory_human:2.31M used_memory_rss:3018752 used_memory_rss_human:2.88M used_memory_peak:2418464 used_memory_peak_human:2.31M total_system_memory:8263512064 total_system_memory_human:7.70G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:1.25 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1511347436 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:1 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_current_size:0 aof_base_size:0 aof_pending_rewrite:0 aof_buffer_length:0 aof_rewrite_buffer_length:0 aof_pending_bio_fsync:0 aof_delayed_fsync:0 # Stats total_connections_received:5 total_commands_processed:1349 instantaneous_ops_per_sec:1 total_net_input_bytes:102199 total_net_output_bytes:6045767 instantaneous_input_kbps:0.04 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:1 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:4132 migrate_cached_sockets:0 # Replication role:master connected_slaves:1 slave0:ip=10.90.7.10,port=7011,state=online,offset=1849,lag=1 master_repl_offset:1849 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1848 # CPU used_cpu_sys:0.09 used_cpu_user:0.11 used_cpu_sys_children:0.01 used_cpu_user_children:0.00 # Cluster cluster_enabled:1 # Keyspace 10.90.7.2:7000>
在10.90.7.2上设置一个数据:
10.90.7.2:7000> set hello 1 OK 10.90.7.2:7000> get hello "1"
查看一下集群的信息点:
10.90.7.2:7000> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_sent:15335 cluster_stats_messages_received:15335
从另外一个主机上,测试看看:
[root@bogon src]# ./redis-cli -c -h 10.90.7.10 -p 7001 10.90.7.10:7001> info # Server redis_version:3.2.8 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:b50c19b6d7e8c0c8 redis_mode:cluster os:Linux 3.10.0-229.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.3 process_id:40885 run_id:5b03ae96c0af7156d9ee0fae9ab96f9c56c7f6b7 tcp_port:7001 uptime_in_seconds:98920 uptime_in_days:1 hz:10 lru_clock:1399401 executable:/opt/redis/redis-3.2.8/src/redis-server config_file:/opt/redis/redis-3.2.8/tkcluster/7001.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:2418496 used_memory_human:2.31M used_memory_rss:10039296 used_memory_rss_human:9.57M used_memory_peak:2418496 used_memory_peak_human:2.31M total_system_memory:33450364928 total_system_memory_human:31.15G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:4.15 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1511347221 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:1 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_current_size:0 aof_base_size:0 aof_pending_rewrite:0 aof_buffer_length:0 aof_rewrite_buffer_length:0 aof_pending_bio_fsync:0 aof_delayed_fsync:0 # Stats total_connections_received:5 total_commands_processed:1647 instantaneous_ops_per_sec:0 total_net_input_bytes:115303 total_net_output_bytes:6128379 instantaneous_input_kbps:0.02 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:1 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:789 migrate_cached_sockets:0 # Replication role:master connected_slaves:1 slave0:ip=10.90.7.2,port=7010,state=online,offset=2255,lag=1 master_repl_offset:2255 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:2254 # CPU used_cpu_sys:35.23 used_cpu_user:19.00 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Cluster cluster_enabled:1 # Keyspace 10.90.7.10:7001> info # Server redis_version:3.2.8 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:b50c19b6d7e8c0c8 redis_mode:cluster os:Linux 3.10.0-229.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.3 process_id:40885 run_id:5b03ae96c0af7156d9ee0fae9ab96f9c56c7f6b7 tcp_port:7001 uptime_in_seconds:98926 uptime_in_days:1 hz:10 lru_clock:1399407 executable:/opt/redis/redis-3.2.8/src/redis-server config_file:/opt/redis/redis-3.2.8/tkcluster/7001.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:2418496 used_memory_human:2.31M used_memory_rss:10039296 used_memory_rss_human:9.57M used_memory_peak:2418496 used_memory_peak_human:2.31M total_system_memory:33450364928 total_system_memory_human:31.15G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:4.15 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1511347221 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:1 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_current_size:0 aof_base_size:0 aof_pending_rewrite:0 aof_buffer_length:0 aof_rewrite_buffer_length:0 aof_pending_bio_fsync:0 aof_delayed_fsync:0 # Stats total_connections_received:5 total_commands_processed:1655 instantaneous_ops_per_sec:1 total_net_input_bytes:115576 total_net_output_bytes:6130809 instantaneous_input_kbps:0.04 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:1 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:789 migrate_cached_sockets:0 # Replication role:master connected_slaves:1 slave0:ip=10.90.7.2,port=7010,state=online,offset=2269,lag=0 master_repl_offset:2269 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:2268 # CPU used_cpu_sys:35.23 used_cpu_user:19.00 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Cluster cluster_enabled:1 # Keyspace 10.90.7.10:7001> get hello -> Redirected to slot [866] located at 10.90.7.2:7000 "1" 10.90.7.2:7000>
选择database的操作:
10.90.7.2:7000> select 0 OK 10.90.7.2:7000> select 1 (error) ERR SELECT is not allowed in cluster mode 10.90.7.2:7000>
特别说明,redis集群下,不支持database的非0的选择,其实是不支持select指令了,但是对于默认的database 0又默认支持。有点设计的不美妙!
另外,备注:集群环境下,不支持slaveof的配置,即配置文件里面,不能启动slaveof的配置。否则如我开始没有注意到这个,将conf文件中的slaveof指定了。就出现下面的错误。
[root@localhost tkcluster]# ./stcluster.sh status from 7010: 0 *** FATAL CONFIG FILE ERROR *** Reading the configuration file, at line 265 >>> 'slaveof 10.90.7.2 7010' slaveof directive not allowed in cluster mode status from 7011: 1 [root@localhost tkcluster]#
OK,到此,redis的集群环境搭建到此结束,成功完成!