概述
对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库中的数据一致。
这样做有如下几点好处:
可以做灾备,其中一个坏了可以切换到另一个。
可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。 对于异地热备,尤其适合灾备。
MySQL 主从复制的方式
在默认情况下,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 Master 数据库操作的任何数据库的时候,都会将操作记录写入到biglog日志文件当中
2 Slave 数据库通过网络获取到主数据库的日志文件,写入本地日志系统 ,然后一条条的将数据库事件在数据库中完成
3 Slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中,所以两端的数据是完全一样的。
环境
操作系统:CentOS
MySQL版本:mysql-5.6.26 (主从两者数据库版本必须保持一致)
Master1 配置
1 开启binlog日志功能
vim /etc/my.cnf
1 2 | server- id =6 log-bin=mysql-bin |
2 重启mysql 登陆并授权
mysql -uroot -p123456
1 | grant replication slave, replication client on *.* to 'repl' @ '10.211.55.7' identified by '123456' ; |
ip地址为slave服务器的ip地址
3 查看日志状态
show master status;
Master2 配置
1 开启binlog日志功能
vim /etc/my.cnf
1 2 | server- id =8 log-bin=mysql-bin |
2 重启mysql 登陆并授权
mysql -uroot -p123456
1 | grant replication slave, replication client on *.* to 'repl' @ '10.211.55.7' identified by '123456' ; |
ip地址为slave服务器的ip地址
3 查看日志状态
show master status;
Slave 配置
1 修改配置文件 (注意 slave的默认数据库启动的端口必须关闭 service mysql stop)
vim /etc/my.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [mysqld] binlog-ignore-db=mysql binlog_format=mixed expire_logs_days=7 slave_skip_errors=1062 relay_log=mysql-relay-bin log_slave_updates=1 [mysqld_muliti] mysqld= /usr/bin/mysqld_safe mysqladmin= /usr/bin/mysqladmin user=root password=123456 [mysqld6] port=3306 datadir= /home/mysql/data6 pid- file = /home/mysql/data6/mysql .pid socket= /home/mysql/data6/mysql .sock user=mysql server- id =7 [mysqld8] port=3307 datadir= /home/mysql/data8 pid- file = /home/mysql/data8/mysql .pid socket= /home/mysql/data8/mysql .sock user=mysql server- id =7 |
2 初始化生成目录
1 2 | /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir= /usr/local/mysql --datadir= /home/mysql/data6 & /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir= /usr/local/mysql --datadir= /home/mysql/data8 & |
3 修改目录权限
1 2 3 | chown -R mysql /home/mysql/data6 chown -R mysql /home/mysql/data8 |
4 启动服务
1 2 3 | mysqld_multi --defaults- file = /etc/my .cnf start 6 mysqld_multi --defaults- file = /etc/my .cnf start 8 |
5 登录测试(并分别做授权)
mysql -P 3306 -S /home/mysql/data6/mysql.sock
1 2 | mysql> change master to master_host= '10.211.55.6' , master_user= 'repl' , master_password= '123456' , master_port=3306, master_log_file= 'mysql-bin.000001' , master_log_pos=120; mysql> start slave; |
mysql -P 3307 -S /home/mysql/data8/mysql.sock
1 2 | mysql> change master to master_host= '10.211.55.8' , master_user= 'repl' , master_password= '123456' , master_port=3306, master_log_file= 'mysql-bin.000001' , master_log_pos=120; mysql> start slave; |
ok 就这样 完成了