部署规划
redis搭建集群至少需要三个master节点,结合高可用和容错机制,我们需要使用三台主机部署9个redis实例。在同一台机器上部署三个实例,一个master实例和两个slave实例,两个slave实例分别为另外两个master的从实例。详见下图:
准备环境
三台机器 192.168.10.10、192.168.10.11、192.168.10.12。
端口:master节点端口7001,slave节点端口7002和7003,内部通信端口17001、17002、17003。
1)准备磁盘环境
三台机器都存在24块硬盘,我们做如下存储规划:将三块硬盘作为redis数据的存储盘,剩余21块盘用作其他存储。
以机器A 为例,master_A的db目录配置为/usr/local/redis_db/M_A,
slave_B的db目录配置为 /usr/local/redis_db/S_B,slave_C的db目录配置为/usr/local/redis_db/S_C。
因此我们需要先创建这些目录:
mkdir -p /usr/local/redis_db
对于机器B我们需要创建如下目录:
mkdir -p /usr/local/redis_db
对于机器C我们需要创建如下目录:
mkdir -p /usr/local/redis_db
改变用户组
chown redis:redis -R /usr/local/redis_db
按照上图的集群设计作图如下存储规划:
设备名称 |
挂在目录 |
软连接目录 |
/dev/sda |
/tendis_db/M_A/0 |
/usr/local/tendis_db/M_A/0 |
/dev/sdb |
/tendis_db/M_A/1 |
/usr/local/tendis_db/M_A/1 |
/dev/sdc |
/tendis_db/M_A/2 |
/usr/local/tendis_db/M_A/2 |
/dev/sdd |
/tendis_db/M_A/3 |
/usr/local/tendis_db/M_A/3 |
/dev/sde |
/tendis_db/M_A/4 |
/usr/local/tendis_db/M_A/4 |
/dev/sdf |
/tendis_db/M_A/5 |
/usr/local/tendis_db/M_A/5 |
/dev/sdg |
/tendis_db/M_A/6 |
/usr/local/tendis_db/M_A/6 |
/dev/sdh |
/tendis_db/S_B/0 |
/usr/local/tendis_db/S_B/0 |
/dev/sdi |
/tendis_db/S_B/1 |
/usr/local/tendis_db/S_B/1 |
/dev/sdj |
/tendis_db/S_B/2 |
/usr/local/tendis_db/S_B/2 |
/dev/sdk |
/tendis_db/S_B/3 |
/usr/local/tendis_db/S_B/3 |
/dev/sdl |
/tendis_db/S_B/4 |
/usr/local/tendis_db/S_B/4 |
/dev/sdm |
/tendis_db/S_B/5 |
/usr/local/tendis_db/S_B/5 |
/dev/sdn |
/tendis_db/S_B/6 |
/usr/local/tendis_db/S_B/6 |
/dev/sdo |
/tendis_db/S_C/0 |
/usr/local/tendis_db/S_C/0 |
/dev/sdp |
/tendis_db/S_C/1 |
/usr/local/tendis_db/S_C/1 |
/dev/sdq |
/tendis_db/S_C/2 |
/usr/local/tendis_db/S_C/2 |
/dev/sdr |
/tendis_db/S_C/3 |
/usr/local/tendis_db/S_C/3 |
/dev/sds |
/tendis_db/S_C/4 |
/usr/local/tendis_db/S_C/4 |
/dev/sdt |
/tendis_db/S_C/5 |
/usr/local/tendis_db/S_C/5 |
/dev/sdu |
/tendis_db/S_C/6 |
/usr/local/tendis_db/S_C/6 |
/dev/sdv |
/rendis_db/M_A |
/usr/local/rendis_db/M_A |
/dev/sdw |
/rendis_db/S_B |
/usr/local/rendis_db/S_B |
/dev/sdx |
/rendis_db/S_C |
/usr/local/rendis_db/S_C |
磁盘设备列表可以通过lsblk命令查看。
sdv、sdw、sdx为redis数据存储盘。
以磁盘sdv为例,我们做如下操作:
a.格式化磁盘
mkfs.xfs /dev/sdv
b.创建磁盘挂载目录
mkdir -p /redis_db/M_A
c.挂载磁盘
mount /dev/sdv /redis_db/M_A //临时挂载,重启机器就接触挂载了。
或
vi /etc/fstab
在fstab最后添加如下内容:
/dev/sdv /tendis_db/M_A xfs defaults 0 0
然后执行mount -a
这种方式为永久挂载,不受机器重启影响。
挂载结果可以通过 df 或 lsblk 查看。
d.改变用户组
chown redis:redis -R /redis_db
chown redis:redis -R /usr/local/redis_db
e.建立挂载目录与db目录的软链接
ln -s /redis_db/M_A /usr/local/redis_db/M_A
按照上述步骤依次对磁盘sdw、sdx进行操作。
至此,我们已将磁盘环境准备完毕。
2)开放端口
开放7001、7002、7003和17001、17002、17003端口。
在三台机器上分别命令配置防火墙开放端口:
firewall-cmd --permanent --add-port=7001/tcp
firewall-cmd --permanent --add-port=7002/tcp
firewall-cmd --permanent --add-port=7003/tcp
firewall-cmd --permanent --add-port=17001/tcp
firewall-cmd --permanent --add-port=17002/tcp
firewall-cmd --permanent --add-port=17003/tcp
firewall-cmd --reload
3)配置selinux
vi /etc/selinux/config
SELINUX=disabled
部署Redis实例
安装redis
将redis的rpm包放到yum源上或分别放到三台机器上,下面以192.168.10.10机器部署为例:
如果是将rpm包放在yum源上则可以用使用yum install 命令安装
yum -y install redis
如果是将rpm放在部署机器上则可以使用rpm 命令安装
rpm -ivh redis-6.0.15-1.el7.x86_64.rpm
为各节点实例配置参数
拷贝三分配置文件:
cp /etc/redis.conf /etc/redis_M_A.conf
cp /etc/redis.conf /etc/redis_S_B.conf
cp /etc/redis.conf /etc/redis_S_C.conf
修改redis_M_A.conf的如下配置项:
port 7001//端口
bind 192.168.10.10 //绑定的IP,如果有多个网卡,可以是空格隔开多个IP
cluster-enabled yes 开启集群模式
cluster-config-file nodes_7001.conf
appendonly yes
daemonize yes
logfile "/usr/local/redis_db/M_A/redis_7001.log"
pidfile /var/run/redis_7001.pid
dir /usr/local/redis_db/M_A //数据持久化目录
protected-mode no关闭保护模式
requirepass pass
修改redis_S_B.conf的如下配置项:
port 7002//端口
bind 192.168.10.10 //绑定的IP,如果有多个网卡,可以是空格隔开多个IP
cluster-enabled yes 开启集群模式
cluster-config-file nodes_7002.conf
appendonly yes
daemonize yes
logfile "/usr/local/redis_db/S_B/redis_7002.log"
pidfile /var/run/redis_7002.pid
dir /usr/local/redis_db/S_B //数据持久化目录
protected-mode no关闭保护模式
requirepass pass
slave_C的配置如下:
port 7003//端口
bind 192.168.10.10 //绑定的IP,如果有多个网卡,可以是空格隔开多个IP
cluster-enabled yes 开启集群模式
cluster-config-file nodes_7003.conf
appendonly yes
daemonize yes
logfile "/usr/local/redis_db/S_C/redis_7003.log"
pidfile /var/run/redis_7003.pid
dir /usr/local/redis_db/S_C//数据持久化目录
protected-mode no关闭保护模式
requirepass pass
添加systemd服务
cp /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis_M_A.service
cp /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis_S_B.service
cp /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis_S_C.service
修改 /usr/lib/systemd/system/redis_M_A.service为如下内容:
注:主要修改ExecStart项,使用对应的配置文件。
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis_M_A.conf --daemonize no --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
修改 /usr/lib/systemd/system/redis_S_B.service为如下内容:
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis_S_B.conf --daemonize no --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
修改 /usr/lib/systemd/system/redis_S_C.service为如下内容:
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis_S_C.conf --daemonize no --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
添加开机启动
systemctl enable redis_M_A
systemctl enable redis_S_B
systemctl enable redis_S_C
启动实例
systemctl start redis_M_A
systemctl start redis_S_B
systemctl start redis_S_C
按照上述操作在192.168.10.11、192.168.10.12上配置并启动redis实例。
至此redis实例已经部署并启动完成。
搭建redis集群
拉起redis服务进程之后,就可以使用Redis命令来建立集群了。
节点握手
登录A机器上的7001节点meet其他所有节点
redis-cli -h 192.168.10.10 -p 7001-a pass
登录到7001节点后,依次执行:
cluster meet 192.168.10.10 7002
cluster meet 192.168.10.10 7003
cluster meet 192.168.10.11 7001
cluster meet 192.168.10.11 7002
cluster meet 192.168.10.11 7003
cluster meet 192.168.10.12 7001
cluster meet 192.168.10.12 7002
cluster meet 192.168.10.12 7003
节点握手后,相当于加入到了集群只是没有分配slot,不能存储数据。
可以使用 cluster forget node_id 命令删除集群中的指定节点。node_id 可以通过cluster nodes 命令查询得到。
分配slots
默认情况下,redis将所有的数据映射到16384个slot中,每个key都会对应一个槽。只有把slot分配给了redis节点,redis节点才能响应与slot相关的命令,否则就会-MOVE到其他节点。
分配slots可使用cluster add slots指令。
redis-cli -h 192.168.10.10-p 7001 -a pass cluster addslots {0..5461}
redis-cli -h 192.168.10.11 -p 7001 -a pass cluster addslots {5462..10922}
redis-cli -h 192.168.10.12 -p 7001 -a pass cluster addslots {10923..16383}
上面的命令将16384个slots平均的分配给3个节点。
可以通过cluster info指令查看集群状态。
192.168.10.10:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
......
如果分配slot过程中出现失误可以结合CLUSTER DELSLOTS 和CLUSTER SETSLOT等命令重新修改SLOT分配策略,也可以通过CLUSTER FLUSHSLOTS命令清空SLOT,然后重新分配。
此时可以发现集群状态已经是OK。
主从复制
这里将3个实例分配了slots,剩余三个实例可以作为他们的slave,使用cluster replicate命令。
可以通过cluster nodes 查询集群节点的信息。
a87015018eafbd36875d9fe77c552b43f17bddb2为master_A的节点id
ac3019e990d7eaf600d6a5d4cfeb63c5fe22b90e为master_B 的节点id
4901856147220e503d943b7ba87cfae24bdeb6d1为master_C的节点id
redis-cli -h 192.168.10.11 -p 7002 -a pass cluster replicate a87015018eafbd36875d9fe77c552b43f17bddb2
redis-cli -h 192.168.10.12 -p 7003 -a pass cluster replicate a87015018eafbd36875d9fe77c552b43f17bddb2
redis-cli -h 192.168.10.12 -p 7002 -a pass cluster replicate ac3019e990d7eaf600d6a5d4cfeb63c5fe22b90e
redis-cli -h 192.168.10.10 -p 7003 -a pass cluster replicate ac3019e990d7eaf600d6a5d4cfeb63c5fe22b90e
redis-cli -h 192.168.10.10 -p 7002 -a pass cluster replicate 4901856147220e503d943b7ba87cfae24bdeb6d1
redis-cli -h 192.168.10.11 -p 7003 -a pass cluster replicate 4901856147220e503d943b7ba87cfae24bdeb6d1
这样,就可以搭建一个三主六从的九节点集群了。