主从的概念
- 主Redis写入数据时,从Redis会通过Redis Sync机制,同步数据,确保数据一致。并且Redis有哨兵(Sentinel)机制,Redis主挂掉会自动帮我们提升从为主,不过哨兵我发现只适用一主多从,不太适合级联模式。
- ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
- master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
- 通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)
主从的配置
- 确认关闭所有服务器的防火墙
关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running) - 查看master ip
[root@10-23-117-188 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1452 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:fe:c2:c8 brd ff:ff:ff:ff:ff:ff
inet 11.23.119.188/16 brd 10.23.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fefe:c2c8/64 scope link
valid_lft forever preferred_lft forever
[root@10-23-117-188 ~]#
可以看到ip为: 11.23.119.188(为云服务器默认配的内网ip)
- 设置之前的redis.conf文件,自己放在在cd /usr/local/redis-6.0.8/bin下
[root@10-23-117-188 ~]# cd /usr/local/redis-6.0.8/bin/
[root@10-23-117-188 bin]# ls
backup.db dump.rdb redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server
[root@10-23-117-188 bin]#
- 打开当前文件夹下的service.conf
vim service.conf
- 修改配置
bind 11.23.119.188 127.0.0.1
#绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接
== protected-mode no ==
#保护模式,默认是开启状态,只允许本地客户端连接
daemonize yes
#默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
appendonly yes
#默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
如果需要设置密码,则添加 requirepass 123456(自己的密码) - 重启redis服务器(先杀死进程,在加载配置文件启动)
[root@10-23-117-188 bin]# ps -aux |grep redis
root 7048 0.1 0.5 173316 9688 ? Ssl 14:35 0:09 ./redis-server 10.23.117.188:6379
root 11323 0.0 0.1 112828 2296 pts/0 R+ 16:25 0:00 grep --color=auto redis
[root@10-23-117-188 bin]# kill -9 7048
[root@10-23-117-188 bin]# ./redis-server ./redis.conf
You have new mail in /var/spool/mail/root
[root@10-23-117-188 bin]#
配置从服务器slave
这里用的本地虚拟机centos中的redis服务器
- 查看slave ip
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:9c:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.111/24 brd 192.168.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::7e0f:4e94:3afd:ae55/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]#
可以看到ip为: 192.168.0.111
- 设置之前的redis.conf文件,同样自己放在 /usr/local/redis-5.0.4/bin下
[root@localhost ~]# cd /usr/local/redis-5.0.4/bin/
[root@localhost bin]# ls
dump.rdb redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server
- 打开redis.conf文件
[root@localhost bin]# vim redis.conf
- 修改配置
bind 192.168.0.111 127.0.0.1
slaveof 106.75.226.106 6379(主节点的ip和端口)
#此处为自己的云服务对外网的ip,如果你用的是局域网搭建,则写自己局域网master绑定的ip,端口6379
port 6379
因为master 服务器设置了密码,所以slave 还需要加上
masterauth 123456 (验证master的密码,此密码为master的密码
requirepass 123456 (给slave设置密码,可设置可不设置,自己选择) - 重启redis服务器(先杀死进程,在加载配置文件启动)
查看主从关系
- 在master下 输入 redis-cli -h 11.23.119.188 info replication -a 123456(主master密码)
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=111.19.42.76,port=6379,state=online,offset=3458,lag=0
master_replid:22dc694b36c6634f14ef9f1718fd0c8f0b81e1a1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3458
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3458
You have new mail in /var/spool/mail/root
[root@10-23-117-188 bin]#
- 在slave下输入 redis-cli -h 192.168.0.111(slave绑定的ip) -a 123456(从slave密码)
[root@localhost bin]# ./redis-cli -h 192.168.0.111 -p 6379 -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:106.75.226.106
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:4494
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:22dc694b36c6634f14ef9f1718fd0c8f0b81e1a1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4494
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4494
[root@localhost bin]#
验证主从读写功能master(读写)slave(只读)
- masert端
[root@10-23-117-188 bin]# redis
127.0.0.1:6379> set name laowang
(error) NOAUTH Authentication required.
127.0.0.1:6379>
提示没有验证,输入密码即可 auth 123456
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set name laowang
OK
127.0.0.1:6379> get name
"laowang"
127.0.0.1:6379>
- slave端
[root@localhost bin]# redis
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get name
"laowang"
127.0.0.1:6379> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379>
由上验证了slave端只能读不能写,master端可读可写。
redis主从搭建与集群搭建密码的配置
-
redis主从
-
主服务器修改配置文件
添加
requirepass redis2020 -
从服务器修改配置文件
添加
masterauth redis2020
requirepass redis2020 -
重启主从服务
-
-
redis集群
- 修改每个节点配置文件
添加
masterauth redis2020
requirepass redis2020 - 重启集群各节点服务
- 修改每个节点配置文件
-
验证
- 无密码进入redis测试
redis-cli -h ip -p port
之后执行 keys *
因为已经设置了密码,所以出现下面的错误
(error) NOAUTH Authentication required.
使用密码进入就没有问题,如下所示
redis-cli -h ip -p port -a redis2020 - 设置密码后,查看集群状态,关闭服务等命令都需要在后边加上密码配置参数
如查看集群状态
redis-cli -h ip -p port -a redis2020 cluster nodes
关闭服务
redis-cli -h ip -p port -a redis2020 shutdown
- 无密码进入redis测试