For what it's worth, I recommend option 2, redundant nsqd. I guess you'd want to make a helper function for the service producing messages, to publish each message to multiple NSQD.
I don't recommend --mem-queue-size=0 because has a significant performance impact, doesn't work with ephemeral channels, and doesn't protect against the primary risk: the physical hardware or operating system crashing. nsqd crashing without the OS/hardware crashing is very rare. Publishing to two or three different nsqd on different hardware (usually different virtual machines in different "availability zones" or different "racks") should prevent losing messages when a single server somewhere crashes.
If processing of these messages is idempotent, then you could have the same nsqlookupd and consumers for all the redundant nsqd nodes. That would be pretty simple. It would result in redundant work processing the copies of the messages, hurting performance ... but other schemes where you only switch to the "backup cluster" when there's a problem with the "primary cluster" can be pretty complicated. When do you switch, how do you switch, and how do you throw out the many days-old messages on the backup cluster that were successfully processed on the primary cluster? (There are a couple ways I can think of, but they can get tricky ...)
If your strategy using a conventional database as backup for the full message history works well for your case, then by all means, do what works. NSQD was always a bit more of a toolkit than a solution. IMHO.