数据库 / Redis

Redis主从集群部署

温馨提示:本文最后更新于2021-03-10 23:42:58,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 3月8日 · 2021年 · 本文8675个字,预计阅读22分钟 6542次已读

一、Redis集群介绍


Redis Cluster提供了一种运行Redis安装的方法,在该安装中,数据会 在多个Redis节点之间自动分片

Redis Cluster在分区期间还提供了一定程度的可用性原文链接:https://www.dqzboy.com这实际上是在某些节点出现故障或无法通信时继续操作的能力。但是,如果发生较大故障(例如,大多数主服务器不可用时),群集将停止运行。

因此,实际上,Redis Cluster能带来什么?
  • 自动分割在多个节点之间的数据集的能力。
  • 当一部分节点出现故障或无法与其余群集通信时可以继续操作

Redis Cluster是Redis的分布式实现,其在设计中的重要性顺序为以下目标:

  • 高达1000个节点的高性能和线性可扩展性。没有代理,使用异步复制,并且不对值执行合并操作。
  • 可接受的写安全程度:系统尝试(以最好的方式)保留来自与大多数主节点连接的客户机的所有写操作。通常有一些小窗口可以丢失已确认的写操作。当客户端位于少数分区时,丢失已确认写操作的窗口会更大。
  • 可用性:Redis Cluster能够在大多数主节点可访问且每个不再可用的主节点上至少有一个可访问的从节点的分区中生存。此外,通过使用副本迁移,不再由任何从属复制的主将从一个由多个从属覆盖的主接收一个。

注意:

  • Redis集群搭建需要Redis 3.0或更高版本
  • 每个Redis群集节点都需要打开两个TCP连接。用于服务客户端的常规Redis TCP端口,例如6379,再加上将数据端口加10000所获得的端口,因此在示例中为16379。
详细介绍请查阅Redis官方文档:

二、Redis集群部署


集群中至少应该有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点;我这里将使用6台机器进行部署,3台作为master,3台作为其对应的sla文章来源(Source):浅时光博客ve节点

1、集群环境准备

1.1、配置主机名

hostnamectl set-hostname redis-m01
hostnamectl set-hostname redis-m02
hostnamectl set-hostname redis-m03
hostnamectl set-hostname redis-s01
hostnamectl set-hostname redis-s02
hostnamectl set-hostname redis-s03

1.2、配置免密登入

  • 先配置主机名称解析
[root@redis-m01 ~]# vi /etc/hosts
192.168.66.155 redis-m01
192.168.66.156 redis-m02
192.168.66.157 redis-m03
192.168.66.158 redis-s01
192.168.66.159 redis-s02
192.168.66.160 redis-s03
  • redis-m01实现ssh免密登入其他节点
[root@redis-m01 ~]# ssh-keygen -t rsa
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.155
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.156
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.157
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.158
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.159
[root@redis-m01 ~]# ssh-copy-id root@192.168.66.160
  • 传给各节点,实现通过主机名解析
[root@redis-m01 ~]# for i in 192.168.66.{156..160}; do echo ">>> $i";scp /etc/hosts root@$i:/etc/; done
  • 配置redis-01节点通过主机名实现免密登入认证
[root@redis-m01 ~]# ssh-copy-id root@redis-m01
[root@redis-m01 ~]# ssh-copy-id root@redis-m02
[root@redis-m01 ~]# ssh-copy-id root@redis-m03
[root@redis-m01 ~]# ssh-copy-id root@redis-s01
[root@redis-m01 ~]# ssh-copy-id root@redis-s02
[root@redis-m01 ~]# ssh-copy-id root@redis-s03
  • 所有节点关闭DNS反向查询,加快SSH连接速度
[root@redis-m01 ~]# for i in 192.168.66.{155..160}; do echo ">>> $i";ssh root@$i "sed -ri 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config && systemctl restart sshd"; done

1.3、关闭防护墙

  • 所有节点执行
[root@redis-m01 ~]# for i in 192.168.66.{155..160}; do echo ">>> $i";ssh root@$i "systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld"; done

1.4、关闭SELinux

  • 所有节点执行
[root@redis-m01 ~]# for i in 192.168.66.{155..160}; do echo ">>> $i";ssh root@$i "sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"; done
[root@redis-m01 ~]# for i in 192.168.66.{155..160}; do echo ">>> $i";ssh root@$i "setenforce 0 && getenforce"; done

1.5、安装依赖包

[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo ">>> $i";ssh root@$i "yum -y install gcc gcc-c++ libaio make cmake zlib-devel openssl-devel pcre pcre-devel wget git curl lynx lftp mailx mutt rsync ntp net-tools vim lrzsz screen sysstat yum-plugin-security yum-utils createrepo bash-completion zip unzip bzip2 tree tmpwatch pinfo man-pages lshw pciutils gdisk system-storage-manager git chrony gdbm-devel sqlite-devel bind-utils lsof";done

1.6、配置时间同步

  • redis-m01节点去同步互联网时间,其他节点与redis-m01节点进行时间同步
  • chrony服务端节点启动ntpd服务,其余与服务端同步时间的节点停用ntpd服务
[root@redis-m01 ~]# systemctl start ntpd && systemctl enable ntpd
[root@redis-m01 ~]# vim /etc/chrony.conf
allow 192.168.66.0/24
1607247357 df5c094609ccd2e
  • 确定时间同步正常
[root@redis-m01 ~]# timedatectl
1607247358 753629c08bf24b7
  • 注意:NTP synchronized的值为yes时,其他节点才能同步时间
  • 其他节点同样关闭ntpd服务,我们这里使用chronyd服务
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo ">>> $i";ssh root@$i "systemctl stop ntpd && systemctl disable ntpd && systemctl status ntpd";done
  • 登入各个节点服务器进行手动修改
~]# vim /etc/chrony.conf
server 192.168.66.155 iburst
1607247473 b9bf134baef4122
  • 各节点启动服务,在节点1上执行
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo ">>> $i";ssh root@$i "systemctl restart chronyd.service && systemctl enable chronyd.service && systemctl status chronyd.service";done
  • 检查时间同步状态(^*表示已经同步) ,在redis-m01节点操作
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo ">>> $i";ssh root@$i "chronyc sources";done
1607247581 72a501e91e81c9b

1.7、关闭交换分区

[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo ">>> $i";ssh root@$i "swapoff -a && free -h|grep Swap";done
  • 永久关闭
[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo ">>> $i";ssh root@$i "sed -ri 's@/dev/mapper/centos-swap@#/dev/mapper/centos-swap@g' /etc/fstab && grep /dev/mapper/centos-swap /etc/fstab";done
文章来源(Source):浅时光博客

1.8、重启服务器

[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i;ssh root@$i "sync && reboot";done
  • 最后重启red原文链接:https://www.dqzboy.comis-m01节点
[root@redis-m01 ~]# sync && reboot

2、源码编译安装

  • 注意:以下编译安装在redis-m01节点上进行编译部署,然后将文件拷贝至其余的5节点上
  • Redis源码编译安装也可以参考本篇文章:

源码编译安装Redis

2020-2-28 0

1.1:下载源码包

#将下载的包存储在/opt/soft目录下
[root@redis-m01 ~]# mkdir /opt/soft
[root@redis-m01 ~]# cd /opt/soft
[root@redis-m01 soft]# wget http://download.redis.io/releases/redis-5.0.6.tar.gz

1.2:解压源码包

[root@redis-m01 soft]# tar -xf redis-5.0.6.tar.gz -C /usr/local/

1.3:编译安装

[root@redis-m01 soft]# yum -y install gcc make
[root@redis-m01 soft]# cd /usr/local/
[root@redis-m01 local]# mv redis-5.0.6 redis
[root@redis-m01 local]# cd redis
#编译
[root@redis-m01 redis]# make
#安装
[root@redis-m01 redis]# make install PREFIX=/usr/local/redis
  • 参数:后面跟 PREFIX=/usr/local/redis 可指定redis的安装路径
#拷贝执行文件到/usr/local/bin下
[root@redis-m01 redis]# cd /usr/local/redis/bin
[root@redis-m01 bin]# cp * /usr/local/bin/

1.4:修改配置文件

[root@redis-m01 bin]# vim /usr/local/redis/redis.conf
1607248153 2cf1ac15e7aa005
1607248154 e9bd15988f80813
1607248155 db2f379f3f0a10a
1607248155 7fe1578f3cec95b
1607248156 2eaac6e1bdd1e7a
1607248157 2ccf5709b748ccb
1607248159 826f63f91227276
1607248159 8590bac707bfa88
1607248160 43aa8b2f34602de
  • 创建数据目录和日志存储目录
[root@redis-m01 bin]# mkdir -p /data/redis/logs

1.5:创建启动用户

[root@redis-m01 bin]# groupadd redis
[root@redis-m01 bin]# useradd redis -g redis
  • 赋权(注意要跟systemd中指定的用户一样)
[root@redis-m01 bin]# chown -R redis. /usr/local/redis
[root@redis-m01 bin]# chown -R redis. /data/redis/

1.6:systemd管理

[root@redis-m01 bin]# vim /usr/lib/systemd/system/redis.service

[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
ExecRepload=/bin/kill -s HUP $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

1.7:拷贝配置

  • 将上面在redis-m01节点创建的文件、用户、以及修改的配置文件和编译完的redis服务拷贝至其他节点上
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i;scp -r /usr/local/redis root@$i:/usr/local/;done

[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i;scp -r /usr/local/redis/bin/* root@$i:/usr/local/bin/;done

#创建数据和日志目录
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i; ssh root@$i "mkdir -p /data/redis/logs";done

#创建运行用户
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i; ssh root@$i "groupadd redis || useradd redis -g redis";done

#对数据与日志目录进行授权
[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i; ssh root@$i "chown -R redis. /usr/local/redis &&  chown -R redis. /data/redis/";done

[root@redis-m01 ~]# for i in 192.168.66.{156..160};do echo $i;scp /usr/lib/systemd/system/redis.service root@$i:/usr/lib/systemd/system/;done
  • 注意:配置拷过去之后,需要修改每个节点的配置文件中的IP为对应主机的IP地址

1.8:启动服务

[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo $i; ssh root@$i "systemctl daemon-reload && systemctl start redis && systemctl enable redis";done
  • 检查服务启动状态
[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo $i; ssh root@$i "systemctl status redis.service |grep Active";done
[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo $i; ssh root@$i "ps -aux | grep redis";done
[root@redis-m01 ~]# for i in 192.168.66.{155..160};do echo $i; ssh root@$i "lsof -i:6379 && lsof -i:16379";done

3、开始创建集群

  • 任意节点下执行以下的命令;redis从5开始已经废弃了使用redis-trib.rb命令创建集群,而将创建集群指令直接集成在了redis-cli里面
redism01=192.168.66.155
redism02=192.168.66.156
redism03=192.168.66.157
rediss01=192.168.66.158
rediss02=192.168.66.159
rediss03=192.168.66.160

redis-cli --cluster create ${redism01}:6379 ${redism02}:6379 ${redism03}:6379 ${rediss01}:6379 ${rediss02}:6379 ${rediss03}:6379 --cluster-replicas 1 -a dqz123456
  • 注意:上面因为是redis设置了密码,那么这里创建集群时就需要通过-a参数写入密码
1607248573 4b7b05d5791b897
1607248574 6f0db4c1f33ef2b

4、验证集群状态

  • 任意节点登入redis,然后输入下面的命令查看集群信息
[root@redis-m01 ~]# redis-cli -h 192.168.66.155 -c -p 6379
192.168.66.155:6379> auth dqz123456
OK
192.168.66.155:6379> cluster nodes
1607248669 b51d2e50cbcae85
  • redis-m02节点上执行 set name dqzboy,然后在其他节点执行get name查看信息
[root@redis-m01 ~]# redis-cli -h 192.168.66.155 -c -p 6379
192.168.66.156:6379> auth dqz123456
OK
192.168.66.156:6379> ste name dqzboy
192.168.66.156:6379> set name dqzboy
OK

[root@redis-m03 ~]# redis-cli -h 192.168.66.157 -c -p 6379
192.168.66.157:6379> auth dqz123456
OK
192.168.66.157:6379> get name
-> Redirected to slot [5798] located at 192.168.66.156:6379
(error) NOAUTH Authentication required.
192.168.66.156:6379> auth dqz123456
OK
192.168.66.156:6379> get name
"dqzboy"

5、查看集群数据槽

  • 在任意一个 redis 节点的主机上执行以下命令,显文章来源(Source):https://www.dqzboy.com示集群当前所有数据槽的分配情况
[root@redis-m01 ~]# redis-cli -h 192.168.66.156 -c -p 6379
192.168.66.156:6379> auth dqz123456
OK
192.168.66.156:6379> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.66.157"
      2) (integer) 6379
      3) "e0c20fa62d8a83eb9245ce79acd4ffd76468ddd0"
   4) 1) "192.168.66.158"
      2) (integer) 6379
      3) "53947d2d4d7cdf7034f69b406d01a223205013b1"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "192.168.66.156"
      2) (integer) 6379
      3) "3c4ca3d464d716cbddd2e82eeadb787640eea013"
   4) 1) "192.168.66.160"
      2) (integer) 6379
      3) "cf0fa1ed6073fa5040cfd7761aee73dbe8fa83d9"
3) 1) (integer) 0
   2) (integer) 5460
   3) 1) "192.168.66.155"
      2) (integer) 6379
      3) "f9498fbc69be1d5a41fb02457dfbed0a947898f8"
   4) 1) "192.168.66.159"
      2) (integer) 6379
      3) "32e5dace74ee5511d724d89a1684e419dce8828b"
192.168.66.156:6379>



本文作者:浅时光
原文链接:https://www.dqzboy.com/5129.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!