MySQL基于SSL安全连接的主从复制怎么实现
生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。
主从复制的原理 master记录二进制日志,在每个事务更新数据完成之前,master在二日志记录这些改变。存储引擎在二进制日志完成后收到来自主服务器的通知,提交MySQL事务。接下来,slave需要将master的二进制日志复制到自己的中继日志。首先,slave开始一个工作线程&
mdash;
&
mdash;
I/O线程,I/O线程在master上打开一个普通的连接,然后开启binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。The final step of this process is handled by the SQL slave thread.。SQL线程会读取中继日志中的事件,并重现这些事件以更新从库的数据,以保持与主库中的数据一致。由于中继日志通常存储在操作系统的缓存中,因此只要该线程与 I/O 线程保持一致,中继日志的开销很少。
环境准备:打开两台MySQL服务器,部署网络环境。
[root@master bin]# mysql_ssl_rsa_setup --user=mysql --basedir=/usr/llocal/mysql --datadir=/usr/local/mysql/data 2. 赋予权限并重启。[root@master bin]# chmod +r /usr/local/mysql/data/server-key.pem
[root@master bin]# service mysqld restart
Shutting down MySQL.. [ 确定 ]
Starting MySQL. [ 确定 ] 3. 登录mysql查看ssl是否开启,并创建一个复制用户。
注:启用 mysql 支持 ssl 安全连接主要用于 mysql 主从复制(局域网可以非 ssh 连接即明文复制,但 internet 复制建议采用 ssl 连接)
mysql>grant replication slave on *.* to rep@'
192.168.8.3'
identified by '
123'
;
Query OK, 0 rows affected, 1 warning (0.07 sec) 4. master开启二进制日志,重启后查看二进制日志文件。
需要注意的是server_id必须唯一。
[root@master ~]# vim /etc/my.cnf#添加下面内容
log-bin=mysql-bin
service_id=1
[root@master ~]# service mysqld restart
Shutting down MySQL.. [ 确定 ]
Starting MySQL. [ 确定 ]
[root@master ~]# mysql -uroot -p123 -e "
show master status"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+ 5. 防火墙配置,实验环境中可以关闭防火墙,生产环境中需要配置防火墙规则,允许3306端口。[root@master ~]# firewall-cmd --permanent --add-port=3306/tcp
success
[root@master ~]# firewall-cmd --reload
success 6. 把ssl文件复制到slave[root@master data]# scp ca.pem client-cert.pem client-key.pem root@192.168.8.3:/usr/local/mysql/data
The authenticity of host '
192.168.8.3 (192.168.8.3)'
can'
t be established.
ECDSA key fingerprint is SHA256:LFby9KMDz/kkPfOESbeJ7Qh+3hmQaX2W5gkDDMwSGHA.
ECDSA key fingerprint is MD5:03:32:64:b4:c2:5b:6c:a4:e2:f0:7f:df:7a:35:19:80.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '
192.168.8.3'
(ECDSA) to the list of known hosts.
root@192.168.8.3'
s password:
ca.pem 100% 1112 232.5KB/s 00:00
client-cert.pem 100% 1112 240.4KB/s 00:00
client-key.pem 100% 1676 205.0KB/s 00:00 部署slave
1. 开启ssl、中继日志,赋予ssl文件读的权限并重启mysql。
[root@slave ~]# vim /etc/my.cnf#添加下面内容
server_id=2
relay-log=relay-log
ssl_ca=ca.pem
ssl_cert=client-cert.pem
ssl_key=client-key.pem
[root@slave ~]# cd /usr/local/mysql/data
[root@slave data]# ll ca.pem client-cert.pem client-key.pem
-rw-r--r--. 1 mysql mysql 1112 3月 31 14:31 ca.pem
-rw-r--r--. 1 mysql mysql 1112 3月 31 14:31 client-cert.pem
-rw-------. 1 mysql mysql 1676 3月 31 14:31 client-key.pem
[root@slave data]# chmod +r client-key.pem
[root@slave ~]# service mysqld restart
Shutting down MySQL.. [ 确定 ]
Starting MySQL. [ 确定 ]
2. 确认ssl开启成功
[root@slave ~]# mysql -uroot -p123 -e "show variables like '
%ssl%'
"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------------------------+-----------------+
| Variable_name | Value |
+-------------------------------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| performance_schema_show_processlist | OFF |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | client-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | client-key.pem |
+-------------------------------------+-----------------+
3. 在配置主从复制之前可以在从 mysql 上用 SSL 连接主服务器试试。
注意分清IP,8.2是master的IP,可以看到ssl协议Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
[root@slave ~]# cd /usr/local/mysql/data[root@slave data]# mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u rep -p123 -h 192.168.8.2
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ;
or \g.
Your MySQL connection id is 3
Server version: 5.7.40-log MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type '
help;
'
or '
\h'
for help. Type '
\c'
to clear the current input statement.
mysql>
mysql>
\s
--------------
mysql Ver 14.14 Distrib 5.7.40, for linux-glibc2.12 (x86_64) using EditLine wrapper
Connection id: 3
Current database:
Current user: rep@192.168.8.3
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Current pager: stdout
Using outfile: '
'
Using delimiter: ;
Server version: 5.7.40-log MySQL Community Server (GPL)
Protocol version: 10
Connection: 192.168.8.2 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 22 min 19 sec
Threads: 1 Questions: 8 Slow queries: 0 Opens: 109 Flush tables: 1 Open tables: 102 Queries per second avg: 0.005
--------------
1.登录slave服务器,配置主从 replicate
记得先退出连接,登录slave的mysql服务。
mysql>exit
Bye
[root@slave data]# mysql -uroot -p123
#省略部分登录信息
mysql>
change master to
->
master_host='
192.168.8.2'
, #masterIP
->
master_user='
rep'
, #master用户
->
master_password='
123'
, #master密码
->
master_log_file='
mysql-bin.000001'
, #master二进制日志文件
->
master_log_pos=154, #master位置
->
master_ssl=1, #masterssl
->
master_ssl_cert='
client-cert.pem'
,
->
master_ssl_key='
client-key.pem'
,
->
master_ssl_ca='
ca.pem'
;
Query OK, 0 rows affected, 2 warnings (0.07 sec)
mysql>
start slave;
#启用从
Query OK, 0 rows affected (0.02 sec)
确认启用成功。
测试SSL主从复制1. 登录master,写入一些数据
[root@master ~]# mysql -uroot -p123#省略部分内容
mysql>
create database bbs;
Query OK, 1 row affected (0.01 sec)
mysql>
use bbs;
Database changed
mysql>
create table tb1(id int,
->
name varchar(20));
Query OK, 0 rows affected (0.02 sec)
mysql>
insert into tb1 values(1,'
z3'
);
Query OK, 1 row affected (0.02 sec)
2. 登录slave,查看数据
[root@slave ~]# mysql -uroot -p123#省略部分内容
mysql>
select * from bbs.tb1;
+------+------+
| id | name |
+------+------+
| 1 | z3 |
+------+------+
1 row in set (0.01 sec)
最后可以查看到z3,主从成功。
SSL安全连接的作用是保护数据在传输过程中的安全,确保数据在传输时不被篡改或窃取。MySQL作为一款流行的开源关系型数据库,它具有数据安全性强、性能稳定、扩展性强等特点,而通过SSL安全连接的主从复制方式可以进一步提高MySQL的数据安全性,本文将介绍MySQL基于SSL安全连接的主从复制实现方法。
一、背景介绍
主从复制是MySQL数据库中的一种常用备份和高可用性架构设计方式。MySQL主从复制的工作方式是将主服务器上的数据同步到从服务器上,通过从服务器提供的读服务来分担主服务器的读写压力,提高数据库的性能和可用性。
二、SSL安全连接的原理
SSL(Secure Sockets Layer)安全套接层是一种通用的安全部署协议,该协议使用公钥加密方式采用环节型套接字提供数据机密性和完整性检查,并提供认证服务。在MySQL中,可以通过使用SSL协议来加密数据通信,进而保证数据在传输时不被篡改或窃取。
三、MySQL基于SSL安全连接的主从复制实现
1. 生成SSL证书和密钥
首先,需要使用OpenSSL生成SSL证书和密钥文件,可以使用以下命令生成:
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout server-key.pem -out server-cert.pem
这个命令将会生成一个自签名的证书和密钥文件。
2. 配置主服务器
在主服务器上修改my.cnf文件,在[mysqld]字段下添加以下内容:
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
这个配置将会启动ssl,并告诉MySQL SSL套接字使用哪些证书和密钥文件。重启MySQL服务,使之生效。
3. 配置从服务器
同样,在从服务器上修改my.cnf文件,在[mysqld]字段下添加以下内容:
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
这个配置告诉MySQL SSL套接字使用哪些证书和密钥文件。从服务器需要使用不同的证书和密钥文件,因此进行如上配置。重启MySQL服务,使之生效。
4. 配置主从关系
在主服务器上创建一个用于从服务器的账号,该账号需要有一定的复制权限。在从服务器上使用该账号并配置主从关系。
5. 启用SSL
在从服务器上启用SSL,即执行如下命令:
change master to master_ssl=1, master_ssl_ca='/etc/mysql/ssl/ca-cert.pem', master_ssl_cert='/etc/mysql/ssl/client-cert.pem', master_ssl_key='/etc/mysql/ssl/client-key.pem';
这个命令告诉从服务器启用SSL,并告诉从服务器使用哪些证书和密钥文件。
启用SSL后,从服务器将会使用SSL连接到主服务器,确保数据在传输过程中不被篡改或窃取。
总结:
通过MySQL基于SSL安全连接的主从复制实现方法,可以大大提高MySQL的数据安全性,确保数据在传输过程中不被篡改或窃取。本文介绍了基于SSL安全连接的主从复制实现步骤,希望能够对使用MySQL的用户有所帮助。