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、由于是最小化安装的系统,需要安装一些基本的组建
# yum -y groupinstall "Perl Support"
# yum -y instdall vim wget
# cd /usr/local/src
# wget
http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.24-linux-glibc2.5-x86_64.tar.gz
2.2、新建用户和数据目录。
# mkdir -pv /mydata/data
# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data
mysql
# chown -R mysql:mysql /mydata/data
2.3、安装并初始化mysql
# tar zxvf mysql-5.6.24-linux-glibc2.5-x86_64.tar.gz -C
/usr/local
# cd /usr/local/
方法一(推荐)
mv mysql-5.6.24-linux-glibc2.5-x86_64 mysql
方法二(不建议)
# ln -sv mysql-5.6.24-linux-glibc2.5-x86_64 mysql
# cd mysql
# chown -R mysql:mysql .
# scripts/mysql_install_db --user=mysql
--datadir=/mydata/data
# chown -R root .
2.4、为mysql提供主配置文件
# cd /usr/local/mysql
# cp support-files/my-default.cnf /etc/my.cnf
2.5、为mysql配置sysv服务脚本
# cd /usr/local/mysql
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add
mysqld //添加至服务列表
# chkconfig mysqld on
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
2.6、输出mysql的man手册至man命令的查找路径。
编辑/etc/man.config,添加如下行即可
MANPATH /usr/local/mysql/man
2.7、输出mysql的头文件至系统头文件路径/usr/include
这可以通过简单的创建链接实现
# ln -sv /usr/local/mysql/include /usr/include/mysql
2.8、输出mysql的库文件给系统库查找路径。
# echo '/usr/local/mysql/lib' >
/etc/ld.so.conf.d/mysql.conf
# ldconfig //让系统重新载入系统库
2.9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。
# echo "export PATH=$PATH:/usr/local/mysql/bin "
>/etc/profile.d/mysql.sh
# source /etc/profile.d/mysql.sh
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
[mysqld]
binlog-format=ROW
log-bin=master-bin
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=1 #改成主机的ID
report-port=3306
port=3306
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=master #改成自己的主机名
#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