20190327 Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换

一、缓存:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如 CPU 的一级、二级缓存是保存了 CPU 最近经常访问的数据,内存是保存 CPU 经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的 raid 卡有也缓存,都是为了起到加速 CPU 访问硬盘数据的目的一因为 CPU 的速度太快了,CPU 需要的数据硬盘往往不能在短时间内满足 CPU 的需求,因此 PCU 缓存、内存、Raid 卡以及硬盘缓存就在一定程度上满足了 CPU 的数据需求,即 CPU 从缓存读取数据可以大幅提高 CPU 的工作效率。
buffer:buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU 会把数据线写到内存的磁盘缓冲区,然后就认为数据已经写入完成。当服务器突然断电就会丢失部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU 读文件从内存读,如果内存没有就先从硬盘读到内存再读到 CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
cache 的特性:
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除
过期时间:强制过期,源网站更新图片后 CDN 是不会更新的,需要强制是图片缓存过期
命中率:即缓存的读取命中率。
CDN:内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能够就近获取,有效降低访问延迟,提升服务可用性,
优势:CDN 第一降低机房的使用带宽,因为很多资源通过 CDN 就直接返回用户了,第二解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加速用户访问的目的, 第三:解决用户访问的地域问题,就近返回用户资源。

Redis:官网地址:https://redis.io/

Redis和Memcached是非关系型数据库也称为NoSQL数据库,MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 数据库属于关系型数据(RDBMS, Relational Database Management System).redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcache,但相比 memcache,redis 还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛,目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比较靠前,而且一直是键值型存储类的首位。

redis 典型应用场景:

Session 共享:常见于 web 集群中的 Tomcat 或者 PHP 中多 web 服务器 session 共享
消息队列:ELK 的日志缓存、部分业务的订阅发布系统
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
缓存:数据查询、电商网站商品信息、新闻内容
微博/微信社交场合:共同好友、点赞评论等

Redis 安装及使用:官方下载地址:http://download.redis.io/releases/

准备工作:在172.18.9.150主机编译安装:
一、 cd /usr/local/src/ tar xvf redis -4.0.14.tar.gz ll --> total 1708
drwxrwxr-x. 6 root root 4096 Mar 19 00:23 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 2019 redis-4.0.14.tar.gz
二、 cd redis-4.0.14 make PREFIX=/apps/redis install
[root@150 src]#ll /apps/redis/ total 0 drwxr-xr-x. 2 root root 134 Mar 27 21:42 bin
[root@150 redis-4.0.14]#ll /apps/redis/bin/
total 21888
-rwxr-xr-x. 1 root root 2452176 Mar 27 21:42 redis-benchmark redis自带的压缩工具,可以模拟并发数
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-aof
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-rdb
-rwxr-xr-x. 1 root root 2618208 Mar 27 21:42 redis-cli
lrwxrwxrwx. 1 root root 12 Mar 27 21:42 redis-sentinel -> redis-server 哨兵机制(软连接)
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-server
三、[root@150 redis-4.0.14]#ll total 312 -rw-rw-r--. 1 root root 58766 Mar 19 00:23 redis.conf
[root@150 redis-4.0.14]#mkdir /apps/redis/etc
[root@150 redis-4.0.14]#cp redis.conf /apps/redis/etc/ 把redis.conf 拷贝至新建文件做配置文件
四、[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 二进制启动方式
50475:C 27 Mar 21:58:08.108 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50475:C 27 Mar 21:58:08.108 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50475, just started
.
_.-__ ‘‘-._ <br/>_.- .. ‘‘-. Redis 4.0.14 (00000000/0) 64 bit
.-.-```. ```\/ _.,_ ‘‘-._ <br/>( ‘ , .-` | `, ) Running in standalone mode 单机模式<br/>|`-._`-...-` __...-.-.|‘` .-‘| Port: 6379
| -._. / .-‘ | PID: 50475
-._-. `-./ .-‘ .-‘
|`-.
-._-..-‘ .-‘.-‘|
| -._-. .-‘.-‘ | http://redis.io
`-.
-._-.
.-‘.-‘ .-‘
|-._-._ -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ |
-._-._-.__.-‘_.-‘ _.-‘ <br/>-._ -.__.-‘ _.-‘ <br/>-. .-‘
`-.__.-‘
50475:M 27 Mar 21:58:08.119 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of
50475:M 27 Mar 21:58:08.119 # Server initialized 此处是三项。
50475:M 27 Mar 21:58:08.119 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1‘ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1‘ for this to take effect.
五、需要修改的配置参数如图:

[root@150 redis-4.0.14]#vim /etc/sysctl.conf net.core.somaxconn = 512 vm.overcommit_memory = 1
[root@150 redis-4.0.14]#sysctl -p net.core.somaxconn = 512 vm.overcommitmemory = 1
再次重启:[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
50607:C 27 Mar 22:07:30.778 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50607:C 27 Mar 22:07:30.778 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50607, just started
.
.-__ ‘‘-._ <br/>_.- .. ‘‘-. Redis 4.0.14 (00000000/0) 64 bit
.-.-```. ```\/ _.,_ ‘‘-._ <br/>( ‘ , .-` | `, ) Running in standalone mode<br/>|`-._`-...-` __...-.-.|‘` .-‘| Port: 6379
| -._. / .-‘ | PID: 50607
-._-. `-./ .-‘ .-‘
|`-.
-._-..-‘ .-‘.-‘|
| -._-. .-‘.-‘ | http://redis.io
`-.
-._-.
.-‘.-‘ .-‘
|-._-._ -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ |
-._-._-.__.-‘_.-‘ _.-‘ <br/>-._ -.__.-‘ _.-‘ <br/>-. .-‘
-.__.-‘ <br/>50607:M 27 Mar 22:07:30.782 # Server initialized 此处就是一项了。<br/>7977:M 28 Mar 08:57:56.291 * DB loaded from disk: 0.000 seconds<br/>50607:M 27 Mar 22:07:30.783 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled‘ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.<br/>六、开启大页内存动态分配,需要关闭让 redis 负责内存管理:[root@150 redis-4.0.14]#echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled<br/>[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf<br/>50689:C 27 Mar 22:14:54.060 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo<br/>50689:C 27 Mar 22:14:54.060 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50689, just started<br/>50689:C 27 Mar 22:14:54.060 # Configuration loaded<br/>50689:M 27 Mar 22:14:54.062 * Increased maximum number of open files to 10032 (it was originally set to 1024).<br/>_._ <br/>_.-``__ ‘‘-._ <br/>_.-``. _. ‘‘-._ Redis 4.0.14 (00000000/0) 64 bit<br/>.-`` .-```. ```\/ _.,_ ‘‘-._ <br/>( ‘ , .- | , ) Running in standalone mode<br/>|-._-...- ...-.`-._|‘ .-‘| Port: 6379
| `-.
._ / _.-‘ | PID: 50689<br/>-. `-. -./ _.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ | http://redis.io
-._-._-.__.-‘_.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ |
-._-._-.__.-‘_.-‘ _.-‘ <br/>-._ `-.
.-‘ .-‘
`-.
_.-‘
-.__.-‘ <br/>50689:M 27 Mar 22:14:54.066 # Server initialized<br/>50689:M 27 Mar 22:14:54.066 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1‘ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1‘ for this to take effect.<br/>50689:M 27 Mar 22:14:54.066 * DB loaded from disk: 0.000 seconds<br/>50689:M 27 Mar 22:14:54.066 * Ready to accept connections。此时表明启动已完成。<br/>七、[root@150 redis-4.0.14]#vim /etc/rc.d/rc.local echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled<br/>[root@150 redis-4.0.14]#chmod a+x /etc/rc.d/rc.local 给该文件要加上x权限。<br/>八、[root@150 redis-4.0.14]#reboot 重启使其生效。<br/>九、[root@centos7 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf<br/>7977:C 28 Mar 08:57:56.284 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo<br/>7977:C 28 Mar 08:57:56.284 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=7977, just started<br/>7977:C 28 Mar 08:57:56.284 # Configuration loaded<br/>7977:M 28 Mar 08:57:56.286 * Increased maximum number of open files to 10032 (it was originally set to 1024).<br/>_._ <br/>_.-``__ ‘‘-._ <br/>_.-``. _. ‘‘-._ Redis 4.0.14 (00000000/0) 64 bit<br/>.-`` .-```. ```\/ _.,_ ‘‘-._ <br/>( ‘ , .- | , ) Running in standalone mode<br/>|-._-...- ...-.`-._|‘ .-‘| Port: 6379
| `-.
._ / _.-‘ | PID: 7977<br/>-. `-. -./ _.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ | http://redis.io
-._-._-.__.-‘_.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ |
-._-._-.__.-‘_.-‘ _.-‘ <br/>-._ `-.
.-‘ .-‘
`-.
_.-‘
-.__.-‘ <br/>7977:M 28 Mar 08:57:56.291 # Server initialized<br/>7977:M 28 Mar 08:57:56.291 * DB loaded from disk: 0.000 seconds<br/>7977:M 28 Mar 08:57:56.291 * Ready to accept connections<br/>十、[root@centos7 ~]#scp /etc/sysctl.conf 172.18.9.100/200/110:/etc/<br/>[root@centos7 ~]#scp /etc/rc.d/rc.local 172.18.9.100/200/110:/etc/rc.d/<br/>[root@centos7 ~]#chmod a+x /etc/rc.d/rc.local (100\110\200\150)<br/>十一、[root@centos7 ~]#mkdir /apps/redis/{logs,data,run} -pv<br/>mkdir: created directory ‘/apps/redis/logs’<br/>mkdir: created directory ‘/apps/redis/data’<br/>mkdir: created directory ‘/apps/redis/run’<br/>十二、[root@centos7 ~]#groupadd -g 1001 redis && useradd -u 1001 -g 1001 redis -s <br/>[root@centos7 ~]#id redis uid=1001(redis) gid=1001(redis) groups=1001(redis)<br/>[root@centos7 ~]#chown redis.redis /apps/redis/ -R 这一步务必完成。<br/>十三、[root@centos7 ~]#su redis<br/>[redis@centos7 root]$ll /apps/ total 0 drwxr-xr-x. 7 redis redis 63 Mar 28 09:20 redis<br/>[redis@centos7 root]$cd /apps/redis/ 此时,我们是以普通用户身份登录的redis。<br/>[redis@centos7 redis]$ll<br/>total 0<br/>drwxr-xr-x. 2 redis redis 134 Mar 27 21:42 bin<br/>drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 data<br/>drwxr-xr-x. 2 redis redis 24 Mar 27 22:07 etc<br/>drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 logs<br/>drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 run<br/>十四、我们用普通用户身份启动redis,会有6379的端口开启,系系统默认行为。<br/>[redis@centos7 redis]$/apps/redis/bin/redis-server /apps/redis/etc/redis.conf<br/>8676:C 28 Mar 09:41:42.609 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo<br/>8676:C 28 Mar 09:41:42.609 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=8676, just started<br/>8676:C 28 Mar 09:41:42.609 # Configuration loaded<br/>8676:M 28 Mar 09:41:42.612 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.<br/>8676:M 28 Mar 09:41:42.613 # Server can‘t set maximum open files to 10032 because of OS error: Operation not permitted.<br/>8676:M 28 Mar 09:41:42.613 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase ‘ulimit -n‘.<br/>_._ <br/>_.-``__ ‘‘-._ <br/>_.-``. _. ‘‘-._ Redis 4.0.14 (00000000/0) 64 bit<br/>.-`` .-```. ```\/ _.,_ ‘‘-._ <br/>( ‘ , .- | , ) Running in standalone mode<br/>|-._-...- ...-.`-._|‘ .-‘| Port: 6379
| `-.
._ / _.-‘ | PID: 8676<br/>-. `-. -./ _.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ | http://redis.io
-._-._-.__.-‘_.-‘ _.-‘ <br/>|-.`-. -.__.-‘ _.-‘_.-‘| <br/>|-.`-. .-‘.-‘ |
-._-._-.__.-‘_.-‘ _.-‘ <br/>-._ `-.
.-‘ .-‘
`-.
_.-‘
`-.__.-‘
8676:M 28 Mar 09:41:42.619 # Server initialized
8676:M 28 Mar 09:41:42.620 DB loaded from disk: 0.000 seconds
8676:M 28 Mar 09:41:42.620
Ready to accept connections
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :
十五、设置软连接,这样我们就可以全局执行redis命令了:
[root@centos7 ~]#ln -sv /apps/redis/bin/ /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
十六、[redis@centos7 redis]$ vim etc/redis.conf bind 0.0.0.0
[redis@centos7 redis]$ /apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重启。
[root@centos7 ~]#ss -ntl 6379的端口就会指向任意IP。
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511
:6379 :
十七、[redis@centos7 redis]$ vim etc/redis.conf
one:logfile "/apps/redis/logs/redis-6379.log" 日志路径 two:stop-writes-on-bgsave-error no #快照出错时是否禁止redis写入操作
/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重启服务
十八、vim /apps/redis/etc/redis.conf
one:dbfilename redis_6379.rdb two:dir /apps/redis/data 这两处做修改。(dump文件是6379端口下的文件,数据放/data/下)
十九、重启:查看端口:
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :

#### Redis的配置文件
主要配置项:
bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听 IP
pidfile /var/run/redis_6379.pid #pid 文件路径
stop-writes-on-bgsave-error no #快照出错时是否禁止 redis 写入操作
dir ./ #快照文件保存路径  我们定义在dir /apps/redis/data
appendfilename "appendonly.aof" #AOF 文件名
appendfsync everysec #aof 持久化策略的配置,no 表示不执行 fsync,由操作系统保证数据同步到磁盘,always 表示每次写入都执行 fsync,以保证数据同步到磁盘,everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据。
cluster-require-full-coverage no #集群槽位覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,那么 yes 情况下 redis 集群槽位验证不全就不再对外提供服务,而 no 则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。
redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按一定的策略保存到硬盘上,从而实现数据持久保存的目的,redis 支持两种不同方式的数据持久化保存机制,分别是 RDB 和 AOF
RDB:基于时间的快照,只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照未完成之间的数据。RDB 实现的具体过程 Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据.
优点:-RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。-可以最大化 o 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的操作都会有这个子进程操作,父进程无需任何的 IO 操作,RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快。
缺点:-不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据。  -数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒。
AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。
优缺点:1、AOF 的文件大小要大于 RDB 格式的文件     2、根据所使用的 fsync 策略(fsync 是同步内存中 redis 所有已经修改的文件到存储设备),默认是appendfsync everysec 即每秒执行一次 fsync
redis的数据类型:
1、字符串(string):redis 中所有的 key 的类型都是字符串。
2、列表(list):列表是一个双向可读写的管道,其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素
3、集合(set):Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
4、sorted set(有序集合):Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个 double(双精度浮点型)类型的分数,redis 正是通过分数来为集合中的成员进行从小到大的排序,序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,
查找的复杂度都是 O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40 多亿个成
员)。
5、哈希(hash):hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,Redis 中每个 hash 可以存储 232 - 1 键值对(40 多亿)。
消息队列:

在生产者消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理生产者消费者模式下,多个消费者同时监听一个队里,但是一个消息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中非常常用,比较常用的软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等

生产者发布消息:(需要2台同ip主机,一台发布,一台监听)

[root@centos7 ~]#redis-cli
127.0.0.1:6379> LPUSH channel1 msg1 生成一个队列(列表)
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
去监听:[root@centos7 data]#redis-cli
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1" 此时,3条消息没有被处理,我们去执行命令,让消费者把学习拿出来。
127.0.0.1:6379> RPOP channel1
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> RPOP channel1
"msg3"
在发布者订阅者模式下,发布者将消息发布到指定的 channel 里面,凡是监听该 channel 的消费者
都会收到同样的一份消息,这种模式类似于是收音机模式,即凡是收听某个频道的听众都会收到主持
人发布的相同的消息内容。 此模式常用语群聊天、群通知、群公告等场景。
Subscriber:订阅者 Publisher:发布者 Channel:频道

订阅者监听频道:

127.0.0.1:6379> SUBSCRIBE channel1 创建一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
现在我们去创建2个频道:
127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 1
在订阅者监听频道即可立即同步:
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel1"
3) "test2"

多频道监听:

127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel2 test2
(integer) 1
127.0.0.1:6379> PUBLISH channel3 test3
(integer) 0
此时去订阅者频道查看:由于没有监听channel3,所以3的消息收不到:
[root@centos7 data]#redis-cli
127.0.0.1:6379> SUBSCRIBE channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel2"
3) "test2"

redis 其他命令:

:CONFIG:config 命令用于查看当前 redis 配置、以及不重启更改 redis 配置等
127.0.0.1:6379> CONFIG set maxmemory 8589934592 更改最大内存
OK
127.0.0.1:6379> CONFIG get maxmemory
1) "maxmemory"
2) "8589934592"
127.0.0.1:6379> CONFIG set timeout 600 更改超时时长
OK
127.0.0.1:6379> CONFIG get timeout
1) "timeout"
2) "600"

配置 reids 主从:


Redis Slave 也要开启持久化并设置和 master 同样的连接密码,因为后期 slave 会有提升为 master 的可能,Slave 端切换 master 同步后会丢失之前的所有数据。
一旦某个 Slave 成为一个 master 的 slave,Redis Slave 服务会清空当前 redis 服务器上的所有数据并将master 的数据导入到自己的内存,但是断开同步关系后不会删除当前已经同步过的数据。

实验:配置redis主从:

准备环境:2台主机必须统一版本:200:master,150:slave
一、将150主机编译好的redisscp到200主机,统一版本:[root@150 src]#ll
total 1708
drwxrwxr-x. 6 root root    4096 Mar 27 22:17 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 08:04 redis-4.0.14.tar.gz
[root@150 src]#scp redis-4.0.14.tar.gz 172.18.9.200:/usr/local/src/
root@172.18.9.200‘s password:
redis-4.0.14.tar.gz                                                    100% 1700KB
二、在200主机:[root@200 apps]#make PREFIX=/apps/redis install  make编译安装
[root@200 redis-4.0.14]#cd /apps/
[root@200 apps]#ll
total 0
drwxr-xr-x. 3 root root 17 Mar 28 16:10 redis
[root@200 apps]#rm -rf redis/  将生成的redis删除,把150主机的拷贝过来:
三、将150主机安装编译好的redis打包拷贝至200:[root@150 src]#cd /apps/
[root@150 apps]#ll
total 0
drwxr-xr-x. 7 redis redis 79 Mar 28 10:08 redis
[root@150 apps]#tar czf redis.tar.gz ./*

[root@150 apps]#scp redis.tar.gz 172.18.9.200:/apps/
root@172.18.9.200‘s password:
redis.tar.gz                                                                    100% 7645KB  26.2MB/s   00:00  

四、200主机接收到做处理:[root@200 apps]#tar xf redis.tar.gz
[root@200 apps]#ll
total 7648
drwxr-xr-x. 7 1001 1001      79 Mar 28 10:08 redis
-rw-r--r--. 1 root root 7828073 Mar 28 16:17 redis.tar.gz

在200主机创建软连接:[root@200 apps]#ln -sv /apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’

vim /apps/redis/etc/redis.conf         bind   0.0.0.0 (让它监听所有的IP)
[root@200 apps]#ps -ef |grep redis
root       8720   7748  0 17:18 pts/1    00:00:04 /apps/redis/bin/redis-server *:6379
root       9161   7748  0 17:56 pts/1    00:00:00 redis-cli -h 172.18.9.200
root       9180   7288  0 17:58 pts/0    00:00:00 grep --color=auto redis
[root@200 apps]#kill -9 8720
五、修改配置文件bind,并重启:[root@200 apps]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@200 apps]#ss -ntl
State      Recv-Q Send-Q                          Local Address:Port                                         Peer Address:Port
LISTEN     0      511                                         *:6379                                                    *:*
在200master上加上密码:
172.18.9.200:6379> CONFIG SET requirepass 123gxy
OK
[root@200 src]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>

六、在150主机slave上修改配置文件:[root@150 ~]#vim /apps/redis/etc/redis.conf
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@150 ~]#ps -ef |grep redis
root      13830      1  0 19:42 ?        00:00:02 /apps/redis/bin/redis-server 0.0.0.0:6379
root      13896  13679  0 19:48 pts/0    00:00:00 redis-cli -h 172.18.9.200 -a 123gxy
root      13970  13730  0 19:54 pts/1    00:00:00 grep --color=auto redis
[root@150 ~]#kill -9 13830
七、重启redis并查看:[root@150 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@150 ~]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>info
#Replication
role:master
connected_slaves:1
slave0:ip=172.18.9.150,port=6379,state=online,offset=728,lag=1   此时,说明主从已经成功。
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  这是正在连接的master的ID.
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:728
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:728

我们也可以在172.18.9.150slave上查看信息:
[root@150 ~]#redis-cli -h 172.18.9.150
172.18.9.150:6379> info
#Replication
role:slave
master_host:172.18.9.200
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1106
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79     此ID就是masterID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1106
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1106
本实验结束。
主从复制过程:
Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从主服务器备份数据,而且从服务器还可与有从服务器,即另外一台 redis 服务器可以从一台从服务器进行数据同步,redis 的主从同步是非阻塞的,其收到从服务器的 sync(2.8 版本之前是 PSYNC)命令会fork 一个子进程在后台执行 bgsave 命令,并将新写入的数据写入到一个缓冲区里面,bgsave 执行完成之后并生成的将 RDB 文件发送给客户端,客户端将收到后的 RDB 文件载入自己的内存,然后主 redis将缓冲区的内容在全部发送给从 redis,之后的同步从服务器会发送一个 offset 的位置(等同于 MySQL的 binlog 的位置)给主服务器,主服务器检查后位置没有错误将此位置之后的数据包括写在缓冲区的积压数据发送给 redis 从服务器,从服务器将主服务器发送的挤压数据写入内存,这样一次完整的数据同步,再之后再同步的时候从服务器只要发送当前的 offset 位 置给主服务器,然后主服务器根据响应的位置将之后的数据发送给从服务器保存到其内存即可。Redis 全量复制一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制一份。
具体步骤如下:
1)从服务器连接主服务器,发送 SYNC 命令;
2)主服务器接收到 SYNC 命名后,开始执行 BGSAVE 命令生成 RDB 快照文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器 BGSAVE 执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
7)后期同步会先发送自己 slave_repl_offset 位置,只同步新增加的数据,不再全量同步。

使用三台服务器部署遗嘱量从,并基于sentinel实现redis 主从自动切换

准备环境:200做master,100/150做slave,好处:1、保证当slav发生宕机,还会有一个可用,2、当200宕机时,slave中还有主有从。
一、在100主机配置redis:
vim  /apps/redis/etc/redis.conf
bind 0.0.0.0
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@100 redis]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@100 redis]#ss -ntl
State       Recv-Q Send-Q                       Local Address:Port                             Peer Address:Port
LISTEN      0      128                                     *:6379                                   *:*
[root@100 redis]#ln -sv /apps/redis/bin/* /usr/bin/  创建软连接:
/apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
二、开启200/150主机,并查看端口,此时在200master上查看info:
127.0.0.1:6379>info
# Replication
role:master
connected_slaves:2  2个slave:100/150.
slave0:ip=172.18.9.150,port=6379,state=online,offset=8316,lag=0
slave1:ip=172.18.9.100,port=6379,state=online,offset=8316,lag=1
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  200master主机的ID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:8316
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:8316
三、编辑配置文件sentinel.conf: 哨兵可以不和redis服务器部署在一起:这是模板:[root@150 redis-4.0.14]#grep -v "#" /usr/local/src/redis-4.0.14/sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

在200master主机配置哨兵文件:[root@200 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy
在150slave的哨兵文件:[root@150 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.150
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy在100slave的哨兵文件:[root@100 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.100   监听地址
port 26379          监听端口
daemonize yes       以守护进程运行
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2  此行最重要
sentinel auth-pass mymaster 123gxy四、在三台主机啥那个启动该文件服务:[root@200 ~]#redis-sentinel  /apps/redis/etc/sentinel.conf查看三台主机的日志:  [root@200 ~]#tail -f /apps/redis/logs/sentinel_26379.log
14161:X 28 Mar 21:58:03.456 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=14161, just started
14161:X 28 Mar 21:58:03.456 # Configuration loaded
14162:X 28 Mar 21:58:03.460 * Increased maximum number of open files to 10032 (it was originally set to 1024).
14162:X 28 Mar 21:58:03.463 * Running mode=sentinel, port=26379.
14162:X 28 Mar 21:58:03.466 # Sentinel ID is ed67a02807302d0cb768cd214f10e87b85a1428f
14162:X 28 Mar 21:58:03.466 # +monitor master mymaster 172.18.9.200 6379 quorum 2
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.150:6379 172.18.9.150 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.100:6379 172.18.9.100 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.081 * +sentinel sentinel b86489b5bf21cec43fcca110c6b84c0ee5cf95eb 172.18.9.100 26379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.095 * +sentinel sentinel f08c40b048f632b0f70f84d30c5f82ddcbeca5a9 172.18.9.150 26379 @ mymaster 172.18.9.200 6379
上述文字清楚的阐述了三台master/slave的关系。五、把200master主机强行宕机:[root@200 src]#ps -ef |grep redis
root      12583      1  0 19:41 ?        00:00:19 /apps/redis/bin/redis-server 0.0.0.0:6379
root      14162      1  0 21:58 ?        00:00:03 redis-sentinel 172.18.9.200:26379 [sentinel]
root      14242  12483  0 22:01 pts/1    00:00:00 tail -f /apps/redis/logs/sentinel_26379.log
root      14291  12430  0 22:06 pts/0    00:00:00 grep --color=auto redis
[root@200 src]#kill -9 12583
六、去新master150主机看info信息:
# Replication
role:master
connected_slaves:1
slave:ip=172.18.9.100,port=6379,state=online,offset=728,lag=1   此时新的slave为172.18.9.100主机,自动生成。
master_replid:69ae79e2ceba8aa9523996c216a946aaa3767808
master_replid2:5c575544ee6d8fb74eed78df0645e16640705e79
master_repl_offset:177021
second_repl_offset:126083
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:177021
七、再次看200主机的日志:[root@200 src]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir "/apps/redis/data"
sentinel myid ed67a02807302d0cb768cd214f10e87b85a1428f
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.100 6379 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster 123gxy
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 3
sentinel known-slave mymaster 172.18.9.150 6379
sentinel known-slave mymaster 172.18.9.200 6379
sentinel known-sentinel mymaster 172.18.9.150 26379 f08c40b048f632b0f70f84d30c5f82ddcbeca5a9
sentinel known-sentinel mymaster 172.18.9.100 26379 b86489b5bf21cec43fcca110c6b84c0ee5cf95eb
sentinel current-epoch 3   标注内容为日志自动生成的信息。
以上实验就是基于哨兵机制完成的,当master宕机,其中一台从服务器会自动提升为master主机.

原文地址:https://blog.51cto.com/14128387/2370943

时间: 2024-08-11 18:19:05

20190327 Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换的相关文章

趁一切还来得及【五】数据库MySQL主从同步的实践部署

自笑栖迟淮海客,十年心事一灯前.                                           --[元]萨都拉 第二章 数据库MySQL主从同步部署操作实践 2.1 数据同步相关应用基础 ①MySQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的部署管理也就显得非常重要. ②MySQL主从同步的作用:(1) 数据分布,(2) 负载平衡(load balancing),(3) 备份,(4) 高可用性(high availability

基于Sentinel的Redis高可用方案

数据存储我们在应用设计过程中非常重要的一部分,无论是关系型数据库,还是Redis.MongoDB等非关系型数据库,都有很多的高可用方案,还有一些针对不同业务设计的中间件,使其性能更有特色,更能保证数据存储的稳定和安全. 目前主流的Redis的数据存储架构有Redis单点,Redis主从,基于Sentinel的Redis主备.基于keepalive的redis主备,以及Redis集群Cluster,还有豌豆荚开源的Codis等是目前业内比较流行的解决方案,不同的存储架构,是若干个技术工程师,根据自

Centos下高可用主从同步DNS服务部署

一.背景介绍 在日常工作中,为解决内网域名解析问题,时长会配置DNS服务来提供解析.这时DNS服务就起到了为所有内部服务提供连通的基础,变得非常重要了.所以在服务启动后还是应该考虑服务的高可用和数据的完整性. 网友有很多LVS+Keepalived+Bind的负载均衡高可用的解决方案,非常不错.不过自建DNS常用在公司内部平台之间的调用,所以负载均衡的意义并不是太大.当然,高可用还是需要保证的.本文章介绍通过Keepalived+Bind实现高可用主从同步DNS服务 二.基础环境 Master

redis配置读写分离以及利用哨兵sentinel进行自动主从切换

redis利用哨兵(sentinel)进行主从切换,断断续续,自己终于通过配置验证了一下该功能,其中遇到过一些的问题,也是耗费了大量的时间才解决,接下来分享下配置的过程以及遇到的问题和解决方法.希望对各位有所帮助. 首先说一下实验环境: redis软件:redis-3.2.1(安装在虚拟机的linux系统中) 宿主主机:window8.1 x64 secureCRT:宿主主机安装此软件来操作linux,这只是个人喜欢,大家可以不装. 对于redis在linux如何安装这里不进行说明,不懂的朋友可

CentOS 7上部署Amoeba实现MySQL主从同步,读写分离,负载均衡高可用群集

实验描述 本实验需要四台主机安装mysql,一台部署Amoeba,一台主数据库服务器,两台从数据库服务器,还需一台主机做客户端访问测试,本实验结束可实现主数据库服务器与从数据库服务器之间数据同步,读写分离(客户机读从服务器的数据,写入的数据存储在主服务器,主服务器再同步给从服务器),负载均衡. 实验拓扑 实验环境 实验步骤 一.Master同步时间 1.Master安装ntp yum install ntp -y 2.修改ntp配置文件 vim /etc/ntp.conf #空白处插入如下内容

MySQL 主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起

Redis(三)-- 主从同步

一.主从同步的工作原理 redis主从复制过程: 当配置好slave后,slave与master建立连接,然后发送sync命令.无论是第一次连接还是重新连接,master都会启动一个后台进程,将 数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存.后台进程完成写文件后,master就发送文件给slave,slave将 文件保存到硬盘上,再加载到内存中,接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave.如果master同时收到多

redis主从同步与读写分离

一.原理 Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构.下面是关于redis主从复制的一些特点: 1.master可以有多个slave. 2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构. 3.主从复制不会阻塞master.也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求.相反s

【转】Redis主从同步与集群管理

转自http://blog.csdn.net/u012152619/article/details/52854465 1.主从同步原理 像MySQL一样,Redis是支持主从同步的,而且也支持一主多从以及多级从结构.主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担.Redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低Redis的处理性能.主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提