mysql主從複製全面解析及應用演練

Mysql複製node

Mysql內建的複製功能是構建大型、高性能應用程序的基礎。Mysql支持單向、異步複製,複製過程當中一臺服務器充當主服務器,而另一個或多個服務器充當從服務器。這不只僅對高性能的程序有益,對其餘任務也方便,好比遠程共享數據、保持「熱備」等等。mysql

複製解決的基本問題是讓一臺服務器的數據和另外的服務器保持同步。主服務器和從服務器能夠位於不一樣的網絡拓撲中,還能對整臺服務器、特定的數據庫、甚至特定的表進行復制。linux


在進入詳細設置複製以前,先看看它實際是如何複製數據的。整體來講,複製有3個步驟:sql

一、主服務器把數據更改記錄到二進制日誌中。(這叫作二進制日誌事件)數據庫

二、從服務器把主服務器的二進制日誌拷貝到本身的中繼日誌中。vim

三、從服務器重放中繼日誌中的事件,把更改應用到本身的數據上。緩存

這只是概述,每個步驟都很複雜。下圖更清晰描述了複製的過程。bash

170314778.png

第一步是在主服務器上記錄二進制日誌。在每一個更新數據的事務完成以前,主服務器都會將數據更改記錄到二進制日誌中。即便事務在執行期間是交錯的,mysql也會串行地將事務寫入到二進制日誌中。在把事件寫入二進制日誌以後,主服務器告訴存儲引擎提交事務。服務器

第二步是從服務器把主服務器的二進制日誌拷貝到本身的硬盤上,進入所謂的「中繼日誌」中。首先,它啓動一個工做線程,叫I/O線程,這個I/O線程開啓一個普通的客戶端鏈接,而後啓動一個特殊的二進制日誌轉儲進程(它沒有相應的SQL命令)。這個轉儲進程從主服務器的二進制日誌中讀取數據。它不會對事件進行輪詢。若是3跟上了主服務器,就會進入休眠狀態並等待有新的事件發生時主服務器發出的信號。I/O線程把數據寫入從服務器的中繼日誌中。網絡

第三步SQL線程讀取中繼日誌,而且重放其中的事件,而後更新從服務器的數據。因爲這個線程能跟上I/O線程,中繼日誌一般在操做系統的緩存中,因此中繼日誌的開銷很低。SQL線程執行事件也能夠被寫入從服務器本身的二進制日誌中,它對於有些場景很實用。


本篇博文主要講解Mysql的主從複製、半同步複製、基於SSL複製。


環境介紹:

系統:CentoS6.4-x86_64

主服務器:node1:172.16.18.7

從服務器:node2:172.16.18.9

Mysql版本:mysql-5.5.33



主從複製

思路解析:

主服務器:建立具備複製權限的用戶帳號;設置server-id;啓動二進制日誌。

從服務器:啓動中繼日誌;設置server-id;啓動複製線程。

過程解析:

一、建立主從服務器並實現雙機互信:

主服務器:

[root@node1~]# ssh-keygen -t rsa -P ''
[root@node1~]##ssh-copy-id -i .ssh/id_rsa.pub root@172.16.18.9

從服務器:

[root@node2~]# ssh-keygen -t rsa -P ''
[root@node2~]##ssh-copy-id -i .ssh/id_rsa.pub root@172.16.18.7

二、編輯主從服務器的hosts文件:

[root@node1~]# vim /etc/hosts
#####添加以下兩項:###############
172.16.18.7node1.magedu.com  node1
172.16.18.9node2.magedu.com node2
#####保存並複製至node2上:########
[root@node1~]# scp /etc/hosts 172.16.18.9:/etc

三、查看時間並同步時間:

[root@node1 ~]#date;ssh node2 'date'

注意:必須保證時間一致,這樣主從複製纔不會實現時間間隔。

四、安裝Mysql:(主從服務器)

這裏不在詳細介紹了,請參考http://pangge.blog.51cto.com/6013757/1059896

(1)、建立用戶
#groupadd -g 306 mysql
#useradd -g mysql -u 306 -r mysql
(2)、建立數據目錄:
#mkdir/mydata/data –pv
(3)、更改數據目錄權限:
#chown -R mysql.mysql /mydata/data
(4)、解壓Mysql建立連接
#tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local
#ln -sv mysql-5.5.33-linux2.6-x86_64 mysql
(5)、更改屬主屬組
#cd mysql
#chown -R root:mysql./*
(6)、初始化mysql
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data
(7)、建立啓動腳本並賦予權限
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#chmod +x /etc/rc.d/init.d/mysqld
(8)、建立並修改配置文件
# cp support-files/my-large.cnf /etc/my.cnf
# vim /etc/my.cnf
添加以下行指定mysql數據文件的存放位置:
datadir = /mydata/data
(9)、更改環境變量
#vim /etc/profile.d/mysql.sh
添加:
export PATH=/usr/local/mysql/bin:$PATH
#. /etc/profile.d/mysql.sh
(10)、添加到服務列表中並啓動mysql
# chkconfig --add mysqld
# service mysql start

五、配置主服務器:

(1)編輯配置文件:

[root@node1 ~]# vim /etc/my.cnf
server-id       = 1        #60行標識本身的ID號
log-bin=mysql-bin          #52行二進制日誌,默認是啓動的
binlog_format=mixed        #55行使用混合模式

(2)創建複製帳號權限:

[root@node1 ~]# mysql
    mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO rpuser@'172.16.%.%' IDENTIFIED BY 'rpuser';
mysql> FLUSH PRIVILEGES;                  #刷新權限

六、配置從服務器:

(1)編輯配置文件:

[root@node2 ~]# vim /etc/my.cnf
server-id       = 20        #60行標識本身的ID號,和主服務器決不能相同
#log-bin=mysql-bin           #52行關閉二進制日誌
#binlog_format=mixed         #55行關閉使用混合模式
#####設置從服務器爲只讀模式######
read-only=1       #注意從服務器不可有寫模式
#####添加中繼日誌################
relay-log=/mydata/data/relay-mysql      #中繼日誌
relay-log-index=relay-mysql.index       #中繼日誌索引文件

【relay-log日誌記錄的是在複製過程當中,從服務器I/O線程將主服務器的二進制日誌讀取過來記錄到從服務器本地文件,而後SQL線程會讀取relay-log日誌的內容並應用到從服務器。】

(2)、登陸mysql查看線程:

查看啓動線程

mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User |Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  1 | root | localhost | NULL | Query   |    0| NULL  | SHOW PROCESSLIST |
+----+------+-----------+------+---------+------+-------+------------------+

根據結果顯示:此時還未啓動任何線程。

(3)、配置鏈接服務器:

命令參數解析:

mysql>helpCHANGE MASTER TO
    MASTER_BIND = 'interface_name'       #將控制綁定在那個接口上
  | MASTER_HOST = 'host_name'            #主服務器地址
  | MASTER_USER = 'user_name'            #主服務器用戶(剛纔建立的)
  | MASTER_PASSWORD = 'password'         #主服務器密碼
  | MASTER_PORT = port_num               #工做端口
  | MASTER_CONNECT_RETRY = interval      #重試時間
  | MASTER_HEARTBEAT_PERIOD = interval   #每隔多長時間探測一下是否落後主服務器,主服務器是否在線
  | MASTER_LOG_FILE = 'master_log_name'  #指定從哪個二進制文件複製
  | MASTER_LOG_POS = master_log_pos      #指定哪個二進制文件的事件位置
  | RELAY_LOG_FILE = 'relay_log_name'    #中繼日誌
  | RELAY_LOG_POS = relay_log_pos
  | MASTER_SSL = {0|1}                   #是否使用SSL功能
  | MASTER_SSL_CA = 'ca_file_name'
  | MASTER_SSL_CAPATH = 'ca_directory_name'
  | MASTER_SSL_CERT = 'cert_file_name'
  | MASTER_SSL_KEY = 'key_file_name'
  | MASTER_SSL_CIPHER = 'cipher_list'
  | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
  | IGNORE_SERVER_IDS = (server_id_list)     #將某些ID號忽略掉

配置從服務器鏈接主服務器:

mysql> CHANGE MASTER TO MASTER_HOST='172.16.18.7',
    -> MASTER_USER='rpuser',
    -> MASTER_PASSWORD='rpuser';

(4)啓動從服務器線程:

mysql> START SLAVE;

(5)查看從服務器工做狀態

mysql> SHOW SLAVE STATUS\G
***************************1. row ***************************
               Slave_IO_State: Waiting formaster to send event       #I/O狀態;接受主服務器發送狀態
                  Master_Host: 172.16.18.7           #主服務器用戶帳號
                  Master_User: rpuser                #用戶
                  Master_Port: 3306                  #默認監聽端口
                Connect_Retry: 60                    #重試時間間隔
              Master_Log_File: mysql-bin.000002   #讀取的二進制日誌文件
          Read_Master_Log_Pos: 107                   #事件位置
               Relay_Log_File:relay-mysql.000003 #當前讀取的中繼日誌文件
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes                   #I/O線程已啓動
            Slave_SQL_Running: Yes                   #SQL線程已啓動
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 966
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0                   #落後主服務器時間
Master_SSL_Verify_Server_Cert:No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1

七、測試

主服務器:

mysql> CREATE DATABASE yong;
Query OK, 1 row affected (0.16sec)
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| yong               |
+--------------------+
5 rows inset (0.03 sec)

從服務器:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| yong               |
+--------------------+
5 rows inset (0.16 sec)

這樣主從複製功能就實現了。



基於事件點複製:

基於事件點複製:就是讓從服務器從指定位置進行同步數據,而不是從頭開始同步數據。

爲了實現效果,這裏將從服務器mysql的原有數據清除,其餘配置不變:

[root@node2 ~]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]
[root@node2 ~]# rm -rf /mydata/data/
[root@node2 ~]# cd /usr/local/mysql
[root@node2 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@node2 mysql]# service mysqld start

清理完成啓動成功進行半同步複製:

思路:首先在主服務器上徹底備份數據庫,而後將數據導出在從服務器上應用便可。

一、主服務器數據庫徹底備份

[root@node1~]# mysqldump -uroot  --lock-all-tables --master-data=2 --events --all-databases > all.sql

更多方法請參考:http://pangge.blog.51cto.com/6013757/1291909

二、備份的數據複製至從服務器上

[root@node1 ~]# scp all.sql node2:/tmp/

三、從服務器將數據導入mysql

mysql> source /tmp/all.sql;        導入數據

四、查看主服務器上二進制文件及事件位置

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      190 |              |                  |
+------------------+----------+--------------+------------------+

五、配置鏈接服務器

從服務器鏈接主服務器:

mysql> CHANGE MASTER TOMASTER_HOST='172.16.18.7',
    -> MASTER_USER='rpuser',
    -> MASTER_PASSWORD='rpuser',
    -> MASTER_LOG_FILE='mysql-bin.000002',
    ->MASTER_LOG_POS=190;
Query OK,0 rows affected (0.16 sec)

六、啓動從服務器

mysql>START SLAVE;

七、查看從服務器狀態

mysql> SHOW SLAVE STATUS\G
*************************** 1.row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 172.16.18.7
                  Master_User: rpuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002       #指定的二進制文件
          Read_Master_Log_Pos: 190                    #指定的事件位置
               Relay_Log_File:relay-mysql.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 190
              Relay_Log_Space: 405
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert:No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row inset (0.00 sec)

八、測試

主服務器:

mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.01sec)
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
| yong               |
+--------------------+
6 rows inset (0.01 sec)

從服務器:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
| yong               |
+--------------------+
6 rows inset (0.06 sec)

這樣基於事件點主從複製就完成了!!



半同步主從複製

半同步的開啓也是比較簡單,只須要在Master與Slave服務器上都安裝上半同步的插件並啓用便可

一、在主服務器上安裝半同步插件:


mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; #安裝Master半同步插件
mysql> set global rpl_semi_sync_master_enabled = 1;    #開啓Master半同步功能
mysql> set global rpl_semi_sync_master_timeout = 1000;

二、查看啓動結果:

mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |      #已啓動
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

三、在從服務器上安裝半同步插件:

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; #安裝Slave半同步插件
mysql> set global rpl_semi_sync_slave_enabled = 1;      #開啓Slave半同步功能

四、重啓IO線程:

mysql> stop slave io_thread;
mysql>start slave io_thread;

五、查看主服務器啓動結果:


mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     | #已經有一個客戶端鏈接
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

六、查看定義的超時時間:

mysql> show global variables like '%rpl%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 1000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+

七、在從服務器上查看定義結果:

mysql> show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |

八、測試:

主服務器:

[root@node1 ~]# mysql -e 'drop database yong;'
[root@node1 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |

從服務器:

[root@node2 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+


這樣半同步複製就完成了,若想永久有效這些配置能夠定義至配置文件中。



基於SSL的mysql主從複製

環境介紹:

Mysql版本:mysql-5.5.33

主服務器:node1:172.16.18.7 數據未改變

從服務器:node2:172.16.18.9 數據未改變

演示過程:

在主服務器上配置CA,而後分別爲主從服務器頒發證書;

更多詳細請參考http://pangge.blog.51cto.com/6013757/1280171

一、將主服務器作成CA服務器:

[root@node1 mysql]# cd /etc/pki/CA/
[root@node1 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
[root@node1 CA]# openssl req -x509 -new -key private/cakey.pem -out cacert.pem -days 3650
[root@node1 CA]# touch index.txt serial
[root@node1 CA]# echo 01 >serial

二、主服務器申請證書

[root@node1 mysql]#mkdir ssl
[root@node1mysql]# chown mysql.mysql ssl
[root@node1 mysql]#cd ssl
[root@node1ssl]# (umask 077;openssl genrsa -out master.key 1024)
[root@node1ssl]# openssl req -new -key master.key -out master.csr
[root@node1ssl]# openssl ca -in master.csr -out master.crt -days 365
[root@node1ssl]# chown -R mysql.mysql *

三、從服務器向主服務器申請證書

從服務器:

[root@node2 mysql]#mkdir ssl
[root@node2 mysql]#chown mysql:mysql ssl
[root@node2 ssl]#(umask 077;openssl genrsa -out slave.key 1024)
[root@node2ssl]# openssl req -new -key slave.key -out slave.csr -days 365
[root@node2ssl]# scp slave.csr node1:/tmp

主服務器:

[root@node1~]# cd /tmp/
[root@node1tmp]# openssl ca -in slave.csr -out slave.crt -days 365
[root@node1tmp]# scp slave.crt node2:/usr/local/mysql/ssl/
[root@node1tmp]# scp /etc/pki/CA/cacert.pem node2:/usr/local/mysql/ssl/

從服務器:

[root@node2ssl]# chown -R mysql.mysql *

注意:在不管是在Master服務器上仍是在Slave服務器上必定要修改ssl目錄及其文件的屬主屬主爲mysql。

四、在主服務器上開啓ssl功能:

[root@node1 ssl]#vim /etc/my.cnf

在mysqld字段中添加以下內容

ssl
ssl-ca=/etc/pki/CA/cacert.pem
ssl-cert=/usr/local/mysql/ssl/master.crt
ssl-key=/usr/local/mysql/ssl/master.key
#####重啓###########
[root@node1 ssl]# service mysqld restart

驗證ssl是否開啓成功:

[root@node1 ~]# mysql
mysql> SHOW GLOBAL VARIABLES LIKE '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| have_openssl  | YES                             |
| have_ssl      | YES                             |
| ssl_ca        | /etc/pki/CA/cacert.pem          |
| ssl_capath    |                                 |
| ssl_cert      | /usr/local/mysql/ssl/master.crt |
| ssl_cipher    |                                 |
| ssl_key       | /usr/local/mysql/ssl/master.key |
+---------------+---------------------------------+
7 rows inset (0.01 sec)

五、建立容許使用ssl鏈接的用戶

mysql>help grant;   #查看權限的定義方法,關於ssl的定義方式。
mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO rpssl@172.16.18.9 IDENTIFIED BY 'redhat' REQUIRE ssl;   #這裏的受權IP不可以使用引號引發來,否則後期必定會報錯。
mysql>FLUSH PRIVILEGES;

六、在從服務器上開啓ssl功能

[root@node2~]# vim /etc/my.cnf
依然在mysqld字段中添加
innodb_file_per_table= 1       #實現單表存儲,可忽略添加
relay-log=/mydata/data/relay-mysql   #中繼日誌
read-only=1                   #只讀選項
ssl
#log-bin=mysql-bin           #註釋使用二進制,可選擇性
#binlog_format=mixed         #註釋二進制類型,可選擇性
######重啓###########
[root@node2~]# service mysqld restart

驗證ssl是否開啓成功:

mysql> SHOW GLOBALVARIABLES LIKE '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES  |
| have_ssl      | YES  |
| ssl_ca        |      |
| ssl_capath    |      |
| ssl_cert      |      |
| ssl_cipher    |      |
| ssl_key       |      |
+---------------+-------+
7 rows inset (0.01 sec)

七、從服務器鏈接主服務器

mysql> change master tomaster_host='172.16.18.7',
    -> master_user='rpssl',
    -> master_password='redhat',
    -> master_log_file='mysql-bin.000004',
    -> master_ssl=1,
    ->master_ssl_ca='/usr/local/mysql/ssl/cacert.pem',
    ->master_ssl_cert='/usr/local/mysql/ssl/slave.crt',
-> master_ssl_key='/usr/local/mysql/ssl/slave.key';
###########狀態顯示:#############
mysql> show slave status\G
*************************** 1.row ***************************
               Slave_IO_State:
                  Master_Host: 172.16.18.7
                  Master_User: rpssl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 4
               Relay_Log_File:relay-mysql.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 4
              Relay_Log_Space: 107
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File:/usr/local/mysql/ssl/cacert.pem
           Master_SSL_CA_Path:
              Master_SSL_Cert:/usr/local/mysql/ssl/slave.crt
            Master_SSL_Cipher:
               Master_SSL_Key:/usr/local/mysql/ssl/slave.key
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert:No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0

八、啓動從服務器線程:

mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: 172.16.18.7
                 Master_User: rpssl
                 Master_Port: 3306
               Connect_Retry: 60
             Master_Log_File: mysql-bin.000004
         Read_Master_Log_Pos: 362
              Relay_Log_File: relay-mysql.000002
               Relay_Log_Pos: 508
       Relay_Master_Log_File: mysql-bin.000004
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
             Replicate_Do_DB:
         Replicate_Ignore_DB:
          Replicate_Do_Table:
       Replicate_Ignore_Table:
     Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
                  Last_Errno: 0
                  Last_Error:
                Skip_Counter: 0
         Exec_Master_Log_Pos: 362
             Relay_Log_Space: 660
             Until_Condition: None
              Until_Log_File:
               Until_Log_Pos: 0
          Master_SSL_Allowed: Yes
          Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
          Master_SSL_CA_Path:
              Master_SSL_Cert:/usr/local/mysql/ssl/slave.crt
           Master_SSL_Cipher:
              Master_SSL_Key: /usr/local/mysql/ssl/slave.key
       Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
               Last_IO_Errno: 0
               Last_IO_Error:
              Last_SQL_Errno: 0
              Last_SQL_Error:
 Replicate_Ignore_Server_Ids:
            Master_Server_Id: 1

九、測試:

[root@node2 ssl]#mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem  --ssl-cert=/usr/local/mysql/ssl/slave.crt--ssl-key=/usr/local/mysql/ssl/slave.key  -urpssl -h172.16.18.7 –predhat
mysql> \s
--------------
mysql  Ver 14.14 Distrib5.5.33, for linux2.6 (x86_64) using readline 5.1
Connection id:      3
Current database:
Current user:       rpssl@node2.magedu.com
SSL:            Cipher inuse is DHE-RSA-AES256-SHA     #基於ssl已可用
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.33-logMySQL Community Server (GPL)
Protocol version:   10
Connection:     172.16.18.7via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         29 min 24sec
Threads: 3  Questions:14  Slow queries: 0  Opens: 33 Flush tables: 1  Open tables:26  Queries per second avg: 0.007
--------------

至此,mysql基於ssl主從複製就完成了!!



總結:

本篇博客成功實現了主從基本複製,半同步主從複製,基於ssl主從複製。筆者演作了5遍實現了所有內容也遇見了各類問題,如本博文描述不到位或有錯誤請留言指出,如有關於主從複製中碰見不解問題也歡迎留言討論!!

後續將更新mysql主主複製的相關內容,敬請繼續關注!!

相關文章
相關標籤/搜索