您的位置:首页 > 运维架构 > Linux

红帽6.4 64位上实现mysql5.6的主从复制、基于GTID复制、半同步、ssl加密复制以及读写分离 推荐

2013-05-23 22:04 1251 查看
文章介绍的是通过在RedHat6.4的64位系统平台mysql5.6的主从复制、基于GTID复制、半同步、ssl加密以及读写分离这些配置应用在生产环境中是实用的,拿来和大家分享一下
Mysql5.6主从复制介绍
Slave服务器通过IO线程连接Master,并请求从指定指定的日志开始复制,Master返回其Binary Log 文件的名称以及在 BinaryLog 中的位置及内容信息,Slave端将复制过来的日志信息保存到自己的中继日志中,然后在把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储
主从复制简构图

Mysql5.6半同步复制介绍

在一主多从模式下,Master与Slave端之间只完成一个Slave的同步复制(与主从复制机制一致);即提交事务的线程会被锁定,直到至少一个Slave收到这个事务,事务的事件在被提交到存储引擎之后才被发送到Slave上
Mysql5.6一主多从模式下半同步简构图



原理部分这里就以分批次的进行介绍了,下面我们就先一起来看一看Mysql复制的实现过程
Mysql5.6主从复制Master服务器准备
创建mysql用户
# groupadd -g 3306 mysql
# useradd -g 3306 -u 3306 mysql
创建数据目录
# mkdir /mydata/data -pv
# cd /mydata/
# chown mysql.mysql data –R
配置Mysql5.6
# tar xf mysql-5.6.10-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv mysql-5.6.10-linux-glibc2.5-x86_64mysql
# chown .mysql * -R
初始化mysql
# scripts/mysql_install_db --user=mysql--datadir=/mydata/data
准备服务脚本
# cp support-files/mysql.server/etc/init.d/mysqld
# chkconfig --add mysqld
初始化后会自动在当前目录下创建一个my.cnf配置文件,直接修改就可以
修改配置文件
#vim my.cnf
添加内容是:
binlog-format=ROW
log-bin=master-bin.log
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
report-port=3306
port=3306
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=master.magedu.com
添加环境变量
# vim /etc/profile.d/mysql.sh
内容是
export PATH=$PATH:/usr/local/mysql/bin
# . /etc/profile.d/mysql.sh
启动mysql
# mysql



在从服务器上进行mysql的安装与主服务器相同,这里就不再过多的叙述了
其中从服务器的my.cnf配置文件添加内容为

binlog-format=ROW
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=11
report-port=3306
port=3306
log-bin=mysql-bin.log
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=slave.magedu.com


在主服务器上授权具有复制权限的用户
mysql> GRANT REPLICATION SLAVE ON *.* TOtest@172.16.51.21 IDENTIFIED BY 'test';
mysql> FLUSH PRIVILEGES;
查看主服务器状态信息



在从服务器上连接到主服务器
mysql> CHANGE MASTER TOMASTER_HOST='172.16.51.20',
-> MASTER_USER='test',
-> MASTER_PASSWORD='test',
-> MASTER_LOG_FILE='master-bin.000001',
->MASTER_LOG_POS=919;查看连接后从服务器状态


启动从服务器服务

mysql> start slave;
状态信息查看



在主服务器上创建相关数据进行测试



在从服务器上查看
mysql> SHOW SLAVE STATUS\G



查看从服务器上所有数据库



以上内容介绍的是mysql5.6不基于GTID完成的复制,下面我们来一起看一看基于GTID完成的mysql复制
这次实验是在上述实验完成之后做,这里已经把之前所有的相关信息都已经删除,重新进行的初始化才进行下面的实验
基于GTID完成的mysql复制介绍
mysql5.6基于GTID完成复制简构图

GTID是什么
由服务器的UUID(全局唯一标识,128位随机字符串,并结合事务的ID号组合成一个唯一的标识某一个主机上某一个事务的表示码mysql5.6的二进制日志中binlog在每个事务语句记录是在事务的首部都会记录相关联的GTID;优点是GTID追踪,比较复制事务更加简单,并且能够实现从崩溃中快速进行恢复
工作机制
A为主BC为从时,BC复制速度会不同,则在A故障的那一刻,BC上的数据也会有不同,此时B若为一个新的MASTER通过GTID的方式实现的话就是在C上有的但B上没有的都先要复制到B上,然后把B提升为主的,然后再把C成为B的从,GTID功能会把记录在二进制中每个事务中首部都记录一个GTID号;此时B可向C发出通告告知C已经完成了哪些事务,有了GTID后,每个事务中都有其相关事务的信息;实现了服务器两端自动的发现各自在对方上缺少什么不需要再进行手动指定的位置、指定文件进行复制
相关命令介绍
mysqlreplicate:复制相关工具能够快速启动从服务器,帮助从服务器检查本地所有已经在本地执行过的事务,通过追踪GTID判断,跳过这些执行过的事务,快速从未执行过的事务开始
mysqlrplcheck:兼具复制与检查的功能,用于实现简单的验证部署,并实现快速故障解决(快速故障修复的相关功能)检查binlog是否被启用了并显示相关的配置信息

mysqlrplshow:发现并显示复制拓扑图(以树状图的形式显示是否是多级复制,已经主从服务器的个数等相关信息)

msyqlfailover:故障转移工具(快速的通过手动或者自动将一个slave转换成master)获取另一个slave中本身不具有的事务
msyqlrpladmin:调度管理工具(手动的让一个slave上线,下线)
在主服务器上的my.cnf配置
binlog-format=ROW
log-bin=master-bin.log
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
report-port=3306
port=3306
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=master.magedu.com
从服务器上my.cnf配置文件添加的内容
binlog-format=ROW
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=11
report-port=3306
port=3306
log-bin=master-bin
datadir=/mydata/data
socket=/tmp/mysql.sock
report-host=slave.magedu.com
启动mysql服务器,在主从服务器查看是否启动gtid功能



将172.16.51.20(master.magedu.com)定义为主服务器
创建账户
mysql> GRANT REPLICATION SLAVE ON *.* TOtest@172.16.51.21 IDENTIFIED BY 'test';
mysql> FLUSH PRIVILEGES;
让172.16.51.21(slave.magedu.com)定义为从连接到主服务器上
mysql> CHANGE MASTER TOMASTER_HOST='172.16.51.20',MASTER_USER='test',MASTER_PASSWORD='test',MASTER_AUTO_POSITION=1;
启动slave
mysql> START SLAVE;
查看slave状态信息
mysql> show slave status\G;



在主服务器上创建一个数据库进行测试
mysql> CREATE DATABASE magedudb1;
在从服务器上验证



查看数据库



查看Slave主机



ssl加密复制实现ssl加密复制是生产环境中对数据安全性的一个保障,配置过程也比较简单,之前在前面的文章中都有对ssl加密实现有详细介绍这里就不再过多赘述了
准备私有CA
# mkdir ca
# cd ca
# (umask 077;openssl genrsa 2048 >ca-key.pem)
# openssl req -new -x509 -nodes -days 3665-key ca-key.pem -out ca-cert.pem
为master服务器生成证书
# openssl req -newkey rsa:2048 -days 3665-nodes -keyout master-key.pem -out master-req.pem
# openssl rsa -in master-key.pem -out master-key.pem
# openssl x509 -req -in master-req.pem-days 3665 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -outmaster-cert.pem
更改属主属组
# chown mysql.mysql -R *
# chmod 600 *
为从服务器生成证书
# openssl req -newkey rsa:2048 -days 3665-nodes -keyout slave-key.pem -out slave-req.pem
# openssl x509 -req -in slave-req.pem -days3665 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out slave-cert.pem
将CA证书、签署的slave端证书、master证书及私钥传送到slave服务器上
# scp ca-cert.pem slave-key.pemslave-cert.pem master-cert.pem master-key.pem 172.16.51.21:/ssl/
更改证书属主属组
# cd /ssl
# chown mysql.mysql -R *
# chmod 600 *
编辑master服务器my.cnf配置文件
# vim /usr/local/mysql/my.cnf ---添加内容如下
ssl
ssl-ca = /ca/ca-cert.pem
ssl-cert = /ca/master-cert.pem
ssl-key = /ca/master-key.pem
编辑slave服务器my.cnf配置文件
# vim /usr/local/mysql/my.cnf ---添加内容如下
ssl
ssl-ca = /ssl/ca-cert.pem
ssl-cert = /ssl/slave-cert.pem
ssl-key = /ssl/slave-key.pem
重启mysql服务器查看ssl功能是否启用
在master服务器查看SSl功能开启状态
mysql> show variables like '%ssl%';



在slave服务器查看SSl功能开启状态
mysql> show variables like '%ssl%';



SSL加密复制验证实现
Master服务器授权
mysql> GRANT FILE,SELECT,REPLICATION SLAVEON*.* TO 'test11'@'%' IDENTIFIED BY 'test11' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;
Slave服务器连接
# mysql -utest11 -ptest11 -h172.16.51.20--ssl-cert=/ssl/master-cert.pem --ssl-key=/ssl/master-key.pem
查看状态信息
mysql> status;



ssl加密复制相关配置就完成了,具体的实现与GTID主从复制验证相同

Mysql5.6半同步配置在主服务器上安装插件
mysql> INSTALL PLUGINrpl_semi_sync_master SONAME 'semisync_master.so';
修改my.cnf配置文件—添加一下选项
rpl_semi_sync_master_enabled=ON
在从服务器上安装的插件
slave> INSTALL PLUGINrpl_semi_sync_slave SONAME 'semisync_slave.so';
修改从服务器配置文件添加一下选项
rpl_semi_sync_slave_enabled=ON
重新启动mysql服务器
验证半同步功能是否开启
mysql> CREATE DATABASE magedudb3;
mysql> SHOW GLOBAL STATUS LIKE 'rpl%';



Mysql-5.6读写分离实现
读写分离实现基本机制基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库;主服务器对向从服务器请求的请求产生的I/o会很多。可以实现多级复制;实现机制是在主服务器为从服务器产生一个进程,有一个单独的服务器器为从服务器提供读进程即是多级复制模式;单独提供查询进程服务器采用black hole存储引擎

Mysql-5.6实现读写分离简构图

Mysql-proxy配置选项介绍
--proxy-address=host:port ————代理服务监听的地址和端口;
--admin-address=host:port ————管理模块监听的地址和端口;
--proxy-backend-addresses=host:port ————后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port ————后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name ————完成mysql代理功能的Lua脚本;
--daemon ————以守护进程模式启动mysql-proxy;
--keepalive ————在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name ————日志文件名称;
--log-level=level ————日志级别;
--log-use-syslog ————基于syslog记录日志;
--plugins=plugin,.. ————在mysql-proxy启动时加载的插件;
--user=user_name ————运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name ————默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling ————禁用profile;
--pid-file=/path/to/pid_file_name ————进程文件名;

安装mysql-proxy
# useradd -r mysql-proxy
# tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-32bit.tar.gz-C /usr/local/
# cd /usr/local/
# ln -sv mysql-proxy-0.8.3-linux-glibc2.3-x86-32bitmysql-proxy
添加环境变量
# vim /etc/profile.d/mysql-proxy.sh
添加内容为
exportPATH=$PATH:/usr/local/mysql-proxy/bin
# . /etc/profile.d/mysql-proxy.sh
为mysql-proxy提供SysV服务脚本以及配置文件mysql-proxy 由于脚本配置文件过长所以就上传到附件了
添加执行权限,加进服务控制列表
# cd /etc/init.d/
# chmod +x mysql-proxy
# chkconfig --add mysql-proxy
# chkconfig --level 2345 mysql-proxy on
相关配置文件已经准备完成,现在就可启动mysql-proxy,然后使用另一客户端(这里的客户端IP为172.16.51.77)进行连接测试
# mysql -uadmin -padmin -h172.16.51.23--port=4041
mysql> select * from backends;



读写分离测试
在负责读写的服务器上进行远程用户授权
mysql> GRANT ALL ON *.* TO 'root'@'%'IDENTIFIED BY 'redhat';
mysql> flush privileges;
在客户端172.16.51.77进行一次写操作
# mysql -uroot -predhat -h172.16.51.23 -e'create database chuangjian;'
# mysql -uadmin -padmin -h172.16.51.23--port=4041



在客户端172.16.51.77进行一次读操作
# mysql -uroot -predhat -h172.16.51.23 -e'select user,password from mysql.user;'



172.16.51.20服务器支持读写,所以在第一次进行查询时172.16.51.21服务器可能响应不到,所以就再一次的进行了查询测试(有不周的地方还望见谅哦)

附件:http://down.51cto.com/data/2362895
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql5.6 红帽6.4 64位