redis集群搭建

1. redis知识整理

2. 安装redis

推荐安装5.0版本及以上,5.0版本将redis集群管理器由 Ruby (redis-trib.rb) 移植到了redis-cli,方便集群的搭建

  • 安装命令
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
# 设置端口  默认不设置为6379 避免攻击
port 7000
# 后台运行
daemonize yes
# 开放外网访问  bind ip 或 将保护模式取消、注释bind
# bind 127.0.0.1 
protected-mode no
# 修改pid进程文件名
pidfile "/var/run/redis_6379.pid"
# 日志文件配置   具体的日志文件无需创建 只需创建到文件夹
logfile "/usr/local/soft/redis-sentinel/6379/redis.log"
# 修改数据文件存放地址
dir "/usr/local/soft/redis-sentinel/6379"
# 启动aof增量持久化策略
appendonly yes
# 设置aof同步策略  建议使用everysec(默认)  每秒写一次到磁盘  always:每次写操作立即写入aof,性能低下  no:不要立刻刷,只有在操作系统需要刷的时候再刷,比较快
appendfsync everysec
  • 启动
# 后台启动
./redis-server  redis.conf &
# 客户端
./redis-cli -h 127.0.0.1 -p 7000 --raw

3. redis-sentinel搭建

一主二从三哨兵

  • 创建文件夹 redis-sentinel
mkdir redis-sentinel
  • 在 redis-sentinel下创建6379、6380、6381三个文件夹
cd redis-sentinel
mkdir 6379 6380 6381
  • 将redis-server、redis-cli、redis-sentinel文件夹拷贝至redis-sentinel下
cp -r redis-5.0.4/src/redis-server ./
cp -r redis-5.0.4/src/redis-cli ./
cp -r redis-5.0.4/src/redis-sentinel ./
  • 复制修改后的redis.conf到6379、6380、6381下 具体修改参照上面redis配置文件
cp redis.conf ./6379/
cp redis.conf ./6380/
cp redis.conf ./6381/
  • 修改6380、6381 redis配置文件
# 除上面redis配置之外 添加下面命令
replicaof 127.0.0.1 6379
  • 分别启动三个redis节点 测试是否搭建成功
# 启动redis节点
./redis-server ./6379/redis.conf &
./redis-server ./6380/redis.conf &
./redis-server ./63781/redis.conf &

# 验证主从复制是否生效
./redis-cli -p 6379 --raw
# master节点写入
127.0.0.1:6379> set name 1
# ok表示写入成功
OK
# 退出master节点 进入子节点
./redis-cli -p 6380 --raw
127.0.0.1:6380> get name
# 出现上面设置的值则说明搭建成功
1
  • 哨兵配置 哨兵最少使用三个
# 将sentinel.conf拷贝到6379文件夹下
cp sentinel.conf ../redis-sentinel/6379 sentinel.conf

# 修改哨兵配置
# 端口设置 一般设为2 + 主节点端口,依次往下增加
port 26379
protected-mode no
daemonize yes
# 配置哨兵监控的主节点以及判断主节点失效的哨兵个数 这里设为2个
sentinel monitor mymaster 127.0.0.1 6379 2
# 30秒内master没有响应该哨兵,该则认定该节点为主观下线  客观下线 只适用于 主节点。如果 主节点 出现故障,Sentinel 节点会通过 sentinel is-master-down-by-addr 命令,向其它 Sentinel 节点询问对该节点的 状态判断。如果超过 <quorum> 【即上面配置的2】个数的节点判定 主节点 不可达,则该 Sentinel 节点会判断 主节点 为 客观下线。
sentinel down-after-milliseconds mymaster 30000  
# 指定在发生故障转移主备切换时,最多可以有多少个slave同时对新的master进行同步。这个数字越小,完成failover所需的时间就越长;反之,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1,来保证每次只有一个slave,处于不能处理命令请求的状态
sentinel parallel-syncs mymaster 1 
# 故障转移的超时时间failover-timeout,默认三分钟,可以用在以下这些方面:
## 1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
## 2. 当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。  
## 3. 当想要取消一个正在进行的failover时所需要的时间。
## 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来同步数据了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000
  • 启动哨兵
# 依次启动三个哨兵节点
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
  • 校验是否启动成功 能否自动完成故障转移
# 查看哨兵进程
ps -ef | grep -v grep | grep sentinel
# kill 主节点
# 查看其它两个从节点状态 若发现其中一个节点变为master则说明成功
./redis-cli -p 6380 info replication
./redis-cli -p 6381 info replication
# 验证master节点写入 slave节点读取
./redis-cli -p 6380
127.0.0.1:6380> set name 6380
OK
./redis-cli -p 6381
127.0.0.1:6381> get name
"6380"
  • 启动redis-sentinel shell脚本 此shell脚本只供参考 实际脚本视情况修改 脚本名称请不要用sentinel或redis,会对grep命令产生影响导致shell脚本的终止
#!/bin/bash

# 终止哨兵集群
SENTINEL_PID=`ps -ef | grep -v grep | grep sentinel | awk '{print$2}'`
echo "当前哨兵集群进程id为: " $SENTINEL_PID
if [ -n "$SENTINEL_PID" ]
    then 
    echo "终止哨兵进程: "  $SENTINEL_PID
    for i in $SENTINEL_PID;
        do
            echo "kill sentinel pid: " $i
            kill -9 $i
        done
fi

# 终止redis主从集群
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "当前redis主从集群进程id为: " $REDIS_PID
if [ -n "${REDIS_PID}" ]
    then
    echo "终止redis进程:" $REDIS_PID
    for i in $REDIS_PID
        do
            echo "kill redis pid: " $i
            kill -9 $i
        done
fi

# 启动redis主从集群

echo "开始启动redis: 6379"
cd /usr/local/soft/redis-sentinel/6379
./redis-server ./6379.conf > /dev/null 2>&1 &
echo "启动redis: 6379成功"

echo "开始启动redis: 6380"
cd /usr/local/soft/redis-sentinel/6380
./redis-server ./6380.conf > /dev/null 2>&1 &
echo "启动redis: 6380成功"

echo "开始启动redis: 6381"
cd /usr/local/soft/redis-sentinel/6381
./redis-server ./6381.conf > /dev/null 2>&1 &
echo "启动redis: 6381成功"

# 启动sentinel集群
echo "开始启动sentinel: 26379"
cd /usr/local/soft/redis-sentinel/6379
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
echo "启动sentinel: 26379成功"

echo "开始启动sentinel: 26380"
cd /usr/local/soft/redis-sentinel/6380
./redis-sentinel sentinel.conf > /dev/null 2>&1 &
echo "启动sentinel: 26380成功"

echo "开始启动sentinel: 26381"
cd /usr/local/soft/redis-sentinel/6381
./redis-sentinel sentinel.conf > /dev/null 2>&1  &
echo "启动sentinel: 26381成功"
  • 关闭redis-sentinel shell脚本
#!/bin/bash

# 终止哨兵集群
SENTINEL_PID=`ps -ef | grep -v grep | grep sentinel | awk '{print$2}'`
echo "当前哨兵集群进程id为: " $SENTINEL_PID
if [ -n "$SENTINEL_PID" ]
    then 
    echo "终止哨兵进程: "  $SENTINEL_PID
    for i in $SENTINEL_PID;
        do
            echo "kill sentinel pid: " $i
            kill -9 $i
        done
fi

# 终止redis主从集群
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "当前redis主从集群进程id为: " $REDIS_PID
if [ -n "${REDIS_PID}" ]
    then
    echo "终止redis进程:" $REDIS_PID
    for i in $REDIS_PID
        do
            echo "kill redis pid: " $i
            kill -9 $i
        done
fi

4. redis-cluster搭建 针对redis5.0及以上

#!/bin/bash

# 1 终止redis进程
echo "redis集群开始关闭..."
REDIS_PID=`ps -ef | grep -v grep | grep redis | awk '{print$2}'`
echo "redis-cluster 进程pid: " $REDIS_PID
if [ -n "$REDIS_PID" ]
    then 
    for i in $REDIS_PID
        do
            echo "kill redis:" $i
            kill -9 $i
        done
fi
echo "redis集群关闭成功"

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

推荐阅读更多精彩内容