Redis 集群的工作原理
Redis Cluster中的各个节点之间保持相互连接,并且彼此之间可以通信,客户端随意连接到任何一个集群节点就能将整个Redis集群作为一个整体来访问,同时客户端也无需知道Redis Cluster将其提交的数据存入哪个Redis节点中,数据存储完全由Redis Cluster根据自己的算法来决定。在Redis Cluster中,数据被分散存储到不同的Redis节点上,Redis Cluster并没有采用一致性HASH来分配数据存放到不同的节点,而是采用了一种称为哈希槽(HASHSlot)的技术来分配数据。
为了保证数据的高可用,Redis Cluster用到了Master-Slave的主从数据复制模式,即为每个Master都设置一个或多个Slave, Master负责数据存取,而Slave负责数据的同步复制,当Master故障时,其中的某个Slave会被提升为Master。假如有三个节点,且没有为节点设置Slave,假如其中一台节点服务器故障,则该节点上的数据将无法访问,因此从高可用角度考虑,需要在Redis Cluster中设置Master节点和Slave节点,假设集群中有A、B、C三个主节点,同时分别为其设置了A1、B1、C1三个Slave节点,此时如果B节点故障,则集群会将B1节点选取为Master节点继续提供服务,当B节点恢复之后,它就变成了B1的Slave节点。
Redis集群的优势
自动分割数据到不同的节点上,整个集群的部分节点失败或者不可达的情况下能够继续处理命令。Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个Key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
Redis 集群的搭建
假如:集群中具有A、B、C三个redis节点服务器,节点A包含0到5500号哈希槽,节点B包含5501到11000号哈希槽,节点C包含11001到16384号哈希槽。
如果节点B故障,整个集群就会因缺少5501-11000这个范围的槽而不可以用,所以为每个节点添加一个从节点A1、B1、C1,整个集群便有三个master节点和三个slave节点组成,在节点B故障不可用后,集群选举B1位新的主节点继续服务,当B和B1都失败后,集群将不可用。
准备6台centos7.6,实验环境,不需要上网,这里选用仅主机VM1,配置固定IP
1、安装Redis
(1) 配静态IP地址(6个节点同步操作)
# vi /etc/sysconfig/network-scripts/ifcfg-ens33
dhcp 改为 static
ONBOOT=no 改为yes
添加:
IPADDR=192.168.100.11
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
# systemctl restart network
# ping 192.168.100.1
(2)关闭防火墙和核心防护(6个节点同步操作)
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# vi /etc/selinux/config
改为 SELINUX=disabled
(3)配本地yum 源(6个节点同步操作)
挂载光盘,永久挂载
# mount /dev/cdrom /mnt
# df -h
# vi /etc/fstab
末行添加:
/dev/cdrom /mnt iso9660 defaults 0 0
# cd /etc/yum.repos.d/
# mkdir backup
# mv C* backup/
# cp backup/CentOS-Base.repo local.repo
# vi local.repo
删除 写入
[centos]
name=CentOS
baseurl=file:///mnt
gpgcheck=0
enabled=1
# yum clean all
# yum makecache
# init 6
(4)解压源码包,编译安装(6个节点同步操作)
安装基本命令环境
# yum -y install net-tools vim bash-completion
# yum -y install gcc gcc-c++ make cmake pcre pcre-devel expat-devel perl
多种方法可上传解压源码包,这里用samba命令共享 上传解压
# mount.cifs //192.168.100.1/share /mnt
# df -h
# cd /mnt/
# tar zxvf redis-5.0.4.tar.gz -C /usr/src/
# cd /usr/src/redis-5.0.4/
# make
# make PREFIX=/usr/local/redis install
设置Redis相关配置文件
# ln -s /usr/local/redis/bin/* /usr/local/bin/
# cd /usr/src/redis-5.0.4/utils/
# ./install_server.sh
回车......
Please select the redis executable path [/usr/local/bin/redis-server] 手动输入 /usr/local/bin/redis-server
回车
2、修改配置文件(6个节点同步操作)
# vi /etc/redis/6379.conf
bind 20.0.0.40 --70行 删除原来的127.0.0.1,添加各主机对应IP地址
logfile /var/log/redis_6379.log --不改
daemonize yes --不改。独立守护进程启动
port 6379 --不改。6379端口
cluster-enabled yes --839行 前的#号去掉。打开集群
cluster-config-file nodes-6379.conf --847行 前的#号去掉。集群配置文件名称
cluster-node-timeout 15000 --853行 前的#号去掉。集群超时时间设置
cluster-require-full-coverage no --930行 前的#号去掉, yes改成no
appendonly yes --700行 no改为yes , 开启持久化
# /etc/init.d/redis_6379 restart 启动redis
# netstat -antp | grep 6379
3、下载依赖包
# yum -y install ruby rubygems
# cd /abc/redis
# cp redis-3.2.0.gem /opt
# cd /opt
# gem install redis --version 3.2.0 装编排工具
# cd /usr/src/redis-5.0.4/src/
# redis-cli --cluster create --cluster-replicas 1 192.168.100.11:6379 192.168.100.12:6379 192.168.100.13:6379 192.168.100.14:6379 192.168.100.15:6379 192.168.100.16:6379
..............
Can I set the above configuration? (type 'yes' to accept): 输入 yes
#redis-cli --cluster check 20.0.0.40:6379 --查看群集状态
4、测试集群
# redis-cli -h 192.168.100.12 -p 6379 -c --远程连接Redis数据库
20.0.0.41:6379> set centos 7.6
20.0.0.41:6379> quit
# redis-cli -h 192.168.100.11 -p 6379 -c --远程连接Redis数据库
20.0.0.42:6379> get centos
"7.6"
20.0.0.42:6379> cluster info --查看集群状态
cluster_state:OK
20.0.0.42:6379> cluster nodes --查看节点信息