redis
redis 是单线程的,但是一般的作为缓存使用的话,redis 足够了,因为它的读写速度太快了。官方的一个简单测试:测试完成了 50 个并发执行 100000 个请求。设置和获取的值是一个 256 字节字符串。结果:读的速度是 110000 次/s,写的速度是 81000 次/s 但对于访问量特别大的服务来说,还是稍有不足。那么,如何提升 redis 的性能呢?搭建集群。
redis 主要提供三种集群策略:
-
主从复制
-
集群
-
哨兵
一、主从复制
在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)。
1.1 主从复制有如下特点:
-
主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
-
从数据库一般都是只读的,并且接收主数据库同步过来的数据
-
一个 master 可以拥有多个 slave,但是一个 slave 只能对应一个 master
1.2 工作机制
-
slave 从节点服务启动并连接到 Master 之后,它将主动发送一个 SYNC 命令。Master 服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master 将传送整个数据库文件到 Slave,以完成一次完全同步。而 Slave 从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master 主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给 Slaves,Slave 将在本次执行这些数据修改命令,从而达到最终的数据同步。
-
复制初始化后,master 每次接收到的写命令都会同步发送给 slave,保证主从数据一致性。
-
如果 Master 和 Slave 之间的链接出现断连现象,Slave 可以自动重连 Master,但是在连接成功之后,一次完全同步将被自动执行。
1.3 主从配置
redis 默认是主数据,所以 master 无需配置,我们只需要修改 slave 的配置即可。设置需要连接的 master 的 ip 端口:slaveof 192.168.0.107 6379 如果 master 设置了密码。需要配置:masterauth master-password 连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息:info replication
1.3 优点
-
同一个 Master 可以同步多个 Slaves。
-
Slave 同样可以接受其它 Slaves 的连接和同步请求,这样可以有效的分载 Master 的同步压力。因此我们可以将 Redis 的 Replication 架构视为图结构。
-
Master Server 是以非阻塞的方式为 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求。
-
Slave Server 同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据
-
为了分载 Master 的读操作压力,Slave 服务器可以为客户端提供只读操作的服务,写服务仍然必须由 Master 来完成。即便如此,系统的伸缩性还是得到了很大的提高。
-
Master 可以将数据保存操作交给 Slaves 完成,从而避免了在 Master 中要有独立的进程来完成此操作。
-
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
1.4 缺点
-
Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复。
-
主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性。
-
Redis 的主从复制采用全量复制,复制过程中主机会 fork 出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
-
Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
-
其实 redis 的主从模式很简单,在实际的生产环境中是很少使用的,我也不建议在实际的生产环境中使