MySQL - 基于SSL安全连接的主从复制
Posted 大虾好吃吗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - 基于SSL安全连接的主从复制相关的知识,希望对你有一定的参考价值。
目录
🦐博客主页:大虾好吃吗的博客
生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。
主从复制的原理
master记录二进制日志,在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务写入二进制日志,在事件写入二进制日志完成后,master通知存储引擎提交事务。 下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程,I/O线程在master上打开一个普通的连接,然后开启binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
环境准备:打开两台MySQL服务器,部署网络环境。
部署master
1. 主机创建 SSL/RSA 文件
[root@master ~]# cd /usr/local/mysql/bin/
[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
--------------
-
登录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(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。复制默认是明文进行传输的,通过SSL加密可以大大提高数据的安全性。
MySql之基于ssl安全连接的主从复制
MySql基于ssl安全连接的主从复制
一、设备环境
centos7.2 两台
MySQL 5.7
MySQL 5.7 主要特性:
原生支持Systemd
更好的性能:对于多核CPU、固态硬盘、锁有着更好的优化
更好的InnoDB存储引擎
更为健壮的复制功能:复制带来了数据完全不丢失的方案,传统金融客户也可以选择使用MySQL数据库。
新增sys库:以后这会是DBA访问最频繁的库
更好的优化器:优化器代码重构的意义将在这个版本及以后的版本中带来巨大的改进,Oracle官方正在解决MySQL之前最大的难题原生JSON类型的支持(JavaScript Object Notation)
注:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
JSON 语法是 JavaScript 对象表示语法的子集。
l 数据在键值对中
l 数据由逗号分隔
l 花括号保存对象
l 方括号保存数组
二、实现基于ssl安全连接的主从复制
1)在主mysql创建SSL/RSA文件
给server-key.pem权限
登录mysql,执行mysql>show variables like‘%ssl%‘;
在主mysql上的操作完成,再生成一个复制帐号:REQUIRE SSL
在主mysql上启用二进制日志并重启mysql服务
查看主mysql的状态
注:要记住上图所显示的file和position的值,配置从服务器要用到
防火墙允许3306/tcp通信
2)接着就去从上配置
从mysql的/etc/my.cnf文件内容
把主mysql生成的证书给了从服务器
查看从mysql复制过来的证书
继续在从上配置SSL:修改/etc/my.cnf文件,添加如下内容
重启mysqld服务
查看SSL是否被支持:
在配置主从复制之前可以在从mysql上用SSL连接主服务器试试:
SSL测试连接成功,并且登入的SSL协议是: Cipher in use is DHE-RSA-AES256-SHA
最后开始配置主从replicate, 登录从mysql
在从上change master to
测试:
从服务器上
以上同步成功。
总结:
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。复制默认是明文进行传输的,通过SSL加密可以大大提高数据的安全性。
本文出自 “duyuheng” 博客,请务必保留此出处http://duyuheng.blog.51cto.com/12879147/1941089
以上是关于MySQL - 基于SSL安全连接的主从复制的主要内容,如果未能解决你的问题,请参考以下文章
centos7.2安装mysql5.7.13实现 ssl 安全连接的主从复制