首页 > 代码库 > MySQL DB 主从复制之SSL

MySQL DB 主从复制之SSL

需求架构

wKioL1NaiXqTBOgtAAGdUZq9ZDA040.jpg

 

准备工作

主从服务器时间同步

# 主从服务器同时配置crontab任务,与NTP服务器同步时间即可
*/5 * * * * ntpdate 172.16.0.1 &>/dev/null

 

部署配置

主库配置

vi /etc/my.cnf
    server-id = 1 # 在复制架构中,需保持全局唯一
    log-bin = mysql-bin # 默认在数据目录下
    sync_binlog = 1 # 设置mariadb每次在提交事务前会将二进制日志同步到磁盘,保证服务器崩溃时不会丢失事件
=====
service mysqld start # 启动mariadb10
=====
mysql -hlocalhost -uroot -p # 登录mysql
MariaDB [mysql]> grant replication slave,replication client on *.* to repluser@172.16.%.% identified by replpass; # 创建最小权限的复制账号
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> show master status; # 查看主库的状态信息

wKioL1Nai5fgVvYsAAHQjGQ3S7A342.jpg

 

从库配置

vi /etc/my.cnf
    server-id = 11 # 在复制架构中,需保持全局唯一
    log-bin = mysql-bin # 也可设置为none,即关闭从库的二进制日志
    relay-log=/data/relaylogs/relay-bin # 设置中继日志文件
    log-slave-updates = 1 # 允许从库将其重放的事件也记录到自身的二进制日志中
    read_only = 1 # 从库设置为只读
=====
service mysqld start # 启动mariadb10
=====
mysql -hlocalhost -uroot -p # 登录mysql
MariaDB [mysql]> change master to master_host=172.16.251.123,master_user=repluser,master_password=replpass,master_log_file=‘mysql-bin.000005,master_log_pos=379; # 连接主库
MariaDB [mysql]> start slave;
MariaDB [mysql]> show slave status\G 查看从库状态

 

wKiom1NajRjgqUcpAAQK7ziCark469.jpg

 

验证

# 在主库上新建数据库并创建数据
MariaDB [(none)]> create database test_for_replication;
MariaDB [(none)]> create table test_for_replication.user(id int not null primary key auto_increment,name char(20) not null,year int not null,classid int not null);
MariaDB [(none)]> insert into test_for_replication.user(name,year,classid) values(Jason Kk,23,2),(Hello Kitty,18,1);
# 查看从库能否正常同步数据
MariaDB [(none)]> select * from test_for_replication.user; # 见下图1
MariaDB [(none)]> show slave status\G # 见下图2

图1

wKioL1NajbuT5Z4mAAFp74FsT9w733.jpg

图2

wKioL1NajqGCubCsAAQpXb_BfJE097.jpg

可以看出主从同步正常,数据无误!

 

 

基于SSL进行安全复制

生成SSL证书及私钥

主从服务器都需要获得各自的证书,具体步骤详见“图解openssl实现私有CA”

主库和从库各需的证书文件有:

wKiom1NamouCh79IAAFZXip6VAQ897.jpg

 

主库配置

SSL支持状态检查

wKiom1NakfSy1e9LAAHZf2OCumE450.jpg

  • 若have_ssl的值为YES,则表明SSL功能已开启使用;

  • 若have_ssl的值为NO,则说明SSL功能并未编译进目前的Mariadb,需要重新编译程序;

  • 若have_ssl的值为DISABLED,则表示mariadb编译时加载了SSL功能,但未启用,一般以通用二进制程序安装的Mariadb都是此值;

查看库文件:

ldd `which mysqld` | grep ssl # 还需查看是否存在libssl.so文件,若不存在,则说明缺少库文件
# 麻烦的是若要安装此缺少的库文件,则需安装libopenssl.1.0.0的程序包,但这个包的安装依赖于glibc2.14版本,而CentOS6.5系统上原生的是glibc2.12版本的,这下就又涉及glibc的升级了,过于麻烦了,而且也很危险,故放弃之
# 那么就只能重新编译安装mariadb10了,从官网下载最新版的源码包安装吧(www.mariadb.com)

 

Mariadb编译安装完成后,就可以配置基于SSL的安全复制了

chown -R mysql.mysql /etc/master/ssl/ # 注意修改认证相关文件的权限
=====
vi /etc/my.cnf # 在mysqld段下添加如下内容
[mysqld]
ssl_ca= /etc/master/ssl/cacert.pem # 配置CA证书
ssl_cert = /etc/master/ssl/master.crt # 配置主库证书
ssl_key = /etc/master/ssl/master.key # 配置主库私钥
ssl_cipher = DHE-RSA-AES256-SHA # 指定支持的加密算法
=====
service mysqld reload # 重载配置
=====
# 再次查看相关变量:
MariaDB [(none)]> show variables like %ssl% # 见下图
# 创建复制账户:
MariaDB [mysql]> grant replication slave,replication client on *.* to repluser@172.16.%.% identified by replpass reuire ssl; # 特别明确必须通过SSL才能复制

wKioL1Nak4Sxf5k0AALjW953ZL4200.jpg

 

从库配置

chown -R mysql.mysql /etc/slave/ssl/
=====
MariaDB [mysql]> change master to master_host=172.16.251.123,master_user=repluser,master_password=replpass,master_log_file=mysql-bin.000010,master_log_pos=776,master_ssl=1,master_ssl_ca=/etc/slave/ssl/cacert.pem,master_ssl_cert=/etc/slave/ssl/slave.crt,master_ssl_key=/etc/slave/ssl/slave.key; # 在连接主库时直接指定本地从库的证书文件等信息
MariaDB [mysql]> start slave;
MariaDB [mysql]> show slave status\G # 查看从库状态

 

wKiom1NalQDQLV_bAAfjqT5VsdY496.jpg

 

从库的另一种配置方法

vi /root/.my.cnf # 在client段下配置从库证书信息
[client]
ssl_ca = /etc/slave/ssl/cacert.pem
ssl_cert = /etc/slave/ssl/slave.crt
ssl_key = /etc/slave/ssl/slave.key
ssl_cipher = DHE-RSA-AES256-SHA
=====
MariaDB [mysql]> change master to master_host=172.16.251.123,master_user=repluser,master_password=replpass,master_log_file=mysql-bin.000010,master_log_pos=776,master_ssl=1; # 只需指定master_ssl=1即可

 

验证

# 主库写入:
create test.table t1(name char(20) not null,age int not null);
# 从库读取;
show tables for test;
# 验证结果见下图

wKioL1NalULhDfW5AAH56fosqLY890.jpg