redis3.x集群的搭建

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,7005bind 后面加的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


分别对应的6个配置文件的6个redis服务


3.查看服务是否已经启动

ps -ef|grep redis


6个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文件


缺少rubgems文件

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 ***

http://gems.ruby-china.org/

说明更换镜像源成功。

6)再次执行gem install redis 可能会出现如下错误


ruby版本过低错误提示

解决方案如下:

查了查资料,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


安装替换为2.3.3版本ruby成功

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


进入redis内部集群配置界面


此串字母数字为此节点在集群中的唯一ID    

输入yes,接受其配置后。


redis集群配置成功

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



redis集群各节点信息

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342