mysql 主主架構,多入口 互為備份


,中小企業很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。因此,如果是雙主或者多主,就會增加mysql入口,增加高可用。不過多主需要考慮自增長ID問題,這個需要特別設置配置文件,比如雙主,可以使用奇偶,總之,主之間設置自增長ID相互不沖突就能完美解決自增長ID沖突問題。

MySQL雙主(主主)架構方案思路是:

1.兩台mysql都可讀寫,互為主備,默認只使用一台(masterA)負責數據的寫入,另一台(masterB)備用;

2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;

3.兩台主庫之間做高可用,可以采用keepalived等方案(使用VIP對外提供服務);

4.所有提供服務的從服務器與masterB進行主從同步(雙主多從);

5.建議采用高可用策略的時候,masterA或masterB均不因宕機恢復后而搶占VIP(非搶占模式);

這樣做可以在一定程度上保證主庫的高可用,在一台主庫down掉之后,可以在極短的時間內切換到另一台主庫上(盡可能減少主庫宕機對業務造成的影響),減少了主從同步給線上主庫帶來的壓力;

但是也有幾個不足的地方:

1.masterB可能會一直處於空閑狀態(可以用它當從庫,負責部分查詢);

2.主庫后面提供服務的從庫要等masterB先同步完了數據后才能去masterB上去同步數據,這樣可能會造成一定程度的同步延時;

架構的簡易圖如下:

mark

主主環境(這里只介紹2台主的配置方案):

1.CentOS 7.3 64位 2台:masterA(192.168.59.132),masterB(192.168.59.133)

2.官方Mysql5.6版本


搭建過程:

1.安裝MySQL服務

  1. 下載免編譯的二進制包
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
  1. 查看並解壓:
# ls # tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
  1. 移動並重命名; 進入新的目錄;
# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql # cd /usr/local/mysql
  1. 增加一個mysql的用戶; 創建一個data的目錄;
# useradd mysql # mkdir -p /data/mysql # chown -R mysql:mysql /data/mysql
  1. 初始化配置;
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

在安裝上一步中遇到了些錯誤,要是還沒有解決問題。直接google或者baidu吧!

等待完成后一個非常重要的操作是檢查有沒有成功~

# echo $? (0 之外的任何值都是錯誤)
  1. 配置–拷貝模板到指定目錄下並重命名!
# cp support-files/my-default.cnf /etc/my.cnf
  1. 制作啟動腳本
[root@zhdy-02 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@zhdy-02 mysql]# vi /etc/init.d/mysqld vim編輯下面兩行basedir和datadir配置 basedir=/usr/local/mysql datadir=/data/mysql [root@zhdy-02 mysql]# chmod 755 /etc/init.d/mysqld
  1. 啟動服務並設為開機啟動
[root@zhdy-02 mysql]# chkconfig --add mysqld [root@zhdy-02 mysql]# chkconfig --list [root@zhdy-02 mysql]# /etc/init.d/mysqld start 或者 : [root@zhdy-02 mysql]# service mysqld start
  1. 查看啟動狀態:
[root@zhdy-02 mysql]# ps aux |grep mysql [root@zhdy-02 mysql]# netstat -lntp |grep mysql

2. 配置主主同步

2.1 配置 /etc/my.cnf

masterA(192.168.59.132) 配置文件

[root@zhdy-04 mysql]# vim /etc/my.cnf server-id=132 log-bin=mysql-bin auto-increment-increment=2 auto-increment-offset=1 log-slave-updates

重啟mysql:

[root@zhdy-04 mysql]# /etc/init.d/mysqld restart

masterB(192.168.59.133) 配置文件

server-id=133 log-bin=mysql-bin auto-increment-increment=2 auto-increment-offset=2 log-slave-updates

重啟:

[root@zhdy-04 mysql]# /etc/init.d/mysqld restart

auto-increment 兩行的配置,使 masterA字段產生的數值是 奇數1,3,5,7 下面的masterB 產生的是 2,4,6,8 等,這樣會避開雙主 id 重復的問題。

2.2 添加主從同步賬戶

masterA上:

[root@zhdy-04 mysql]# export PATH=$PATH:/usr/local/mysql/bin/ [root@zhdy-04 mysql]# vim /etc/profile [root@zhdy-04 mysql]# source /etc/profile [root@zhdy-04 mysql]# mysql -uroot mysql> grant replication slave on *.* to 'repl'@'192.168.59.133' identified by 'zhangduanya'; mysql> flush privileges;

masterB上:

[root@zhdy-05 mysql]# export PATH=$PATH:/usr/local/mysql/bin/ [root@zhdy-05 mysql]# vim /etc/profile [root@zhdy-05 mysql]# source /etc/profile [root@zhdy-05 mysql]# mysql -uroot mysql> grant replication slave on *.* to 'repl'@'192.168.59.132' identified by 'zhangduanya'; mysql> flush privileges;

2.2 查看主庫的狀態

masterA上:

mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 208 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

masterB上:

mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

2.3 配置同步信息:

masterA上:

mysql> change master to master_host='192.168.59.133',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000001',master_log_pos=120;

mysql> start slave;

mysql> show slave status\G


*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.59.133 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 120 Relay_Log_File: zhdy-04-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

masterB上:

mysql> change master to master_host='192.168.59.132',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000001',master_log_pos=208;

mysql> start slave;

mysql> show slave status\G


*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.59.132 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 208 Relay_Log_File: zhdy-05-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

我在開始的時候也說了,我用的是測試環境,可以保證沒數據寫入,否則需要的步驟是:

先masterA鎖表-->masterA備份數據-->masterA解鎖表 -->masterB導入數據-->masterB設置主從-->查看主從。

 

3.測試主主同步

3.1 在masterA上創建一個數據庫測試同步效果

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

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | asd | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)

3.2 到masterB查看是否已經同步創建數據庫

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | asd | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)

已經成功!!!


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com