环境:
centos7 gcc版本
4C8G 磁盘100G
单台机器:6个节点,3个master,3个slave
1.redis介绍
版本3.0之后支持集群,为解决单台服务器不够用情况。redis可作为数据库、缓存、消息中间件。Redis 5.0 是第一个加入流数据类型(stream data type )的版本。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel(哨兵模式)提供高可用,通过Redis Cluster(集群模式)提供自动分区。
2.安装环境
(2.1)安装支持的库文件
切换目录:cd /usr/local/
安装命令:yum -y install gcc automake autoconf libtool make
(2.2)下载redis5.0.4
下载命令:wget http://download.redis.io/releases/redis-5.0.4.tar.gz
(2.3)解压redis文件
解压命令:tar xvzf redis-5.0.4.tar.gz
(2.4)编译与安装
切换目录:cd /usr/local/redis-5.0.4
编译与安装命令: make PREFIX=/usr/local/redis install
(2.5)复制redis-trib.rb到 /usr/local/bin 目录下
切换目录:cd src/
复制命令:cp redis-trib.rb /usr/local/bin/
(2.6)创建redis节点
切换目录:cd /usr/local/bin/
创建redis-cluster目录:mkdir redis-cluster
切换目录:cd redis-cluster/
创建三个目录:mkdir 6001 6002 6003
(2.7)redis.conf复制到6001、6002、6003这三个目录中
命令:cp redis.conf redis-cluster/6001
出现问题:
解决方法:
redis.conf正确路径:/usr/local/redis-5.0.4/redis.conf
执行命令:cp /usr/local/redis-5.0.4/redis.conf redis-cluster/6001
出现问题:
解决方法:
执行命令:cp /usr/local/redis-5.0.4/redis.conf 6001/
同样,复制redis.conf到6002、6003目录下
执行命令:
切换目录:cd ..
复制命令:
cp /usr/local/redis-5.0.4/redis.conf 6002/
cp /usr/local/redis-5.0.4/redis.conf 6003/
(2.8)修改配置文件redis.conf
(2.8.1)6001目录下配置文件
切换目录:cd 6001/
编辑命令:vim redis.conf
快速查找字段命令:先按空格键,再输入/查找字段,再按回车,输入i编辑,Esc退出,:wq退出并保存,Home行首,End行尾。
port 6001
bind 192.168.229.130
daemonize yes //redis后台运行
pidfile /var/run/redis_6001.pid
cluster-enabled yes
cluster-config-file nodes-6001.conf //集群的配置
cluster-node-timeout 15000
appendonly yes //aof日志开启,每次写操作都记录一条日志
(2.8.2)6002目录下配置文件
切换目录:cd ..
cd 6002/
编辑命令:vim redis.conf
快速查找字段命令:先按空格键,再输入/查找字段,再按回车,输入i编辑,Esc退出,:wq退出并保存,Home行首,End行尾。
port 6002
bind 192.168.229.130
daemonize yes //redis后台运行
pidfile /var/run/redis_6002.pid
cluster-enabled yes
cluster-config-file nodes-6002.conf //集群的配置
cluster-node-timeout 15000
appendonly yes //aof日志开启,每次写操作都记录一条日志
(2.8.3)6003目录下配置文件,参考前两个步骤即可。
(2.9)启动节点
切换目录:cd /usr/local/redis/bin/
执行启动命令:redis-server /usr/local/bin/redis-cluster/6001/redis.conf
出现问题:
解决方法:
重新执行命令:./redis-server /usr/local/bin/redis-cluster/6001/redis.conf
启动其它两个节点:
./redis-server /usr/local/bin/redis-cluster/6002/redis.conf
./redis-server /usr/local/bin/redis-cluster/6003/redis.conf
(2.10)查看redis启动情况
查看命令:ps -ef|grep redis
(2.11)查看pid情况
查看命令:cat nodes-6001.conf、cat nodes-6002.conf、cat nodes-6003.conf
编辑命令:vim nodes-6001.conf、vim nodes-6002.conf 、vim nodes-6003.conf
查找文件名:find -name nodes-6001.conf
(2.12)查看redis端口
执行命令:netstat -tnlp|grep redis
出现问题:
解决方法:
安装依赖:yum -y install net-tools
重新执行命令:netstat -tnlp|grep redis
查看所有端口命令:netstat -tunpl
(2.13)开启防火墙
firewall-cmd --zone=public --add-port=6001-6003/tcp --permanent
firewall-cmd --zone=public --add-port=16001-16003/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
出现问题:
解决方法:
开启防火墙:systemctl start firewalld
查看防火墙状态:systemctl status firewalld
重新执行命令:
firewall-cmd --zone=public --add-port=6001-6003/tcp --permanent
firewall-cmd --zone=public --add-port=16001-16003/tcp --permanent
firewall-cmd --reload
执行命令:
firewall-cmd --zone=public --list-ports
(2.14)创建集群
执行命令:
./redis-cli --cluster create --cluster-replicas 1 192.168.229.130:6001 192.168.229.130:6002 192.168.229.130:6003
出现问题:
解决方法:
切换目录:cd /usr/local/bin/redis-cluster/6001
编辑命令:vim redis.conf,只保留一个bind
bind 127.0.0.1 192.168.229.130
6002、6003目录配置文件参考6001修改
杀掉所有进程: kill -s 9 6684 6689 6934
重新启动:./redis-server /usr/local/bin/redis-cluster/6001/redis.conf
./redis-server /usr/local/bin/redis-cluster/6002/redis.conf
./redis-server /usr/local/bin/redis-cluster/6003/redis.conf
拓展:启动原始配置文件:./redis-server /usr/local/redis-5.0.4/redis.conf
重新执行:
切换目录:/usr/local/redis/bin
执行命令:
./redis-cli --cluster create --cluster-replicas 1 192.168.229.130:6001 192.168.229.130:6002 192.168.229.130:6003
出现问题:
解决方法:
参考前2.7-2.13步,在搭建3个节点。
重新执行创建集群命令:
./redis-cli --cluster create --cluster-replicas 1 192.168.229.130:6001 192.168.229.130:6002 192.168.229.130:6003 192.168.229.130:6004 192.168.229.130:6005 192.168.229.130:6006
输入:yes
(2.15)集群验证
连接6001节点命令:./redis-cli -h 192.168.229.130 -c -p 6001
输入命令:set 1 hello redis
出现问题:
解决方法:
检查语法,输入:set 1 hello
1-key
hello-value
连接另一个节点命令:./redis-cli -h 192.168.229.130 -c -p 6006
输入命令:get 1
拓展:其它节点可参考连接6001方式
3.redis简单原理
(3.1)每个节点都是对等、平等关系,保存各自数据和整个集群状态信息,和其它所有节点活跃连接。连接一个节点可获取其它节点数据。
(3.2)redis端口为6001,集群总线端口为16001.
(3.3)redis采用哈希槽(hash slot)方式分配,默认16384个slot。set一个key算法:CRC16(key) % 16384,将key分配到哈希槽区间的节点。
(3.4)redis 集群把数据存在一个 master 节点,在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
(3.5)必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。