一、概念
在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题。
单点故障解决方案:
主主架构:
互为主备,互相监控对方二进制日志文件进行同步
note:当两个sql语句发生冲突的时候主主架构有可能出现数据不一致的现象;
MHA(master high availability):
HMA可以有多个配置文件,一个配置文件监控一个主从架构
二、主主架构思路
1、两台mysql都可读可写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
2、masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
3、两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);
4、所有提供服务的从服务器与masterB进行主从同步(双主多从);
5、建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);
1可以增加这两个参数,使两个主库可以异步写入且能区分 auto_increment_offset=2 <<从2开始增长 2 auto_increment_increment=2 <<每次增长为2,即为偶数
三、演示步骤
环境(主1服务器端IP:10.1.1.11;主2服务器端IP:10.0.0.12)
yum源:
1[mysql57-community] 2name=MySQL 5.7 Community Server 3baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ 4enabled=1 5gpgcheck=0 6 7yum -y remove mariadb* 8yum -y install mysql-community-server 9mysql -p`cat /var/log/mysqld.log |grep password |head -1 |awk '{print $NF}'` 10alter user 'root'@'localhost' identified by 'Ryz0304/1'; 11 12vim /root/.my.cnf 13[mysql] 14user=root 15password='Ryz0304/1'
主1(10.0.0.11)
1、修改主1配置文件,配置服务器编号,开启bin-log
1vim /etc/my.cnf 2############## 3server-id=1 4log-bin=binlog 5##############
2、重启主1mysql服务
1systemctl restart mysqld 2systemctl enable mysqld 3firewall-cmd --add-service=mysql 4firewall-cmd --add-service=mysql --permanent
3、创建复制用的用户(主1)
1mysql> grant replication slave on *.* to 'repl'@'10.0.0.12' identified by'Repl0304/1'; 2Query OK, 0 rows affected, 1 warning (0.00 sec) 3 4mysql> flush privileges; 5Query OK, 0 rows affected (0.00 sec)
4、(若第一次同步可忽略此步骤)这里可以清空两台主机的master和slave日志(若之前有开启过同步的,需要先停止同步:stop slave;)
在mysql命令行中输入:
reset master;
reset slave;
5、查看主1二进制日志文件的位置
1mysql> show master status\G 2*************************** 1. row *************************** 3 File: binlog.000001 4 Position: 154 5 Binlog_Do_DB: 6 Binlog_Ignore_DB: 7Executed_Gtid_Set: 81 row in set (0.00 sec)
主2(10.0.0.12)
1、修改主2配置文件,配置服务器编号,开启bin-log
1[mysqld] 2server-id=2 3log-bin=binlog
2、重启主2mysql服务
1systemctl restart mysqld 2systemctl enable mysqld 3firewall-cmd --add-service=mysql 4firewall-cmd --add-service=mysql --permanent
3、(若第一次同步可忽略此步骤)这里可以清空两台主机的master和slave日志(若之前有开启过同步的,需要先停止同步:stop slave;)
在mysql命令行中输入:
reset master;
reset slave;
4、连接到主1服务器上面
1mysql> change master to master_host='10.0.0.11',master_user='repl',master_password='Repl0304/1',master_port=3306,master_log_file='binlog.000001',master_log_pos=154; 2Query OK, 0 rows affected, 2 warnings (0.01 sec) 3 4mysql> start slave; 5Query OK, 0 rows affected (0.01 sec) 6 7mysql> show slave status\G 8*************************** 1. row *************************** 9 Slave_IO_State: Waiting for master to send event 10 Master_Host: 10.0.0.11 11 Master_User: repl 12 Master_Port: 3306 13 Connect_Retry: 60 14 Master_Log_File: binlog.000001 15 Read_Master_Log_Pos: 154 16 Relay_Log_File: s2-relay-bin.000002 17 Relay_Log_Pos: 317 18 Relay_Master_Log_File: binlog.000001 19 Slave_IO_Running: Yes 20 Slave_SQL_Running: Yes
5、查看主2二进制日志文件的位置
1mysql> show master status\G 2*************************** 1. row *************************** 3 File: binlog.000001 4 Position: 154 5 Binlog_Do_DB: 6 Binlog_Ignore_DB: 7Executed_Gtid_Set: 81 row in set (0.00 sec)
6、创建复制用的用户(主2)
1mysql> grant replication slave on *.* to 'repl'@'10.0.0.11' identified by'Repl0304/1'; 2Query OK, 0 rows affected, 1 warning (0.00 sec) 3 4mysql> flush privileges; 5Query OK, 0 rows affected (0.00 sec)
主1(10.0.0.11)
连接到主2服务器上
1mysql> change master to master_host='10.0.0.12',master_user='repl',masterr_password='Repl0304/1',master_port=3306,master_log_file='binlog.000001',,master_log_pos=154; 2Query OK, 0 rows affected, 2 warnings (0.01 sec) 3 4mysql> start slave; 5Query OK, 0 rows affected (0.01 sec) 6 7mysql> show slave status\G 8*************************** 1. row *************************** 9 Slave_IO_State: Waiting for master to send event 10 Master_Host: 10.0.0.12 11 Master_User: repl 12 Master_Port: 3306 13 Connect_Retry: 60 14 Master_Log_File: binlog.000001 15 Read_Master_Log_Pos: 597 16 Relay_Log_File: s1-relay-bin.000002 17 Relay_Log_Pos: 760 18 Relay_Master_Log_File: binlog.000001 19 Slave_IO_Running: Yes <<IO线程启动成功 20 Slave_SQL_Running: Yes <<SQL线程启动成功
测试
1、在主2服务器上创建库,创建表并插入数据
1mysql> create database ren; 2Query OK, 1 row affected (0.00 sec) 3 4mysql> use ren; 5Database changed 6mysql> create table tb1(id int primary key auto_increment,name char(30)); 7Query OK, 0 rows affected (0.01 sec) 8 9mysql> insert into tb1(name) values('rr'),('ryz'),('dad'); 10Query OK, 3 rows affected (0.13 sec) 11Records: 3 Duplicates: 0 Warnings: 0 12 13mysql> select * from tb1; 14+----+------+ 15| id | name | 16+----+------+ 17| 1 | rr | 18| 2 | ryz | 19| 3 | dad | 20+----+------+ 213 rows in set (0.00 sec)
2、登录主2服务器并检查是否已经有主1上面的数据
1mysql> show databases; 2+--------------------+ 3| Database | 4+--------------------+ 5| information_schema | 6| mysql | 7| performance_schema | 8| ren | 9| sys | 10+--------------------+ 115 rows in set (0.07 sec) 12 13mysql> select * from ren.tb1; 14+----+------+ 15| id | name | 16+----+------+ 17| 1 | rr | 18| 2 | ryz | 19| 3 | dad | 20+----+------+ 213 rows in set (0.00 sec)