一.主从复制有什么好处呢
1.读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规模自由增加或减少从库的数量;
2.数据被赋值了好几份,就算有一台机器出现故障,也可以使用其他的机器的数据快速恢复
注:但是主从复制也带来一些问题,比如当主节点出现故障,我们需要手动选择一个从节点代替它,此时不仅要修改应用方的主节点地址,还要命令其他从节点复制新的主节点,整个过程都需要人工干预。其次,主节点的读写能力、存储能力都受制于单机。
二.哨兵模式
哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,它会独立运行,功能有二个:
-
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
-
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
三.哨兵模式下的主从复制
两个slave从库是复制master主库,他们的数据是同步
slave从库只能作为副本被读取,并不能写入数据,而master主库却可以,利用他的这一特点我们可以做读写分离,提高服务器的负载能力
但当主库出现故障时,我们需要手动去切换主库,哨兵模式的作用就在这了
从图中我们可以看出redis三个库都受到sentinel哨兵的监控,当其中一个库出现问题,哨兵就会告知另外两个库。如果是主库会出现问题,那么哨兵就会从两个从库中重新选出一个当做主库,无需我们手动去切换
大致流程
1 多个sentinel发现并确认master有问题 2 选举触一个sentinel作为领导 3 选取一个slave作为新的master 4 通知其余slave成为新的master的slave 5 通知客户端主从变化 6 等待老的master复活成为新master的slave
四.创建主从复制
1.安装redis (自行百度安装,或者参考这里https://www.cnblogs.com/marvinn/p/11081106.html)
2.创建多个redis数据库
复制redis目录下的redis.conf 我这里复制多两份并且分别命名为redis6380.conf redis6381.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
修改redis6380.conf配置
vim redis6380.conf
#修改端口
port 6380
#关闭保护模式
protected-mode no
#开启守护进程
daemonize yes
#进程文件
pidfile "/var/run/redis_6380.pid"
#日志文件
logfile 这个地址你自己存 不要和redis.conf redis6381.conf填写到一起 到时出现问题好排查
#数据文件名
dbfilename 这个也是自己写 一般直接写文件名就好 会自动创建 如"dump6380.rdb"
ESC + :wq 保存配置并退出
redis6381.conf的配置方法也是同上 但是不要一味复制
启动redis实例
redis-server redis.conf
redis-server redis6380.conf
redis-server redis6381.conf
输入 netstat -nplt 查看进程中是否有三个redis进程
我是因为修改了配置文件中的bind 所以显示0.0.0.0 你们如果是显示127.0.0.1的就代表启动成功
3.配置主从复制
任意选取两个库作为从库 我这边是以redis6380.conf redis6381.conf为从库
所以我在redis6380.conf redis6381.conf的加入
slaveof 127.0.0.1 6379
这个话的意思是你认127.0.0.1:6379为主,你作为从属
重启下三个redis实例
进入6379客户端 redis-cli
随便设置个值 set test 1111
然后退出客户端
进入6380客户端 redis-cli -p 6380
获取test的值 get test
如果得到1111那么说明你配置成功了
五,启动哨兵模式
复制redis下的sentinel.conf文件 我这里复制多两份并且分别命名为sentinel6380.conf sentinel6381.conf
cp sentinel.conf sentinel6380.conf
cp sentinel.conf sentinel6381.conf
修改sentinel6380.conf配置
vim sentinel6380.conf
port 26380 #此端口号是该哨兵文件的端口号,每个哨兵文件的端口号不同
daemonize yes
dir /root/data
protected-mode no
bind 0.0.0.0
logfile "redis6380_sentinel.log"
#sentinel monitor代表监控,mymaster是给主库取得别名,ip地址代表监控的主库,6379是主库的端口号,2代表有两个或者两个以上的 哨兵认为主库不可用时,才会进行换库
sentinel monitor mymaster 127.0.0.1 6380 2
#此配置指需要多少时间,一个master才会被sentinel主观认定是不可用的,单位是毫秒,默认是30秒
sentinel down-after-milliseconds mymaster 30000
#此配置值在发生故障时,最多可以有几个slave同时对新的master进行同步,这个数字越小完成故障处理的时间越短
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
#failover-timeout可以用在以下这些方面
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向 master,但是就不按parallel-syncs所配置的规则来了。
ESC + :wq 保存配置并退出
sentinel6381.conf的配置方法也是同上 但是不要一味复制
启动哨兵
redis-sentinel sentinel.conf
redis-sentinel sentinel6380.conf
redis-sentinel sentinel6381.conf
类似这样子 代表你的哨兵启动成功
此时我们可以进入6379控制台 redis-cli
查询当前redis信息
127.0.0.1:6379>info replication
其中的role代表你的身份 master是主库
connected_slaves代表你有多少个从库
此时如果我们的主库进程被杀死/主库停止了
redis-cli -p 6379 shutdown
我们在进入6381或者6380的客户端 输入info replication 会发现其中的6380或者6381被自动切换成主库 此时你的主从和哨兵就都搭建完成了
六 redis的一些配置信息注释
daemonize:如需要在后台运行,把该项的值改为yes
pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址
bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请 求,在生产环节中最好设置该项
port:监听端口,默认为6379 timeout:设置客户端连接时的超时时间,单位为秒
loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice
logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上
database:设置数据库的个数,默认使用的数据库是0 save:设置redis进行数据库镜像的频率
rdbcompression:在进行镜像备份时,是否进行压缩
dbfilename:镜像备份文件的文件名 dir:数据库镜像备份的文件放置的路径
slaveof:设置该数据库为其他数据库的从数据库
masterauth:当主数据库连接需要密码验证时,在这里设定
requirepass:设置客户端连接后进行任何其他指定前需要使用的密码
maxclients:限制同时连接的客户端数量
maxmemory:设置redis能够使用的最大内存
appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
appendfsync:设置appendonly.aof文件进行同步的频率
vm_enabled:是否开启虚拟内存支持 vm_swap_file:设置虚拟内存的交换文件的路径
vm_max_momery:设置开启虚拟内存后,redis将使用的最大物理内存的大小,默认为0
vm_page_size:设置虚拟内存页的大小
vm_pages:设置交换文件的总的page数量
vm_max_thrrads:设置vm IO同时使用的线程数量