天天看點

探究rh6上mysql5.6的主從、半同步、GTID多線程、SSL認證主從複制

mysql's replication

       Mysql的 Replication 是一個異步的複制過程,從一個 Mysql Master複制到另一個 Mysql Slave。在 Master 與 Slave 之間的實作整個複制過程主要由三個線程來完成,其中兩個線程( thread )( SQL_Thread和IO_Thread )在 Slave 端,另外一個線程(IO_Tread )在 Master 端。

   要實作 MySQL 的 Replication ,首先必須打開 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否則無法實作。因為整個複制過程實際上就是Slave從Master端擷取該日志然後再在自己身上完全順序的執行日志中所記錄的各種操作。打開 MySQL 的 Binary Log 可以通過在啟動 MySQL Server 的過程中使用“—log-bin”參數選項,或者在 my.cnf 配置檔案中的 mysqld 參數組([mysqld]辨別後的參數部分)增加“log-bin”參數項。

MySQL 複制的基本過程如下:

1.

Slave 上面的IO線程連接配接上 Master,并請求從指定日志檔案的指定位置(或者從最開始的日志)之後的日志内容;

2.

Master 接收到來自 Slave 的 IO 線程的請求後,通過負責複制的 IO 線程根據請求資訊讀取指定日志指定位置之後的日志資訊,傳回給 Slave 端的 IO 線程。傳回資訊中除了日志所包含的資訊之外,還包括本次傳回的資訊在 Master 端的Binary Log 檔案的名稱以及在 Binary Log 中的位置;

3.

Slave 的 IO 線程接收到資訊後,将接收到的日志内容依次寫入到 Slave 端的Relay Log檔案(mysql-relay-bin.xxxxxx)的最末端,并将讀取到的Master端的bin-log的檔案名和位置記錄到master- info檔案中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往後的日志内容,請發給我”

4.

Slave 的 SQL 線程檢測到 Relay Log 中新增加了内容後,會馬上解析該 Log 檔案中的内容成為在 Master 端真實執行時候的那些可執行的 Query 語句,并在自身執行這些Query。這樣,實際上就是在 Master 端和 Slave 端執行了同樣的Query,是以兩端的資料是完全一樣的。

實驗過程

虛拟機版本

Rhel6.4

32位

MySQL版本

mysql-5.6.10

linux-glibc2.5-i686.tar.gz

MySQL-5.6主從複制

兩個HA節點:

MASTER

SLAVE

HA1:172.16.111.12

HA2:172.16.111.13

node1.doubao.com

node2.doubao.com

(基本是相同的設定,做node1的示範)

關掉selinux

# setenforce 0

或者

# vim /etc/selinux/config

##修改

SELINUX=permissive

配置主機名,保持主機名一緻

# hostname node1.doubao.com

# vim /etc/sysconfig/network

##修改如下:

HOSTNAME=node1.doubao.com #當然HA2上要改為node2

:wq #儲存退出

主機名稱解析:

# vim /etc/hosts

##添加如下内容

172.16.111.6node1.doubao.com node1

172.16.111.7node2.doubao.com node2

雙機互信:

#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 生成密鑰

#ssh-copy-id -i .ssh/id_rsa.pub root@node2 ##将公鑰檔案發送到HA2上邊

時間同步:

# hwclock –s #由于筆者的實驗環境特殊,暫用此方法,也可以使用ntpdate的方法進行更新

配置好yum

mysql配置(node1,node2執行同樣操作)

5

6

7

8

9

<code># mkdir /mydata/data -pv</code>

<code># groupadd -r -g </code><code>3306</code> <code>mysql</code>

<code># useradd -r -g </code><code>3306</code> <code>mysql</code>

<code># chown -R mysql.mysql /mydata/data/</code>

<code># tar xf mysql-</code><code>5.6</code><code>.</code><code>10</code><code>-linux-glibc2.</code><code>5</code><code>-i686.tar.gz -C /usr/local</code>

<code># ln -sv mysql-</code><code>5.6</code><code>.</code><code>10</code><code>-linux-glibc2.</code><code>5</code><code>-i686 mysql</code>

<code># chown -R root.mysql ./*</code>

<code># scripts/mysql_install_db --user=mysql --datadir=/mydata/data</code>

<code># cp support-files/mysql.server /etc/rc.d/init.d/mysqld</code>

然後這個時候現在主節點(node1 | MASTER)上執行

<code># vim my.cnf#注意這個my.cnf在/usr/local/mysql下</code>

<code>#添加如下内容</code>

<code>datadir = /mydata/data</code>

<code>innodb_file_per_table = ON</code>

<code>server-id = </code><code>1</code>

<code>socket =/tmp/mysql.sock</code>

<code>:wq</code>

儲存退出後,将mysql的快捷路徑輸出下,便于以後打開mysql

<code># vim /etc/profile.d/mysql.sh</code>

<code>##添加如下内容</code>

<code>export PATH=$PATH:/usr/local/mysql/bin</code>

<code>##完成後退出,執行下此腳本。</code>

<code># . /etc/profile.d/mysql.sh</code>

然後指令提示符下打開mysql測試下連結

為從伺服器添加使用者及複制權限:

<code>mysql&gt; GRANT REPLICATION SLAVE ON *.* TO </code><code>'repluser'</code><code>@</code><code>'172.16.%.%'</code> <code>IDENTIFIED BY </code><code>'replpass'</code><code>;</code>

<code>Query OK, </code><code>0</code> <code>rows affected (</code><code>0.00</code> <code>sec)</code>

<code>mysql&gt; FLUSH PRIVILEGES;</code>

從伺服器配置

# vim my.cnf

<code>server-id = </code><code>11</code>

<code>socket = /tmp/mysql.sock</code>

<code>relay-log = relay-log</code>

<code>relay-log-index =relay-log.index</code>

儲存退出

主上觀看

從上

在主上建立個資料庫測試下。

到從上,剛開始是同步不了的,因為IO和SQL的THREAD還沒開啟,

這樣,主從的模型就完成了。

------------------------完成

(主上建立資料庫,從上觀看)

為了讓從mysql隻做讀操作,

首先觀察從中的mysql的read-only變量,為OFF,為了使其永久生效需要編輯其配置檔案:

退出後重新開機下Mysql服務。然後在進去到mysql中檢視其,已經打開(為on)。然後在Mysql中進行下建立資料庫的操作(即寫操作),就能發現其已經不能執行

MySQL-5.6半同步複制

PS:這裡沿用上邊的實驗資料,進而進行進一步的修改

設定半同步步驟:

<code>在Master和Slave的mysql指令行運作如下代碼:</code>

<code>在Master和Slave的my.cnf中編輯:</code>

<code># On Master</code>

<code>[mysqld]</code>

<code>rpl_semi_sync_master_enabled=</code><code>1</code><code>##永久生效</code>

<code>rpl_semi_sync_master_timeout=</code><code>1000</code> <code># </code><code>1</code> <code>second</code>

<code># On Slave</code>

<code>rpl_semi_sync_slave_enabled=</code><code>1</code>

然後重新開機Mysql

主伺服器

從伺服器

重新開機下IO線程才能正式啟動

主上看

<code># 也可通過設定全局變量的方式來設定,如下:</code>

<code>set</code> <code>global rpl_semi_sync_master_enabled=</code><code>1</code>

<code># 取消加載插件</code>

<code>mysql&gt; UNINSTALL PLUGIN rpl_semi_sync_master;</code>

<code>==============================================</code>

<code># 檢視從伺服器上的semi_sync是否開啟:</code>

<code>mysql&gt; SHOW GLOBAL STATUS LIKE </code><code>'rpl_semi%'</code><code>;</code>

<code># 檢視主伺服器上的semi_sync是否開啟,注意clients 變為</code><code>1</code> <code>,證明主從半同步複制連接配接成功:</code>

這樣一個半同步複制的mysql伺服器就已經搭建好了,大家可以進行實驗測試。

MySQL-5.6-GTID多線程複制

主服務中編輯my.cnf檔案添加如下内容

10

11

12

13

14

15

16

17

18

19

20

<code>socket=/tmp/mysql.sock</code>

<code>log-bin = master-bin</code>

<code>binlog-format=ROW</code>

<code>log-slave-updates=</code><code>true</code>

<code>gtid-mode=on</code>

<code>enforce-gtid-consistency=</code><code>true</code>

<code>master-info-repository=TABLE</code>

<code>relay-log-info-repository=TABLE</code>

<code>sync-master-info=</code><code>1</code>

<code>slave-parallel-workers=</code><code>2</code>

<code>binlog-checksum=CRC32</code>

<code>master-verify-checksum=</code><code>1</code>

<code>slave-sql-verify-cheksum=</code><code>1</code>

<code>binlog-rows-query-log_events=</code><code>1</code>

<code>repo-port=</code><code>3306</code>

<code>port=</code><code>3306</code>

<code>report-host=</code><code>172.16</code><code>.</code><code>111.12</code>

# service mysqld restart

從伺服器中編輯my.cnf檔案添加内容:

<code>report-host=</code><code>172.16</code><code>.</code><code>111.13</code>

重新開機服務

主上邊

然後主上mysql指令中設定

這個時候,GTID多線程複制已經建立好了。當然一台從伺服器很難看出來其效果。這裡不做具體示範,大家可以自行幾個同學一起做下此個實驗。

MySQL-5.6-SSL主從複制

PS:主從複制的過程仿照上邊來進行,ok後仿照下面來執行SSL的配置

如果是編譯安裝MySQL,需要加上 --with-openssl 和 --with-vio的安裝(這裡不做具體示範)

1、自建SSL認證檔案

<code># cd /data/ssl</code>

<code>##建立、簽署CA過程</code>

<code># openssl genrsa </code><code>2048</code> <code>&gt; ca-key.pem#生成密鑰</code>

<code># openssl req -</code><code>new</code> <code>-x509 -nodes -days </code><code>3600</code> <code>-key ca-key.pem -out ca-cert.pem</code>

<code># openssl req -newkey rsa:</code><code>2048</code> <code>-days </code><code>3600</code> <code>-nodes -keyout server-key.pem -out server-req.pem</code>

<code># openssl rsa -</code><code>in</code> <code>server-key.pem -out server-key.pem</code>

<code># openssl x509 -req -</code><code>in</code> <code>server-req.pem -days </code><code>3600</code> <code>-CA ca-cert.pem -CAkey ca-key.pem -set_serial </code><code>01</code> <code>-out server-</code>

<code>cert.pem</code>

<code># openssl req -newkey rsa:</code><code>2048</code> <code>-days </code><code>3600</code> <code>-nodes -keyout client-key.pem -out client-req.pem</code>

<code># openssl rsa -</code><code>in</code> <code>client-key.pem -out client-key.pem</code>

<code># openssl x509 -req -</code><code>in</code> <code>client-req.pem -days </code><code>3600</code> <code>-CA ca-cert.pem -CAkey ca-key.pem -set_serial </code><code>01</code> <code>-out client-</code>

最後驗證下是否正确,如下則是正确的:

<code># openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem</code>

<code>server-cert.pem: OK</code>

<code>client-cert.pem: OK</code>

2、主從資料庫配置調整:

編輯主伺服器配置/etc/my.cnf 的 [mysqld] 下,加上如下幾行,并重新開機資料庫:

<code>ssl</code>

<code>ssl-ca = /data/ssl/ca-cert.pem</code>

<code>ssl-cert = /data/ssl/server-cert.pem</code>

<code>ssl-key = /data/ssl/server-key.pem</code>

複制生成的認證檔案到從庫伺服器/data/ssl下

編輯從庫資料庫配置/etc/my.cnf 的 [mysqld] 下,加上如下幾行,并重新開機資料庫:

<code>ssl-cert = /data/ssl/client-cert.pem</code>

<code>ssl-key = /data/ssl/client-key.pem</code>

登陸到主從資料庫上,

<code>mysql&gt; show </code><code>var</code><code>iables like </code><code>'%ssl%'</code><code>;</code>

<code>+--------------------+------------------------------------------+</code>

<code>| Variable_name | Value|</code>

<code>| have_openssl| YES|</code>

<code>| have_ssl| YES|</code>

<code>| ssl_ca| /data/newscrets/ca-cert.pem|</code>

<code>| ssl_capath||</code>

<code>| ssl_cert| /data/newscrets/server-cert.pem |</code>

<code>| ssl_cipher||</code>

<code>| ssl_key| /data/newscrets/server-key.pem|</code>

<code>+-------------------+--------------------------------------------+</code>

<code>7</code> <code>rows </code><code>in</code> <code>set</code> <code>(</code><code>0.00</code> <code>sec)</code>

看到YES就是成功了,如果看到的是NO或者DISABLE,那麼看下驗證檔案的目錄權限和檔案權限。確定mysql使用者可以讀取即可。

3、主從同步

在主庫上建立同步帳号:

<code>mysql&gt; GRANT FILE,SELECT,REPLICATION SLAVEON *.* TO </code><code>'repluser'</code><code>@</code><code>'192.168.1.241'</code> <code>IDENTIFIED BY </code><code>'replpass'</code> <code>REQUIRE</code>

<code>SSL;</code>

在從庫上測試下是否可以成功登陸:

<code>mysql -h192.</code><code>168.1</code><code>.</code><code>154</code> <code>-urepluser -preplpass -S /tmp/mysql.sock --ssl-ca=/data/ssl/ca-cert.pem --ssl-</code>

<code>cert=/data/ssl/client-cert.pem --ssl-key=/data/ssl/client-key.pem</code>

如果沒有問題,登陸從庫mysql,change master到主庫

<code>mysql&gt; change master to</code>

<code>master_host=</code><code>'172.16.111.12'</code><code>,</code>

<code>master_port=</code><code>3306</code><code>,</code>

<code>master_user=</code><code>'repluser'</code><code>,</code>

<code>master_password=</code><code>'replpass'</code><code>,</code>

<code>master_log_file=</code><code>'mysql-bin.000001'</code><code>,</code>

<code>master_log_pos=</code><code>348221</code><code>,</code>

<code>master_ssl=</code><code>1</code><code>, #是說開啟SSL認證的意思。</code>

<code>master_ssl_ca=</code><code>'/data/ssl/ca-cert.pem'</code><code>,</code>

<code>master_ssl_cert=</code><code>'/data/ssl/client-cert.pem'</code><code>,</code>

<code>master_ssl_key=</code><code>'/data/ssl/client-key.pem'</code><code>;</code>

這樣,基于SSL的主從複制模型就搭建成功了。大家可以進行測試。

基于SSL認證這些内容,個人參考了一些資料。大家覺得不對的地方歡迎指出。

本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1203973,如需轉載請自行聯系原作者