Mám replikaci spuštěnou na Percona Server 5.5 podle tato příručka a přemýšlel, jestli bych měl přidat read-only=1
k mému otrokovi my.cnf
, aby to bylo jen pro čtení?
Průvodce nastavuje replikaci pro tabulku mysql, takže uživatelé jsou replikováni, ale primárně používám otrok, aby převzal mysqldumps, a v nouzové konfiguraci jej znovu nastavil jako master, takže nevěřím, že potřebujeme (nebo měli bychom) povolit zápis na to neustále?
Když je Slave pouze pro čtení , není 100% chráněn před světem.
Podle dokumentace MySQL na read-only
Tato proměnná je ve výchozím nastavení vypnutá. Je-li povoleno, server nepovoluje žádné aktualizace, s výjimkou uživatelů, kteří mají oprávnění SUPER nebo (na slave serveru) z aktualizací prováděných podřízenými vlákny. V nastavení replikace může být užitečné povolit read_only na slave serverech, aby se zajistilo, že slave přijímají aktualizace pouze z hlavního serveru a ne od klientů.
Každý, kdo má SUPER privilegium , tak může číst a psát takovým slave ...
Ujistěte se, že všichni uživatelé, kteří nemají oprávnění, nemají oprávnění SUPER.
Pokud chcete zrušit všechna SUPER oprávnění jednorázově, spusťte to na Master a Slave:
UPDATE mysql.user SET super_priv='N' WHERE user<>'root';
FLUSH PRIVILEGES;
S odkazem na Slave si to vyhrazuje SUPER privilegium pouze na root
a zabrání tomu, aby neprivilegovaní dělali zápisy, od kterých by jinak byli omezeni.
Nedávno jsem se dozvěděl, že MySQL 5.7 představí super_read_only .
To zastaví SUPER uživatelé v jejich stopách, protože dokumenty 5.7
Pokud je povolena systémová proměnná read_only, server povoluje aktualizace klienta pouze od uživatelů, kteří mají oprávnění SUPER. Pokud je také povolena systémová proměnná super_read_only, server zakáže aktualizace klientů i od uživatelů, kteří mají SUPER. V popisu systémové proměnné read_only najdete popis režimu jen pro čtení a informace o tom, jak interně read_only a super_read_only interagují.
Změny super_read_only na hlavním serveru nejsou replikovány na slave servery. Hodnota může být nastavena na slave serveru nezávisle na nastavení na masteru.
super_read_only byl přidán do MySQL 5.7.8.
Měl by být replikační slave MySQL nastaven pouze na čtení?
Ano, raději byste měli spustit slave servery s dostupnými R/O režimy. Dříve privilegovaní uživatelé mohli data takového otroka stejně upravovat, ale později dostali také knoflík pro omezení R/O.
Proč je to důležité - je lepší selhat při zápisu než lítost s nesprávnými zápisy, které by mohly efektivně učinit nepoužitelné otroky kvůli jednoduchému zasunutí dat nebo konfliktům klíčů, které by přerušily replikaci (už žádné další skutečné otrokyně).
K dispozici je také software používaný pro rozdělení orchestrací a zatížení, který by zohledňoval stav R/O serverů v fondech, které nakonfigurovali pro správné směrování požadavků mezi těmito servery.
To je bezpečnost. Použij to.
Problém, včetně MySQL 8.0, spočívá v tom, že MySQL vás nenutí k nastavení read_only = ON
, Když provedete příkaz start slave
. Proč je problém? Protože téměř všechny MySQL DBA používají své otroky na RO, aby se zabránilo poškození dat, a vždy existuje jeden dba, který omylem spouští chybně SQL, který modifikuje data na otroka, nebo aplikaci, která nezmění jeho conf. Pokud chci psát na otroky, protože má několik schémat a musím psát na tomto schématu, musí být příkaz read_only
Inteligentnější a nechte nás udělat read_only for schema
. To by mohlo být velmi užitečné na serverech s více Master a slave, kteří dělají Replicate_Ignore_DB
. Takže prozatím musíte ovládat ručně a být velmi opatrní.
Užívat si.