Centos7上搭建redis主從


1. 節點(服務器)數量說明

按照redis官方建議:salve和master的數量按照2n+1台服務器(1台master節點,2n台slave節點)
有興趣的可以了解下redis的master選舉機制
但是本文是1台master節點,1台slave節點做測試,測試結果也沒問題
如果你要添加第2台salve節點的話,兩台slave節點的配置幾乎是一樣的,我會在下文中提及不一樣的地方

2. 本文測試redis主從要達到的目的

1. master節點上的redis服務down掉之后,slave節點升級為master節點
2. 當老的master節點上的redis服務起來后,視新master節點為master,自己降為slave節點
3. 如果你想讓老的master還當master,你可以循環以上1、2兩步,測過才知道

3. 主機列表

角色 IP
master 192.168.1.9
slave 192.168.1.10

4. 配置前提

假設你已經在master主機上配置好了redis服務(即單機版)

假設你已經在slave主機上配置好了redis服務(即單機版)

如果你還沒有配置好單機版的redis服務,請點擊這里,先把2個單機版的搞起來

再回來搞這個主從

5. 主從配置過程

配置主從時,把2台機器的redis服務先停掉

5.1 redis主配置文件需要改動的地方如下,其余保持默認即可

[root@master ~]# vim /etc/redis.conf
bind 192.168.1.9
daemonize yes
logfile "/var/log/redis.log"
masterauth "123456"                  # 其它redis視我為master時的驗證密碼
requirepass "123456"                 # 本機redis的登錄密碼
maxmemory 100mb

5.2 redis主的哨兵配置文件需要改動的地方如下,其余保持默認即可

[root@master ~]# cp /usr/local/redis-4.0.6/sentinel.conf /etc/sentinel.conf
[root@master ~]# vim /etc/sentinel.conf
bind 192.168.1.9
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
logfile "/var/log/sentinel.log"
daemonize yes

如果你在windows server上搭建主從,你需要手動創建sentinel.conf,除了添加一些內容,完整的配置內容如下:

bind 192.168.1.9
port 26379
dir "/tmp"
sentinel myid 6a23c773b7e139e2ebdd64e5c5fb6de3df3f7b77
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
logfile "/var/log/sentinel.log"
daemonize yes

5.3 redis從配置文件需要改動的地方如下,其余保持默認即可

[root@slave ~]# vim /etc/redis.conf
bind 192.168.1.10
daemonize yes
logfile "/var/log/redis.log"
masterauth "123456"                  # 其它redis視我為master時的驗證密碼
requirepass "123456"                 # 本機redis的登錄密碼
maxmemory 100mb
slaveof 192.168.1.9 6379           # master的ip和redis端口

5.4 redis從的哨兵配置文件需要改動的地方如下,其余保持默認即可

[root@slave ~]# cp /usr/local/redis-4.0.6/sentinel.conf /etc/sentinel.conf
[root@slave ~]# vim /etc/sentinel.conf
bind 192.168.1.10
sentinel monitor mymaster 192.168.1.9 6379 2       # master的ip和redis端口
sentinel auth-pass mymaster 123456
logfile "/var/log/sentinel.log"
daemonize yes

如果你在windows server上搭建主從,你需要手動創建sentinel.conf,除了添加一些內容,完整的配置內容如下:

bind 192.168.1.10
port 26379
dir "/tmp"
sentinel myid 7f24d4d935d7e97c8267910535e0c1f0f26b8d6d
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
logfile "/var/log/sentinel.log"
daemonize yes

6. 哨兵是什么?

1. 哨兵是redis用於主從或集群的不可缺少的故障切換機制。
2. 單台redis的話,程序連接的是redis服務的6379端口;主從或集群的話,程序不再直接連接redis服務了,
   而要連接的是多個哨兵,哨兵會告訴程序端找哪個redis服務。

7. 在2台機器上都允許端口通過防火牆

在2台機器上允許對方訪問對方的redis端口(6379)和哨兵端口(26379)

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6379 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 26379 -j ACCEPT
service iptables save

8. 在2台機器上起redis服務,並測試主從是否同步

8.1 起redis服務

[root@master ~]# redis-server /etc/redis.conf >> /var/log/redis-init.log 2>&1

8.2 測試主從是否可以同步數據

在master服務器終端上登錄redis服務

[root@master ~]# redis-cli -h 192.168.1.9 -p 6379 -a 123456
192.168.1.9:6379> info replication         # 查看主從狀態
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.10,port=6379,state=online,offset=30290,lag=1
master_replid:426acab1b0c50873b516b7f0bf265c98c927a4f2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:30290
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:30290
192.168.1.9:6379>
192.168.1.9:6379> quit
not connected>
[root@master ~]#

在slave服務器終端上登錄redis服務

[root@slave ~]# redis-cli -h 192.168.1.10 -p 6379 -a 123456
192.168.1.10:6379> info replication        # 查看主從狀態
# Replication
role:slave
master_host:192.168.1.9
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:350
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:37472d667df3859cd37371453be2d0197ffbb07b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350
192.168.1.10:6379>
192.168.1.10:6379>
192.168.1.10:6379>

在master服務器終端上登錄redis服務,創建數據

192.168.1.9:6379> set name zhangsan
OK
192.168.1.9:6379> set age 20
OK
192.168.1.9:6379> get name
"zhangsan"
192.168.1.9:6379> get age
"20"

在slave服務器終端上登錄redis服務,如果可以查詢到數據,說明數據同步到從了

192.168.1.10:6379> get name
"zhangsan"
192.168.1.10:6379> get age
"20"

8.3 在2台機器上起哨兵服務,測試故障轉移功能

[root@master ~]# redis-sentinel /etc/sentinel.conf
[root@slave ~]# redis-sentinel /etc/sentinel.conf

把master的redis服務停掉

192.168.1.9:6379> shutdown
not connected> quit
[root@master ~]#

等待5秒后,查看從上的redis服務是否升級為了master

192.168.1.10:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:33b4f309f906ecf6105b9822661236ad7689af27
master_replid2:426acab1b0c50873b516b7f0bf265c98c927a4f2
master_repl_offset:59193
second_repl_offset:53354
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:59193
192.168.1.10:6379> get name
"zhangsan"
192.168.1.10:6379> get age
"20"
192.168.1.10:6379> quit
[root@slave ~]#

把192.168.1.9上的redis服務起來,命令參照上文8.1

再查看192.168.1.10上的redis主從狀態,5秒后,應該會有slave信息

192.168.1.10:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.9,port=6379,state=online,offset=112,lag=1
master_replid:431fb03e1644a50620dd150c2527ca5acaa5648b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112
192.168.1.10:6379>

注意1: master角色是非搶占模式

即:一旦集群中存在master,則其余節點視其為master,除非master掛掉

注意2: 從庫是只讀的

9. 查看redis日志和哨兵日志

在/etc/redis.conf和/etc/sentinel.conf里查找日志文件記錄在哪個位置了,去看吧

10. 你可以再增加1台slave主機,來測試一下2n+1台的主從


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM