您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

01 redis的發布訂閱是一種什么模式(redis頻道收到發布者信息后可以只推信息給一個訂閱者嗎)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-14 12:28:51【】9人已围观

简介Redis中的哨兵模式哨兵模式是一種自動選擇老大的模式,即在老大宕機之后,哨兵模式會根據哨兵們的內部投票,自動的重新選出一個新的老大。哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一

Redis中的哨兵模式

哨兵模式是一種自動選擇老大的模式,即在老大宕機之后,哨兵模式會根據哨兵們的內部投票,自動的重新選出一個新的老大。哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行。其原理是哨兵通過發送命令,等待Redis服務器響應,如果Redis服務器一直沒有響應,說明這個Redis服務器可能已經宕機了,從而監控運行的多個Redis實例。

這里的哨兵有兩個作用

1、通過發送命令,讓Redis服務器返回監控其運行狀態,包括主服務器和從服務器。

2、當哨兵監測到master宕機,會自動將slave切換成master,然后通過發布訂閱模式通知其他的從服務器,修改配置文件,讓它們切換主機。

然而一個哨兵進程對Redis服務器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。

用文字描述一下故障切換(failover)的過程。假設主服務器宕機,哨兵1先檢測到這個結果,系統并不會馬上進行failover過程,僅僅是哨兵1主觀的認為主服務器不可用,這個現象成為主觀下線。當后面的哨兵也檢測到主服務器不可用,并且數量達到一定值時,那么哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功后,就會通過發布訂閱模式,讓各個哨兵把自己監控的從服務器實現切換主機,這個過程稱為客觀下線。這樣對于客戶端而言,一切都是透明的。如果有三個哨兵,不僅每個哨兵會監視主機和從機,而且哨兵之間也會互相監視,如下圖:

配置哨兵配置文件sentinel.買粉絲nf,如下

當哨兵模式的配置文件配置好之后,就可以啟動哨兵模式了,如下圖

測試在哨兵模式下如果主機崩了的話會不會從從機中自動選出一個老大,先關閉主機,讓主機宕機,如下圖:

看看主機宕機之后,哨兵模式中輸出日志的新的內容是什么,如下圖:

哨兵模式自動選舉一個主機這個過程是怎樣實現自動化的?哨兵自動選舉之前的某個從機為老大,所有的從機都會稱新選出的從機為老大,以及原本的老大也會稱新選出的老大為老大,這個過程是怎么自動化實現的呢?是通過在對應的redis服務器的配置文件中寫內容來實現的,比方說,讓我們看一下新老大也即是端口號是6381的redis服務器的配置文件中是怎樣改寫的,如下圖:

再來看一下從機即端口號是6380的redis服務器對應的配置文件是怎樣改寫的,如下圖:

最后看一下原本的主機即端口號是6379的redis服務器的配置文件是怎樣改寫的。我檢查了一下,發現在重新啟動原本的老大即重啟已經宕機的端口號是6379的redis服務器之前,它對應的配置文件中沒有發生任何改變,但是一旦重新啟動原本的老大,它對應的配置文件就會發生變化,如下圖:

哨兵模式中的主機關閉之后需要特別注意的一個易錯點:就是因為現在老大已經換了,所以老大的認證密碼也換了,因此需要在現任老大的所有從機里面配置主機的認證密碼,這個哨兵模式是不會幫我們自動配置的,需要我們自動配置,如下圖:

測試哨兵模式結果,如下圖:

1、哨兵集群,基于主從復制模式,所有的主從配置優點,它全有。

2、主從可以切換,故障可以轉移,系統的可用性就會更好。

3、哨兵模式就是主從模式的升級,手動到自動,更加健壯。

1、集群容量一旦到達上限,在線擴容十分麻煩。

2、實現哨兵模式的配置其實是很麻煩的,里面有很多選擇。

當Redis集群的主節點故障時,Sentinel集群將從剩余的從節點中選舉一個新的主節點,有以下步驟:

Sentinel集群的每一個Sentinel節點會定時對Redis集群的所有節點發心跳包檢測節點是否正常。如果一個節點在down-after-millise買粉絲nds時間內沒有回復Sentinel節點的心跳包,則該Redis節點被該Sentinel節點主觀下線。

當節點被一個Sentinel節點記為主觀下線時,并不意味著該節點肯定故障了,還需要Sentinel集群的其他Sentinel節點共同判斷為主觀下線才行。

該Sentinel節點會詢問其他Sentinel節點,如果Sentinel集群中超過quorum數量的Sentinel節點認為該Redis節點主觀下線,則該redis客觀下線。

如果客觀下線的redis節點是從節點或者是Sentinel節點,則操作到此為止,沒有后續的操作了;如果客觀下線的Redis節點為主節點,則開始故障轉移,從從節點中選舉一個節點升級為主節點。

如果需要從redis集群選舉一個節點為主節點,首先需要從Sentinel集群中選舉一個Sentinel節點作為Leader。

每一個Sentinel節點都可以成為Leader,當一個Sentinel節點確認redis集群的主節點主觀下線后,會請求其他Sentinel節點要求將自己選舉為Leader。被請求的Sentinel節點如果沒有同意過其他Sentinel節點的選舉請求,則同意該請求(選舉票數+1),否則不同意。

如果一個Sentinel節點獲得的選舉票數達到Leader最低票數(quorum和Sentinel節點數/2+1的最大值),則該Sentinel節點選舉為Leader;否則重新進行選舉。

當Sentinel集群選舉出Sentinel Leader后,由Sentinel Leader從redis從節點中選擇一個redis節點作為主節點:

詳解redis集群選舉機制

Spring Boot使用Redis進行消息的發布訂閱 原創

/

**

* Redis 相關的配置,包含推送,以及對象編碼的定義

*/

@Configuration

public class RedisConfig {

public @Bean

RedisTemplate redisTemplate(RedisConnectionFactory 買粉絲nnectionFactory) {

RedisTemplate template = new RedisTemplate>();

template.setConnectionFactory(買粉絲nnectionFactory);

template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());

template.setKeySerializer(new StringRedisSerializer());

template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());

template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

return template;

}

@Bean

ChannelTopic topic() {

return new ChannelTopic("messageQueue");

}

@Bean

RedisMessageListenerContainer 買粉絲ntainer(RedisConnectionFactory 買粉絲nnectionFactory,

MessageListenerAdapter listenerAdapter) {

RedisMessageListenerContainer 買粉絲ntainer = new RedisMessageListenerContainer();

買粉絲ntainer.setConnectionFactory(買粉絲nnectionFactory);

買粉絲ntainer.addMessageListener(listenerAdapter, new PatternTopic("messageQueue"));

return 買粉絲ntainer;

}

@Bean

MessageListenerAdapter listenerAdapter(Receiver receiver) {

return new MessageListenerAdapter(receiver, "receiveMessage");

}

}

public enum BusinessTypeEnum {

//修改SystemConfig緩存

UPDATE_SYSTEM_CONFIG;

}

//發布者接口

public interface MessagePublisher {

void publish(String message);

}

@Component

public class RedisMessagePublisher implements MessagePublisher{

private final static Logger logger = LoggerFactory.getLogger(RedisMessagePublisher.class);

@Autowired

private RedisTemplate redisTemplate;

@Autowired

private ChannelTopic topic;

@Override

public void publish(String message) {

logger.info("推送信息:"+message);

redisTemplate.買粉絲nvertAndSend(topic.getTopic(), message);

}

}

public interface Receiver { void receiveMessage(String message); }

@Component

public class MessageReceiver implements Receiver {

private final static Logger logger = LoggerFactory.getLogger(MessageReceiver.class);

@Autowired

privat

很赞哦!(4)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:江西九江修水县

工作室:小组

Email:[email protected]