本文主要講述瞭如何在主從複製的過程當中使用SSL
進行加密,還有binlog
加密(MySQL 8.0.14+
)的實現。html
MySQL 8.0.25
Docker
先拉取鏡像並啓動,主庫3306
,從庫3307
,還須要加上--ssl
參數,以開啓SSL
加密鏈接的功能:mysql
docker pull mysql docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql --ssl docker run -itd -p 3307:3306 -p 33061:33060 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql --ssl
啓動容器以後進入容器並安裝vim
和net-tools
:sql
apt install vim net-tools
同時進入MySQL
準備好數據源:docker
create database test; use test; create table user( id int primary key auto_increment, name varchar(30) not null, age int not null );
SSL
鏈接準備SSL
開啓首先能夠進入MySQL
確保SSL
功能開啓:vim
show variables like '%ssl%';
CA
和私鑰默認狀況下,在/var/lib/mysql
下已經有生成的證書和私鑰文件,若是不想用默認的,能夠從新生成:bash
sudo mkdir /mysql sudo chown mysql:mysql /mysql mysql_ssl_rsa_setup --datadir=/mysql
生成的文件包括:服務器
ca-key.pem
:CA
私鑰ca.pem
:自簽名的CA
證書client-key.pem
:客戶端鏈接時使用的私鑰client-cert.pem
:客戶端鏈接時使用的證書server-key.pem
:服務器端私鑰server-cert.pem
:服務器端證書public_key.pem
/private_key.pem
:密鑰對的公鑰和私鑰實際使用只須要用到ca.pem
、服務端私鑰證書、客戶端私鑰證書這五個文件。因爲主從複製的時候,主庫做爲服務端,從庫做爲客戶端,所以ca.pem
/server-key.pem
/server-client.pem
只須要在主庫中配置,而ca.pem
/client-key.pem
/client-cert.pem
須要經過scp
傳到從庫中。ide
權限錯誤會致使MySQL
沒法正常使用SSL
的功能:測試
sudo chown mysql:mysql /mysql/*.pem sudo chmod 400 /mysql/*.pem sudo chmod 444 /mysql/ca.pem
修改主庫的配置文件,以下所示:ui
[mysqld] ssl_ca=/mysql/ca.pem ssl_cert=/mysql/server-cert.pem ssl_key=/mysql/server-key.pem
而從庫配置文件 修改以下:
[client] ssl-ca=/mysql/ca.pem ssl-cert=/mysql/client-cert.pem ssl-key=/mysql/client-key.pem
此時從庫是沒辦法鏈接本身的,只能鏈接主庫,若是須要鏈接本身,須要將主庫的server-key.pem
/server-cert.pem
拷貝到從庫中,並配置從庫的[mysqld]
:
[mysqld] ssl_ca=/mysql/ca.pem ssl_cert=/mysql/server-cert.pem ssl_key=/mysql/server-key.pem
下面是一些主從複製的最常規最簡單的配置,主庫僅配置了id
和須要複製的庫:
[mysqld] server-id=1 binlog-do-db=test
從庫的配置以下:
[mysqld] server-id=2 replicate-do-db=test
修改完後重啓主庫和從庫。
在主庫中建立主從複製的用戶(具體ip
請使用ifconfig
查看):
create user 'repl'@'172.17.0.3' identified with mysql_native_password by '123456' require ssl; grant replication slave on *.* to 'repl'@'172.17.0.3';
首先查看主庫的狀態:
show master status;
把File
和Position
記錄下來,並在從庫中使用change master to
/change replication source to
(8.0.23+
)設置主庫信息:
change master to master_host = '172.17.0.2', master_user = 'repl', master_password = '123456', master_log_file = 'binlog.000005', master_log_pos = 156, master_ssl = 1;
或
change replication source to source_host = '172.17.0.2', source_user = 'repl', source_password = '123456', source_log_file = 'binlog.000005', source_log_pos = 156; source_ssl = 1;
能夠使用start slave
/start replica
(8.0.22+
)啓動從庫開啓複製功能:
start slave # 或 start replica
啓動完成後使用
show slave stauts\G
查看從庫狀態:
須要顯示兩個Yes
纔算成功,若是Slave_IO_Running
一直顯示Connecting
,可能緣由是:
SSL
配置錯誤,好比使用了錯誤的client-key.pem
請查看日誌自行檢查,日誌位置可經過
show variables like 'log_error'
查看。
沒有問題後,嘗試在主庫中插入數據:
use test; insert into user values('111',1);
在從庫中就能夠查詢到了:
use test; select * from user;
binlog
的加密從8.0.14
開始,MySQL
提供了對binlog
的加密功能,默認狀況下,binlog
是沒有加密的,加密須要使用keyring
插件或者組件:
實現步驟以下:
keyring_file
插件MySQL
提供瞭如下插件的安裝:
因爲使用的是社區版,社區版只支持keyring_file
插件,以此爲例。
主庫和從庫修改配置文件以下:
[mysqld] early-plugin-load=keyring_file.so keyring_file_data=/mysql/keyring
重啓後,進入MySQL
查看:
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'keyring%';
須要處於ACTIVE
狀態,這樣就是成功了。
binlog
的加密經過一個系統變量binlog_encryption
控制,須要手動開啓:
set global binlog_encryption=ON; set persist binlog_encryption=ON;
開啓後查看日誌:
show binary logs;
能夠看到是加密了的binlog
:
而以前沒有加密的binlog
能夠手動遷移數據後進行刪除。
加密完binlog
後並不須要修改主從複製的配置,主從複製依然生效,以下圖所示:
主庫插入了一個用戶從庫依然能select
到。