MySQL 5.6 一主多从的 半同步复制搭建
半同步简介:
在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,因为主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更新数据是否已经复制到从服务器中,就可以自由处理其它进入的事务处理请求。但这也同时带来了很高的风险,如果在主服务器或从服务器端发生故障,会造成主从数据的不一致,甚至在恢复时造成数据丢失。
从MySQL5.5开始引入了一种半同步复制功能,该功能可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。在这种配置结构中,一台主服务器和其许多从服务器都进行了配置,这样在复制拓扑中,至少有一台从服务器在父主服务器进行事务处理前,必须确认更新已经收到并写入了其中继日志(Relay
Log)。当出现超时,源主服务器必须暂时切换到异步复制模式重新复制,直到至少有一台设置为半同步复制模式的从服务器及时收到信息。
继5.5半同步复制后,MySQL5.6又对其进行了优化和改进,其中有两个地方较为重要:
1、在主从切换后,在传统的方式里,需要找到binlog和POS点,然后更改master指向,而在mysql5.6里,你无须再知道binlog和POS点,你只需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。
2、多线程复制,以前的版本,同步复制是单线程的,只能一个一个执行,在MySQL5.6里,可以做到多个库之间的多线程复制,但一个库里的表,多线程复制是无效的。
一、试验环境准备
1.1、安装平台:vmware workstation 10
操作系统:CentOS release 6.6 (Final) x86_64,最小化安装。
MySQL版本:mysql-5.6.24-linux-glibc2.5-x86_64
关闭防火墙
1.2、服务器IP地址规划:
MySQL Master:192.168.1.152
MySQL Slave1:192.168.1.201
MySQL Slave2:192.168.1.202
1.3、实验拓扑:
二、安装Mysql5.6
2.1、由于是最小化安装的系统,需要安装一些基本的组建
2.2、新建用户和数据目录。
2.3、安装并初始化mysql
2.4、为mysql提供主配置文件
2.5、为mysql配置sysv服务脚本
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
2.6、输出mysql的man手册至man命令的查找路径。
编辑/etc/man.config,添加如下行即可
2.7、输出mysql的头文件至系统头文件路径/usr/include
这可以通过简单的创建链接实现
2.8、输出mysql的库文件给系统库查找路径。
2.9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。
vim /etc/my.cnf
datadir = /mydata/data #添加
log-error = /mydata/data/error.log #添加
#pid-file = /mydata/data/mysql.pid #注释掉
tmpdir = /var/tmp #不建议放在/tmp下
service mysqld start
以上安装过程在三台服务器均需执行。
三、主从模式配置
3.1、配置master节点:
[root@master ~]# cat /etc/my.cnf
rpl_semi_sync_master_enabled=ON
禁用 rpl_semi_sync_master_enabled=ON
参数不然启动报错
注意:添加
上面的配置文件都可以不要,对于新手来说,看不懂,就很容易出错,新手朋友照着这个方案搭建起来也不能主从复制
选填下面的my.cnf配置
#
The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
tmpdir = /tmp
slave-load-tmpdir = /tmp
pid-file = /data/mysql/mysql.pid
#skip-name-resolve
##skip-symbolic-links
#replicate-wild-ignore-table = mysql.%
#replicate-wild-ignore-table = test.%
#log-bin-index = mysql-bin.index
#relay-log-index = relay-log.index
max_connect_errors = 10000
max_connections = 500
wait-timeout = 30
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
#new add DBA
server-id=11
report-port=3306
port=3306
log-bin=mysql-bin.log
#report-h
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
mysql>
show variables like '%dir%';
+-----------------------------------------+----------------------------+
| Variable_name | Value|
+-----------------------------------------+----------------------------+
|basedir
| /usr | | |
| datadir | /var/lib/mysql/ | |
| slave_load_tmpdir | /tmp |
| tmpdir|/tmp|
+-----------------------------------------+----------------------------+
配置参数简要说明:
3.2、配置slave节点
[root@slave1 ~]# cat /etc/my.cnf
选填:
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
socket=/var/lib/mysql/mysql.sock
slave_load_tmpdir=/tmp
max_connect_errors = 10000
max_connections = 500
wait-timeout = 30
#new add dba
log-bin=master-bin
server-id=1
report-port=3306
port=3306
report-host=WIN-P11PIHOSG63.lan
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
说明:楼主搭建测试是5.5以后的半同步复制(新功能),建议数据库版本一致,不要用5.6到5.5,如果不懂my.cnf配置的新手会出很多问题。
针对半同步复制技术,建议在MHA里面打开,如果是测试环境不要要求那么高,不然会出问题。当然,看你怎么去思考。
[root@slave2 ~]# cat /etc/my.cnf
3.3、创建复制用户
在主库上执行
3.4、在主从节点上安装相关的插件并启动复制
在主库上执行
在从库上执行
查看主库的复制线程和pid号:
mysql> show master status\G;
*************************** 1. row ***************************
File: master-bin.000001
Position: 539
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 22915959-e5e3-11e5-a894-000c29c0d786:1-2
1 row in set (0.00 sec)
安装完毕后在两从库上定义到主库的复制连接
可以看到主从服务器已经启用gtid功能。
在主库上查看已连接的slave主机
查看slave1的复制状态
再去查看slave2的状态
可以看到此时两个从库的复制进度是一样的。
3.5、在主库写入数据进行测试
在从库上执行查询可以看到
四、配置基于ssl的加密
4.1、主服务器上生成私钥
4.2、主服务器上生成自签证书
权限设置
4.3、为从服务器生成证书
将CA证书、签署的slave端证书、master证书及私钥传送到slave服务器上
4.4、配置主从ssl
编辑master服务器my.cnf配置文件
配置从服务器ssl(该步骤两台从服务器相同)
编辑slave服务器my.cnf配置文件
启动从服务器上的复制
可以看到如下信息
但是到这里之后发现了一个问题,那就是我使用的编译好的mysql二进制包不支持ssl,要想支持需要重新编译mysql,限于时间有限,这里就不重来了,有需要的朋友就自己折腾下吧。
参考:
http://zhangjianjian.blog.51cto.com/2944771/1632109
http://www.it165.net/database/html/201403/5562.html