redis cluster
(1)自动将数据进行分片,每个master上放一部分数据
(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的
redis cluster不用一致性hash,而是使用hash slots来替代。
为了实现效果:实现了读写分离(master-slave),高可用(redis-cluster本身的特性),多个master协同(水平扩容)。做如下试验:
在三台虚拟机上启动6个redis实例,3个为master,3个为slave
1),编写配置文件
redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,
3个master,3个slave
3台虚拟机去搭建6个redis实例的redis cluster
mkdir -p /var/log/redis
每台虚拟机上都需要将配置文件修改一下选项,比如在虚拟机A上:
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 192.168.0.101
appendonly yes
将上面的配置文件,在/etc/redis下放6个,
分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf
2),准备生产环境的启动脚本
在/etc/init.d下,放6个启动脚本,分别为:
redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006。每个启动脚本内,都修改对应的端口号
3),分别在3台机器上,启动6个redis实例。redis-trib.rb是Redis Cluster的一个常用工具。使用redis-trib.rb需要ruby环境,下面就是安装ruby等环境
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar -zxvf ruby-2.3.1.tar.gz
./configure -prefix=/usr/local/ruby
make && make install
cd ruby所在目录
cp "ruby所在目录"/bin/ruby /usr/bin
cp "ruby所在目录"/bin/gem /usr/bin
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l ./redis-3.3.0.gem
gem list check redis gem
cp “redis安装所在目录”/src/redis-trib.rb /usr/bin
--replicas: 每个master有几个slave
使用redis-tri.rb命令,
redis-trib.rb create --replicas 1 192.168.0.101:7001 192.168.0.101:7002 192.168.0.102:7003 192.168.0.102:7004 192.168.0.103:7005 192.168.0.103:7006
得到的结果如下:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.101:7001
192.168.0.102:7003
192.168.0.103:7005
Adding replica 192.168.0.102:7004 to 192.168.0.101:7001
Adding replica 192.168.0.101:7002 to 192.168.0.102:7003
Adding replica 192.168.0.103:7006 to 192.168.0.103:7005
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
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.0.101:7001)
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
slots: (0 slots) slave
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
slots: (0 slots) slave
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
slots: (0 slots) slave
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
从结果看得出,每个master虚拟机大概平均被分配了5461个slots
尝试 check 一下,输入:
redis-trib.rb check 192.168.0.101:7001
>>> Performing Cluster Check (using node 192.168.0.101:7001)
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
slots: (0 slots) slave
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
slots: (0 slots) slave
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
slots: (0 slots) slave
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
没问题,16384个slots全被分配了。
(1)自动将数据进行分片,每个master上放一部分数据
(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的
redis cluster不用一致性hash,而是使用hash slots来替代。
为了实现效果:实现了读写分离(master-slave),高可用(redis-cluster本身的特性),多个master协同(水平扩容)。做如下试验:
在三台虚拟机上启动6个redis实例,3个为master,3个为slave
1),编写配置文件
redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,
3个master,3个slave
3台虚拟机去搭建6个redis实例的redis cluster
不同虚拟机上创建目录,比如在虚拟机A上:
mkdir -p /etc/redis-clustermkdir -p /var/log/redis
mkdir -p /var/redis/7001
mkdir -p /var/redis/7002
每台虚拟机上都需要将配置文件修改一下选项,比如在虚拟机A上:
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 192.168.0.101
appendonly yes
将上面的配置文件,在/etc/redis下放6个,
分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf
2),准备生产环境的启动脚本
在/etc/init.d下,放6个启动脚本,分别为:
redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006。每个启动脚本内,都修改对应的端口号
3),分别在3台机器上,启动6个redis实例。redis-trib.rb是Redis Cluster的一个常用工具。使用redis-trib.rb需要ruby环境,下面就是安装ruby等环境
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar -zxvf ruby-2.3.1.tar.gz
./configure -prefix=/usr/local/ruby
make && make install
cd ruby所在目录
cp "ruby所在目录"/bin/ruby /usr/bin
cp "ruby所在目录"/bin/gem /usr/bin
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l ./redis-3.3.0.gem
gem list check redis gem
cp “redis安装所在目录”/src/redis-trib.rb /usr/bin
--replicas: 每个master有几个slave
使用redis-tri.rb命令,
redis-trib.rb create --replicas 1 192.168.0.101:7001 192.168.0.101:7002 192.168.0.102:7003 192.168.0.102:7004 192.168.0.103:7005 192.168.0.103:7006
得到的结果如下:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.101:7001
192.168.0.102:7003
192.168.0.103:7005
Adding replica 192.168.0.102:7004 to 192.168.0.101:7001
Adding replica 192.168.0.101:7002 to 192.168.0.102:7003
Adding replica 192.168.0.103:7006 to 192.168.0.103:7005
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
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.0.101:7001)
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
slots: (0 slots) slave
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
slots: (0 slots) slave
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
slots: (0 slots) slave
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
从结果看得出,每个master虚拟机大概平均被分配了5461个slots
尝试 check 一下,输入:
redis-trib.rb check 192.168.0.101:7001
>>> Performing Cluster Check (using node 192.168.0.101:7001)
M: 20df2234e622fcadcce1d135e7458dcfd1c16ca2 192.168.0.101:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 5ac6d025af59500553df2ba13a265d9519f8865a 192.168.0.101:7002
slots: (0 slots) slave
replicates 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f
S: 05e3e313c07b31a136bd50191324ba52f90c58a7 192.168.0.103:7006
slots: (0 slots) slave
replicates cf13c8086fcba76bb9b97a6bf0699069da419e1d
M: 01d1bbd83ec5ec1586d831cfc0edbd0d2ac58b3f 192.168.0.102:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: cf13c8086fcba76bb9b97a6bf0699069da419e1d 192.168.0.103:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: ec8d3bd658982ba4180df00fc5ae0d2b79b2fe5b 192.168.0.102:7004
slots: (0 slots) slave
replicates 20df2234e622fcadcce1d135e7458dcfd1c16ca2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
没问题,16384个slots全被分配了。