I've always done 1-hour retrospectives every two weeks. I typically do
- 30 minutes of data gathering
- 5 minutes of basic grouping (and voting on topics, if there are more than 3 or 4 groups)
- 30 minutes of root-causes analysis and corresponding action items
I like to limit the analysis / action items to 3 or 4 items, which I can pretty easily keep track of as far as time goes (5-10 minutes a piece).
I try to schedule them for the last hour of the day on Thursdays or Fridays, regardless of when the iteration ends, and it's worked really well so far. I should note that I come from more of an XP background than a scrum background, so there tends to be a little less weight to the concept of a sprint ending.
I always like to end at exactly one hour, even if there are still items to discuss, so that people always know that I value their time outside of work (since the retros happen late in the day).
As far as who runs retrospectives, if there is a new team member, I always ask them to run it - especially if they've never run one before. They typically have the least amount to contribute if they've only been there a short time (a few days) and they tend not to dominate conversations. After that, I like to rotate through team members so everyone gets comfortable leading retros. I've found that team leads running retrospectives is only a problem if they do it often. If they are just one part of the rotation, I haven't noticed any issues with that.
I've never really been able to get to 5 why's, but I've found that getting to two or three is often enough to come up with some action items that can help move things in a positive direction.
The biggest problem I've noticed is that some themes come back over and over. I haven't seen a good tool that's worked for me to deal with this, so I'm currently building one (http://retrospectr.com/)
to try to help with the retrospective-memory part as well as helping remote team members participate more easily.
As far as team members participating actively, one technique I use very often is the "talking stick" - I bring a small plush toy and ask people to pass it around in order 2 or 3 times and throw out one data point / piece of feedback. That usually lasts about 10 minutes, at which point people just sort of throw things out. I've had a few teams where we kept throwing the fuzzy duck around just to keep order, but those have been rare.