一、 安装环境信息
Linux 操作系统: centos 6.1
Redis版本:redis-4.0.6.tar.gz
本案例使用到时一台服务器搭建3主3从到redis集群服务
二、redis 集群配置说明:
1、redis安装前面的章节已经讲过,这就不在说明,不懂可以看前面到章节
2、在/usr/local 目录下创建redis-cluster目录
# 创建redis-cluster目录存放redis集群到配置信息
[root@zero local]# mkdir redis-cluster
#在redis-cluster下创建6个文件夹,为区分用端口命名
[root@zero local]# cd redis-cluster/
[root@zero redis-cluster]# cd 6380 6381 6382 6383 6384 6385
#拷贝redis下到redis.conf 配置文件到6380目录下
[root@zero local]# cp redis/redis.conf redis-cluster/6380/
#修改6380配置文件信息
[root@zero local]# vi redis-cluster/6380/redis.conf
#修改以下配置信息
port 6380 #端口6380,6381,6382,6383,6384,6385
daemonize yes #redis后台运行
protected-model no #redis 2.8版本以后需要修改成no 不受保护
cluster-enabled yes #开启集群
cluster-config-file node-6380.conf #集群配置信息,开启集群后自动生成
cluster-node-timeout 5000 #请求超时时长
appendonly yes #开启aof日志,它会每次写操作都记录一条日志
bind 192.168.2.173 #默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
pidfile /opt/module/redis-cluster/6380/redis_6380.pid #pidfile文件对应6380,6381,6382,6383,6384,6385
dir /usr/local/redis-cluster/6380/ #数据文件存放位置对应6380,6381,6382,6383,6384,6385
3、拷贝6380节点下到redis.conf配置文件到相应到6381,6382,6383,6384,6385目录下
#拷贝配置文件
[root@zero local]# cp redis-cluster/6380/redis.conf redis-cluster/6381/
#在使用全局复制命令,将端口修改成相应到端口号
[root@zero local]# vi redis-cluster/6381/redis.conf
#在修改到配置文件末尾
:%s/6380/6381/g
# 即可替换6380端口为6381端口 最后:wq保存文件
重复3步骤将剩下到配置文件配置完成即可
4、启动redis节点服务
#启动节点服务
[root@zero local]# ./redis/src/redis-server redis-cluster/6381/redis.conf && ./redis/src/redis-server redis-cluster/6382/redis.conf && ./redis/src/redis-server redis-cluster/6383/redis.conf && ./redis/src/redis-server redis-cluster/6384/redis.conf && ./redis/src/redis-server redis-cluster/6385/redis.conf && ./redis/src/redis-server redis-cluster/6380/redis.conf
510:C 10 Jul 10:52:46.802 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
510:C 10 Jul 10:52:46.802 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=510, just started
510:C 10 Jul 10:52:46.802 # Configuration loaded
512:C 10 Jul 10:52:46.813 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
512:C 10 Jul 10:52:46.813 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=512, just started
512:C 10 Jul 10:52:46.813 # Configuration loaded
514:C 10 Jul 10:52:46.864 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
514:C 10 Jul 10:52:46.864 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=514, just started
514:C 10 Jul 10:52:46.864 # Configuration loaded
522:C 10 Jul 10:52:46.945 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
522:C 10 Jul 10:52:46.945 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=522, just started
522:C 10 Jul 10:52:46.945 # Configuration loaded
530:C 10 Jul 10:52:46.998 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
530:C 10 Jul 10:52:46.998 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=530, just started
530:C 10 Jul 10:52:46.998 # Configuration loaded
532:C 10 Jul 10:52:47.014 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
532:C 10 Jul 10:52:47.014 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=532, just started
532:C 10 Jul 10:52:47.015 # Configuration loaded
#查看节点服务启动情况
[root@zero local]# ps -ef|grep redis
root 511 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6381 [cluster]
root 513 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6382 [cluster]
root 521 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6383 [cluster]
root 523 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6384 [cluster]
root 531 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6385 [cluster]
root 533 1 0 10:52 ? 00:00:00 ./redis/src/redis-server *:6380 [cluster]
root 541 3739 0 10:52 pts/0 00:00:00 grep redis
可以看出reids节点服务已经全部启动
5、创建集群
1)redis安装目录src中redis-trib.rb完成集群创建,redis-trib.rb命令需要安装gem redis模块才能运行,gem redis需要Ruby环境
备注:直接使用yum install ruby 安装到版本是1.8.7.374-5.el6 ,在执行gem install redis时候提示[root
ERROR: Error installing redis:
redis requires Ruby version >= 2.3.0.
需要当前版本或以上到版本才能使用
2) 需要提前安装gcc插件才能使用:yum -y install gcc
3)Ruby离线安装:官网下载:http://www.ruby-lang.org/en/downloads/ 最新的版本为ruby-2.3.8 版本
4)解压当前到ruby:tar -zxvf ruby-2.3.8.tar.gz
# 解压
drwxr-xr-x. 25 1035 1035 4096 Oct 17 2018 ruby-2.3.8
-rwxrw-rw-. 1 root root 17858806 Jul 4 17:47 ruby-2.3.8.tar.gz
#安装
[root@zero tools]# cd ruby-2.3.8
[root@zero ruby-2.3.8]# ./configure
# 出现如下界面
checking whether wrapper for LD_LIBRARY_PATH is needed... no
checking for __builtin_setjmp... yes with cast ()
checking for setjmp type... __builtin_setjmp
checking for prefix of external symbols... NONE
checking pthread.h usability... yes
checking pthread.h presence... yes
checking for pthread.h... yes
checking if make is GNU make... yes
checking for nroff... /usr/bin/nroff
.ext/include/x86_64-linux/ruby/config.h updated
configure: ruby library version = 2.3.0
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating Makefile
config.status: creating ruby-2.3.pc
# 执行如下命令
[root@zero ruby-2.3.8]# make && make install
installing default gems: /usr/local/lib/ruby/gems/2.3.0 (build_info, cache, doc, extensions, gems, specifications)
bigdecimal 1.2.8
io-console 0.4.5
json 1.8.3.1
psych 2.1.0.1
rdoc 4.2.1
installing bundle gems: /usr/local/lib/ruby/gems/2.3.0 (build_info, cache, doc, extensions, gems, specifications)
rake 10.4.2
minitest 5.8.5
test-unit 3.1.5
did_you_mean 1.0.0
power_assert 0.2.6
net-telnet 0.1.1
installing rdoc: /usr/local/share/ri/2.3.0/system
installing capi-docs: /usr/local/share/doc/ruby
# 通过gem install redis 搭建redis集群出现如下错误
[root@zero ruby-2.3.8]# gem install redis
ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
#解决方法
#首先安装zlib库
[root@zero ruby-2.3.8]# yum install zlib-devel
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.cn99.com
* updates: mirrors.163.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package zlib-devel.x86_64 0:1.2.3-29.el6 will be installed
--> Processing Dependency: zlib = 1.2.3-29.el6 for package: zlib-devel-1.2.3-29.el6.x86_64
--> Running transaction check
---> Package zlib.x86_64 0:1.2.3-25.el6 will be updated
---> Package zlib.x86_64 0:1.2.3-29.el6 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
zlib-devel x86_64 1.2.3-29.el6 base 44 k
Updating for dependencies:
zlib x86_64 1.2.3-29.el6 base 73 k
Transaction Summary
================================================================================
Install 1 Package(s)
Upgrade 1 Package(s)
Total download size: 117 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): zlib-1.2.3-29.el6.x86_64.rpm | 73 kB 00:00
(2/2): zlib-devel-1.2.3-29.el6.x86_64.rpm | 44 kB 00:00
--------------------------------------------------------------------------------
Total 342 kB/s | 117 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : zlib-1.2.3-29.el6.x86_64 1/3
Installing : zlib-devel-1.2.3-29.el6.x86_64 2/3
Cleanup : zlib-1.2.3-25.el6.x86_64 3/3
Installed:
zlib-devel.x86_64 0:1.2.3-29.el6
Dependency Updated:
zlib.x86_64 0:1.2.3-29.el6
Complete!
集成zlib库到Ruby环境
# 进入到相关目录
[root@zero ruby-2.3.8]# cd ext/zlib/
[root@zero zlib]# ruby extconf.rb
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for crc32_combine() in zlib.h... yes
checking for adler32_combine() in zlib.h... yes
checking for z_crc_t in zlib.h... no
creating Makefile
[root@zero zlib]# make
compiling zlib.c
linking shared-object zlib.so
[root@zero zlib]# make install
/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/2.3.0/x86_64-linux
[root@zero zlib]# gem install redis
ERROR: While executing gem ... (Gem::Exception)
Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
[root@zero zlib]#
#解决方案
[root@zero zlib]# yum install openssl-devel -y
#上一步执行完成,如下操作
[root@zero ext]# cd openssl/
[root@zero openssl]# ruby ./extconf.rb
checking for CRYPTO_THREADID.ptr in openssl/crypto.h... yes
checking for EVP_CIPHER_CTX.flags in openssl/evp.h... yes
checking for EVP_CIPHER_CTX.engine in openssl/evp.h... yes
checking for X509_ATTRIBUTE.single in openssl/x509.h... yes
checking for OPENSSL_FIPS in openssl/opensslconf.h... yes
checking for EVP_CTRL_GCM_GET_TAG in openssl/evp.h... yes
creating extconf.h
creating Makefile
#编辑Makefile文件
[root@zero openssl]# vi Makefile
#在最上边添加 top_srcdir = ../.. 设置
# 执行make install
[root@zero openssl]# gem install redis
Fetching: redis-4.1.2.gem (100%)
Successfully installed redis-4.1.2
Parsing documentation for redis-4.1.2
Installing ri documentation for redis-4.1.2
Done installing documentation for redis after 1 seconds
1 gem installed
# 出现以上结果说明成功
集成redis
[root@zero local]# ./redis/src/redis-trib.rb create --replicas 1 192.168.2.173:6380 192.168.2.173:6381 192.168.2.173:6382 192.168.2.173:6383 192.168.2.173:6384 192.168.2.173:6385
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.2.173:6380
192.168.2.173:6381
192.168.2.173:6382
Adding replica 192.168.2.173:6383 to 192.168.2.173:6380
Adding replica 192.168.2.173:6384 to 192.168.2.173:6381
Adding replica 192.168.2.173:6385 to 192.168.2.173:6382
M: 269e2d9e8fb646c5e8f5c63d29693a3614826ad5 192.168.2.173:6380
slots:0-5460 (5461 slots) master
M: add3dc9c44ef41a9c194e92d91e1930443ddf001 192.168.2.173:6381
slots:5461-10922 (5462 slots) master
M: 940b350d48605c515b6ec845e93af6ea0766163e 192.168.2.173:6382
slots:10923-16383 (5461 slots) master
S: 742a925513303a4eb7259975dfdee2f5fdb319dc 192.168.2.173:6383
replicates 269e2d9e8fb646c5e8f5c63d29693a3614826ad5
S: 33838395f6dc806cb9e204b4d0e03b72dbca4cd5 192.168.2.173:6384
replicates add3dc9c44ef41a9c194e92d91e1930443ddf001
S: 0142a4e22483ccfb9b217c4af298c42861ac0a7c 192.168.2.173:6385
replicates 940b350d48605c515b6ec845e93af6ea0766163e
Can I set the above configuration? (type 'yes' to accept): y
*** Aborting...
[root@zero local]# ./redis/src/redis-trib.rb create --replicas 1 192.168.2.173:6380 192.168.2.173:6381 192.168.2.173:6382 192.168.2.173:6383 192.168.2.173:6384 192.168.2.173:6385>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.2.173:6380
192.168.2.173:6381
192.168.2.173:6382
Adding replica 192.168.2.173:6383 to 192.168.2.173:6380
Adding replica 192.168.2.173:6384 to 192.168.2.173:6381
Adding replica 192.168.2.173:6385 to 192.168.2.173:6382
M: 269e2d9e8fb646c5e8f5c63d29693a3614826ad5 192.168.2.173:6380
slots:0-5460 (5461 slots) master
M: add3dc9c44ef41a9c194e92d91e1930443ddf001 192.168.2.173:6381
slots:5461-10922 (5462 slots) master
M: 940b350d48605c515b6ec845e93af6ea0766163e 192.168.2.173:6382
slots:10923-16383 (5461 slots) master
S: 742a925513303a4eb7259975dfdee2f5fdb319dc 192.168.2.173:6383
replicates 269e2d9e8fb646c5e8f5c63d29693a3614826ad5
S: 33838395f6dc806cb9e204b4d0e03b72dbca4cd5 192.168.2.173:6384
replicates add3dc9c44ef41a9c194e92d91e1930443ddf001
S: 0142a4e22483ccfb9b217c4af298c42861ac0a7c 192.168.2.173:6385
replicates 940b350d48605c515b6ec845e93af6ea0766163e
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.2.173:6380)
M: 269e2d9e8fb646c5e8f5c63d29693a3614826ad5 192.168.2.173:6380
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: add3dc9c44ef41a9c194e92d91e1930443ddf001 192.168.2.173:6381
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 742a925513303a4eb7259975dfdee2f5fdb319dc 192.168.2.173:6383
slots: (0 slots) slave
replicates 269e2d9e8fb646c5e8f5c63d29693a3614826ad5
M: 940b350d48605c515b6ec845e93af6ea0766163e 192.168.2.173:6382
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 33838395f6dc806cb9e204b4d0e03b72dbca4cd5 192.168.2.173:6384
slots: (0 slots) slave
replicates add3dc9c44ef41a9c194e92d91e1930443ddf001
S: 0142a4e22483ccfb9b217c4af298c42861ac0a7c 192.168.2.173:6385
slots: (0 slots) slave
replicates 940b350d48605c515b6ec845e93af6ea0766163e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@zero local]#
集群测试
# 集群客户端连接方式 redis-cli -c
[root@zero local]# ./redis/src/redis-cli -c -p 6380
127.0.0.1:6380> set aaa avalue
-> Redirected to slot [10439] located at 192.168.2.173:6381
OK
192.168.2.173:6381> get aaa
"avalue"
192.168.2.173:6381>
#切换客户端读取值
[root@zero local]# ./redis/src/redis-cli -c -p 6383
127.0.0.1:6383> get aaa
-> Redirected to slot [10439] located at 192.168.2.173:6381
"avalue"
192.168.2.173:6381>
不加-c会报错如下
[root@zero local]# ./redis/src/redis-cli -p 6383
127.0.0.1:6383> get aaa
(error) MOVED 10439 192.168.2.173:6381
127.0.0.1:6383>
查看当前集群主从关系
[root@zero local]# redis/src/redis-cli cluster nodes | grep master
Could not connect to Redis at 127.0.0.1:6379: Connection refused
[root@zero local]# redis/src/redis-cli -p 6380 cluster nodes | grep master
add3dc9c44ef41a9c194e92d91e1930443ddf001 192.168.2.173:6381@16381 master - 0 1562749258000 2 connected 5461-10922
940b350d48605c515b6ec845e93af6ea0766163e 192.168.2.173:6382@16382 master - 0 1562749260621 3 connected 10923-16383
269e2d9e8fb646c5e8f5c63d29693a3614826ad5 192.168.2.173:6380@16380 myself,master - 0 1562749257000 1 connected 0-5460
[root@zero local]# redis/src/redis-cli -p 6380 cluster nodes | grep slave
742a925513303a4eb7259975dfdee2f5fdb319dc 192.168.2.173:6383@16383 slave 269e2d9e8fb646c5e8f5c63d29693a3614826ad5 0 1562749303796 4 connected
33838395f6dc806cb9e204b4d0e03b72dbca4cd5 192.168.2.173:6384@16384 slave add3dc9c44ef41a9c194e92d91e1930443ddf001 0 1562749302795 5 connected
0142a4e22483ccfb9b217c4af298c42861ac0a7c 192.168.2.173:6385@16385 slave 940b350d48605c515b6ec845e93af6ea0766163e 0 1562749301791 6 connected
验证故障转移
# 杀掉6380 端口redis进程
18479:S 10 Jul 17:21:56.961 # Connection with master lost.
18479:S 10 Jul 17:21:56.961 * Caching the disconnected master state.
18479:S 10 Jul 17:21:57.352 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:21:57.352 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:21:57.352 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:21:58.357 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:21:58.358 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:21:58.358 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:21:59.363 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:21:59.363 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:21:59.364 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:00.369 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:00.369 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:00.370 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:01.375 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:01.375 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:01.376 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:02.379 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:02.380 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:02.380 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:03.385 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:03.385 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:03.385 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:04.389 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:04.389 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:04.389 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:05.391 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:05.392 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:05.392 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:06.395 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:06.396 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:06.396 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:07.399 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:07.401 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:07.402 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:08.406 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:08.406 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:08.406 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:09.409 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:09.409 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:09.409 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:10.413 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:10.413 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:10.414 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:11.419 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:11.419 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:11.420 # Error condition on socket for SYNC: Connection refused
18472:M 10 Jul 17:22:12.266 * Marking node f787c39d0bf8e98278b276863524c93da9387363 as failing (quorum reached).
18472:M 10 Jul 17:22:12.267 # Cluster state changed: fail
18489:S 10 Jul 17:22:12.268 * FAIL message received from bbbe8f8d4a45cf0d7c99613932f667affa7867b9 about f787c39d0bf8e98278b276863524c93da9387363
18474:M 10 Jul 17:22:12.269 * Marking node f787c39d0bf8e98278b276863524c93da9387363 as failing (quorum reached).
18474:M 10 Jul 17:22:12.269 # Cluster state changed: fail
18489:S 10 Jul 17:22:12.269 # Cluster state changed: fail
18487:S 10 Jul 17:22:12.272 * FAIL message received from bbbe8f8d4a45cf0d7c99613932f667affa7867b9 about f787c39d0bf8e98278b276863524c93da9387363
18487:S 10 Jul 17:22:12.272 # Cluster state changed: fail
18479:S 10 Jul 17:22:12.274 * FAIL message received from 6a573e5464bb35c092e30045d9d9776eaf7a8757 about f787c39d0bf8e98278b276863524c93da9387363
18479:S 10 Jul 17:22:12.274 # Cluster state changed: fail
18479:S 10 Jul 17:22:12.324 # Start of election delayed for 531 milliseconds (rank #0, offset 252).
18479:S 10 Jul 17:22:12.425 * Connecting to MASTER 192.168.2.173:6380
18479:S 10 Jul 17:22:12.425 * MASTER <-> SLAVE sync started
18479:S 10 Jul 17:22:12.425 # Error condition on socket for SYNC: Connection refused
18479:S 10 Jul 17:22:12.928 # Starting a failover election for epoch 7.
18472:M 10 Jul 17:22:12.935 # Failover auth granted to afbf0d94658b127209ae9efbd8264266aa9be734 for epoch 7
18474:M 10 Jul 17:22:12.936 # Failover auth granted to afbf0d94658b127209ae9efbd8264266aa9be734 for epoch 7
18479:S 10 Jul 17:22:12.936 # Failover election won: I'm the new master.
18479:S 10 Jul 17:22:12.937 # configEpoch set to 7 after successful failover
18479:M 10 Jul 17:22:12.937 # Setting secondary replication ID to b76187f820013062bbff5373a457c3a077d52878, valid up to offset: 253. New replication ID is d4c7e518a47a412e5e28e7b39ce1b9dd21bfc687
18479:M 10 Jul 17:22:12.937 * Discarding previously cached master state.
18479:M 10 Jul 17:22:12.937 # Cluster state changed: ok
18487:S 10 Jul 17:22:12.976 # Cluster state changed: ok
18472:M 10 Jul 17:22:12.978 # Cluster state changed: ok
18489:S 10 Jul 17:22:12.979 # Cluster state changed: ok
18474:M 10 Jul 17:22:12.980 # Cluster state changed: ok
# 重新查看进程状态
[root@zero local]# redis/src/redis-cli -p 6381 cluster nodes | grep master
f787c39d0bf8e98278b276863524c93da9387363 192.168.2.173:6380@16380 master,fail - 1562750517054 1562750514244 1 disconnected
6a573e5464bb35c092e30045d9d9776eaf7a8757 192.168.2.173:6382@16382 master - 0 1562750611658 3 connected 10923-16383
bbbe8f8d4a45cf0d7c99613932f667affa7867b9 192.168.2.173:6381@16381 myself,master - 0 1562750612000 2 connected 5461-10922
afbf0d94658b127209ae9efbd8264266aa9be734 192.168.2.173:6383@16383 master - 0 1562750613667 7 connected 0-5460
[root@zero local]# redis/src/redis-cli -p 6381 cluster nodes | grep slave
86d0ef4b5fbceb783f3f75390bd395ee87e5cbb5 192.168.2.173:6385@16385 slave 6a573e5464bb35c092e30045d9d9776eaf7a8757 0 1562750645000 6 connected
70d733b907e8afb4f19f6155d073b5c3adce7ff9 192.168.2.173:6384@16384 slave bbbe8f8d4a45cf0d7c99613932f667affa7867b9 0 1562750644000 5 connected
[root@zero local]#
#6383由原来到slave 升级为现在到master
Redis配置说明
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf,配置项说明如下:
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,
port 6379
4. 绑定的主机地址
bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
12. 指定本地数据库存放目录
dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
14. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf