1. 程式人生 > >20190327 Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換

20190327 Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換

速度 http 會有 commit channel 統計 不一致 only 宕機

一、緩存:緩存是為了調節速度不一致的兩個或多個不同的物質的速度,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的作用,比如 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/
[email protected]‘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/
[email protected]‘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主機.

20190327 Redis主從同步、三臺服務器部署,基於sentinel實現redis主從切換