【干货 | 原创 】MySQL/MariaDB数据库基于SSL实现主从复制

前言

备份数据库是生产环境中的首要任务,重中之重,有时候不得不通过网络进行数据库的复制,由于 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/datalog-bin=/mydata/binlogs/master-binbinlog_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:/tmpslave.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/sslslave.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/sslcacert.pem 100% 1403 1.4KB/s 00:00

修改证书权限

[root@node1 ssl]# chown -R mysql.mysql ./[root@node1 ssl]# lltotal 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实现主从复制实验就说到这里了,实验过程中会遇到一些问题,只要耐心对待,一切都会迎刃而解,朋友们实验过程如果遇到问题记得留言交流哦。以上仅为个人学习整理,如有错漏,大神勿喷~~~

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏二次元

Git简单的使用步骤

本文并不阐述任何概念性知识,仅仅只是做一个笔记,简单是使用步骤,如遇障碍,请Google一下

9110
来自专栏北京马哥教育

技术 | Linux系统/boot目录破损无法启动怎么办

linux系统中的/boot目录存放着系统开机所需要的各种文件,其中包含内核、开机菜单及所需配置文件等等。 但是当不小心删除了/boot目录里的某些文件或...

43290
来自专栏轻量级微服务

Kubernetes 应用管理工具 Helm 使用指南

Helm 是一个类似于 yum/apt/homebrew 的 Kubernetes 应用管理工具。Helm 使用 Chart 来管理 Kubernetes ma...

28730
来自专栏python3

zabbix-agent(客户端安装)

useradd -g zabbix zabbix -s /sbin/nologin

10210
来自专栏IT笔记

rsync+inotify实现分布式集群部署

上一篇:Linux下使用ssh密钥实现无交互备份 上二篇:Linux下使用rsync实现文件备份 缘起 由于公司要对支付做压测,于是使用了公司的服务器搭建了一个...

46250
来自专栏Java后端技术

解决Windows10下80端口被PID为4的System占用的问题

  最近由于好奇心,更新了windows10系统,感觉上手还蛮快,而且体验还不错,但是在IDEA中做开发时,使用80端口进行启动项目的时候发现端口被占用了,于是...

11830
来自专栏BeJavaGod

tomcat7 - 烫手山芋之热部署

tomcat7部署,项目发布有很多种方式 1. 增量发布,把修改过得那些文件手动上传至tomcat,*.class *.xml 等等,这样的缺点非常大,需要断开...

26130
来自专栏腾讯云容器服务团队的专栏

使用腾讯云容器服务搭建 ELK 日志系统

目前主流的分布式日志系统有ELK,flume,fluentd,splunk等,本文利用腾讯云容器服务搭建ELK系统收集nginx的访问日志 ,搭建过程中共搭建4...

2.4K30
来自专栏写代码的海盗

Ubuntu 常用命令

1、查看Linux当前操作系统位数   sudo uname --m   如果显示 i686,你安装了32位操作系统   如果显示 x86_64,你安装了64位...

40870
来自专栏腾讯大数据的专栏

Ta 腾讯分析添加热点图

1、打开TA:http://v2.ta.qq.com/ QQ号登录 2、点选站点列表 ? 3、选择新增站点,输入域名点击添加即可。 ? 4、点选监控检测→页面热...

49280

扫码关注云+社区

领取腾讯云代金券