前言
備份數據庫是生產環境中的首要任務,重中之重,有時候不得不通過網絡進行數據庫的復制,由于MySQL/MariaDB的主從復制是明文傳送的,如果在生產環境中跨網絡傳送,數據的安全性就無法完全保證,為了解決這一問題,我們需要一種安全的方式進行傳送,即基于SSL加密進行數據傳輸。
部署配置
實驗拓撲
實驗環境
系統環境:CentOS6.6
數據庫版本:mariadb-5.5.36
#注意:主從服務器數據庫版本須一致:主從服務器時間須同步 #此實驗從服務器只做一組為例
配置主從復制
安裝mariadb
[root@node1 ~]# mkdir /mydata/data -pv [root@node1 ~]# groupadd -r mysql [root@node1 ~]# useradd -g mysql -r mysql [root@node1 ~]# chown -R mysql.mysql /mydata/data [root@node1 ~]# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local [root@node1 ~]# cd /usr/local [root@node1 local]# ln -sv mariadb-5.5.36-linux-x86_64 mysql [root@node1 local]# chown -R root.mysql mysql
提供配置及腳本文件
[root@node1 local]# mkdir /etc/mysql [root@node1 local]# cd mysql [root@node1 mysql]# cp /support-files/my-large.cnf /etc/mysql/my.cnf [root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld [root@node1 mysql]# chkconfig --add mysqld [root@node1 mysql]# chkconfig mysqld on #主從節點都執行以上操作 #以下為后續工作,可省略 [root@node1 ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh [root@node1 ~]# source /etc/profile.d/mysql.sh [root@node1 ~]# ln -sv /usr/local/mysql/include /usr/include/mysql [root@node1 ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
主服務器配置
[root@node1 mysql]# mkdir /mydata/binlogs [root@node1 mysql]# chown -R mysql.mysql /mydata [root@node1 mysql]# vim /etc/mysql/my.cnf datadir = /mydata/data log-bin=/mydata/binlogs/master-bin binlog_format=mixed #二進制日志格式 server-id = 1 #主服務器與從服務器不可一致 [root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data [root@node1 mysql]# service mysqld start
授權從服務器復制賬號
查看二進制日志位置
從服務器配置
[root@node2 mysql]# mkdir /mydata/relaylogs [root@node2 mysql]# chown -R mysql.mysql /mydata [root@node2 mysql]# vim /etc/mysql/my.cnf datadir = /mydata/data #log-bin=mysql-bin #binlog_format=mixed #log-slave-updates = 1 #如果從服務器為其他從服務器主服務器須啟用以上三項 server-id = 2 #不可與主服務器一致 relay-log=/mydata/relaylogs/relay-bin #中繼日志位置 read_only = 1 #設置為只讀 [root@node2 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data [root@node2 mysql]# service mysqld start
從服務器連接主服務器
查看從服務器狀態
#通過查看從服務器狀態可發現主從已完全同步
主從復制測試
主服務器添加數據
查看從服務器數據及狀態
#與主服務器一致,主從復制配置完成
實現SSL安全傳輸
檢查SSL狀態
配置主服務器為CA
CA配置不做詳細注釋,詳細CA搭建請見前期博文
[root@node1 ~]# cd /etc/pki/CA [root@node1 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) [root@node1 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 [root@node1 CA]# touch {index.txt,serial} [root@node1 CA]# echo 01 > serial
主服務器生成證書
[root@node1 CA]# mkdir /etc/mysql/ssl [root@node1 CA]# cd /etc/mysql/ssl [root@node1 ssl]# (umask 077;openssl genrsa -out master.key 2048) [root@node1 ssl]# openssl req -new -key master.key -out master.csr [root@node1 ssl]# openssl ca -in master.csr -out master.crt -days 3650
從服務器生成證書請求
[root@node2 ssl]# (umask 077;openssl genrsa -out slave.key 2048) [root@node2 ssl]# openssl req -new -key slave.key -out slave.csr
為從服務器簽署證書
[root@node2 ssl]# scp slave.csr node1:/tmp slave.csr 100% 1013 1.0KB/s 00:00 [root@node1 ssl]# openssl ca -in /tmp/slave.csr -out /tmp/slave.crt -days 3650 [root@node1 ssl]# scp /tmp/slave.crt node2:/etc/mysql/ssl slave.crt 100% 4520 4.4KB/s 00:00
將CA證書拷到各服務器
[root@node1 ssl]# cp /etc/pki/CA/cacert.pem ./ [root@node1 ssl]# scp /etc/pki/CA/cacert.pem node2:/etc/mysql/ssl cacert.pem 100% 1403 1.4KB/s 00:00
修改證書權限
[root@node1 ssl]# chown -R mysql.mysql ./ [root@node1 ssl]# ll total 20 -rw-r--r-- 1 mysql mysql 1403 Jun 19 14:50 cacert.pem -rw-r--r-- 1 mysql mysql 4596 Jun 19 14:27 master.crt -rw-r--r-- 1 mysql mysql 1045 Jun 19 14:24 master.csr -rw------- 1 mysql mysql 1679 Jun 19 14:22 master.key #主從服務器都執行以上操作
主從服務器配置SSL
[root@node1 ~]# vim /etc/mysql/my.cnf [mysqld] #在此段中添加如下配置 ssl #開啟SSL功能 ssl-ca = /etc/mysql/ssl/cacert.pem #指定CA文件位置 ssl-cert = /etc/mysql/ssl/master.crt #指定證書文件位置 ssl-key = /etc/mysql/ssl/master.key #指定密鑰所在位置 [root@node1 ~]# service mysqld restart
主服務器配置
再次查看SSL狀態
設授權復制用戶只能通過SSL復制
從服務器配置
從服務器登陸測試
由此可見此次連接是基于SSL加密實現的,下面我們開始連接主服務器并開啟復制
查看從服務器狀態
出錯了,Slave_IO_Running狀態為NO說明啟動失敗,找到錯誤如下
解決方法:
#從服務器停止復制 MariaDB [(none)]> stop slave; Query OK, 0 rows affected (0.01 sec)
#主服務器刷新日志,記錄新位置
#從服務器更新日志文件及位置,重新啟動復制
#狀態都為Yes,問題解決
主從復制測試
主服務器添加數據
從服務器查看數據
The end
MySQL/MariaDB數據庫基于SSL實現主從復制實驗就說到這里了,實驗過程中會遇到一些問題,只要耐心對待,一切都會迎刃而解,朋友們實驗過程如果遇到問題記得留言交流哦。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5524
哥,我按照你的步驟做,centos7系統,報錯,主從都能啟動SSL。但是啟動start slave同步的時候報錯了,error connecting to master ‘repluser@192.168.1.20:3306’ – retry-time: 60 retries: 86400 message: SSL connection error: SSL_CTX_set_default_verify_paths failed,有看到信息請聯系我,謝謝,我是馬的學生
報錯解決了,centos 7成功基于ssl半同步復制
@xiaozhiqi:你好,我也遇到過這個問題,我的系統是centos6.6的,請問你是怎么解決的?