MariaDB(MySQL):半同步复制+ssl+复制过滤
时间:2014-09-21 11:14 来源:linux.it.net.cn 作者:it
一、半同步复制
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)]&
gt
; INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
03.
MariaDB[(none)]&
gt
; SHOW GLOBAL VARIABLES LIKE '%semi%';
04.
MariaDB[(none)]&
gt
; SET GLOBAL rpl_semi_sync_master_enabled=ON;
05.
#开启半同步
06.
MariaDB[(none)]&
gt
; SET GLOBAL rpl_semi_sync_master_timeout=1000;
07.
#等待超时时间:单位ms;
08.
09.
####从服务器插件:
10.
MariaDB[(none)]&
gt
; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
11.
MariaDB[(none)]&
gt
; SHOW GLOBAL VARIABLE LIKE '%semi%';
12.
MariaDB[(none)]&
gt
; SET GLOBAL rpl_semi_sync_slave_enabled=ON;
13.
mysql&
gt
; STOP SLAVE IO_THREAD;
14.
mysql&
gt
; START SLAVE IO_THREAD;
#重启IO线程生效3
3.查看半同步开启状态
01.
######在Master服务器上查看
02.
MariaDB[(none)]&
gt
; show global status like 'rpl_semi%';
03.
Rpl_semi_sync_master_clients 1
#已经有一个客户端连接
04.
Rpl_semi_sync_master_status ON
#已经为开启状态
05.
MariaDB[(none)]&
gt
; 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)]&
gt
; show global status like 'rpl_semi%';
10.
Rpl_semi_sync_master_status ON
#已经为开启状态
11.
MariaDB[(none)]&
gt
; 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)]&
gt
;
set
global rpl_semi_sync_master_enabled=1
3.
取消加载插件
4.
MariaDB[(none)]&
gt
; uninstall plugin rpl_semi_sync_master;
5.
####Slave:
6.
MariaDB[(none)]&
gt
;
set
global rpl_semi_sync_slave_enabled = 1;
7.
MariaDB[(none)]&
gt
; 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)]&
gt
; 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)]&
gt
; 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)]&
gt
; grant replication client,replication slave on *.* to 'slave'@'172.16.%.%' identified by '
passwd
' require ssl;
3.
MariaDB[(none)]&
gt
; 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)]&
gt
; show variables like '%ssl%';
04.
####获取命令帮助
05.
MariaDB[(none)]&
gt
; 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)
一、半同步复制 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)]& gt ; INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 03. MariaDB[(none)]& gt ; SHOW GLOBAL VARIABLES LIKE '%semi%'; 04. MariaDB[(none)]& gt ; SET GLOBAL rpl_semi_sync_master_enabled=ON; 05. #开启半同步 06. MariaDB[(none)]& gt ; SET GLOBAL rpl_semi_sync_master_timeout=1000; 07. #等待超时时间:单位ms; 08. 09. ####从服务器插件: 10. MariaDB[(none)]& gt ; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 11. MariaDB[(none)]& gt ; SHOW GLOBAL VARIABLE LIKE '%semi%'; 12. MariaDB[(none)]& gt ; SET GLOBAL rpl_semi_sync_slave_enabled=ON; 13. mysql& gt ; STOP SLAVE IO_THREAD; 14. mysql& gt ; START SLAVE IO_THREAD; #重启IO线程生效3 3.查看半同步开启状态
01. ######在Master服务器上查看 02. MariaDB[(none)]& gt ; show global status like 'rpl_semi%'; 03. Rpl_semi_sync_master_clients 1 #已经有一个客户端连接 04. Rpl_semi_sync_master_status ON #已经为开启状态 05. MariaDB[(none)]& gt ; 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)]& gt ; show global status like 'rpl_semi%'; 10. Rpl_semi_sync_master_status ON #已经为开启状态 11. MariaDB[(none)]& gt ; 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)]& gt ; set global rpl_semi_sync_master_enabled=1 3. 取消加载插件 4. MariaDB[(none)]& gt ; uninstall plugin rpl_semi_sync_master; 5. ####Slave: 6. MariaDB[(none)]& gt ; set global rpl_semi_sync_slave_enabled = 1; 7. MariaDB[(none)]& gt ; 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)]& gt ; 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)]& gt ; 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)]& gt ; grant replication client,replication slave on *.* to 'slave'@'172.16.%.%' identified by ' passwd ' require ssl; 3. MariaDB[(none)]& gt ; 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)]& gt ; show variables like '%ssl%'; 04. ####获取命令帮助 05. MariaDB[(none)]& gt ; 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) |