用两台虚拟机(ip: 10.60.44.7六、ip: 10.60.44.105)共 6 个节点,一台虚拟机 3 个节点,模拟出 3 master、3 salve 环境html
注意:node
centos 6.5linux
service iptables stop # 关闭命令: chkconfig iptables off # 永久关闭防火墙 service iptables status # 两个命令同时运行,运行完成后查看防火墙关闭状态
centos 7.0redis
systemctl stop firewalld.service # 中止firewall systemctl disable firewalld.service # 禁止firewall开机启动 firewall-cmd --state # 查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
安装包在附件 redis-3.2.4.tar.gz。也可使用 wget 插件下载shell
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
单点指的是一个 redis 实例,须要先下载 redis 的源码,接着进行编译、安装,完成经过命令启动该实例数据库
[root@localhost Desktop]# tar zxvf redis-3.2.4.tar.gz [root@localhost Desktop]# cd redis-3.2.4 [root@localhost redis-3.2.4]# cd src && make install
# 存放 redis 相关命令文件 [root@localhost src]# mkdir -p /usr/local/redis/bin # 存放 redis 的配置文件 [root@localhost src]# mkdir -p /usr/local/redis/etc
# 移动 redis 配置文件(配置文件在解压好的目录) [root@localhost redis-3.2.4]# mv redis.conf /usr/local/redis/etc # 移动 redis 命令文件(命令文件在解压好的目录中的 src 目录) [root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin
# 指定配置文件启动 redis [root@localhost src]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
# 或者是 netstat -tunpl | grep 6379 ps -ef | grep redis
名为 7031-7033 的文件夹置于 10.60.44.76 的机子中,7034-7036 文件夹置于 10.60.44.105 的机子中centos
mkdir -p /usr/local/redis-cluster cd /usr/local/redis-cluster # 建立各个节点文件夹 mkdir 7031 7032 7033 # IP 为 10.60.44.76 的机子上执行 mkdir 7034 7035 7036 # IP 为 10.60.44.105 的机子上执行
此处以 10.60.44.76 的机子为例,另外一台操做一致ruby
cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7031 cd /usr/local/redis-cluster/7031 vi redis.conf
修改配置文件,范本以下app
port 7031 # 绑定端口 bind 本机ip # 物理 ip:如 10.60.44.76 dir /usr/local/redis-cluster/7031 # 指定数据存放路径 cluster-enabled yes # 启动集群模式 cluster-config-file redis-7031.conf # 指定集群节点配置文件 daemonize yes # 后台启动 cluster-node-timeout 5000 # 指定集群节点超时时间 appendonly yes # 指定持久化方式
将 7031 的 redis.conf 改完后再拷贝到剩下的 2 个目录(703二、7033)中,再全局替换 redis.conf 中的 7031 为对应的节点编号(703二、7033)便可。同理得 10.60.44.105 机子测试
移动完后 ip 为 10.60.44.76 的 /usr/local/
目录结构图以下:(10.60.44.105 同理)
[root@localhost local]# cd /usr/local/ && tree -L 3 . ├── bin ....... ├── redis │ ├── bin │ │ ├── mkreleasehdr.sh │ │ ├── redis-benchmark │ │ ├── redis-check-aof │ │ ├── redis-check-rdb │ │ ├── redis-cli │ │ ├── redis-sentinel │ │ ├── redis-server │ │ └── redis-trib.rb │ └── etc │ └── redis.conf ├── redis-cluster │ ├── 7031 │ │ └── redis.conf │ ├── 7032 │ │ └── redis.conf │ └── 7033 │ └── redis.conf ....... └── src
集群的启动须要用到 Ruby 实现的 redis-trib.rb 插件,因此须要先安装 Ruby 环境和其插件,命令以下:
# 步骤一:建议不使用 yum 安装。使用网上本身下载源码的形式安装,版本能够稍微新一点 yum install ruby # 步骤二:通常不会出错 yum install rubygems # 步骤三:容易出错,下面有常看法决方案 gem install redis
此步骤须要不少环境,容易出错,附上常见错误解决方法:
错误一:no such file to load -- zlib
进入 ruby 源码文件夹并安装 ruby 自身提供的 zlib 包
[root@localhost ruby-2.3.3]# cd ext/zlib [root@localhost zlib]# ruby ./extconf.rb [root@localhost zlib]# make [root@localhost zlib]# make install
错误二:--with-openssl-include=/usr/local/ssl/include/ --with-openssl-lib=/usr/local/ssl/lib
处理方法同错误一:
[root@localhost ruby-2.3.3]# cd ext/openssl [root@localhost zlib]# ruby ./extconf.rb [root@localhost zlib]# make [root@localhost zlib]# make install
错误三:Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
首先查看一下 $openssl version
是否是安装了 OpenSSL
[root@localhost /]# openssl version OpenSSL 1.0.1e-fips 11 Feb 2013
没有,则新安装一个 OpenSSL,具体教程不展开。若是有,则更换 gem 源的地址:
# 查看 gem 源 [root@localhost /]# gem source # 删除 https 源 [root@localhost /]# gem source -r https://rubygems.org/ to remove # 添加 http 源 [root@localhost /]# gem source -a http://rubygems.org/ to read
在两台机子中分别运行下面命令,启动集群中的每一个节点
# 10.60.44.76 for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done # 10.60.44.105 for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done
查看节点的开启状态
ps -ef | grep redis-server
结果以下:
### 10.60.44.76 root 18992 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7031 [cluster] root 18994 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7032 [cluster] root 18998 1 0 04:37 ? 00:00:10 /usr/local/redis/bin/redis-server 10.60.44.76:7033 [cluster] root 41471 16554 0 05:29 pts/2 00:00:00 grep redis-server ### 10.60.44.105 root 50565 1 0 04:37 ? 00:00:07 /usr/local/redis/bin/redis-server 10.60.44.105:7034 [cluster] root 50567 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7035 [cluster] root 50571 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7036 [cluster] root 51273 34592 0 05:29 pts/1 00:00:00 grep --color=auto redis-server
每一个节点正常开启后,在两台机子任意一台上运行:
/usr/local/redis/bin/redis-trib.rb create --replicas 1 10.60.44.76:7031 10.60.44.76:7032 10.60.44.76:7033 10.60.44.105:7034 10.60.44.105:7035 10.60.44.105:7036
登陆客户端,并测试读写(记得要加上 -c 选项,否则会报错)
# 10.60.44.76 /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 7031 cluster info # 显示集群信息
显示字段 cluster_state:ok
为正常运行状态,说明集群搭建成功
使用 cluster nodes
查看集群各节点的当前状态,能够查看主从节点的分配和链接和状况。以下:
10.60.44.76:7031> cluster nodes 1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498187489957 11 connected 396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498187486928 9 connected 5461-10922 37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 slave 396e92e2e8207be6a4a93e29fd16670656477131 0 1498187488947 9 connected 82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498187483893 6 connected 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498187487937 11 connected 0-5460 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 myself,master - 0 0 3 connected 10923-16383
关闭集群须要将节点逐个关闭,可使用脚本自动完成:
# 10.60.44.76 for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 703$i shutdown; done # 10.60.44.105 for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.105 -p 703$i shutdown; done
每次新建立集群以前须要将自动生成的配置文件和数据库删除,命令以下:
# 10.60.44.76 for((i=1;i<=3;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done # 10.60.44.105 for((i=4;i<=6;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done
当前存在集群节点状况以下:
# 7034(主)- 7032(从) # 7035(主)- 7033(从) # 7036(主)- 7031(从) 82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498199288536 6 connected 396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199282454 9 connected 5461-10922 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199289546 3 connected 10923-16383 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199285499 11 connected 0-5460 37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 myself,slave 396e92e2e8207be6a4a93e29fd16670656477131 0 0 1 connected 1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498199287523 11 connected
在原有的集群之上添加一个新的主节点,须要开启新的节点,接着将此节点添加进集群中并分配槽,详细以下描述:
[root@localhost /]# mkdir /usr/local/redis-cluster/7037
将配置文件中的 7036 字符串所有替换为 7037,此处再也不累述
[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7037/
[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf
# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口 [root@localhost /]# redis-trib.rb add-node 10.60.44.105:7037 10.60.44.105:7034
成功后打印信息以下:
>>> Adding node 10.60.44.105:7037 to cluster 10.60.44.105:7034 >>> Performing Cluster Check (using node 10.60.44.105:7034) ............... 省略 >>> Send CLUSTER MEET to node 10.60.44.105:7037 to make it join the cluster. [OK] New node added correctly.
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498199380639 0 connected 396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199384698 9 connected 5461-10922 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199381655 3 connected 10923-16383 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199383685 11 connected 0-5460
[root@localhost /]# /usr/local/redis/bin/redis-trib.rb reshard 10.60.44.105:7037 # 分配多少槽点给新节点 How many slots do you want to move (from 1 to 16384)? 1000 # 哪一个是接受节点?(填入新节点的 id) What is the receiving node ID? 3f2c74e5888907c494b8b728210175144657f218 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. # 从全部主节点中随机选取 Source node #1: all
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201081749 12 connected 0-332 5461-5794 10923-11255 396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498201080733 9 connected 5795-10922 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498201082755 3 connected 11256-16383 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498201078714 11 connected 333-5460
在原有的集群之上为其中一个主节点(7037)添加一个新的从节点(7038),须要开启新的从节点,并将此节点添加进集群中,详细以下描述:
[root@localhost /]# mkdir /usr/local/redis-cluster/7038
将配置文件中的 7036 字符串,所有替换为 7038,此处再也不累述
[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7038/
[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf
# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口 [root@localhost /]# redis-trib.rb add-node 10.60.44.105:7038 10.60.44.105:7034
成功后打印信息以下:
>>> Adding node 10.60.44.105:7038 to cluster 10.60.44.105:7034 >>> Performing Cluster Check (using node 10.60.44.105:7034) ............... 省略 >>> Send CLUSTER MEET to node 10.60.44.105:7038 to make it join the cluster. [OK] New node added correctly.
9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 master - 0 1498201399078 0 connected 3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255 .......
[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f218
9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 slave 3f2c74e5888907c494b8b728210175144657f218 0 1498201731111 12 connected 3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255 .......
删除集群中端口为 7037 的主节点,填入集群中集群中任意节点 ip 端口和所要删除节点的 id。(须要先将所拥有的槽分配到其余的主节点)
[root@localhost /]# usr/local/redis/bin/redis-trib.rb del-node 10.60.44.105:7034 3f2c74e5888907c494b8b728210175144657f218
同理得主节点
模拟 oom(Out Of Meomery)
redis-cli debug oom
模拟宕机
redis-cli debug segfault
模拟 hang
redis-cli -p 6379 DEBUG sleep 30
参考资料:
http://www.cnblogs.com/hjwubl...
http://blog.csdn.net/cfl20121...
http://www.cnblogs.com/wuxl36...
http://www.redis.cn/topics/cl...
http://wiki.jikexueyuan.com/p...