本次集群采用redis官方推荐的redis cluster集群方式.
注意必须要3个或以上的主节点,否则在创建集群时会失败.
–part1 每台单机安装redis
–拷贝文件
scp redis-3.2.1.tar.gz username@10.100.94.195:/home/username
scp redis.conf username@10.100.94.195:/home/username
scp tcl8.6.1-src.tar.gz username@10.100.94.195:/home/username
–解压
tar xvf redis-3.2.1.tar.gz
tar xvf tcl8.6.1-src.tar.gz
–整理文件
sudo -i
cd /home/username
mv redis-3.2.1 /usr/local/redis
mv tcl8.6.1 /usr/local/tcl
mv redis.conf /usr/local
–安装插件
apt-get install libc6-dev
make MALLOC=libc 仅在有必要时考虑这一步,大部分情况忽略,不能执行下面./configure命令时安装
如果没有make命令 则安装如下
apt-get install build-essential
–安装tcl
cd /usr/local/tcl/unix
./configure
make
make test
make install
–安装redis
cd /usr/local/redis
make
cd /usr/local/redis/src
make test
如果遇到
[err]: Test replication partial resync…,则用以下方法解决
/usr/local/redis/src
make install
-part2 集群-
1.准备
检查ruby有没有安装好 ruby -v,如果没有安装好,如下:
apt install ruby-full
执行下面这个gem命令
执行之前,检查能不能连到外网,如果不能, 注意开代理,临时开代理命令如下
export http_proxy=http://xxx.com:80
export https_proxy=http://xxx.com:80
gem install redis
2. a. /usr/local下创建两个文件夹
b. 复制redis.conf 到这俩能个文件夹下,并更改redis.conf,如下
port 7000 //端口 比如7000,7002,7003
bind 本机ip //默认ip为127.0.0.1 改为其他节点机器可访问的本机ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
3.启动每个节点
redis-server 7000/redis.conf 注意需要sudo权限
查看 ps -ef | grep redis
一定注意不要在集群之前设置密码,建议之后也不设密码
4. 安装完所有节点,并启动后,就可以集群了. 运行集群命令 /usr/local/redis/src/redis-trib.rb 如下:
./redis-trib.rb create --replicas 1 10.193.146.234:7000 10.212.207.30:7002 10.212.207.30:7003 10.177.209.145:7004 10.177.209.145:7005 10.218.61.183:7006 10.218.61.183:7007 10.212.207.34:7008 10.212.207.34:7009 10.177.209.212:7010 10.177.209.212:7011 10.218.61.210:7012 10.218.61.210:7013 10.212.226.208:7014 10.212.226.208:7015 10.218.88.219:7016 10.218.88.219:7017 10.193.146.234:7001
这里的命令参数 --replicas 1 表示每台master 有一个slave; 所以语句中,依次为 master 和slave的1对1的配对 ,并循环往复.比如:10.193.146.234:7000 10.212.207.30:7002是一对master slave
所以配置的时候要注意
- 不要把master 和 slave的配对 搞在同一台机器上,而是让他们错开到不同机器上
- 不要把master都配置到同一台机器上,而是应该尽量错开
附上 redis集群挂掉的必要条件
A、某个主节点和所有从节点全部挂掉,我们集群就进入faill状态。
B、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
C、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态
连接集群命令示例
redis-cli -h 10.15.17.72 -c -p 8008
redis-cli -h 10.212.207.30 -c -p 7002
有密码的连接
redis-cli -h 10.212.216.197 -c -p 7019 -a password
-part3维护-
可以给每台机器增加一个定时job检查redis 服务进程是否正常运行,如果没有则重启redis,做法如下:
- crontab
*/10 * * * * /home/username/healthy_check.sh 2>&1 > /home/username/healthy_check.log - healthy_check.sh bash脚本
#!/bin/bash
port1=8008
port2=8009
count1=`pgrep -f $port1 | wc -l`
count2=`pgrep -f $port2 | wc -l`
if [ $count1 -eq 0 ]
then
echo "checked port:$port1 down..."
# restart
/usr/local/redis/src/redis-server /usr/local/$port1/redis.conf
nowtime=$(date +"%Y-%m-%d %H:%M:%S")
echo "restart port:$port1 success by $nowtime"
echo "--------------------------------------"
fi
sleep 10
if [ $count2 -eq 0 ]
then
echo "checked port:$port2 down..."
# restart
/usr/local/redis/src/redis-server /usr/local/$port2/redis.conf
nowtime=$(date +"%Y-%m-%d %H:%M:%S")
echo "restart port:$port2 success by $nowtime"
echo "--------------------------------------"
fi
将新节点增加进集群
有时需要增加新节点进集群,如下做法是给master 增加 一个slave
cd /usr/local/redis/src
./redis-trib.rb add-node --slave --master-id 0c59192fc07b6b007433d5d1f0e39c7463dece58 10.72.171.214:7025 10.72.164.80:7019
命令解释
add-node new_host:new_port existing_host:existing_port
–slave
–master-id
add-node有两个可选参数:
–slave:设置该参数,则新节点以slave的角色加入集群
–master-id:这个参数需要设置了–slave才能生效,–master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。
在这里 10.72.171.214:7025是新节点, 10.72.164.80:7019 是旧节点master,0c59192fc07b6b007433d5d1f0e39c7463dece58 是 10.72.164.80:7019
对应的节点名
如何迁移master进新的机器
有时需要退役master所在的物理机器,这时需要把master迁移到新的机器上,实现思路如下:
- 在新机器上给这个master加slave.
- kill master 进程, 让集群自动选举新机器的slave 为master
- 一切正常,就可以退役master所在物理机器了