> 数据库 > MySQL >

MariaDB(MySQL):半同步复制+ssl+复制过滤

一、半同步复制

1.mysql的复制

通过记录主服务器的二进制日志,并在从服务器上进行重放(replay)完成复制,默认都是异步进行的。

2.半同步复制

半同步复制是google贡献给MySQL的一个补丁,在MySQL 5.5之后就支持了,MariaDB都是支持的。

MySQL的插件,一般在MySQL安装目录下;

半同步复制插件默认没有启用,需要自己安装,/usr/local/mysql/lib/plugin可以看到semisync_master.so和semisync_slave.so和其他许多插件;进行半同步时,主启用semisync_master.so,从启用semisync_slave.so,且只要一个从(离主近,带宽足够可用)启用半同步即可。

3.半同步的目的

保证Master服务器的事务必须接收指定slave服务器(一台)的返回消息,才会commit;否则需要等待超时时间(rpl_semi_sync_master_timeout的默认为10s),然后切换成异步再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以在损失很小的性能的前提下提高数据安全性。

解决的问题:如果slve不幸落后,而更不幸的是主库此时又出现Crash,这时备库中的数据就是不完整的,无法使用备库来继续提供数据一致的服务了。Semisynchronous Replication则一定程度上保证提交的事务已经传给了至少一个slave。

 

二、半同步复制的实现

1.检查插件

1.# ls /usr/local/mysql/lib/plugin
2.semisync_master.so    #用于Master服务器安装的半同步插件
3.semisync_slave.so     #用于Slave服务器安装的半同步插件

2.安装半同步插件

 

01.#####主服务器安装插件(Mysql提供插件安装机制:HELP INSTALL):
02.MariaDB[(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
03.MariaDB[(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
04.MariaDB[(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
05.#开启半同步
06.MariaDB[(none)]> SET GLOBAL rpl_semi_sync_master_timeout=1000;
07.#等待超时时间:单位ms;
08. 
09.####从服务器插件:
10.MariaDB[(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME  'semisync_slave.so';
11.MariaDB[(none)]> SHOW GLOBAL VARIABLE LIKE '%semi%';
12.MariaDB[(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=ON;
13.mysql> STOP SLAVE IO_THREAD;
14.mysql> START SLAVE IO_THREAD;   #重启IO线程生效3

3.查看半同步开启状态

 

 

01.######在Master服务器上查看
02.MariaDB[(none)]> show global status like 'rpl_semi%';
03.Rpl_semi_sync_master_clients      1      #已经有一个客户端连接
04.Rpl_semi_sync_master_status       ON     #已经为开启状态
05.MariaDB[(none)]> show global variables like '%rpl%';
06.rpl_semi_sync_master_enabled     ON     #Master半同步已经开启
07.rpl_semi_sync_master_timeout    1000   #超时时间
08.######在Slave服务器上查看
09.MariaDB[(none)]> show global status like 'rpl_semi%';
10.Rpl_semi_sync_master_status       ON     #已经为开启状态
11.MariaDB[(none)]> show global variables like '%rpl%';
12.rpl_semi_sync_slave_enabled      ON     #Master半同步已经开启

4.上面的设置重启服务后会失效的,设置开机生效

不建议把半同步配置写在配置文件中;

 

01.####Master:
02.vim /etc/my.cnf
03.[mysqld] 
04.rpl_semi_sync_master_enabled=1
05.rpl_semi_sync_master_timeout=1000   
06.####Slave:
07.vim /etc/my.cnf
08.[mysqld]
09.rpl_semi_sync_slave_enabled=1

5.通过全局变量来设置半同步

 

 

1.####Master:
2.MariaDB[(none)]&gtset global rpl_semi_sync_master_enabled=1
3.取消加载插件
4.MariaDB[(none)]> uninstall plugin rpl_semi_sync_master;
5.####Slave:
6.MariaDB[(none)]&gtset global rpl_semi_sync_slave_enabled = 1;
7.MariaDB[(none)]> uninstall plugin rpl_semi_sync_slave;

 

三、基于SSL的复制

Mysql的主从复制是明文传送的,为保证数据的安全性,使用SSL的加密进行传输数据。(不过,SSL的Heartblood事件之后,SSL的安全性也被大大怀疑,囧)

1.在master上自建CA服务器

 

1.# cd /etc/pki/CA/
2.# (umask 077;openssl genrsa -out private/cakey.pem 2048)
3.# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
4.# touch  index.txt
5.# echo 01 > serial

2.master自签证书

 

1.# mkdir /usr/local/mysql/ssl
2.# cd /usr/local/mysql/ssl
3.# (umask 077;openssl genrsa -out master.key 2048)
4.# openssl req -new -key master.key -out master.csr -days 3650
5.//证书申请
6.# openssl ca -in master.csr -out master.crt -days 3650
7.//签署证书

3.为Slave服务器创建证书申请

 

# mkdir /usr/local/mysql/ssl
# cd /usr/local/mysql/ssl
# (umask 077;openssl genrsa -out slave.key 2048)
# openssl req -new -key slave.key -out slave.csr -days 3650
# scp slave.csr master.hoo.com:/tmp/

4.为Slave签署证书

 

1.//master上操作
2.# openssl ca -in /tmp/slave.csr -out /tmp/slave.crt -days 3650
3.# scp /tmp/slave.crt slave.allen.com:/usr/local/mysql/ssl/

5.SSL文件的权限

 

1.######修改Master服务器
2.# chown -R mysql.mysql /usr/local/mysql/ssl
3.//保证秘钥在目录下
4.######修改Slave服务器
5.# chown -R mysql.mysql /usr/local/mysql/ssl
6.//保证秘钥在目录下

6.在Master与Slave服务器修改主配置文件开启SSL加密功能

 

01.######修改Master服务器
02.# vim /etc/my.cnf                          #添加如下选项
03.ssl                                        #开启SSL功能
04.ssl_ca = /usr/local/mysql/ssl/cacert.pem    #指定CA文件位置
05.ssl_cert = /usr/local/mysql/ssl/master.crt  #指定证书文件位置
06.ssl_key = /usr/local/mysql/ssl/master.key   #指定密钥所在位置
07.# service mysqld restart     #重启服务生效
08.######修改Slave服务器
09.# vim /etc/my.cnf
10.ssl
11.ssl_ca = /usr/local/mysql/ssl/cacert.pem
12.ssl_cert = /usr/local/mysql/ssl/slave.crt
13.ssl_key = /usr/local/mysql/ssl/slave.key
14.# service mysqld restart

7.在master上查看SSL是否生效;

 

 

01.# mysql
02.MariaDB[(none)]> show variables like '%ssl%';
03.+---------------+---------------------------------+
04.| Variable_name | Value                           |
05.+---------------+---------------------------------+
06.| have_openssl  | YES                             |
07.| have_ssl      | YES                             |
08.| ssl_ca        | /usr/local/mysql/ssl/cacert.pem |
09.| ssl_capath    |                                 |
10.| ssl_cert      | /usr/local/mysql/ssl/master.crt |
11.| ssl_cipher    |                                 |
12.| ssl_key       | /usr/local/mysql/ssl/master.key |
13.+---------------+---------------------------------+

8.查看master的状态

 

1.MariaDB[(none)]> show master status;
2.+------------------+----------+--------------+------------------+
3.| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
4.+------------------+----------+--------------+------------------+
5.| mysql-bin.000004 |      550 |              |                  |
6.+------------------+----------+--------------+------------------+

9.添加一个用户,并使用加密方式连接到master

 

 

 

 

1.####master
2.MariaDB[(none)]> grant replication client,replication slave on *.* to 'slave'@'172.16.%.%' identified by 'passwd' require ssl;
3.MariaDB[(none)]> flush privileges;
4.####slave
5.# mysql -uslave -ppasswd -h 172.16.1.3 --ssl-ca=/usr/local/mysql/ssl/cacert.pem --ssl-cert=/usr/local/mysql/ssl/slave.crt --ssl-key=/usr/local/mysql/ssl/slave.key

10.开始基于SSL的复制

 

 

01.####查看Slave服务器SSL是否开启
02.# mysql
03.MariaDB[(none)]> show variables like '%ssl%';
04.####获取命令帮助
05.MariaDB[(none)]> help change master to
06.| MASTER_SSL = {0|1}                        #是否使用SSL功能
07.| MASTER_SSL_CA = 'ca_file_name'            #CA证书位置
08.| MASTER_SSL_CERT = 'cert_file_name'        #指定自己的证书文件
09.| MASTER_SSL_KEY = 'key_file_name'          #指定自己的密钥文件
10.####连接Master服务器
11.MariaDB[(none)]&gt; change master to master_host='172.16.1.3',master_user='slave',master_pass<a href="http://www.it165.net/edu/ebg/" target="_blank"class="keylink">word</a>='passwd',
12.master_log_file='mysql-bin.000004',master_log_pos=550,master_ssl=1,
13.master_ssl_ca='/usr/local/mysql/ssl/cacert.pem',
14.master_ssl_cert='/usr/local/mysql/ssl/slave.crt',
15.master_ssl_key='/usr/local/mysql/ssl/slave.key';

11.查看slave服务器状态

 

MariaDB[(none)]> show slave status\G;
         Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
         Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
         Master_SSL_CA_Path:
         Master_SSL_Cert: /usr/local/mysql/ssl/slave.crt
         Master_SSL_Cipher:
         Master_SSL_Key: /usr/local/mysql/ssl/slave.key

12.测试

在master上创建数据库,在slave上查看是否同步

 

四、补充,复制过滤器

 

01.####复制过滤器
02.master:
03.binlog_do_db=   (白名单列表,表示复制哪些数据库,记录到二进制日志)
04.binlog_ignore_db=  (黑名单列表,忽略哪些数据库)
05.以上两点不建议同时使用
06.slave:
07.replicate_do_db=  (数据库白名单,多个用列表)
08.replicate_ignore_db=  (黑名单)
09.不建议同时使用,
10.如果同时启用则以白名单为准,
11.如果同时出现在白黑名单中,则拒绝复制
12.replicate_do_table= db_name.table_name  (表的白名单)
13.replicate_ignore_table=(表的黑名单)
14.replicate_wild_do_table=
15.replicate_wild_ignore_table=
16.以上两项支持通配符,进行过滤
17.主服务器只能过滤到库级别,从服务器可以过滤到表级别;
 

(责任编辑:IT)