MySQL复制
MYSQL的复制其实就是其中一台服务器充当主服务器,而有一台或多台从服务器,它们以某种方式同步数据的过程就叫MYSQL的复制。
MYSQL复制的工作机制
由于画图水平有限,描述的可能不够详尽。根据图示讲解一下都表示什么?分别有什么用途?
MySQL复制过程中要启用三个重要的线程:
(1)dump thread:主服务器从本地的二进制日志传送至从服务的中继日志
(2)IO Thread:从服务器向主服务器请求数据
(3)SQL thread:在从服务器上读取中继日志并应用到本地服务器的线程
三个线程的调用关系就完成了数据复制的过程。
红线表示的IO线程会每隔一段时间向主服务器请求获取二进制文件;当主服务器中有新操作时就响应IO线程,再有dump线程读取本地的二进制日志传递给IO线程,IO线程则将读取的语句记录到本地的relay log中;当记录完成后,SQL线程就会启动起来,然后读取relay log并应用至本地。
MYSQL复制的类型
MYSQL的复制类型有:主-从模型,主-主模型,半同步模型
一、主-从模型
在主从模型中,主服务器可以接收用户的读、写操作,但从服务器只能执行读操作。主从模型是如何配置的呢?现在就开始配置。
1、规划
主服务器地址:192.168.0.100 主机名rs1
从服务器地址:192.168.0.101 主机名rs1
2、环境
这里是基于虚拟机环境的,最好能够同步时间。
3、配置步骤
在主服务器rs1上
(1)创建逻辑卷用于存放数据
- 创建一个20G的分区本机为/dev/sda5,调整器类型为8e
- #pvcreate /dev/sda5
- #vgcreate myvg /dev/sda5
- #lvcreate -n mylv -L 10G myvg
- #mke2fs -j /dev/myvg/mylv
- #mkdir -p /data/mydata
- 编写/etc/fstab文件让其能够开机自动挂载
- /dev/myvg/mylv /data/mydata ext3 defaults 0 0
(2)安装MYSQL
- #useradd -r mysql
- #tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local
- #cd /usr/local
- #ln -sv mysql-5.5.24-linux2.6-i686 mysql
- #cd mysql
- #chown -R mysql.mysql .
- #scripts/mysql_install_db --user=mysql --datadir=/data/mydata
- #cp support-files/my-large.cnf /etc/my.cnf
- #cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- 编辑主配置文件/etc/my.cnf
- thread_concurrency = 2 datadir = /data/mydata
- log-bin=mysql-bin //开启二进制日志
- binlog_format=mixed
- server-id = 1 //从服务器的Server-id不能与此值相同
- #chown -R root .
- #service mysqld start
(3)配置相关属性
- #/usr/local/mysql/bin/mysql
- mysql>grant replication slave,replication client on *.* to
- repluser@'192.168.0.%' identified by 'sql123'; //创建有复制权限的用户
- mysql>flush privileges;
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 355 | | |
- +------------------+----------+--------------+------------------+
在从服务器rs2上
(1)前面两个步骤与主服务器相同,但在编辑配置文件时有所不同。
- #vim /etc/my.cnf
- thread_concurrency = 2
- datadir = /data/mydata
- log-bin=mysql-bin //二进制日志可以开启也可以关闭
- relay-log=mysql-relay //一定要开启中继日志
- binlog_format=mixed
- server-id = 21 //从服务器的Server-id不能与此值相同
- #service mysqld restart //重启让修改生效
(2)配置相关属性
- #/usr/local/mysql/bin/mysql
- mysql> show global variables like '%relay_log%';//配置生效
- +-----------------------+----------------+
- | Variable_name | Value |
- +-----------------------+----------------+
- | max_relay_log_size | 0 |
- | relay_log | mysql-relay |
- | relay_log_index | |
- | relay_log_info_file | relay-log.info |
- | relay_log_purge | ON |
- | relay_log_recovery | OFF |
- | relay_log_space_limit | 0 |
- | sync_relay_log | 0 |
- | sync_relay_log_info | 0 |
- +-----------------------+----------------+
- mysql> show global variables like 'server_id';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | server_id | 11 |
- +---------------+-------+
- mysql> change master to
- master_host='192.168.0.100', //主服务器的地址
- master_user='repluser' ,
- master_password='sql123',
- master_log_file='mysql-bin.000001',
- master_log_pos=355;
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 192.168.0.100
- Master_User: repluser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000001
- Read_Master_Log_Pos: 355
- Relay_Log_File: mysql-relay.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mysql-bin.000001
- Slave_IO_Running: No
- Slave_SQL_Running: No
- 此时IO线程和SQL线程没有启动,执行如下命令使其启用
- mysql>start slave;
4、测试
此时主从基本配置已完成。下面进行一个小小的测试。
在主服务器上创建一个数据库testdb,在从服务器上查看。
- mysql> show databases;
- +---------------------+
- | Database |
- +---------------------+
- | information_schema |
- | #mysql50#lost+found |
- | mysql |
- | performance_schema |
- | test |
- | testdb |
- +---------------------+
testdb已显示出来,配置完成。
二、主-主模型
两台服务器都有二进制日志和中继日志;服务器可读可写。但请注意配置对于有自动增长字段的数据要设置特别的属性。
1、使用与主从模型相同的主机
2、配置
在rs1服务器上
(1)安装软件步骤同上述内容
(2)配置相关属性
- #vim /etcmy.cnf
- log-bin=mysql-bin //二进制日志必须开启
- relay-log=mysql-relay //中继日志必须开启
- auto-increment-increment = 2 //增长间隔为2
- auto-increment-offset = 1 //自动增长的字段从1开始
- server-id = 10
- 进入mysql命令行
- mysql>grant replication slave,replication client on *.*
- to repluser@'192.168.0.%' identified by 'sql123';
- mysql> show global variables like '%auto_increment%';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | auto_increment_increment | 2 |
- | auto_increment_offset | 1 |
- +--------------------------+-------+
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 355 | | |
- +------------------+----------+--------------+------------------+
在从服务器rs2上
(1)同样的基本配置同上。在此直接编辑配置文件
- log-bin=mysql-bin
- relay-log=mysql-relay
- auto-increment-increment = 2
- auto-increment-offset = 2
- server-id = 20
- mysql> show global variables like '%auto_increment%';
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | auto_increment_increment | 2 |
- | auto_increment_offset | 2 |
- +--------------------------+-------+
- mysql>change master to
- master_host='192.168.0.100',
- master_user='repluser',
- master_password='sql123',
- master_log_file='mysql-bin.000001',
- master_log_pos=355;
- mysql>start slave;
- mysql>grant replicatin slave,replication client on *.* to
- repluser2@'192.168.0.%' identified by 'sql456'; //创建授权用户
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000002 | 286 | | |
- +------------------+----------+--------------+------------------+
现在rs1已是rs2的主服务器,接下来配置rs2成为rs1的主。回到rs1服务器上。
- 进入mysql命令行
- change master to
- master_host='192.168.0.101',
- master_user='repluser2',
- master_password='sql456',
- master_log_file='mysql-bin.000002',
- master_log_pos=286; //这里定义的值是从从服务器中得到的。
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 192.168.0.101
- Master_User: repluser2
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000002
- Read_Master_Log_Pos: 286
- Relay_Log_File: mysql-relay.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mysql-bin.000002
- Slave_IO_Running: No
- Slave_SQL_Running: No
- mysql>start slave
3、测试
现在rs1上创建一个有自动增长类型的字段,查看设置的属性是否生效。
插入两个字段。查看效果
三、半同步模型
MYSQL复制时的默认方式为异步,但异步方式会产生很多滞后操作,因此引进了半同步式的模式。半同步模式是依靠插件模块来实现的。它可以将在主服务器上写操作转发至从服务器的内存中,大大提高了数据的同步性。
1、配置一个主从模型
2、在主服务器上
- mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- //装载插件模块
- mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; //启动插件
- mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; //设置超时参数
- mysql> show global status like 'rpl_semi%';
- +--------------------------------------------+-------+
- | Variable_name | Value |
- +--------------------------------------------+-------+
- | Rpl_semi_sync_master_clients | 1 |
- | Rpl_semi_sync_master_net_avg_wait_time | 0 |
- | Rpl_semi_sync_master_net_wait_time | 0 |
- | Rpl_semi_sync_master_net_waits | 0 |
- | Rpl_semi_sync_master_no_times | 0 |
- | Rpl_semi_sync_master_no_tx | 0 |
- | Rpl_semi_sync_master_status | ON |
- | Rpl_semi_sync_master_timefunc_failures | 0 |
- | Rpl_semi_sync_master_tx_avg_wait_time | 0 |
- | Rpl_semi_sync_master_tx_wait_time | 0 |
- | Rpl_semi_sync_master_tx_waits | 0 |
- | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
- | Rpl_semi_sync_master_wait_sessions | 0 |
- | Rpl_semi_sync_master_yes_tx | 0 |
- +--------------------------------------------+-------+
- clients 变为1 ,证明主从半同步复制连接成功。
3、在从服务器上
- mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
- mysql> show global status like 'rpl_semi%';
- +----------------------------+-------+
- | Variable_name | Value |
- +----------------------------+-------+
- | Rpl_semi_sync_slave_status | ON |
- +----------------------------+-------+
配置完成。
如果想要配置永久生效则只需在各自服务器的/etc/my.cnf的[mysqld]段添加上述操作中set指令后的内容即可。
四、基于ssl的MYSQL复制
MYSQL的复制过程中数据的传输是明文显示的,这对企业来说是非常不安全的。所以我们采取某种机制对数据进行相应的加密,而ssl就是首选机制了。下面就进行ssl配置。
1、首先配置主-从服务。在此不再详述。
2、将rs1设置为CA服务器
- #vim /etc/pki/tls/openssl.cnf
- 将 dir = ../../CA修改为
- dir = /etc/pki/CA
- #(umask 077;openssl genrsa 2048 > private/cakey.pem)
- #openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
- #mkdir certs crl newcerts
- #touch index.txt
- #echo 01 > serial
- 为Master上的Mysql准备私钥以及颁发证书
- #mkdir /usr/local/mysql/ssl
- #cd ssl/
- #(umask 077;openssl genrsa 1024 > mysql.key)
- #openssl req -new -key mysql.key -out mysql.csr
- #openssl ca -in mysql.csr -out mysql.crt
- #chown -R mysql.mysql ssl/
3、为rs2颁发证书
- #mkdir /usr/local/mysql/ssl
- #cd /usr/local/mysql
- #chown -R mysql.mysql ssl/
- #cd ssl/
- #(umask 077;openssl genrsa 1024 > slave.key)
- #openssl req -new -key slave.key -out slave.csr
- #scp slave.csr 192.168.0.100:/root
- 在rs1上为rs2签发证书
- #openssl ca -in slave.csr -out slave.crt
- #scp slave.crt 192.168.0.101:/usr/local/mysql/ssl
- #cd /etc/pki/CA
- #scp cacert.pem 192.168.0.101:/etc/pki/CA
4、在主服务器rs1上配置开启ssl
- #vim /etc/my.cnf
- [mysqld]
- ssl-ca=/etc/pki/CA/cacert.pem
- ssl-cert=/usr/local/mysql/ssl/mysql.crt
- ssl-key=/usr/local/mysql/ssl/mysql.key
- #serivce mysqld restart
5、在从服务器上
- # vim my.cnf
- [mysqld]
- ssl-ca=/etc/pki/CA/cacert.pem
- ssl-cert=/usr/local/mysql/ssl/slave.crt
- ssl-key=/usr/local/mysql/ssl/slave.key
- 登录从服务器mysql 更改master的相关选项,以实现ssl功能
- mysql> change master to
- -> master_host='192.168.0.100',
- -> master_user='repluser',
- -> master_password='sql123',
- -> master_ssl=1,
- -> master_ssl_ca = '/etc/pki/CA/cacert.pem',
- -> master_ssl_capath = 'ettc/pki/CA',
- -> master_ssl_cert = '/usr/local/mysql/ssl/slave.crt',
- -> master_ssl_key = '/usr/local/mysql/ssl/slave.key';
- mysql>start slave;
- mysql>show slave status;
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Master_SSL_Allowed: Yes
- Master_SSL_CA_File: /etc/pki/CA/cacert.pem
- Master_SSL_CA_Path: /etc/pki/CA
- Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt
- Master_SSL_Cipher:
- Master_SSL_Key: /usr/local/mysql/slave.key
至此,基于ssl的MYSQL复制配置完成。