4、讀寫分離---雙主雙從(mycat)


雙主雙從

一個主機 m1 用於處理所有寫請求,它的從機 s1 和另一台主機 m2 還有它的從機 s2 負責所有讀請
求。當 m1 主機宕機后,m2 主機負責寫請求,m1、m2 互為備機。
 
 角色               地址
master1          192.168.199.231
slave1             192.168.199.185
master2          192.168.199.120
slave2             192.168.199.174
 
注意:在一主一從基本上需要刪除testdb以及恢復從機
 
 
mater1配置
修改/etc/my.cnf文件
#主服務器唯一ID
server-id=1
##啟用二進制日志
log-bin=mysql-bin
## 設置不要復制的數據庫(可設置多個)
binlog-ignore-db=mysql
##binlog-ignore-db=information_schema
##設置需要復制的數據庫
binlog-do-db=testdb
##設置logbin格式
binlog_format=STATEMENT

 

新加配置

# 在作為從數據庫的時候,有寫入操作也要更新二進制日志文件
log-slave-updates
#表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1,取值范圍是1 .. 65535
auto-increment-increment=2 
## 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 .. 65535
auto-increment-offset=1

 

 

master2配置

/etc/my.cnf

#主服務器唯一ID
server-id=3 
#啟用二進制日志
log-bin=mysql-bin
# 設置不要復制的數據庫(可設置多個)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#設置需要復制的數據庫
binlog-do-db=testdb
##設置logbin格式
binlog_format=STATEMENT
## 在作為從數據庫的時候,有寫入操作也要更新二進制日志文件
log-slave-updates 
##表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1,取值范圍是1 .. 65535
auto-increment-increment=2 
## 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值范圍是1 .. 65535
auto-increment-offset=2

 

slave1配置

#從服務器唯一ID
server-id=2
##啟用中繼日志
relay-log=mysql-relay

  

 slave2配置

#從服務器唯一ID
server-id=4 
#啟用中繼日志 relay-log=mysql-relay

  

 ①、配置好哦之后進行mysql服務的重啟

 

②、關閉防火牆

 

③、 在兩台主機上建立帳戶並授權 slave
#在主機MySQL里執行授權命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';

 

 查看主機master1狀態

mysql> show master status
    -> ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000010 |      120 | testdb       | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

查詢 Master2的狀態
mysql> show master status
    -> ;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000002 |      120 | testdb       | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
#分別記錄下File和Position的值
#執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化

 

 在兩台主機創建slave

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';

 

④、在從機上配置需要復制的主機

slave1·

mysql> CHANGE MASTER TO MASTER_HOST='192.168.199.231',
    -> MASTER_USER='slave',
    -> MASTER_PASSWORD='123123',
    -> MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

 

slave2

mysql> CHANGE MASTER TO MASTER_HOST='192.168.199.120',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='123123',
-> MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

此時master1和slave1,master2和slave2的主從復制搭建完成

 

⑤、兩個主機互相復制
master1和master2互備主從賦值

 

master1執行(即連接master2的主機IP地址)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.199.120',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='123123',
-> MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

 master2執行(即連接master1的主機IP地址)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.199.231',
    -> MASTER_USER='slave',
    -> MASTER_PASSWORD='123123',
    -> MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.07 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

 

⑥、 Master1 主機新建庫、新建表、insert 記錄,Master2 和從機復制

創建數據庫

 master1

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

 

slave2

mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

 

 master2

mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
6 rows in set (0.01 sec)

 

 slave2

mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

 

 
 
創建表以及插入數據
master1
mysql> use testdb;
Database changed
mysql
> create table tbl(id int,name varchar(40)); Query OK, 0 rows affected (0.03 sec) mysql> insert into tbl values (1,'mrchengs'); Query OK, 1 row affected (0.00 sec)

 

slave1
mysql> use testdb;
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 tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
+------+----------+
1 row in set (0.00 sec)

 

master2

mysql> use testdb;
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 tbl; +------+----------+ | id | name | +------+----------+ | 1 | mrchengs | +------+----------+ 1 row in set (0.00 sec)

 

 
slave2
mysql> use testdb;
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 tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
+------+----------+
1 row in set (0.00 sec)

 

 

mycat的使用

①、修改schema.xml配置文件

 

 

配置項說明
#balance="1": 全部的readHost與stand by writeHost參與select語句的負載均衡。
# writeType="0": 所有寫操作發送到配置的第一個writeHost, 第一個掛了切到還生存的第二個
# writeType="1",所有寫操作都隨機的發送到配置的 writeHost,1.5 以后廢棄不推薦
# writeHost,重新啟動后以切換后的為准,切換記錄在配置文件中:dnindex.properties 。
# switchType=
  1 : 1 默認值,自動切換。
   -1 表示不自動切換
   2 基於 MySQL 主從同步的狀態決定是否切換。
 
 
②、啟動mycat
 
 
③、驗證讀寫分離
在master1上執行插入語句
INSERT INTO mytbl VALUES(3,@@hostname);
mysql> select * from tbl;
+------+-----------------------+
| id   | name                  |
+------+-----------------------+
|    1 | mrchengs              |
|    3 | localhost.localdomain |
+------+-----------------------+
2 rows in set (0.01 sec)

slave2

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat03  |
+------+----------+
2 rows in set (0.00 sec)
 master2
mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat04  |
+------+----------+
2 rows in set (0.00 sec)

 slave2

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat05  |
+------+----------+
2 rows in set (0.00 sec)

 

④、登陸mycat

[root@localhost ~]# mysql -umycat -p123456 -P 8066 -h 192.168.199.217

進行驗證讀寫分離

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat04  |
+------+----------+
2 rows in set (0.00 sec)

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat03  |
+------+----------+
2 rows in set (0.00 sec)

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat05  |
+------+----------+
2 rows in set (0.07 sec)

 

 

 ⑤、 高可用下的抗風險能力(高可用)
 
 關閉master1查詢在配置文件中配置是否進行切換寫主機數據庫
[root@localhost ~]# systemctl stop mysql
[root@localhost ~]# systemctl status mysql
● mysql.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql; bad; vendor preset: disabled)
   Active: inactive (dead) since Thu 2020-02-13 20:15:06 CST; 8s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1632 ExecStop=/etc/rc.d/init.d/mysql stop (code=exited, status=0/SUCCESS)
  Process: 1070 ExecStart=/etc/rc.d/init.d/mysql start (code=exited, status=0/SUCCESS)

Feb 13 19:18:32 localhost.localdomain systemd[1]: Starting LSB: start and stop MySQL...
Feb 13 19:18:33 localhost.localdomain mysql[1070]: Starting MySQL SUCCESS!
Feb 13 19:18:33 localhost.localdomain systemd[1]: Started LSB: start and stop MySQL.
Feb 13 20:14:50 localhost.localdomain systemd[1]: Stopping LSB: start and stop MySQL...
Feb 13 20:15:06 localhost.localdomain mysql[1632]: Shutting down MySQL.............. SUCCESS!
Feb 13 20:15:06 localhost.localdomain systemd[1]: Stopped LSB: start and stop MySQL.

 

mycat客戶端中執行插入代碼
mysql> INSERT INTO tbl VALUES(100,@@hostname);
Query OK, 1 row affected, 1 warning (0.15 sec)

 

 啟動master1進行查看數據、
mysql> select * from tbl;
+------+-----------------------+
| id   | name                  |
+------+-----------------------+
|    1 | mrchengs              |
|    3 | localhost.localdomain |
|  100 | localhost.localdomain |
+------+-----------------------+
3 rows in set (0.00 sec)

 

在mycat上進行查詢

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat05  |
|  100 | mycat05  |
+------+----------+
3 rows in set (0.00 sec)

mysql> select * from tbl;
+------+-----------------------+
| id   | name                  |
+------+-----------------------+
|    1 | mrchengs              |
|    3 | localhost.localdomain |
|  100 | localhost.localdomain |
+------+-----------------------+
3 rows in set (0.00 sec)

mysql> select * from tbl;
+------+----------+
| id   | name     |
+------+----------+
|    1 | mrchengs |
|    3 | mycat03  |
|  100 | mycat03  |
+------+----------+
3 rows in set (0.00 sec)

 

此時master1成為讀主機
此時master2成為寫主機 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM