One clarification to share about enabling an IGMP Querier:
Enabling an IGMP querier on an L3 interface by itself does not permit a multicast stream to route between VLANs. For that you need to enable Multicast routing on the involved interfaces, this enables the PIM Sparse protocol.
Also, when you do enable multicast routing on an interface, the interface will run an IGMP querier in addition to PIM -- so you don't need to do anything fancy like specifically enabling queriers when using multicast routing.
So an open question may remain:
What is the purpose of only enabling an IGMP Querier on an interface, but NOT enabling multicast routing?
The answer is that you actually still need to introduce an IGMP querier in the network for IGMP snooping to work correctly across multiple switches. The reason this is needed is due to the following:
When endpoint devices wish to receive a multicast stream, they send an IGMP report packet that indicates the IP of the group they want to join. When a switch has IGMP snooping enabled, these IGMP report packets will only get forwarded out the port where an IGMP querier has been learned (the port where IGMP queries come in). If there is no IGMP querier, and thus, no IGMP query packets, the IGMP report packets from endpoints will be dropped.
The problem this causes is easiest to understand just by considering a very simple scenario with two switches interconnected by a single link.
[_1ST_SWITCH_]<-------------->[_2ND_SWITCH_]
(1) Imagine there is NO IGMP querier present in the network.
(2) Also imagine that the 1st switch has a device connected that is sending a multicast stream to the 239.1.1.1 group -- we can pretend it's a PA system and the group traffic is the audio broadcast.
(3) Lastly, imagine both the 1st and 2nd switch have endpoints connected that want to receive this group, so they send IGMP reports to join 239.1.1.1. These devices may be the PA loudspeakers that plays the audio.
You may already see what the problem is. The 1st switch is receiving the incoming audio stream. And on the 1st switch, it has a loudspeaker connected directly that has expressed to receive the audio via an IGMP report. As a result, the 1st switch will only send the audio out the port with the connected loudspeaker.
Since the 2nd switch did not forward the IGMP report from its own receiver toward the 1st switch (no querier is present), the 1st switch has no idea that there is ALSO a receiver on the port leading to the 2nd switch. So that loudspeaker won't get the audio.
If we introduce an IGMP querier on the 1st switch, the problem is solved. When the 2nd switch begins to receive IGMP queries from the 1st switch, it will now forward the IGMP reports from its own receiver out the port where the queries come in. So the IGMP reports from the 2nd switch will now reach the 1st switch, allowing it to properly send the audio stream out both of the necessary ports.
A final question may be raised:
What happens if the IGMP querier is moved to the 2nd switch, but the 1st switch still has the audio sender connected? Turns out we are still OK here.
In this case, the 1st switch will again stop receiving IGMP reports from the 2nd switch, because the 2nd switch does not see any incoming IGMP queries from the 1st switch. Although the 1st switch no longer receives IGMP reports from the 2nd switch, it DOES receive IGMP queries from the 2nd switch. With IGMP snooping:
Multicast data streams will also get sent out of the ports where IGMP queries come in.
This is true even if that port never has any incoming IGMP reports to join the group. Basically all multicast streams flow towards the querier.
This also means that to have a best optimized network, it is a good practice to place your querier as close to the source of your multicast traffic as possible. Since multicast traffic always flows to the querier, if the source of the traffic and the querier are at opposite ends of the network, all the multicast traffic will traverse the whole network 100% of the time, irrespective of whether receives exist.