|
如果数据跨网络传输的话,那么mysql主从复制都是明文的,这在互联网中是不安全的,所以引入了ssl的主从复制机制;
环境:Red Hat Enterprise Linux Server release 5.8
主服务器:172.16.9.1 master.test.com
从服务器:172.16.9.2 slave.test.com
mysql版本:mysql-5.5.28-linux2.6-i686.tar.gz
配置前准备:
ssh互信,时间同步,/etc/hosts中两个主机可以相互解析;
mysql安装过程参考http://90112526.blog./6013499/1039835
基于ssl的主从复制,需要给主从服务器颁发证书,这里给主从两端都提供证书:详情参考http://90112526.blog./6013499/1035754
在主服务器上创建CA证书:
- vim /etc/pki/tls/openssl.conf
- 将dir = ../../CA
- 更改为:dir = /etc/pki/CA
- ##下面国家、所在地、机构等自己设置便可。。
- cd /etc/pki/CA
- mkdir certs newcerts crl
- touch index.txt
- echo 01 > serial
- umask 077;openssl genrsa -out private/cakey.pem 1024
- openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
- ###Common Name (eg, your name or your server's hostname) []:ca.test.com
- ###Email Address []:ca@test.com
证书创建成功,接下来在主从服务器端申请证书:
- cd /usr/local/mysql/
- mkdir ssl
- cd ssl/
- umask 077;openssl genrsa -out mysql.key 1024
- openssl req -new -key mysql.key -out mysql.csr -days 3650
- ###Common Name (eg, your name or your server's hostname) []:master.test.com
- ###Email Address []:master@test.com
注:从服务器端/etc/pki/tls/openssl中配置要和主服务端保持一致
从服务器端申请证书:
- cd /usr/local/mysql/
- mkdir ssl
- cd ssl/
- umask 077;openssl genrsa -out mysql.key 1024
- openssl req -new -key mysql.key -out mysql.csr -days 3650
- ###Common Name (eg, your name or your server's hostname) []:slave.test.com
- ###Email Address []:slave@test.com
将该申请拷贝到主服务器:
- scp mysql.csr master:/tmp
为主服务器颁发证书:
- openssl ca -in mysql.csr -out mysql.crt -day N
- cp /etc/pki/CA/cacert.pem /data/mydata/ssl/ #将CA文件按拷贝到证书所在目录
为从服务器颁发证书:
- cd /tmp
- openssl ca -in mysql.csr -out mysql.crt -day N
- ##再拷贝到从服务器端,并拷贝CA证书 ##
- scp mysql.crt slave:/data/mydata/ssl/
- scp /etc/pki/CA/cacert.pem slave:/data/mydata/ssl/
注:将证书和密钥文件所在目录属组、属主改为mysql
至此,证书颁发成功!!
下面配置主从服务器让其支持ssl功能:
本身是ssl功能是关闭的:
配置其让其开启ssl功能:
Master
- vim /etc/my.cnf
- server-id = 1 #唯一id号
- log-bin=/binlog/mysql-bin #二进制日志开启(目录手动创建)
- innodb_flush_log_at_trx_commit=1 #每秒将事务刷写进磁盘一次
- ssl #启用ssl功能
- ssl_ca=/data/mydata/ssl/cacert.pem #CA文件所在位置
- ssl_cert=/data/mydata/ssl/mysql.crt #证书文件位置
- ssl_key=/usr/loca/mysql/ssl/mysql.key #密钥文件所在位置
重启服务,查看其变量:
为从服务器复制数据建立一个用户,给其复制权限并要求密钥认证:
- mysql> grant replication client,replication slave on *.* to 'reuser'@172.16.9.2 identified by 'reuser' require ssl;
- mysql> flush privileges;
查看主服务器状态,并记录;
Slave
- vim /etc/my.cnf
- server-id = 5 #唯一id号,不要和主服务器一致
- #log-bin=mysql-bin #关闭二进制日志
- relay-log=/relaylog/mysql-relay #开启中继日志
- relay-log-index=mysql-relay.index #中继日志索引
- read-only=1 #只读
- ssl #开启ssl功能
- ssl_ca=/data/mydata/ssl/cacert.pem #CA文件所在位置
- ssl_cert=/data/mydata/ssl/mysql.crt #证书所在位置
- ssl_key=/data/mydata/ssl/mysql.key #密钥文件所在位置
重启服务,查看其是否开启:
设定该从服务器的主服务器信息:
- mysql> change master to
- -> master_host='172.16.9.1',
- -> master_user='reuser',
- -> master_password='reuser',
- -> master_log_file='mysql-bin.000011',
- -> master_log_pos=534,
- -> master_ssl=1,
- -> master_ssl_ca='/etc/pki/CA/cacert.pem',
- -> master_ssl_cert='/data/mydata/ssl/mysql.crt',
- -> master_ssl_key='/data/mydata/ssl/mysql.key';
- mysql>start slave;
查看从服务器状态信息如果出现以下内容,说明构建成功。。
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 172.16.9.1
- Master_User: reuser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000011
- Read_Master_Log_Pos: 534
- Relay_Log_File: relay-mysql.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mysql-bin.000013
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 107
- Relay_Log_Space: 551
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: Yes
- Master_SSL_CA_File: /data/mydata/ssl/cacert.pem
- Master_SSL_CA_Path:
- Master_SSL_Cert: /data/mydata/ssl/mysql.crt
- Master_SSL_Cipher:
- Master_SSL_Key: /data/mydata/ssl/mysql.key
- Seconds_Behind_Master: 0
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 1
- 1 row in set (0.00 sec)
验证效果:
在主服务器端创建一个数据库,看从服务器是否可以同步,如果同步成功,基于ssl的主从复制到此就成功完成了!!!
求解决方法:
附:在做这个实验的时候,刚开始没有将证书mysql.crt,mysql.key,cacert.pem和数据文件放在一个目录,而是放在了mysql的安装目录/usr/local/mysql/ssl/ 下面,但是做了好几遍,总是出现如下错误,最后将那几个文件放到了mysql的数据目录/data/mydata下才解决,
如有方法解决,还请多多指点!!!
mysql>show slave status\G;
………………………………………………………………………………………………
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 641
Relay_Log_Space: 107
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /usr/local/mysql/ssl/mysql.crt
Master_SSL_Cipher:
Master_SSL_Key: /usr/local/mysql/ssl/mysql.key
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1045
Last_IO_Error: error connecting to master 'ibuler@172.16
Last_SQL_Errno: 0
……………………………………………………………………………………………………
|
|
|