Loading... <p style="text-indent: 2em"><strong>前言</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">备份数据库是生产环境中的首要任务,重中之重,有时候不得不通过网络进行数据库的复制,由于MySQL/MariaDB的主从复制是明文传送的,如果在生产环境中跨网络传送,数据的安全性就无法完全保证,为了解决这一问题,我们需要一种安全的方式进行传送,即基于SSL加密进行数据传输。</p> <p style="text-indent: 2em"><strong>部署配置</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>实验拓扑</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-41.jpg" title="1434874602316517.jpg" alt="MySQL基于SSL安全复制架构.jpg" /></p> <p style="text-indent: 2em"><strong>实验环境</strong></p> <p style="text-indent: 2em">系统环境:CentOS6.6<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">数据库版本:mariadb-5.5.36</p> <pre class="brush:bash;toolbar:false">#注意:主从服务器数据库版本须一致:主从服务器时间须同步 #此实验从服务器只做一组为例</pre> <p style="text-indent: 2em"><strong>配置主从复制</strong></p> <p style="text-indent: 2em">安装mariadb<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">提供配置及脚本文件</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">主服务器配置</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">授权从服务器复制账号<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-77.jpg" title="1434874620120455.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em">查看二进制日志位置<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-59.jpg" title="1434874635499149.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">从服务器配置</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">从服务器连接主服务器<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-75.jpg" title="1434874667108311.jpg" alt="3.jpg" /></p> <p style="text-indent: 2em">查看从服务器状态<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-83.jpg" title="1434874683799734.jpg" alt="4.jpg" /></p> <pre class="brush:bash;toolbar:false">#通过查看从服务器状态可发现主从已完全同步</pre> <p style="text-indent: 2em">主从复制测试</p> <p style="text-indent: 2em">主服务器添加数据<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-72.jpg" title="1434874699240655.jpg" alt="5.jpg" /></p> <p style="text-indent: 2em">查看从服务器数据及状态</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-26.jpg" title="1434874862426421.jpg" alt="7.jpg" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-34.jpg" title="1434874942172424.jpg" alt="6.jpg" /></p> <pre class="brush:bash;toolbar:false">#与主服务器一致,主从复制配置完成</pre> <p style="text-indent: 2em"><strong>实现SSL安全传输</strong></p> <p style="text-indent: 2em">检查SSL状态</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-73.jpg" title="1434874964348904.jpg" alt="8.jpg" /></p> <p style="text-indent: 2em">配置主服务器为CA<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">CA配置不做详细注释,详细CA搭建请见前期博文</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">主服务器生成证书</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">从服务器生成证书请求</p> <pre class="brush:bash;toolbar:false">[root@node2 ssl]# (umask 077;openssl genrsa -out slave.key 2048) [root@node2 ssl]# openssl req -new -key slave.key -out slave.csr</pre> <p style="text-indent: 2em">为从服务器签署证书</p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">将CA证书拷到各服务器<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">修改证书权限<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[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 #主从服务器都执行以上操作</pre> <p style="text-indent: 2em">主从服务器配置SSL<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[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</pre> <p style="text-indent: 2em">主服务器配置<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">再次查看SSL状态<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-75-1.jpg" title="1434874982180971.jpg" alt="9.jpg" /></p> <p style="text-indent: 2em">设授权复制用户只能通过SSL复制</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-79.jpg" title="1434874999315001.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em">从服务器配置</p> <p style="text-indent: 2em">从服务器登陆测试</p> </p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-78.jpg" title="1434875016485414.jpg" alt="11.jpg" /></p> <p style="text-indent: 2em">由此可见此次连接是基于SSL加密实现的,下面我们开始连接主服务器并开启复制<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-57.jpg" title="1434875034101878.jpg" alt="12.jpg" /></p> <p style="text-indent: 2em">查看从服务器状态</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-35.jpg" title="1434875051119894.jpg" alt="13.jpg" /></p> <p style="text-indent: 2em"><span style="font-family:微软雅黑, Microsoft YaHei">出错了,Slave_IO_Running状态为NO说明启动失败,找到错误如下</span></p> <p style="text-indent: 2em"><span style="font-family:微软雅黑, Microsoft YaHei"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-84.jpg" title="1434875066100462.jpg" alt="14.jpg" /></span></p> <p style="text-indent: 2em"><span style="font-family:微软雅黑, Microsoft YaHei">解决方法:<br style="text-indent: 2em" /></span></p> <pre class="brush:bash;toolbar:false">#从服务器停止复制 MariaDB [(none)]> stop slave; Query OK, 0 rows affected (0.01 sec)</pre> <pre class="brush:bash;toolbar:false">#主服务器刷新日志,记录新位置</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-30.jpg" title="1434875084134043.jpg" alt="15.jpg" /></p> <pre class="brush:bash;toolbar:false">#从服务器更新日志文件及位置,重新启动复制</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151254-5.jpg" title="1434875104847593.jpg" alt="16.jpg" /></p> <pre class="brush:bash;toolbar:false">#状态都为Yes,问题解决</pre> <p style="text-indent: 2em">主从复制测试<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">主服务器添加数据</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151255-67.jpg" title="1434875124104111.jpg" alt="17.jpg" /></p> <p style="text-indent: 2em">从服务器查看数据</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703151255-66.jpg" title="1434875140698353.jpg" alt="18.jpg" /></p> <p style="text-indent: 2em"><strong>The end</strong></p> <p style="text-indent: 2em">MySQL/MariaDB数据库基于SSL实现主从复制实验就说到这里了,实验过程中会遇到一些问题,只要耐心对待,一切都会迎刃而解,朋友们实验过程如果遇到问题记得留言交流哦。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信