A fundamental principle to design a highly available systems is to get rid of any single points of failure. In order to make DB instance fail-safe and efficient, Cloud SQL makes it easy to implement the most basic forms of replication.
It does so by providing two different push-button replica types:
- Read replicas : Only read is allowed, write operation is refused.
- Failover replicas: Standby or replacement primary instance
A read replica is a clone of your Cloud SQL instance that follows the primary or master instance, pulling in any changes made to the master.
- The read replica is strictly read-only, which means that it will reject any queries that modify data (such as INSERT or UPDATE queries).
- Read replicas are useful when your application does a lot more reads than writes, because you can turn on a bunch of read replicas and route some of the read-only traffic to those instances.
- Horizontal scaling is an added advantage
Read replica creation from Google console:
- From SQL Services dashboard, select MYSQL instance(three dot from Action's column) and "Create read replica".
- Instance name can be changed, by default it created <primary_instance_name>-replica
- Architecture of read replica with primary instance
No write is allowed from application/client, Only Read operation is allowed.
A failover replica is similar to a read replica, except its primary job is to be ready as a replacement or standby instance of primary instance in case of some sort of disaster.
Failover replica creation from Google console:
- From SQL Services dashboard, select MYSQL instance(three dot from Action's column) and "Create clone".
- Architecture of failover/standby replica with primary instance:
Overview of readonly and failover replica in Google console:
Visualize Read-Only replica feature
In order to simulate readonly replica feature, lets perform write operation from primary instance and repeat the same from readonly replica using remote MYSQL client.
- Connect to primary MYSQL instance and execute both read and write operation query.
- Instance ID = devinline-gcp-mysqll
- Public IP address = 35.225.161.77
n0r0082@m-c02z31rnlvdt ~ % mysql -u root --password=PASSWORD -h 35.225.161.77 \ --ssl-ca=../GCP/certs/server-ca.pem \ --ssl-cert=../GCP/certs/client-cert.pem \ --ssl-key=../GCP/certs/client-key.pem Your MySQL connection id is 10151 Server version: 5.7.36-google-log (Google) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases -> ; +--------------------+ | Database | +--------------------+ | information_schema | | devInlineTxn | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.05 sec) mysql> CREATE TABLE ORDERS( -> order_id INT NOT NULL AUTO_INCREMENT, -> order_total VARCHAR(100) NOT NULL, -> customer_id VARCHAR(40) NOT NULL, -> order_date DATE, -> PRIMARY KEY ( order_id ) -> ); Query OK, 0 rows affected (0.07 sec) mysql> show tables; +------------------------+ | Tables_in_devInlineTxn | +------------------------+ | ORDERS | +------------------------+ 1 row in set (0.05 sec) mysql> INSERT INTO ORDERS -> (order_total, customer_id, order_date) -> VALUES -> ("$120.98", "WM-198721", NOW()); Query OK, 1 row affected, 1 warning (0.05 sec) mysql> INSERT INTO ORDERS -> (order_total, customer_id, order_date) -> VALUES -> ("$11.98", "WM-1100", NOW()); Query OK, 1 row affected, 1 warning (0.05 sec) mysql> INSERT INTO ORDERS -> (order_total, customer_id, order_date) -> VALUES -> ("$41.98", "WM-4360", NOW()); Query OK, 1 row affected, 1 warning (0.06 sec) mysql> select * from ORDERS; +----------+-------------+-------------+------------+ | order_id | order_total | customer_id | order_date | +----------+-------------+-------------+------------+ | 1 | $120.98 | WM-198721 | 2022-02-26 | | 2 | $11.98 | WM-1100 | 2022-02-26 | | 3 | $41.98 | WM-4360 | 2022-02-26 | +----------+-------------+-------------+------------+ 3 rows in set (0.05 sec) mysql>
- Connect to read-only MYSQL instance and try to execute write operation query.
- InstanceId = devinline-gcp-mysqll-replica
- public Ip address = 34.72.79.8)
- This replicas is not SSL enabled so we will login into this instance without SSH keys.
n0r0082@m-c02z31rnlvdt ~ % mysql -u root --password=PASSWORD -h 34.72.79.8 Your MySQL connection id is 8088 Server version: 5.7.36-google (Google) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> clear mysql> show databases -> ; +--------------------+ | Database | +--------------------+ | information_schema | | devInlineTxn | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.05 sec) mysql> use devInlineTxn; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from ORDERS; +----------+-------------+-------------+------------+ | order_id | order_total | customer_id | order_date | +----------+-------------+-------------+------------+ | 1 | $120.98 | WM-198721 | 2022-02-26 | | 2 | $11.98 | WM-1100 | 2022-02-26 | | 3 | $41.98 | WM-4360 | 2022-02-26 | +----------+-------------+-------------+------------+ 3 rows in set (0.06 sec) mysql> mysql> INSERT INTO ORDERS -> (order_total, customer_id, order_date) -> VALUES -> ("$1.98", "WM-020", NOW()); ERROR 1290 (HY000): The MySQL server is running with the --read-only option
so it cannot execute this statement mysql>
- InstanceId = devinline-gcp-mysqll-replica
Fail-over/clone DB Instance: Since fail-over DB instance is clone of primary instance(Instance ID = devinline-gcp-mysqll and Public IP address = 35.225.161.77) so by default when clone was created, fail-over instance created with SSL enabled.
What is replica promotion?
A couple of operations are only possible with read replicas: promoting and disabling replication.
- Promoting a read replica stops replication and converts the instance into a standalone primary instance with read and write capabilities. This can't be undone.
- To avoid loss of data, before promoting the replica, you should verify that the replica has applied all transactions received from the primary.
-----======----------
HI I HAVE READ ALL THE COMMENTS AND SUGGESTIONS POSTED BY THE VISITORS FOR THIS ARTICLE ARE VERY FINE, WE WILL WAIT FOR YOUR NEXT ARTICLE SO ONLY. THANKS!
ReplyDelete온라인섯다
Well written! Explore a variety of Available Cargos for seamless and efficient freight transport. Optimize your logistics operations with reliable cargo shipping solutions, ensuring safe, timely, and cost-effective global trade.
ReplyDelete