10 Redis 主从复制
文章目錄
- 1 是什么
- 2 能干嘛
- 3 主從復(fù)制搭建
- 3.1 根目錄下創(chuàng)建目錄/myredis
- 3.2 修改/myredis中redis.conf
- 3.3 vim redis6379.conf
- 3.3.1 在/myredis 目錄下增加配置文件redis6379.conf,并添加配置
- 3.3.1 在/myredis 目錄下增加配置文件redis6380.conf,并修改配置
- 3.3.1 在/myredis 目錄下增加配置文件redis6381.conf,并修改配置
- 3.4 分別啟動(dòng)三個(gè)redis服務(wù)
- 3.4.1 查看進(jìn)程是否正常啟動(dòng)
- 3.5 通過(guò)客戶端連接加端口號(hào)查看redis信息
- 3.5.1 通過(guò)客戶端連接加端口號(hào)查看redis6379信息 info replication
- 3.5.2 通過(guò)客戶端連接加端口號(hào)查看redis6380信息 info replication
- 3.5.3 通過(guò)客戶端連接加端口號(hào)查看redis6381信息 info replication
- 3.6 配置從庫(kù)不配置主庫(kù)
- 3.6.1 在6380客戶端執(zhí)行slaveof 127.0.0.1 6379
- 3.6.1 在6381客戶端執(zhí)行slaveof 127.0.0.1 6379
- 3.7 驗(yàn)證主從復(fù)制
- 3.7.1 在主庫(kù)寫入鍵值對(duì),在從機(jī)查看可以復(fù)制成功
- 3.7.2 在從機(jī)查看可以取到鍵值,說(shuō)明復(fù)制成功
- 3.7.3 如果在從庫(kù)寫入鍵值對(duì)是提示失敗
- 3.8 一主二從
- 3.9 薪火相傳
- 3.10 反客為主
- 3.11 主從復(fù)制原理
- 4 哨兵模式sentinel
- 4.1 首先配置一主二從的基本環(huán)境
- 4.2 配置哨兵
- 4.3 啟動(dòng)哨兵
- 4.4 模擬主服務(wù)器shutdown
- 4.5 此時(shí)再啟動(dòng)之前的主服務(wù)器6379變?yōu)閺姆?wù)器slave了
- 4.6 復(fù)制延時(shí)
- 4.7 故障恢復(fù)
- 4.7.1 新主登基
- 4.7.2 群臣俯首
- 4.7.3 舊主俯首
1 是什么
主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略,自動(dòng)同步到備機(jī)的master/slave機(jī)制,Master以寫為主,Slave以讀為主
2 能干嘛
讀寫分離,性能擴(kuò)展
容災(zāi)快速恢復(fù)
3 主從復(fù)制搭建
3.1 根目錄下創(chuàng)建目錄/myredis
將/etc/redis.conf 配置文件拷貝到/myredis中
[root@localhost chengwen]# mkdir /myredis [root@localhost chengwen]# cd /myredis/ [root@localhost myredis]# cp /etc/redis.conf /myredis/redis.conf [root@localhost myredis]# ls redis.conf3.2 修改/myredis中redis.conf
appendonly 修改為 no
appendonly no3.3 vim redis6379.conf
3.3.1 在/myredis 目錄下增加配置文件redis6379.conf,并添加配置
include /myredis/redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb3.3.1 在/myredis 目錄下增加配置文件redis6380.conf,并修改配置
[root@localhost myredis]# cp redis6379.conf redis6380.conf [root@localhost myredis]# vim redis6380.conf include /myredis/redis.conf pidfile /var/run/redis_6380.pid port 6380 dbfilename dump6380.rdb3.3.1 在/myredis 目錄下增加配置文件redis6381.conf,并修改配置
[root@localhost myredis]# cp redis6379.conf redis6381.conf [root@localhost myredis]# vim redis6381.conf include /myredis/redis.conf pidfile /var/run/redis_6381.pid port 6381 dbfilename dump6381.rdb3.4 分別啟動(dòng)三個(gè)redis服務(wù)
[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-server redis6380.conf [root@localhost myredis]# redis-server redis6381.conf [root@localhost myredis]#3.4.1 查看進(jìn)程是否正常啟動(dòng)
[root@localhost myredis]# ps -ef|grep redis root 152843 2158 0 04:30 ? 00:00:00 redis-server *:6380 root 152856 2158 0 04:31 ? 00:00:00 redis-server *:6381 root 152966 2158 0 04:33 ? 00:00:00 redis-server *:6379 root 152972 123376 0 04:33 pts/0 00:00:00 grep --color=auto redis [root@localhost myredis]#3.5 通過(guò)客戶端連接加端口號(hào)查看redis信息
3.5.1 通過(guò)客戶端連接加端口號(hào)查看redis6379信息 info replication
role:master 說(shuō)明是角色是主機(jī)Master
[root@localhost myredis]# redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:1ecba680652395416fe8bd719da26c6564a957d5 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379>3.5.2 通過(guò)客戶端連接加端口號(hào)查看redis6380信息 info replication
role:master 說(shuō)明是角色是主機(jī)Master
[chengwen@localhost redis]$ redis-cli -p 6380 127.0.0.1:6380> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:ad3b7ea9b5309fe5b1974333a68cd95a2c60e2df master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6380>3.5.3 通過(guò)客戶端連接加端口號(hào)查看redis6381信息 info replication
role:master 說(shuō)明是角色是主機(jī)Master
[chengwen@localhost ~]$ redis-cli -p 6381 127.0.0.1:6381> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:08aebaa422e9096f8efb3ec263e8334f208ae017 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381>3.6 配置從庫(kù)不配置主庫(kù)
slaveof
ip為主庫(kù)的ip
port為主庫(kù)的port
3.6.1 在6380客戶端執(zhí)行slaveof 127.0.0.1 6379
127.0.0.1:6380> slaveof 127.0.0.1 6379 OK6380 角色變?yōu)閞ole:slave
127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 127.0.0.1:6380>6379主庫(kù)信息顯示了從庫(kù)信息 slave0:ip=127.0.0.1,port=6380
127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=154,lag=1 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:154 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:154 127.0.0.1:6379>3.6.1 在6381客戶端執(zhí)行slaveof 127.0.0.1 6379
在6381客戶端執(zhí)行
127.0.0.1:6381> slaveof 127.0.0.1 6379 OK6381 角色變?yōu)閞ole:slave
127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:1120 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1120 second_repl_offset:-1 repl_backlog_active6379主庫(kù)信息顯示了從庫(kù)信息slave1:ip=127.0.0.1,port=6381
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=1232,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=1232,lag=1 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1232 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1232 127.0.0.1:6379>3.7 驗(yàn)證主從復(fù)制
3.7.1 在主庫(kù)寫入鍵值對(duì),在從機(jī)查看可以復(fù)制成功
127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379>3.7.2 在從機(jī)查看可以取到鍵值,說(shuō)明復(fù)制成功
127.0.0.1:6380> get k1 "v1" 127.0.0.1:6380>3.7.3 如果在從庫(kù)寫入鍵值對(duì)是提示失敗
127.0.0.1:6380> set k2 v2 (error) READONLY You can't write against a read only replica. 127.0.0.1:6380>3.8 一主二從
如果從slave服務(wù)器shutdown,重啟啟動(dòng)后會(huì)變?yōu)楠?dú)立的master;
通過(guò)slaveof 127.0.0.1 6379 配置為從服務(wù)器后,會(huì)從master復(fù)制全部數(shù)據(jù)
如果master服務(wù)器shutdown,重啟后還是master
通過(guò)redis-server redis6379.conf 啟動(dòng)后還是主服務(wù)器
3.9 薪火相傳
上一個(gè)slave可以是下一個(gè)slave的master,slave同樣可以接收其他slaves的連接和同步請(qǐng)求,那么該slave作為了鏈條中下一個(gè)的master,可以有效減輕master的寫壓力,去中心化降低風(fēng)險(xiǎn)
用slaveof
中途變更轉(zhuǎn)向,會(huì)清除之前的數(shù)據(jù),重新建立拷貝最新的
風(fēng)險(xiǎn)是一旦某個(gè)slave宕機(jī),后面的slave無(wú)法備份
主機(jī)掛了,從機(jī)還是從機(jī),無(wú)法寫數(shù)據(jù)了
3.10 反客為主
當(dāng)一個(gè)master宕機(jī)后,后面的slave可以立刻升為master,后面的slave不用做任何修改
用slaveof no one 將從機(jī)變?yōu)橹鳈C(jī)
3.11 主從復(fù)制原理
當(dāng)從服務(wù)器slave連接上主服務(wù)器master后,會(huì)發(fā)送sync命令
master接到命令后啟動(dòng)后臺(tái)的存盤進(jìn)程,同時(shí)收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺(tái)進(jìn)程執(zhí)行完畢后,master將傳送整個(gè)數(shù)據(jù)文件到slave,以完成一次完全同步
全量復(fù)制 slave服務(wù)器在接收到數(shù)據(jù)庫(kù)文件后,將其存盤并加載到內(nèi)存中
增量復(fù)制 master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步
只要是重新連接master,一次完全同步(全量復(fù)制)將被自動(dòng)執(zhí)行
4 哨兵模式sentinel
反客為主的自動(dòng)版,能夠后臺(tái)監(jiān)控主機(jī)是否故障,如果故障了根據(jù)投票數(shù)自動(dòng)將從庫(kù)轉(zhuǎn)換為主庫(kù)
4.1 首先配置一主二從的基本環(huán)境
[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-server redis6380.conf [root@localhost myredis]# redis-server redis6381.conf [root@localhost myredis]# redis-cli -p 6379 [chengwen@localhost ~]$ redis-cli -p 6381 127.0.0.1:6381> slaveof 127.0.0.1 6379 OK [chengwen@localhost redis]$ redis-cli -p 6380 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK4.2 配置哨兵
[root@localhost myredis]# vim /myredis/sentinel.conf在sentinel.conf中添加如下配置
sentinel monitor mymaster 127.0.0.1 6379 1其中mymaster 為監(jiān)控對(duì)象起的服務(wù)器名稱,
1為至少有多少個(gè)哨兵同意遷移的數(shù)量
4.3 啟動(dòng)哨兵
[root@localhost ~]# redis-sentinel /myredis/sentinel.conf啟動(dòng)信息,包含主機(jī)名稱 端口,從機(jī)端口等
168706:X 05 May 2021 10:00:40.739 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 168706:X 05 May 2021 10:00:40.750 # Sentinel ID is 09cecc8460e8981db67146daa636f7ec6ccb2cdf 168706:X 05 May 2021 10:00:40.750 # +monitor master mymaster 127.0.0.1 6379 quorum 1 168706:X 05 May 2021 10:00:40.752 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:00:40.754 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 63794.4 模擬主服務(wù)器shutdown
127.0.0.1:6379> shutdown nosave not connected> exit [root@localhost myredis]#此時(shí)再看sentinel 信息
168706:X 05 May 2021 10:05:09.971 # +sdown master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.971 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1 168706:X 05 May 2021 10:05:09.971 # +new-epoch 1 168706:X 05 May 2021 10:05:09.971 # +try-failover master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.974 # +vote-for-leader 09cecc8460e8981db67146daa636f7ec6ccb2cdf 1 168706:X 05 May 2021 10:05:09.974 # +elected-leader master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.974 # +failover-state-select-slave master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.050 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.050 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.109 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.696 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.696 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.775 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.782 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.782 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.874 # +failover-end master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.874 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381 168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 168706:X 05 May 2021 10:05:41.940 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381上述信息 selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
表明新的master 為6381,查看6381的info replication為
4.5 此時(shí)再啟動(dòng)之前的主服務(wù)器6379變?yōu)閺姆?wù)器slave了
[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:slave master_host:127.0.0.1 master_port:6381 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:64126 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8bedc64549b81b2c8b0fd6aaedfabda6339831c3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:64126 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:62879 repl_backlog_histlen:1248 127.0.0.1:6379>4.6 復(fù)制延時(shí)
由于所有的寫操作都是先在master上操作,然后同步的更新到slave,所以從master同步到slave機(jī)器有一定的延遲,當(dāng)系統(tǒng)繁忙的時(shí)候,延遲問(wèn)題更加嚴(yán)重,slave機(jī)器數(shù)量的增加也會(huì)使這個(gè)問(wèn)題更加嚴(yán)重
4.7 故障恢復(fù)
4.7.1 新主登基
從宕機(jī)的主服務(wù)的所有從服務(wù)里面挑選一個(gè)從服務(wù),將其轉(zhuǎn)換成主服務(wù)
選擇條件依次為:
選擇優(yōu)先級(jí)靠前的
選擇偏移量最大的
選擇runid最小的服務(wù)
4.7.2 群臣俯首
挑選出新的主服務(wù)器之后,sentinel向原主服務(wù)器的從服務(wù)發(fā)送slaveof新主服務(wù)的命令 復(fù)制新master
4.7.3 舊主俯首
當(dāng)宕機(jī)的服務(wù)重新上線時(shí),sentinel會(huì)向其發(fā)送slaveof命令,讓其成為新的從機(jī)
優(yōu)先級(jí)在redis.conf 中默認(rèn):slave-priority 100 ,值越小優(yōu)先級(jí)越高replica-priority 100 (新版本配置優(yōu)先級(jí))
偏移量是指獲得原主機(jī)數(shù)據(jù)最安全的
每個(gè)redis實(shí)例啟動(dòng)后都會(huì)隨機(jī)生成一個(gè)40位的runid
文章目錄
- 1 是什么
- 2 能干嘛
- 3 主從復(fù)制搭建
- 3.1 根目錄下創(chuàng)建目錄/myredis
- 3.2 修改/myredis中redis.conf
- 3.3 vim redis6379.conf
- 3.3.1 在/myredis 目錄下增加配置文件redis6379.conf,并添加配置
- 3.3.1 在/myredis 目錄下增加配置文件redis6380.conf,并修改配置
- 3.3.1 在/myredis 目錄下增加配置文件redis6381.conf,并修改配置
- 3.4 分別啟動(dòng)三個(gè)redis服務(wù)
- 3.4.1 查看進(jìn)程是否正常啟動(dòng)
- 3.5 通過(guò)客戶端連接加端口號(hào)查看redis信息
- 3.5.1 通過(guò)客戶端連接加端口號(hào)查看redis6379信息 info replication
- 3.5.2 通過(guò)客戶端連接加端口號(hào)查看redis6380信息 info replication
- 3.5.3 通過(guò)客戶端連接加端口號(hào)查看redis6381信息 info replication
- 3.6 配置從庫(kù)不配置主庫(kù)
- 3.6.1 在6380客戶端執(zhí)行slaveof 127.0.0.1 6379
- 3.6.1 在6381客戶端執(zhí)行slaveof 127.0.0.1 6379
- 3.7 驗(yàn)證主從復(fù)制
- 3.7.1 在主庫(kù)寫入鍵值對(duì),在從機(jī)查看可以復(fù)制成功
- 3.7.2 在從機(jī)查看可以取到鍵值,說(shuō)明復(fù)制成功
- 3.7.3 如果在從庫(kù)寫入鍵值對(duì)是提示失敗
- 3.8 一主二從
- 3.9 薪火相傳
- 3.10 反客為主
- 3.11 主從復(fù)制原理
- 4 哨兵模式sentinel
- 4.1 首先配置一主二從的基本環(huán)境
- 4.2 配置哨兵
- 4.3 啟動(dòng)哨兵
- 4.4 模擬主服務(wù)器shutdown
- 4.5 此時(shí)再啟動(dòng)之前的主服務(wù)器6379變?yōu)閺姆?wù)器slave了
- 4.6 復(fù)制延時(shí)
- 4.7 故障恢復(fù)
- 4.7.1 新主登基
- 4.7.2 群臣俯首
- 4.7.3 舊主俯首
總結(jié)
以上是生活随笔為你收集整理的10 Redis 主从复制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 9 Redis 持久化AOF
- 下一篇: Spring 事务基于注解和xml方式