mysql基礎之mysql雙主(主主)架構


一、概念

  在企業中,數據庫高可用一直是企業的重中之重,中小企業很多都是使用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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM