centos系统服务器2台、 一台用户作Mysql主服务器, 一台用于作Mysql从服务器, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间能够经过主机名互相通讯html
1)iptables -F && setenforce 清空防火墙策略,关闭selinux
2)拿两台服务器都使用yum方式安装Mysql服务, 要求版本一致
3)分别启动两台服务器mysql服务, 确保服务正常
架构图:
mysql
对master进行配置,包括打开二进制日志,指定惟一的servr ID。例如,在配置文件加入以下值linux
server-id=1 //配置server-id,让主服务器有惟一ID号 log-bin=mysql-bin //打开Mysql日志,日志格式为二进制 skip-name-resolve //关闭名称解析,(非必须)
在 Master 的数据库中创建一个备份账户:每一个 slave 使用标准的 MySQL 用户名和密码链接 master 。进行复制操做的用户会授予 REPLICATION SLAVE 权限。sql
MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';
在 Master 的数据库执行 show master status
,查看主服务器二进制日志状态及位置号。
数据库
对 slave 进行配置,打开中继日志,指定惟一的 servr ID,设置只读权限。在配置文件加入以下值:vim
server-id=2 //配置server-id,让从服务器有惟一ID号 relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_bin = mysql-bin //开启从服务器二进制日志 log_slave_updates = 1 //使得更新的数据写进二进制日志中
让 slave 链接 master ,并开始重作 master 二进制日志中的事件。centos
MariaDB [(none)]> change master to master_host='192.168.37.111', >master_user='slave', >master_password='keer', >master_log_file='mysql-bin.000001', >master_log_pos=413;
执行start slave;
,来启动复制线程。
安全
可以使用SHOW SLAVE STATUS\G;
查看从服务器状态,以下所示,也可用show processlist \G;
查看当前复制状态:服务器
Slave_IO_Running: Yes //IO线程正常运行 Slave_SQL_Running: Yes //SQL线程正常运行
1)测试主从同步
咱们在 master 服务器上建立一个数据库,再使用该数据库建立一个表,添加一条记录,来看一看 slave 服务器有没有同步成功。
首先,咱们先来查看一下两个服务器上有什么数据库:
master:
slave:
如今,咱们在主服务器上建立一个数据库“keer”:
而后,咱们来看看从服务器是否已经更新:
咱们能够看出,数据库已经同步,接下来,咱们就来建立表,并在表中插入一条记录:
而后,咱们来看看从服务器是否更新:
网络
2)测试只读属性
咱们在从服务器上设置了只读,因此咱们来试试看能不能插入数据:
这就很尴尬了,为何咱们设置只读仍是能够插入数据呢?这要如何解决呢?
由于咱们登陆的时候使用的是root
超级用户,这个大变态是不受只读设置影响的,因此,咱们仍是能够往里面去插入数据,固然,若是咱们换成其余的普通用户就不会出现这样的问题了。
解决方式也很简单,咱们只须要把表锁起来就能够了:
MariaDB [keer]> flush tables with read lock;
进行锁表操做之后,咱们再来插入一条数据:
这样的话,即便咱们是超级用户登陆进来的,也不能再插入数据了。这样会安全不少。可是,有利就有弊,这样的话,咱们的主从就不能实时同步了,由于咱们的主从同步是经过把主上的 sql 语句放在从上再执行一遍来实现的,但是咱们锁表的话,sql 语句就不能执行了。想要同步方法也很简单,直接把表解锁就能够了。
咱们在主上插入一条数据:
此时,咱们的从上就要解表之后才能实现同步:
当咱们的服务器运行一段时间后,流量变得愈来愈多,这时,一主一从可以实现的高可用性和负载均衡不能知足咱们的需求,咱们就要选择再添加一台从服务器。
但是如今咱们的 master 已经运行好久了,咱们也须要对新安装的 slave 进行数据同步,甚至它没有 master 的数据。
此时,有几种方法可使 slave 从另外一个服务开始,例如,从 master 拷贝数据,从另外一个 slave 克隆,从最近的备份开始一个 slave 。为了加快 slave 与 master 同步,可用如下方式先进行数据同步:
(1)master的某个时刻的数据快照;
(2)数据库的备份数据;
(3)master的二进制日志文件。
架构图:
接下来,咱们就来实现一下这个过程:
1)对 master 进行彻底备份
[root@master ~]# mkdir /backup [root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
照例查看一下主的二进制日志状态及位置号。
2)把彻底备份的数据发到新增的从上
[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~ root@192.168.37.133's password: mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00
3)把这个彻底备份导入从的数据库:
4)查看从是否恢复成功:
咱们来查看一下从的二进制日志状态及位置号:
咱们的数据已经恢复成功
5)设置主从
接下来就是按照上述步骤,对该从服务器进行设置就好:
[root@slave2 ~]# vim /etc/my.cnf [mysqld] server-id = 3 relay-log = mysql-relay-bin read-only = 1 log-bin = mysql-bin log-slave-updates = 1
而后,咱们就来设置从服务器:
[root@slave2 ~]# mysql -uroot -p Enter password: MariaDB [(none)]> change master to master_host='192.168.37.111', >master_user='slave', >master_password='keer', >master_log_file='mysql-bin.000001', >master_log_pos=330; MariaDB [(none)]> start slave;
而后咱们来查看一下从服务器的状态:
6)测试
设置完毕,咱们来测试一下,当主上有操做时,从上是否更新:
至此,咱们就完成了一主两从。若是有须要,咱们还能够继续添加从服务器。
1)同步复制
指当主库执行完一个事务,全部的从库都执行了该事务才返回给客户端。由于须要等待全部从库执行完该事务才能返回,因此全同步复制的性能必然会收到严重的影响。须要有超时时间。
2)异步复制
MySQL默认的复制便是异步的,主库在执行完客户端提交的事务后会当即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主若是crash掉了,此时主上已经提交的事务可能并无传到从上,若是此时,强行将从提高为主,可能致使新主上的数据不完整。
3)半同步复制
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是马上返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提升了数据的安全性,同时它也形成了必定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。因此,半同步复制最好在低延时的网络中使用。
半同步复制是基于特定的模块来实现。不过很是 nice 的一点就是,在咱们的 mariadb5.5 以上的版本默认是带有这个模块的。
若是咱们的 centos7 上安装了 mariadb ,咱们就能够进入目录去查看一下:
[root@master ~]# cd /usr/lib64/mysql/plugin/
找到咱们的模块后,咱们就能够经过命令来安装,而后进行简单配置便可使用了。下面就是具体方法:
master 服务器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
slave 服务器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ; MariaDB [(none)]> stop slave; MariaDB [(none)]> start slave;
如今,咱们的半同步复制就开启了,咱们能够来查看一下日志:
[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log
从日志里也能够看出咱们的半同步复制已经开启。
以上,实验一完成。
还有一种数据库的架构为双主模式,也就是互为主从,这种设定在企业中虽不经常使用,可是咱们仍是须要掌握的。
Master-Master复制的两台服务器,既是master,又是另外一台服务器的slave。这样,任何一方所作的变动,都会经过复制应用到另一方的数据库中。
架构图以下:
centos系统服务器2台、 两台用户实现Mysql互为主从, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间能够经过主机名互相通讯
1)iptables -F && setenforce 清空防火墙策略,关闭selinux
2)拿两台服务器都使用yum方式安装Mysql服务, 要求版本一致
3)分别启动两台服务器mysql服务, 确保服务正常
server-id = 1 //配置server-id,让主服务器有惟一ID号 log-bin = mysql-bin //打开Mysql日志,日志格式为二进制 skip-name-resolve //关闭名称解析,(非必须) relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_slave_updates = 1 //使得更新的数据写进二进制日志中 auto_increment_offset = 1 //表示自增加字段从那个数开始 auto_increment_increment = 2 //表示自增加字段每次递增的量
server-id = 2 //配置server-id,让主服务器有惟一ID号 log-bin = mysql-bin //打开Mysql日志,日志格式为二进制 skip-name-resolve //关闭名称解析,(非必须) relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制 read_only = 1 //设置只读权限 log_slave_updates = 1 //使得更新的数据写进二进制日志中 auto_increment_offset = 2 //表示自增加字段从那个数开始 auto_increment_increment = 2 //表示自增加字段每次递增的量
由于咱们实现的是双主模式,因此咱们每一台机器上都要建立复制帐号:
咱们分别查看两台服务器的状态,从而为咱们下一步的设置奠下基础:
咱们来分别对两台机器进行的设置:
首先,先对第一台 master 机器进行设置:
MariaDB [(none)]> change master to master_host='192.168.37.222',master_user='slave',master_password='keer',master_log_file='mysql-bin.000003',master_log_pos=245; MariaDB [(none)]> start slave;
接着,咱们来查看一下他的状态:
如今,咱们来对第二台 master 进行设置:
MariaDB [(none)]> change master to master_host='192.168.37.111',master_user='slave',master_password='keer',master_log_file='mysql-bin.000002',master_log_pos=245; MariaDB [(none)]> start slave;
咱们来查看一下他的状态:
能够看出,咱们的两个机器都设置完毕,接下来,咱们就能够来测试一下了。
在咱们的配置文件中,咱们设置了自增加字段的起始值和增加值,如今咱们去建立一个自增加的表:
MariaDB [keer]> create table test(id int PRIMARY KEY AUTO_INCREMENT,name char(20) not null);
由于咱们设置了主从,因此在任一机器使用该命令便可。
建立好了表之后,咱们就能够插入数据进行测试了,咱们一个插入多条数据来看看效果:
第一个服务器:
MariaDB [keer]> insert into test(name) value('zhao'),('qian'),('sun'),('li'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
第二个服务器:
MariaDB [keer]> insert into test(name) value('zhou'),('wu'),('zheng'),('wang'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
数据咱们都插入了,咱们来看看效果如何:
能够看出,两个表插入的数据是不会重复的。
可是如今也不是咱们想象的连续的 id ,这是由于,咱们两台机器都是同时插入4条数据,并且不是同步插入的,这样就会有一个前后顺序,第一台机器上的 sql 语句执行结束之后才执行第二台机器上的。因此会出现这样的状况。
可是,这样已经不会插入重复的数据了。咱们的目的也是达到了。
以上,实验二完成。
具体的实现过程见个人下一篇博客mysql实现高可用架构之MHA
若有不足之处还请你们多多指教喏٩(๑>◡<๑)۶