Mysql主從配置和跳過事務

Mysql主從配置和跳過事務

1、介紹:mysql

大型網站中數據層仍是原來那種傳統的數據架構,或者只是淡淡靠一臺服務器來扛,如此多的數據庫鏈接操做,數據必然會崩潰,數據丟失的話,可想而知後果不堪設想。因此咱們想到不少解決方法·:一方面採用優秀的代碼框架,進行代碼的優化,採用優秀的數據緩存技術如:redis,若是資金豐厚的話,必然會想到架設服務器羣,來分擔主數據庫的壓力。而後重點到了今天介紹的:利用MySQL主從配置,實現讀寫分離,減輕數據庫壓力。這種方式,在現在不少網站裏都有使用,也不是什麼新鮮事情,今天總結一下,方便你們學習參考一下。redis

原理:主服務器(Master)負責網站NonQuery操做,從服務器負責Query操做,用戶能夠根據網站功能模特性塊固定訪問Slave服務器,或者本身寫個池或隊列,自由爲請求分配從服務器鏈接。主從服務器利用MySQL的二進制日誌文件,實現數據同步。二進制日誌由主服務器產生,從服務器響應獲取同步數據庫。sql

拓撲圖:數據庫

f73c83a77fcd7496fafb9cf0a86829a4.png

Master---cml5:192.168.5.103緩存

Slave---cml2:192.168.5.102bash

Slave---cml6:192.168.5.106服務器

2、配置:架構

一、首先備份主(master)主機數據庫(全備),而後倒入到從(slave)主機上:框架

[root@cml5 ~]# mysqldump -uroot -predhat--single-transaction -R --triggers -E --master-data --flush-logs--all-databases > cml.sql
mysqldump:[Warning] Using a password on the command line interface can be insecure.
[root@cml5 mydata]# scp cml.sql cml2:/data/
cml.sql                                                         100% 1617     1.6KB/s   00:00
[root@cml2 data]# mysql -uroot -predhat< cml.sql
mysql: [Warning] Using a password on thecommand line interface can be insecure.

 

二、編輯master主機的my.cnf配置文件:socket

[root@cml5 mydata]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/mydata
socket=/usr/local/mysql/mysql.sock
log_bin=/usr/local/mysql/mydata/mysql-bin
server-id=1

##備註:server-id 服務器惟一標識,log_bin 啓動MySQL二進制日誌

 

三、主庫建立同步用戶:

mysql> grant all on *.* to 'rsync'@'%'identified by 'redhat';
Query OK, 0 rows affected, 1 warning (0.00sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

四、查看主庫上數據節點:

83d4694eb09433d85ab536f0d52d5758.png

 

五、修改slave上的my.cnf配置文件:

[root@cml2 mydata]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/mydata
socket=/usr/local/mysql/mysql.sock
log_bin=/usr/local/mysql/mydata/mysql-bin
server-id=2
relay_log=relay-log

六、slave褲上面同步:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.103',MASTER_USER='rsync',MASTER_PASSWORD='redhat',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=587;
Query OK, 0 rows affected, 2 warnings (0.00sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

 

七、查看狀態兩個線程必須都是YES:

 

mysql> show slave status\G;

*************************** 1. row***************************

               Slave_IO_State: Connecting tomaster

                  Master_Host: 192.168.5.103

                  Master_User: rsync

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000011

         Read_Master_Log_Pos: 587

               Relay_Log_File: relay-log.000001

                Relay_Log_Pos: 4

       Relay_Master_Log_File: mysql-bin.000011

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

 

八、鏈接一臺空的DB,測試數據是否同步:

server-id=3
relay_log=relay-log

###測試:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.103',MASTER_USER='rsync',MASTER_PASSWORD='redhat',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=587;
Query OK, 0 rows affected, 2 warnings (0.01sec)
mysql> start slave;

##由於以前已經建立了一張表,因此寫入確定會出錯:
mysql> show slave status\G;

*************************** 1. row***************************

               Slave_IO_State: Connecting tomaster

                  Master_Host: 192.168.5.103

                  Master_User: rsync

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000011

         Read_Master_Log_Pos: 587

               Relay_Log_File: relay-log.000001

                Relay_Log_Pos: 4

       Relay_Master_Log_File: mysql-bin.000011

            Slave_IO_Running: Yes

            Slave_SQL_Running: no 
##線上能夠直接跳過這個錯誤,可是這個事務的數據久找不到了:

mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ;   ##跳過一個事務,多個就改變數字。
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

##重設置slave:

mysql> stop slave;
Query OK, 0 rows affected (0.00sec)
 
mysql> reset slave;
Query OK, 0 rows affected (0.00sec)
相關文章
相關標籤/搜索