Redis3.x版本中加入了对集群的支持,其中包括sharding分片,支持master slave,支持atuo failover 自动故障切换。最主要的区别于早期3.x版本之前的是内部支持了atuo failover,当主机宕机后,备机会自动顶上变成主机。
HashSolt(哈希槽)
其中引入了HashSolt(哈希槽)的概念,即在集群搭建中,redis集群内部会自动地给集群中的各个redis节点均匀分配总量为16384个长度的槽位。
好处:
1. 加快了查询的效率。
2. 槽的使用和转移,易于集群的拓展。当集群中的节点增加时,需要把原来存在其他节点上的众多数据分给新加的节点,从而达到增加节点优化的优化的效果,而槽的使用就能够更容易的转移数据。
搭建集群步骤
1.修改配置文件,在本机开启6个redis(3个主机,3个备机),并开启服务。
配置文件修改项如下:(其中的port应该为6个不同项,本次试验端口号为7000,7001,7002,7003,7004,7005,bind 后面加的ip为本机IP地址)
port 7000
bind 192.168.8.150
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
修改好redis.conf 配置文件之后,复制到自定义的 /usr/local/redisCluster/ 目录下分别创建好的7000,7001,7002,7003,7004,7005目录下并更改文件名,易于区分。
创建一个redisCluster目录下再分别创建6个目录名为不同端口号的目录用于存储不同的redis配置文件
cp redis.conf /usr/local/redisCluster/7000/7000.conf
cp redis.conf /usr/local/redisCluster/7001/7001.conf
cp redis.conf /usr/local/redisCluster/7002/7002.conf
cp redis.conf /usr/local/redisCluster/7003/7003.conf
cp redis.conf /usr/local/redisCluster/7004/7004.conf
cp redis.conf /usr/local/redisCluster/7005/7005.conf
之后,分别更改对应的配置文件中的端口号为7000,7001,7002,7003,7004,7005
2.分别启动6个redis的服务
cd /usr/local/redisCluster/
cd 7000
redis-server 7000.conf
cd ../7001
redis-server 7001.conf
cd ../7002
redis-server 7002.conf
cd ../7003
redis-server 7003.conf
cd ../7004
redis-server 7004.conf
cd ../7005
redis-server 7005.conf
3.查看服务是否已经启动
ps -ef|grep redis
其中红框标注的是cluster集群标示,说明集群模式已经启动。
4.执行redis的创建集群命令创建集群
1)进入redis安装目录的src目录下
cd/usr/local/redis/src
2)执行创建集群命令
./redis-trib.rb create --replicas 1 192.168.8.150:7000 192.168.8.150:7001 192.168.8.150:7002 192.168.8.150:7003 192.168.8.150:7004 192.168.8.150:7005
此开启集群命令需要使用ruby的支持,所以先安装ruby的环境,否则会报错说缺少ruby支持文件
安装ruby
yum install ruby
3)执行之后发现,没有rubygems文件
4)使用安装rubygems命令
yum install rubygems
安装后再次执行,发现又报少一个文件,错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in`gem_original_require': no such file to load -- redis (LoadError) from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from ./redis-trib.rb:25
5)此错误提示为不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装
使用命令:
gem install redis
但是, 执行上面的命令后发现并没有什么反应,由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败。添加淘宝的gem源。
解决方案:
a)首先移除掉rubygems.org
使用gem源查看命令,查看是哪一个源
gem source -l
如果为http://rubygems.org/,那么就先移除该源,跟换可以访问的源。移除时需注意网址应一致(如:http和https的区别)
gem sources --remove http://rubygems.org/
然后换用淘宝镜源
gem sources -a https://ruby.taobao.org/
此时会出现错误提示如下
Error fetching https://ruby.taobao.org/:
SSL_connect returned=1 errno=0 state=SSLv3read server certificate B: certificate verify failed (https://rubygems-china.oss-cn-hangzhou.aliyuncs.com/specs.4.8.gz)
发现原来是taobao Gems 源已停止维护,现由 ruby-china 提供镜像服务,即我们要换源:http://gems.ruby-china.org/
gem sources -a http://gems.ruby-china.org/
注意:这里是http而不是https,如果你发现出错了,请检查下这里。
安装好后用 gem sources -l 检查当前SOURCES列表:
*** CURRENT SOURCES ***
说明更换镜像源成功。
6)再次执行gem install redis 可能会出现如下错误
解决方案如下:
查了查资料,CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,自己编译的ruby源码,再执行还是报错…
采用rvm来更新ruby ,安装RVM命令:
gpg2 --keyserver hkp://keys.gnupg.net--recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
find / -name rvm –print
source /usr/local/rvm/scripts/rvm
查看rvm库中已知的ruby版本
rvm list known
安装一个ruby版本
rvm install 2.3.3
使用一个ruby版本
rvm use 2.3.3
设置默认版本
rvm use 2.3.3 –default
卸载一个已知版本
rvm remove 2.0.0
查看ruby版本:
ruby –version
再继续安装这个redis接口
gem install redis
7)此时再次在redis安装目录下src目录下执行搭建集群命令
./redis-trib.rb create --replicas 1 192.168.8.150:7000 192.168.8.150:7001 192.168.8.150:7002
192.168.8.150:7003 192.168.8.150:7004 192.168.8.150:7005
成功结果如下,红色标注为分配的hashsolt
输入yes,接受其配置后。
redis自动把16384个槽给均匀分配开了,说明集群搭建成功。
8)查看集群状态,看是否已经搭建完成。
使用命令:
redis-cli -c -h 192.168.8.150 -p 7000 cluster nodes
执行信息如下:
[root@server src]# redis-cli -c -h 192.168.8.150 -p 7000
cluster nodes
4c8f74d896f0b550ae41211e04d5d4fbe44b2bd3192.168.8.150:7001master - 0 1514650927177 2connected 5795-10922
7e21d69e8038185ea0a419fccfdeed99e7a6fdcb192.168.8.150:7005 master - 0 1514650926169 8connected 11256-16383
68f45e1b0c4832b6681565a8ddfcdb5195b7b1bd192.168.8.150:7004 slave 4c8f74d896f0b550ae41211e04d5d4fbe44b2bd30 1514650927682 5 connected
e4922caef55cca4793c16a1767c42602ca8cdb3b192.168.8.150:7003 master - 0 1514650927177 7connected 333-5460
b15e99ebcbcffc1f221412716ee33b03c45a3e3b192.168.8.150:7000 myself,slave e4922caef55cca4793c16a1767c42602ca8cdb3b0 0 1 connected
82002358e7805a0151bcf63e6fb7255ad4b3d3a3192.168.8.150:7006 master - 0 1514650926169 9 connected 0-332 5461-579410923-11255
5289466e00cdb535512a3d4d4208b619f3313878192.168.8.150:7002 slave 7e21d69e8038185ea0a419fccfdeed99e7a6fdcb0 1514650927682 8 connected
9)在集群中存储数据
1.首先进入redis 的客户端,任意一个即可
使用命令:
redis-cli -h 192.168.8.150 -p 7000 –c
注意事项:
1) 其中-h 后面的主机名地址为redis的配置文件中绑定的ip地址,否则会无法连接相应的服务端。
如果没有指定ip,本地默认的本机ip为127.0.0.1,此时就会出现,无法连接到ip为127.0.0.1的服务端的错误。
出现如下错误:
[root@server 7000]#redis-cli -p 7000 -c
Could not connect toRedis at 127.0.0.1:7000: Connection refused
Could not connect to
Redis at 127.0.0.1:7000: Connection refused
所以要么更改本机的默认本地ip,要么登录连接时指定主机ip为配置文件中bind后的ip地址
使用命令:
redis-cli -h 192.168.8.150 -p 7000 –c
2) 其中命令后面应添加–c ,采取集群模式进行操作。
如果不添加–c 那么会出现如下错误:
[root@server 7000]# redis-cli -h192.168.8.150 -p 7000
192.168.8.150:7000> keys *
(empty list or set)
192.168.8.150:7000> sethxhaaj 'hhh'
(error) MOVED 2124
192.168.8.150:7003
造成无法存储的现象。
2. 正确使用命令后:
[root@server 7000]# redis-cli -h 192.168.8.150 -p 7000 -c
192.168.8.150:7000> set a 1
->Redirected to slot [15495] located at192.168.8.150:7005
OK
192.168.8.150:7005> get a
"1"
现象:redis内部会自动的在这几个节点之间随机存储,取数据时,会自动跳到该节点进行取,方式没有任何改变,redis内部自主实现。
命令:info
描述了当前服务器集群的状态。
192.168.8.150:7000> info
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3d43e53feb34660a
redis_mode:cluster
os:Linux 2.6.32-358.el6.i686i686
arch_bits:32
multiplexing_api:epoll
gcc_version:4.4.7
process_id:3537
run_id:657c74a6c2db9c1d83b8454e954c07d3b85b430c
tcp_port:7000
uptime_in_seconds:75518
uptime_in_days:0
hz:10
lru_clock:4685395
executable:/usr/local/redisCluster/7000/redis-server
config_file:/usr/local/redisCluster/7000/7000.conf
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:899680
used_memory_human:878.59K
used_memory_rss:2318336
used_memory_rss_human:2.21M
used_memory_peak:1952044
used_memory_peak_human:1.86M
total_system_memory:1394896896
total_system_memory_human:1.30G
used_memory_lua:25600
used_memory_lua_human:25.00K
maxmemory:3221225472
maxmemory_human:3.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.58
mem_allocator:libc
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1514559784
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:0
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:7
total_commands_processed:27672
instantaneous_ops_per_sec:0
total_net_input_bytes:972181
total_net_output_bytes:26092395
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.05
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:219
migrate_cached_sockets:0
# Replication
role:slave
master_host:192.168.8.150
master_port:7003
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:104232
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:31416
# CPU
used_cpu_sys:184.04
used_cpu_user:29.15
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:1
# Keyspace