mysql 5.5主从复制与基于ssl加密复制

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

一, 复制的工作机制:由主服务器产生数据,从服务器从主服务器将数据同步过来。靠三个线程来实现:

(1)dump thread:当从服务器来复制时,dump会去读取二进制日志的语句并发送给从服务器
(2)io thread:在从服务器由io thread到主服务上去请求二进制日志中语句的内容。每隔一段时间就会启动,io thread到主服务器上查看二进制日志是否有变化。如果有变化则就请求传输,一条语句复制过来。
(3)SQL thread(单线程):io thread获取到之后将其存储到relay log中。一条语句一条语句执行。

二,Mysql复制有三个种方式:异步,同步,半同步

1)异步:主服务器的修改操作本地完成就认为完成。至于后面的事,并不理会

2)同步指定是:主服务器涉及的修改操作,要等待从服务器也完成

3)半同步:在一主多从的环境中,只等待一台从服务器同步完成操作。设置一个等待超时时间,如果超过这个时间,则降级为异步。在5.5可以使用半同步,google公司提供一个补丁。半同步如果无法在指定时间完成-->自动 降到异步模式。

三,实验步骤:
两台虚拟主机分别安装mysql-5.5.25a.tar.gz,我采用的编译安装mysql,编译步骤请参考http://bingodeng.blog.51cto.com/1038075/935635。在redhat 5.8编译。
 
四,mysql的数据目录最好存储在lvm的磁盘中,因此下面分别对两台虚拟机创建一个lvm的分区。

 
 
  1. #pvcreate /dev/sda5  
  2. #vgcreate myvg /dev/sda5  
  3. #lvcreate -L 5G -n mylv myvg   
  4. # mke2fs -j /dev/myvg/mylv  
  5. # vim /etc/fstab   
  6. /dev/myvg/mylv          /data/mysql             ext3    defaults        0 0 
  7. # mount -a  
  8. # df  
  9. # chown -R mysql:mysql /data/mysql/  
  10. #cd /usr/local/mysql 
  11. # cp support-files/my-large.cnf /etc/my.cnf 
  12. vim /etc/my.cnf 
  13. thread_concurrency = 4 
  14. datadir = /data/mysql 
  15. #cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
  16. #chmod +x /etc/rc.d/init.d/mysqld 
  17. #chkconfig --add mysqld 
  18. #chown -R :mysql * 
  19. #scripts/mysql_install_db --user=mysql --datadir=/data/mysql 
  20. #service mysqld start 

五,在master上,执行下列mysql语句

 
 
  1. mysql> grant replication slave,replication client on *.* to repluser@'172.16.150.%' identified by 'redhat';
  2. 创建用户,并赋权为replication。能复制所有数据库。
  3. mysql> flush privileges; 
  4. mysql> show master status; 记录当前的二进制日志名,与所处的位置。
  5. +------------------+----------+--------------+------------------+ 
  6. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
  7. +------------------+----------+--------------+------------------+ 
  8. | mysql-bin.000001 |      356 |              |                  | 

六,在slave上,先修改配置文件:

 
 
  1. vim /etc/my.cnf  
  2. [mysqld] 在mysqld段中修改 
  3. thread_concurrency = 4  
  4. datadir = /data/mysql  
  5. #log-bin=mysql-bin  禁止二进制日志,在此实现中并不需要二进制日志 
  6. relay_log      = mysql-relay 启用中继日志,需要自己添加 
  7. server-id = 2修改为2,不要与master的server-id相同就ok

  上面修改完之后启用 service mysqld resstart

七,在slave连接到mysql,并执行下面mysql语句

 
 
  1.  mysql> change master to 
  2. > master_host='172.16.150.30'
  3. >master_user='repluser'
  4. >master_password='redhat'
  5. >master_log_file='mysql-bin.000001', 在master执行show master status所看到的。
  6. >master_log_pos=356;数字是整数不能加引号 
  7. mysql > start slave;启动重服务器线程

此时已经完成一个简单的主从复制。在从服务器用户还可以新增数据与表,如果这样会导致主从的数据不能保持一至。此时需要从服务器的配置文件添加一个行

 
 
  1. [mysqld] 
  2. read-only = 1 

添加完之后需要重启mysqld服务,这并不能阻止具有super权限修改数据,只能阻止普通用户。如果从服务器重新启用后,slave会自动启动,那么此时想做一些维护工作并不合适,此时在配置文件中添加一项

 
 
  1. [mysqld]
  2. skip_slave_start=1 

八,在主服务器的配置文件中,最好在在配置文件添加下列选项:

 
 
  1. [mysqld] 
  2. sync_binlog=1 
  3. 在事务提交时,会先写到内存缓存的日志中,=1任何一个事务提交之后就立即写入到磁盘中的二进制文件 
  4. innodb_flush_logs_at_trx_commit=1 
  5. 表示任何一个事物提交之后就立即写入到磁盘中的日志文件 

 到此一个比较安全的主从的复制完。

由于Mysq的复制是明文传输,很难保存其数据的安全,因此需要利用ssl加密协议来加强安全。将/data/mysql的数据删除,删除之前先停止mysql服务,并重新初始化。

一,在master上配置CA,CA的详细配置过程查看http://bingodeng.blog.51cto.com/1038075/904144

 
 
  1. # vim /etc/pki/tls/openssl.cnf  
  2. dir             = ../../CA 将这行修改 =/etc/pki/CA 
  3. # cd /etc/pki/CA 
  4. # (umaks 077; openssl genrsa 2048 > private/cakey.pem) 
  5. # openssl req -new -x509 -key private/cakey.pem  -out cacert.pem -days 3650 
  6. # mkdir certs crl newcerts 
  7. # touch index.txt 
  8. # echo 01 > serial 

二,给master自己签署证书

 
 
  1. # mkdir /etc/mysql_ssl 
  2. #chown mysql:mysql /etc/mysql_ssl 
  3. 如果不修改这个证书存放目录,会导致Mysql用户可能没有权限读取证书
  4. # cd /etc/mysql_ssl 
  5. #(umask 077;openssl genrsa 1024 > master.key) 
  6. #openssl req -new -key master.key -out master.csr
  7. #openssl ca -in master.csr -out master.crt
  8. #cp /etc/pki/CA/cacert.pem . 

三,slave上生成私钥与证书

 
 
  1. # mkdir /etc/mysql_ssl  
  2. #chown mysql:mysql /etc/mysql_ssl  
  3. # cd /etc/mysql_ssl  
  4. #(umask 077;openssl genrsa 1024 > slave.key)  
  5. #openssl req -new -key slave.key -out slave.csr 
  6. #scp slave.csr 172.16.150.30:/tmp 

四,在master签署slave的证书

 
 
  1. #cd /tmp 
  2. #openssl ca -in slave.csr -out slave.crt 
  3. #scp /etc/pki/CA/cacert.pem 172.16.150.30:/etc/mysql_ssl 
  4. #scp slave.crt 172.16.150.30:/etc/mysql_ssl 

五,在master的my.cnf中添加下面内容,并重启服务。

 
 
  1. [mysqld]
  2. ssl 
  3. ssl-ca=/etc/mysql_ssl/cacert.pem 
  4. ssl-cert=/etc/mysql_ssl/master.crt 
  5. ssl-key=/etc/mysql_ssl/master.key 

查看有没有生效

 
 
  1. mysql> show variables like '%ssl%'; 
  2. +---------------+---------------------------+ 
  3. | Variable_name | Value                     | 
  4. +---------------+---------------------------+ 
  5. | have_openssl  | YES  启用openssl                     | 
  6. | have_ssl      | YES    启用ssl加密                   | 
  7. | ssl_ca        | /etc/mysql_ssl/cacert.pem | 
  8. | ssl_capath    |                           | 
  9. | ssl_cert      | /etc/mysql_ssl/master.crt | 
  10. | ssl_cipher    |                           | 
  11. | ssl_key       | /etc/mysql_ssl/master.key | 
  12. +---------------+--------------------------- 

六,在slave上,也需要添加,重启服务,查看有没有生效

 
 
  1. [mysqld] 
  2. ssl 
  3. ssl-ca=/etc/mysql_ssl/cacert.pem 
  4. ssl-cert=/etc/mysql_ssl/slave.crt 
  5. ssl-key=/etc/mysql_ssl/slave.key 

七,在master创建用户指定复制时必要在使用ssl加密,也可以修改之前的用户,下面新增一个用户。

 
 
  1. mysql> grant replication client,replication slave on *.* to rep@'172.16.150.%' identified by 'redhat' require ssl; 
  2. mysql> flush privileges;
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> show master status;
  5. +------------------+----------+--------------+------------------+ | File
  6. | Position | Binlog_Do_DB | Binlog_Ignore_DB
  7. | +------------------+----------+--------------+------------------+ |
  8. mysql-bin.000005 | 544 | |
  9. | +------------------+----------+--------------+------------------+

八,在slave服务器上配置复制的信息:

 
 
  1. mysql> change master to 
  2.     -> master_host='172.16.150.30'
  3.     -> master_user='rep'
  4.     -> master_password='redhat'
  5.     -> master_log_file='mysql-bin.000005'
  6.     -> master_log_pos=544
  7.     -> master_ssl=1
  8.     -> master_ssl_ca='/etc/mysql_ssl/cacert.pem'
  9.     -> master_ssl_cert='/etc/mysql_ssl/slave.crt'
  10.     -> master_ssl_key='/etc/mysql_ssl/slave.key'

验证有没有生效:

 
 
  1. mysql> start slave; 
  2. mysql> show slave status\G 
  3. *************************** 1. row *************************** 
  4.                Slave_IO_State: Waiting for master to send event 
  5.                   Master_Host: 172.16.150.30 
  6.                   Master_User: rep 
  7.                   Master_Port: 3306 
  8.                 Connect_Retry: 60 
  9.               Master_Log_File: mysql-bin.000005 
  10.           Read_Master_Log_Pos: 544 
  11.                Relay_Log_File: mysql-relay.000002 
  12.                 Relay_Log_Pos: 253 
  13.         Relay_Master_Log_File: mysql-bin.000005 
  14.              Slave_IO_Running: Yes 表示已经成功
  15.             Slave_SQL_Running: Yes 
  16.               Replicate_Do_DB:  
  17.           Replicate_Ignore_DB:  
  18.            Replicate_Do_Table:  
  19.        Replicate_Ignore_Table:  
  20.       Replicate_Wild_Do_Table:  
  21.   Replicate_Wild_Ignore_Table:  
  22.                    Last_Errno: 0 
  23.                    Last_Error:  
  24.                  Skip_Counter: 0 
  25.           Exec_Master_Log_Pos: 544 
  26.               Relay_Log_Space: 405 
  27.               Until_Condition: None 
  28.                Until_Log_File:  
  29.                 Until_Log_Pos: 0 
  30.            Master_SSL_Allowed: Yes 
  31.            Master_SSL_CA_File: /etc/mysql_ssl/cacert.pem 
  32.            Master_SSL_CA_Path:  
  33.               Master_SSL_Cert: /etc/mysql_ssl/slave.crt 
  34.             Master_SSL_Cipher:  
  35.                Master_SSL_Key: /etc/mysql_ssl/slave.key 
  36.         Seconds_Behind_Master: 0 
  37. Master_SSL_Verify_Server_Cert: No 
  38.                 Last_IO_Errno: 0 
  39.                 Last_IO_Error:  
  40.                Last_SQL_Errno: 0 
  41.                Last_SQL_Error:  
  42.   Replicate_Ignore_Server_Ids:  
  43.              Master_Server_Id: 1 
  44. 1 row in set (0.00 sec) 

十,在master上创建一个数据库,并查看slave上会不会生效。










本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/956980,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
SQL 运维 关系型数据库
MySQL数据库运维第一篇(日志与主从复制)
MySQL数据库运维第一篇(日志与主从复制)
|
1月前
|
SQL 负载均衡 关系型数据库
mysql主从复制,从搭建到使用
mysql主从复制,从搭建到使用
34 1
|
2月前
|
SQL 关系型数据库 MySQL
mysql 主从复制与读写分离
mysql 主从复制与读写分离
|
1月前
|
SQL 监控 关系型数据库
探秘MySQL主从复制的多种实现方式
探秘MySQL主从复制的多种实现方式
19 0
|
10天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
981 6
Mysql 数据库主从复制
|
4天前
|
SQL 关系型数据库 MySQL
《揭秘MySQL主从复制:数据同步的幕后故事》
MySQL主从复制依赖binlog,从库通过I/O线程拉取主库的binlog并存入relay log,SQL线程再将relay log中的事件应用到数据。复制过程是异步的,确保从库能独立管理同步。三种复制方式:默认异步(可能丢失数据)、全同步(低性能)和半同步(折中)。半同步要求至少一个从库确认收到binlog事件。主从延迟指的是从库相对于主库的数据滞后。
|
1月前
|
存储 关系型数据库 MySQL
Java大佬必知必会——MySQL主从复制
如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。如果二进制文件包含了已存在的数据,就会造成数据重复了。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的。
Java大佬必知必会——MySQL主从复制
|
25天前
|
SQL 关系型数据库 MySQL
MySQL高可用架构设计:从主从复制到分布式集群
MySQL高可用性涉及主从复制、半同步复制和Group/InnoDB Cluster。主从复制通过二进制日志同步数据,保证故障时可切换。半同步复制确保事务在至少一个从服务器确认后才提交。Group Replication是多主复制,支持自动故障切换。InnoDB Cluster是8.0的集成解决方案,简化集群管理。使用这些技术能提升数据库的稳定性和可靠性。
217 2
|
5天前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
1月前
|
负载均衡 关系型数据库 MySQL
MySQL 主主复制与主从复制对比
MySQL的主主复制和主从复制是两种常见的数据库复制配置方式,各有优缺点和适用场景。以下是对这两种复制方式的详细对比: ### 主从复制 (Master-Slave Replication) **特点:** 1. **单向复制**:数据从主服务器复制到一个或多个从服务器。从服务器只能从主服务器接收数据更新,不能向主服务器发送数据。 2. **读写分离**:主服务器处理写操作(INSERT、UPDATE、DELETE),从服务器处理读操作(SELECT),可以分担读负载,提高系统的整体性能。 3. **数据一致性**:数据在主服务器上是最新的,从服务器上可能会有一定的延迟。 **优点:**