十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
yum install epel-release.noarch -y
yum install redis -y
主:
vim /etc/redis.conf #修改配置文件
bind 10.1.1.111 #修改监听IP
requirepass 233233 #添加密码
masterauth 233233
#为什么要添加认证密码,假如主挂了,再次上线。此时主就变成从了,它需要认证其它服务器,其它服务器有密码会无法通过认证,所以预先设置好。
slave-priority 50 #增大选举权,保证主的挂了,再次线切换时候有足够权限拿到master
从:
vim /etc/redis.conf #修改配置文件
bind 10.1.1.112 #修改监听IP
requirepass 233233
#从 也要设置和主一样密码,假如主挂了,112提升为主,113认证的还是111的密码,这样112和113两台机器就无法连接。
slaveof 10.1.1.111 6379 #指定主的ip和端口
masterauth 233233 # 指定主的密码
另一台从也这个配置
systemctl start redis #同时启动三台主机
redis-cli -h 10.1.1.111 -a 233233 #登陆主服务器
10.1.1.111:6379> INFO replication #查看主从信息
#Replication
role:master
connected_slaves:2
slave0:ip=10.1.1.112,port=6379,state=online,offset=1135,lag=0
slave1:ip=10.1.1.113,port=6379,state=online,offset=1135,lag=1
master_repl_offset:1135
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1134
10.1.1.111:6379>
在主服务器创建一个键值
11.10.1.1.111:6379> set ID 001
OK
10.1.1.111:6379> get ID
"001"
10.1.1.111:6379>
切换到从服务器查看
[root@cs112 ~]# redis-cli -h 10.1.1.112 -a 233233 #登陆112服务器
10.1.1.112:6379> get ID #查看ID键值
"001"
10.1.1.112:6379>
命令配置主从 (命令配置会自动同步到配置文件)
[root@web1 ~]# redis-cli -h 10.1.1.233
10.1.1.233:6379> slaveof 10.1.1.111 6379
OK
10.1.1.233:6379> config set masterauth 233233
OK
10.1.1.233:6379>
登陆到主服务器查看主从
10.1.1.111:6379> INFO replication
# Replication
role:master
connected_slaves:3
slave0:ip=10.1.1.112,port=6379,state=online,offset=2602,lag=1
slave1:ip=10.1.1.113,port=6379,state=online,offset=2602,lag=1
slave2:ip=10.1.1.233,port=6379,state=online,offset=2602,lag=1
master_repl_offset:2602
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2
#可以看到,这边从服务器已经有三个了,
下面是redis主从复制场景的一些可调参数,需要根据实际环境调整
slave-serve-stale-data yes : 是否可以把不新鲜的数据服务与客户端
slave-read-only yes : 从节点只读,启用slaveof定义后才生效
repl-diskless-sync no :是否同时向多个从节点同时发数据
repl-diskless-sync-delay 5 :发送的延迟时间
repl-ping-slave-period 10 探测从节点状态
repl-timeout 60 探测节点超时时间
repl-disable-tcp-nodelay no : 启用nodelay
repl-backlog-size 1mb
slave-priority 100 : 从节点优先级,复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
先找一台从服务器把优先级调高
vim /etc/redis.conf #修改112配置,控制选举
slave-priority 90 #调到90,默认100,越小权限越大,0不参与选举
systemctl restart redis #重启一下
找三台服务器 配置sentinel服务
vim /etc/redis-sentinel.conf
bind 10.1.1.112 #监听IP,建议不要用0.0.0.0 会出错
sentinel monitor mymaster 10.1.1.111 6379 2 #设置主服务器ip
sentinel auth-pass mymaster 233233 #主服务器的认证
#其他两台除了IP不一样其他 一样配置
配置好了 启动sentinel
如何查看sentinel是否已经正常运行
vim /etc/redis-sentinel.conf #打开sentinel的配置文件
#查看最后几行,sentinel正常运行的话,能获取的到局域网其他redis主机信息,其他sentinel主机信息,如图。
测试
先将主服务器的redis的服务给停掉
redis-cli -h 10.1.112 -p 26379 #登陆sentinel服务
10.1.1.112:26379> SENTINEL masters #查看主服务器状态
1) 1) "name"
2) "mymaster"
3) "ip"
4) "10.1.1.113"
5) "port"
6) "6379"
7) "runid"
8) "7ee5fe0e808bd06638f0f4c365d95c7694c6770c"
9) "flags"
10) "master"
上面我们已经能看到主的已经转移到113主机了,打开其他从服务器配置可以发现,配置文件里指向10.1.1.111为主的已经被改成了113了。
redis-cli -h 10.1.1.112 -a 233233 #登录112的从服务器
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.1.1.113
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1253
slave_priority:70
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#上面可以看到从 从服务器112 主已经变成了113服务器了
#总结,主服务器挂了再次上线的的角色就变成slave了,除非再次触发选举,而且权限要比其他机器权限大。
一个查看sentinel命令
[root@cs11 ~]# redis-cli -h 192.168.0.11 -a 233233 -p 26379 info |tail -1
#登录到26379端口(这个端口就是默认sentinel运行的端口),运行info命令,取最后一行
master0:name=mymaster,status=ok,address=192.168.0.14:6379,slaves=2,sentinels=3
#表示master是192.168.0.14 有2个从,3个哨兵
配置文件解释
sentinel monitor mymaster 192.168.0.11 6379 2
#192.168.0.11是master redis的IP地址和端口,2是代表2个sentinel(哨兵)检测到异常,才判断是real fail. Mymaster主机组的名称可以随便定义
sentinel auth-pass mymaster 233233
#当redis访问都需要密码的时候,即在redis.conf有配置requirepass项的时候,需要定义此项
sentinel down-after-milliseconds mymaster 30000
#指定sentinel监控到redis实例持续异常多长时间后,会判决其状态为down。若实际业务需要sentinel尽快判决出redis实例异常,则可适当配小,单位是毫秒
sentinel can-failover mymaster yes
#在sentinel检测到O_DOWN后,是否对这台redis启动failover机制
sentinel parallel-syncs mymaster 1
#执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
failover-timeout mymaster900000
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败
sentinel notification-script mymaster1 /root/通知.sh
#当sentinel触发时,切换主从状态时,需要执行的脚本。当主down的时候可以通知当事人
这里我们要用一台机器模拟9个主机,每个redis端口不一样,真实环境,ip不一样而已,
mkdir /date/700{1,2,3,4,5,6,7,8,9} -p # 创建9个文件夹存放配置log等
vim redis.conf #先修改一个模板,把配置文件cp一份改成下面的一样
port 6379
bind 127.0.0.1
daemonize yes
#redis后台运行
cluster-enabled yes
#开启集群
cluster-config-file nodes_6379.conf
#集群的配置,配置文件首次启动自动生成
cluster-node-timeout 8000
#请求超时,默认15秒,可自行设置
appendonly yes
#开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中
logfile "/data/6379/redis.log"
#日志路径
pidfile /var/run/redis_6379.pid
#pid路径
#端口还是用6379应为这个改的模板,等会后面用sed 批量修改
for((i=1;i<=9;i++));do cp redis.conf /date/700$i/redis.conf ; sed -i "s/6379/700$i/" /date/700$i/redis.conf;done
#批量复制配置文件到各个文件夹,在修改6379 端口号 。
for((i=1;i<=9;i++));do redis-server /date/700$i/redis.conf;done
#批量启动
ps -ef |grep redis #查看下服务有没有起来
./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008 127.0.0.1:7009 --cluster-replicas 1
#创建集群的命令 --replicas 1表示为集群的master节点创建1个slave。那么9个实例里,有4master,有5是slave。
--replicas 0不为集群的master节点创建slave。
#如图,集群被成功创建,1 2 3 4 被设置了成master ,其他均为slave
./redis-cli -p 7001 -c #登陆到集群里
#上图,我登陆进去了创建一个键值 cs1 ,该键值以一创建就被分配到7004端口分片上,后面我无论登陆那个端口,只要我get cs1 都会被重定向到7004端口上
#我又创建一个cs2 ,该键值被分配到了7001端口,无论那个端口访问cs2,都会被重定向到7001,就是redis的分片机制
常见集群命令
127.0.0.1:7004> cluster info #查看集群状态信息
#按照之前的方法,在复制两份配置文件,启动两个redis 端口为7010 7011
./redis-cli --cluster add-node 127.0.0.1:7010 127.0.0.1:7001
#新增节点命令 前面个地址是需要添加的地址,后面那个是任意已经在集群的节点
./redis-cli -c -p 7001 cluster nodes #查看集群节点
#如图添加成功,但是新增的节点不会有任何数据,因为他没有分配任何槽需要为新节点手动分配槽
./redis-cli --cluster reshard 127.0.0.1:7010
./redis-cli -c -p 7001 cluster nodes #在看下节点信息
#此时7010端口已经有槽了,里已经存了 2000/16384的数据了,如果坏了这部数据就会丢失了,所以我们给它加个从节点冗余
./redis-cli --cluster add-node 127.0.0.1:7011 127.0.0.1:7001
#依然是这个命令,增加了一个7011端口的节点
./redis-cli -c -p 7001 cluster nodes #在用查看节点的命令看一下
#上图能看见7011端口依然上线,角色是master 没有槽,我们要给他转变成slave角色
./redis-cli -c -p 7011
127.0.0.1:7011> cluster replicate d7ff265c7293735c5bbf9c5ef34d2bc54fe1a3ea
./redis-cli -c -p 7001 cluster nodes #在用查看节点的命令看一下
#再用查看节点的命令看一下,可以发现7011已经变成了slave 状态,且后面跟着7010的ID号,表示7011是7010的slave。
添加可能出现的报错及解决办法
由于主节点上有槽删了会丢失数据,所以我们要先移动槽到其他主节点上去
./redis-cli --cluster reshard 127.0.0.1:7001 #启动程序分槽
How many slots do you want to move (from 1 to 16384)? 2000
#您要移动多少个插槽(从1到16384)?
What is the receiving node ID? 4ef4f52ddff10e66eff50f40d765bb390ab935dd
接收节点ID是什么? 4ef4f52ddff10e66eff50f40d765bb390ab935dd
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
#请输入所有源节点ID。
#键入“ all”以将所有节点用作哈希槽的源节点。(抽取所有master的槽均摊2000)
#输入所有源节点ID后,键入“ done”。 (只抽取一个ID的槽,这里我们要把7003的槽移空)
Source node #1: dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
#源节点1:dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
Source node #2: done
#源节点2:已完成
Ready to move 2000 slots.
#准备移动2000个插槽。
Source nodes:
#源节点:
M: dfe430fa679ef9a38aa5e072df4c957b3ed9a92d 127.0.0.1:7003
slots: (0 slots) master
#移动完成后,还有多少槽
Destination node:
#目标节点
M: 4ef4f52ddff10e66eff50f40d765bb390ab935dd 127.0.0.1:7002
slots:[0-3115],[5782-8857],[10181-11698],[12181-12953] (8483 slots) master
#移动完成后,还有多少槽
4 additional replica(s)
# 4个其他副本
Resharding plan:
#分片计划:
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#您是否要继续执行建议的分片计划(是/否)? 是
#一点要用cluster nodes 命令确保要删除的主节点没槽了,才能执行下面的删除操作
./redis-cli --cluster del-node 127.0.0.1:7003 dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
#删除7003节点,要输入ip+端口+ID
删除从节点7009
./redis-cli --cluster del-node 127.0.0.1:7009 088ace239a35fbbbb8f7fe68618331383c762c6b
#由于7009节点只是从节点,没有槽,所以直接删除即可
#用cluster nodes 查看,可以发现7003 和 7009 节点已经被删除了
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。