MySQL - 基于SSL安全连接的主从复制

简介: 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 文件

1. [root@master ~]# cd /usr/local/mysql/bin/
2. [root@master bin]# mysql_ssl_rsa_setup --user=mysql --basedir=/usr/llocal/mysql --datadir=/usr/local/mysql/data

2. 赋予权限并重启。

1. [root@master bin]# chmod +r /usr/local/mysql/data/server-key.pem 
2. [root@master bin]# service mysqld restart
3. Shutting down MySQL..                                      [  确定  ]
4. Starting MySQL.                                            [  确定  ]

3. 登录mysql查看ssl是否开启,并创建一个复制用户。

注:启用 mysql 支持 ssl 安全连接主要用于 mysql 主从复制(局域网可以非 ssh 连接即明文复制,但 internet 复制建议采用 ssl 连接)

1. mysql> grant replication slave on *.* to rep@'192.168.8.3' identified by '123';
2. Query OK, 0 rows affected, 1 warning (0.07 sec)

4. master开启二进制日志,重启后查看二进制日志文件。

需要注意的是server_id必须唯一。

1. [root@master ~]# vim /etc/my.cnf
2. #添加下面内容
3. log-bin=mysql-bin
4. service_id=1
5. [root@master ~]# service mysqld restart
6. Shutting down MySQL..                                      [  确定  ]
7. Starting MySQL.                                            [  确定  ]
8. [root@master ~]# mysql -uroot -p123 -e "show master status"
9. mysql: [Warning] Using a password on the command line interface can be insecure.
10. +------------------+----------+--------------+------------------+-------------------+
11. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
12. +------------------+----------+--------------+------------------+-------------------+
13. | mysql-bin.000001 |      154 |              |                  |                   |
14. +------------------+----------+--------------+------------------+-------------------+

5. 防火墙配置,实验环境中可以关闭防火墙,生产环境中需要配置防火墙规则,允许3306端口。

1. [root@master ~]# firewall-cmd --permanent --add-port=3306/tcp
2. success
3. [root@master ~]# firewall-cmd --reload
4. success

6. 把ssl文件复制到slave

1. [root@master data]# scp ca.pem client-cert.pem client-key.pem root@192.168.8.3:/usr/local/mysql/data
2. The authenticity of host '192.168.8.3 (192.168.8.3)' can't be established.
3. ECDSA key fingerprint is SHA256:LFby9KMDz/kkPfOESbeJ7Qh+3hmQaX2W5gkDDMwSGHA.
4. ECDSA key fingerprint is MD5:03:32:64:b4:c2:5b:6c:a4:e2:f0:7f:df:7a:35:19:80.
5. Are you sure you want to continue connecting (yes/no)? yes
6. Warning: Permanently added '192.168.8.3' (ECDSA) to the list of known hosts.
7. root@192.168.8.3's password: 
8. ca.pem                             100% 1112   232.5KB/s   00:00    
9. client-cert.pem                    100% 1112   240.4KB/s   00:00    
10. client-key.pem                     100% 1676   205.0KB/s   00:00

部署slave

1. 开启ssl、中继日志,赋予ssl文件读的权限并重启mysql。

1. [root@slave ~]# vim /etc/my.cnf
2. #添加下面内容
3. server_id=2
4. relay-log=relay-log
5. ssl_ca=ca.pem
6. ssl_cert=client-cert.pem
7. ssl_key=client-key.pem
8. 
9. [root@slave ~]# cd /usr/local/mysql/data
10. [root@slave data]# ll ca.pem client-cert.pem client-key.pem 
11. -rw-r--r--. 1 mysql mysql 1112 3月  31 14:31 ca.pem
12. -rw-r--r--. 1 mysql mysql 1112 3月  31 14:31 client-cert.pem
13. -rw-------. 1 mysql mysql 1676 3月  31 14:31 client-key.pem
14. [root@slave data]# chmod +r client-key.pem
15. [root@slave ~]# service mysqld restart
16. Shutting down MySQL..                                      [  确定  ]
17. Starting MySQL.                                            [  确定  ]

2. 确认ssl开启成功

1. [root@slave ~]# mysql -uroot -p123 -e "show variables like '%ssl%'"
2. mysql: [Warning] Using a password on the command line interface can be insecure.
3. +-------------------------------------+-----------------+
4. | Variable_name                       | Value           |
5. +-------------------------------------+-----------------+
6. | have_openssl                        | YES             |
7. | have_ssl                            | YES             |
8. | performance_schema_show_processlist | OFF             |
9. | ssl_ca                              | ca.pem          |
10. | ssl_capath                          |                 |
11. | ssl_cert                            | client-cert.pem |
12. | ssl_cipher                          |                 |
13. | ssl_crl                             |                 |
14. | ssl_crlpath                         |                 |
15. | ssl_key                             | client-key.pem  |
16. +-------------------------------------+-----------------+

3. 在配置主从复制之前可以在从 mysql 上用 SSL 连接主服务器试试。

       注意分清IP,8.2是master的IP,可以看到ssl协议Cipher in use is ECDHE-RSA-AES128-GCM-SHA256

1. [root@slave ~]# cd /usr/local/mysql/data
2. [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
3. mysql: [Warning] Using a password on the command line interface can be insecure.
4. Welcome to the MySQL monitor.  Commands end with ; or \g.
5. Your MySQL connection id is 3
6. Server version: 5.7.40-log MySQL Community Server (GPL)
7. 
8. Copyright (c) 2000, 2022, Oracle and/or its affiliates.
9. 
10. Oracle is a registered trademark of Oracle Corporation and/or its
11. affiliates. Other names may be trademarks of their respective
12. owners.
13. 
14. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
15. 
16. mysql> 
17. mysql> \s
18. --------------
19. mysql  Ver 14.14 Distrib 5.7.40, for linux-glibc2.12 (x86_64) using  EditLine wrapper
20. 
21. Connection id:    3
22. Current database: 
23. Current user:   rep@192.168.8.3
24. SSL:      Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
25. Current pager:    stdout
26. Using outfile:    ''
27. Using delimiter:  ;
28. Server version:   5.7.40-log MySQL Community Server (GPL)
29. Protocol version: 10
30. Connection:   192.168.8.2 via TCP/IP
31. Server characterset:  latin1
32. Db     characterset:  latin1
33. Client characterset:  utf8
34. Conn.  characterset:  utf8
35. TCP port:   3306
36. Uptime:     22 min 19 sec
37. 
38. Threads: 1  Questions: 8  Slow queries: 0  Opens: 109  Flush tables: 1  Open tables: 102  Queries per second avg: 0.005
39. --------------
  1. 登录slave服务器,配置主从 replicate

记得先退出连接,登录slave的mysql服务。

1. mysql> exit
2. Bye
3. [root@slave data]# mysql -uroot -p123
4. #省略部分登录信息
5. mysql> change master to
6.     -> master_host='192.168.8.2',            #masterIP
7.     -> master_user='rep',                #master用户
8.     -> master_password='123',              #master密码
9.     -> master_log_file='mysql-bin.000001',       #master二进制日志文件
10.     -> master_log_pos=154,                #master位置
11.     -> master_ssl=1,                  #masterssl
12.     -> master_ssl_cert='client-cert.pem',
13.     -> master_ssl_key='client-key.pem',
14.     -> master_ssl_ca='ca.pem';
15. Query OK, 0 rows affected, 2 warnings (0.07 sec)
16. 
17. mysql> start slave;       #启用从
18. Query OK, 0 rows affected (0.02 sec)

确认启用成功。

测试SSL主从复制

1. 登录master,写入一些数据

1. [root@master ~]# mysql -uroot -p123
2. #省略部分内容
3. mysql> create database bbs;
4. Query OK, 1 row affected (0.01 sec)
5. 
6. mysql> use bbs;
7. Database changed
8. mysql> create table tb1(id int,
9.     -> name varchar(20));
10. Query OK, 0 rows affected (0.02 sec)
11. 
12. mysql> insert into tb1 values(1,'z3');
13. Query OK, 1 row affected (0.02 sec)

2. 登录slave,查看数据

1. [root@slave ~]# mysql -uroot -p123
2. #省略部分内容
3. mysql> select * from bbs.tb1;
4. +------+------+
5. | id   | name |
6. +------+------+
7. |    1 | z3   |
8. +------+------+
9. 1 row in set (0.01 sec)

最后可以查看到z3,主从成功。

结语:

       SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。复制默认是明文进行传输的,通过SSL加密可以大大提高数据的安全性。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL 分布式数据库
安全可靠的PolarDB V2.0 (兼容MySQL)产品能力及应用场景
PolarDB分布式轻量版采用软件输出方式,能够部署在您的自主环境中。PolarDB分布式轻量版保留并承载了云原生数据库PolarDB分布式版技术团队深厚的内核优化成果,在保持高性能的同时,显著降低成本。
928 141
|
网络安全 数据库
YashanDB HA节点间SSL连接配置
本指南介绍HA内部节点链路的SSL连接配置,包括客户端监听与HA节点自身监听两种方式。需使用OpenSSL工具生成证书,具体步骤参考数据库服务端SSL连接配置文档。此外,还需在数据库中开启HA的SSL连接开关并设置证书路径(仅支持绝对路径,长度≤254字节),最后重启数据库以完成配置。确保服务器已安装所需工具,详细操作请查阅相关文档。
YashanDB HA节点间SSL连接配置
|
安全 网络安全 数据库
YashanDB分布式节点间SSL连接配置
本文介绍YashanDB分布式节点间SSL连接配置方法,确保通信安全。需统一为整个集群配置SSL,使用相同根证书签名的服务器证书,否则可能导致连接失败或数据库无法启动。文章详细说明了使用OpenSSL生成根证书、服务器私钥、证书及DH文件的步骤,并指导如何将证书分发至各节点。最后,通过配置数据库参数(如`din_ssl_enable`)并重启集群完成设置。注意,证书过期需重新生成以保障安全性。
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
432 40
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
1048 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
安全 算法 网络安全
数字时代的“安全结界”与“票房神话”: 从SSL证书到《哪吒之魔童闹海》的技术与人性共振
**简介:** 在2025年,全球互联网加密流量占比飙升至60%,SSL证书成为互联网“新基建”,从电商支付到社交聊天,保障数据安全。其通过加密技术(如RSA或ECC)防止信息窃取,DV、OV、EV等级别确保不同场景的安全性。SSL证书的普及源于隐私保护需求,市场呈现分层竞争。同时,《哪吒之魔童闹海》以48.39亿票房展现信任重构,其成功与SSL证书的技术逻辑异曲同工,强调内容与技术并重。两者共同揭示了数字时代“可信度”与“体验感”的双重加持,预示着未来赢家需将技术与人文融合。
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
2068 11
|
安全 算法 物联网
SSL/TLS:互联网通信的加密基石与安全实践
**简介:** 在数字化时代,互联网每天传输海量敏感数据,网络攻击频发。SSL/TLS协议作为网络安全的基石,通过加密技术确保数据安全传输。本文解析SSL/TLS的技术架构、密码学原理、应用场景及常见误区,探讨其在未来的发展趋势,强调持续演进以应对新型威胁的重要性。 SSL/TLS不仅保障Web安全,还广泛应用于API、邮件、物联网等领域,并遵循合规标准如PCI DSS和GDPR。
|
存储 Oracle 关系型数据库
MySQL 8.4 配置SSL组复制(八个步骤)
MySQL 8.4 配置SSL组复制(八个步骤)
1062 0

推荐镜像

更多