mysql基础之mysql双主(主主)架构

Wesley13
• 阅读 1172

一、概念

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用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(非抢占模式);

可以增加这两个参数,使两个主库可以异步写入且能区分 auto_increment_offset=2         <<从2开始增长
 auto_increment_increment=2       <<每次增长为2,即为偶数

三、演示步骤

环境(主1服务器端IP:10.1.1.11;主2服务器端IP:10.0.0.12)

yum源:

[mysql57-community]
name=MySQL 5.7 Community Server  
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0

yum -y remove mariadb*
yum -y install mysql-community-server
mysql -p`cat /var/log/mysqld.log |grep password |head -1 |awk '{print $NF}'`
alter user 'root'@'localhost' identified by 'Ryz0304/1';

vim /root/.my.cnf
[mysql]
user=root
password='Ryz0304/1'

主1(10.0.0.11)

1、修改主1配置文件,配置服务器编号,开启bin-log

vim /etc/my.cnf
##############
server-id=1
log-bin=binlog
##############

2、重启主1mysql服务

systemctl restart mysqld
systemctl enable mysqld
firewall-cmd --add-service=mysql
firewall-cmd --add-service=mysql --permanent

3、创建复制用的用户(主1)

mysql> grant replication slave on *.* to 'repl'@'10.0.0.12' identified by'Repl0304/1';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4、(若第一次同步可忽略此步骤)这里可以清空两台主机的master和slave日志(若之前有开启过同步的,需要先停止同步:stop slave;)
在mysql命令行中输入:
  reset master;
  reset slave;

5、查看主1二进制日志文件的位置

mysql> show master status\G
*************************** 1. row ***************************
             File: binlog.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

主2(10.0.0.12)

1、修改主2配置文件,配置服务器编号,开启bin-log

[mysqld]
server-id=2
log-bin=binlog

2、重启主2mysql服务

systemctl restart mysqld
systemctl enable mysqld
firewall-cmd --add-service=mysql
firewall-cmd --add-service=mysql --permanent

3、(若第一次同步可忽略此步骤)这里可以清空两台主机的master和slave日志(若之前有开启过同步的,需要先停止同步:stop slave;)
在mysql命令行中输入:
reset master;
reset slave;

4、连接到主1服务器上面

mysql> 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;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: s2-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: binlog.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

5、查看主2二进制日志文件的位置

mysql> show master status\G
*************************** 1. row ***************************
             File: binlog.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

6、创建复制用的用户(主2)

mysql> grant replication slave on *.* to 'repl'@'10.0.0.11' identified by'Repl0304/1';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

主1(10.0.0.11)

连接到主2服务器上

mysql> 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;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.12
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000001
          Read_Master_Log_Pos: 597
               Relay_Log_File: s1-relay-bin.000002
                Relay_Log_Pos: 760
        Relay_Master_Log_File: binlog.000001
             Slave_IO_Running: Yes   <<IO线程启动成功
            Slave_SQL_Running: Yes   <<SQL线程启动成功

测试

1、在主2服务器上创建库,创建表并插入数据

mysql> create database ren;
Query OK, 1 row affected (0.00 sec)

mysql> use ren;
Database changed
mysql> create table tb1(id int primary key auto_increment,name char(30));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb1(name) values('rr'),('ryz'),('dad');
Query OK, 3 rows affected (0.13 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | rr   |
|  2 | ryz  |
|  3 | dad  |
+----+------+
3 rows in set (0.00 sec)

2、登录主2服务器并检查是否已经有主1上面的数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| ren                |
| sys                |
+--------------------+
5 rows in set (0.07 sec)

mysql> select * from ren.tb1;
+----+------+
| id | name |
+----+------+
|  1 | rr   |
|  2 | ryz  |
|  3 | dad  |
+----+------+
3 rows in set (0.00 sec)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Mysql双主热备+LVS+Keepalived高可用操作记录
MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障。然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换。前面介绍了MysqlKeepalived双主热备高可用方案记录
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这