ubuntu下數據庫主從配置

今天說一下MySQL的主從複製如何做到!

- 準備工作:

1.兩個虛擬機:我這裏用的是CentOS5.5,IP地址分別是192.168.1.101 和192.168.1.105;

       101做主服務器,105做從服務器(都已經安裝相同版本的Mysql);

2.本機環境:nginx+PHP+MySQL

好了,現在開始吧,來看看這聽起來高大上的主從複製是怎麼回事。

原理:mysql要做到主從複製,其實依靠的是二進制日誌,即:假設主服務器叫A,從服務器叫B;主從複製就是

   B跟着A學,A做什麼,B就做什麼。那麼B怎麼同步A的動作呢?現在A有一個日誌功能,把自己所做的增刪改查的動作

   全都記錄在日誌中,B只需要拿到這份日誌,照着日誌上面的動作施加到自己身上就可以了。這樣就實現了主從複製。

擴展:MYSQL還有一種日誌叫做:慢日誌

   可以設置一個時間,那麼所有執行時間超過這個時間的SQL都會被記錄下來。這樣就可以通過慢日誌快速的找到網站中SQL的瓶頸來進行優化。

     大家有時間可以研究一下,這裏不多做介紹。
  • 實現步驟:

1.首先修改mysql的配置文件,使其支持二進制日誌功能。

打開主服務器的mysql配置文件:my.conf

代碼:# vi /etc/my.cnf

加入如下三行代碼:

vi /etc/my.cnf
-----
log-bin=mysql-bin
binlog_format=mixed
server-id=101
------
  • 參數解釋:

log-bin=mysql-bin //將mysql二進制日誌取名爲mysql-bin

     binlog_format=mixed //二進制日誌的格式,有三種:statement/row/mixed,具體分別不多做解釋,這裏使用mixed

     server-id=101 //爲服務器設置一個獨一無二的id便於區分,這裏使用ip地址的最後一位充當server-id

配置完成,:wq 保存,重啓mysql

重啓mysql命令:#

  • service mysqld restart
  • 從服務器的配置(有幾臺,配置幾臺)

同樣的,進入從服務器,配置從服務器的my.cnf,重複步驟1即可,

唯一的區別是,server-id要改成從服務器的ip尾位(只要不一樣就ok,但是業界喜歡將ip尾位作爲id),即server-id=105;其他兩項是一樣的,保存,並重啓mySQL;

service mysqld restart

2.在主服務器上爲從服務器分配一個賬號,就像一把鑰匙,從服務器拿着這個鑰匙,才能到主服務器上來共享主服務器的日誌文件。

進入主服務器的mysql界面,

命令: # mysql -u root -p 111111 //我這裏mysql賬號是root,密碼是111111

在mysql操作界面下,輸入下面一行命令:

GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY '111111';

刷新

 FLUSH PRIVILEGES;

3.查看主服務器BIN日誌的信息(執行完之後記錄下這兩值,然後在配置完從服務器之前不要對主服務器進行任何操作,因爲每次操作數據庫時這兩值會發生改變).

  • 設置從服務器

進入從服務器mysql

命令: # mysql -u root -p111111

關閉slave(如果你以前配置過主從的話,一定要先關閉)

stop slave;

開始配置:

輸入下面代碼即可:

  • 參數解釋:

            MASTER_HOST  :  設置要連接的主服務器的ip地址
    

         MASTER_USER : 設置要連接的主服務器的用戶名

         MASTER_PASSWORD : 設置要連接的主服務器的密碼

        MASTER_LOG_FILE : 設置要連接的主服務器的bin日誌的日誌名稱,即第3步得到的信息

        MASTER_LOG_POS : 設置要連接的主服務器的bin日誌的記錄位置,即第3步得到的信息,(這裏注意,最後一項不需要加引號。否則配置失敗)

    示例:

CHANGE MASTER TO
MASTER_HOST  ="10.0.0.128",
MASTER_USER  ="slave",
MASTER_PASSWORD  ="111111",
MASTER_LOG_FILE  ="mysql-bin.000001",
MASTER_LOG_POS  = 590;

先在從服務器配置完成,啓動從服務器:

命令:

start slave;

5.查看是否配置成功:

命令: show slave status;

上面兩項均爲yes,說明配置成功,否則,請重複前面的步驟。(或者評論問我,我也是摸索了很久之後才知道的,可能寫的不太詳細)

  • 優化
 主庫 
 set global binlog_group_commit_sync_delay=10;



 從庫配置文件添加
 slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=4

或者 在線添加
 stop slave;
 set global slave_parallel_type='LOGICAL_CLOCK';
  set global slave_parallel_workers=4;
  start slave;
   show variables like 'slave_parallel_%';

 從庫配置文件添加
 在 MySQL 5.7 中,推薦將 master-info-repository 和 relay-log-info-repository 設置爲 TABLE ,來減小這部分的開銷。

 master-info-repository = table
relay-log-info-repository = table
relay-log-recovery = ON`
  • 參數解釋

    啓用MySQL並行複製

MySQL 5.7的並行複製建立在組提交的基礎上,所有在主庫上能夠完成 Prepared 的語句表示沒有數據衝突,就可以在 Slave 節點並行複製。

關於 MySQL 5.7 的組提交,我們要看下以下的參數:

mysql> show global variables like '%group_commit%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_group_commit_sync_delay          | 0     |
| binlog_group_commit_sync_no_delay_count | 0     |
+-----------------------------------------+-------+

2 rows in set (0.00 sec)
要開啓 MySQL 5.7 並行複製需要以下二步,首先在主庫設置 binlog_group_commit_sync_delay 的值大於0 。

mysql> set global binlog_group_commit_sync_delay=10;

這裏簡要說明下 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 參數的作用。

binlog_group_commit_sync_delay
全局動態變量,單位微妙,默認0,範圍:0~1000000(1秒)。

表示 binlog 提交後等待延遲多少時間再同步到磁盤,默認0 ,不延遲。當設置爲 0 以上的時候,就允許多個事務的日誌同時一起提交,也就是我們說的組提交。組提交是並行複製的基礎,我們設置這個值的大於 0 就代表打開了組提交的功能。

binlog_group_commit_sync_no_delay_count
全局動態變量,單位個數,默認0,範圍:0~1000000。

表示等待延遲提交的最大事務數,如果上面參數的時間沒到,但事務數到了,則直接同步到磁盤。若 binlog_group_commit_sync_delay 沒有開啓,則該參數也不會開啓。

其次要在 Slave 主機上設置如下幾個參數:

過多的線程會增加線程間同步的開銷,建議4-8個Slave線程。

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=4
或者直接在線啓用也是可以的:

mysql> stop slave;
Query OK, 0 rows affected (0.07 sec)
mysql> set global slave_parallel_type='LOGICAL_CLOCK';
Query OK, 0 rows affected (0.00 sec)
mysql> set global slave_parallel_workers=4;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.06 sec)
mysql> show variables like 'slave_parallel_%';
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 4             |
+------------------------+---------------+

2 rows in set (0.00 sec)
檢查Worker線程的狀態

當前的 Slave 的 SQL 線程爲 Coordinator(協調器),執行 Relay log 日誌的線程爲 Worker(當前的 SQL 線程不僅起到協調器的作用,同時也可以重放 Relay log 中主庫提交的事務)。

我們上面設置的線程數是 4 ,從庫就能看到 4 個 Coordinator(協調器)進程。

並行複製配置與調優

開啓 MTS 功能後,務必將參數 master-info-repository 設置爲 TABLE ,這樣性能可以有 50%~80% 的提升。這是因爲並行複製開啓後對於 master.info 這個文件的更新將會大幅提升,資源的競爭也會變大。

在 MySQL 5.7 中,推薦將 master-info-repository 和 relay-log-info-repository 設置爲 TABLE ,來減小這部分的開銷。

配置文件添加
master-info-repository = table
relay-log-info-repository = table
relay-log-recovery = ON

並行複製監控

複製的監控依舊可以通過 SHOW SLAVE STATUS\G,但是 MySQL 5.7 在 performance_schema 架構下多了以下這些元數據表,用戶可以更細力度的進行監控:

mysql> use performance_schema;
mysql> show tables like 'replication%';
+---------------------------------------------+
| Tables_in_performance_schema (replication%) |
+---------------------------------------------+
| replication_applier_configuration           |
| replication_applier_status                  |
| replication_applier_status_by_coordinator   |
| replication_applier_status_by_worker        |
| replication_connection_configuration        |
| replication_connection_status               |
| replication_group_member_stats              |
| replication_group_members                   |
+---------------------------------------------+
8 rows in set (0.00 sec)

注意

  • 如果是新機器,可以完全按照這個來
  • 如果不是新機器,stop slave之後可能還需要 reset slave; 然後再開啓slave
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章