MySQL主主複製,mysql主從複製,MySQL+keepalived故障轉移。

實驗流程圖
這裏寫圖片描述
實驗環境:
本實驗,我用了三臺服務器
master01:172.16.1.50
master02:172.16.1.51
slave :172.16.1.53
VIP :172.16.1.52
操做系統:centos6.6mysql

實驗需求:
兩臺服務器作MySQL主主複製,一臺服務器作兩臺的從服務器。兩臺主服務器作故障轉移。web

實驗目的:
兩臺master數據庫服務器作主主複製,而且採用keepalived作高可用,一臺slave服務器分別和master的兩臺服務器作主從複製sql

實驗原理:
咱們知道,MySQL作主從複製須要開啓三個線程,master服務器要開啓I/O線程,而slave服務器須要開啓I/O線程和SQL線程。
首先,在slave服務器執行start slave命令開啓主從複製開關。數據庫

其次,slave服務器的I/O線程經過master服務器已經受權的用戶請求鏈接,而且請求從指定的lbin-log日誌文件的指定位置以後開始開始發送bin-log日誌內容。(指定位置是指change master 命令時候的內容)。centos

接着,master服務器接收到slave服務器的I/O線程的請求以後,master服務器上的I/O線程會根據salve服務器上的I/O線程請求的信息分批讀取指定的bin-log日誌文件指定位置以後的bin-log日誌信息,而後返回給slave服務器的I/O線程。服務器

而後,slave服務器的I/O線程獲取到master上的I/O線程發送的日誌文件、內容及位置點後,會將bin-log日誌內容依次寫到slave服務器的relay log(中繼日誌)文件的最末端。並將新的bin-log文件名和位置記錄到master-info文件中,以便於下一次讀取master服務器新bin-log日誌是可以告訴master服務器重新bin-log日誌的指定文件及位置開始請求新的bin-log日誌內容。socket

最後,slave服務器的SQL線程會實時檢測到本地的relay log中I/O線程新增長的日誌內容,而後及時地把relay log文件中的內容解析成SQL語句,並在自身slave服務器上按解析SQL語句的位置順序執行這些SQL語句,並在relay-log.info中記錄當前應用中繼日誌的文件名及位置點。tcp

實驗步驟
第一步:
首先開始搭建master服務器的主主複製
在master01服務器上的操做ide

#安裝MySQL數據庫
[root@MYSQL-master-01 ~] yum -y install mysql mysql-server mysql-devel mysql-libs

#爲了試驗方便,關閉防火牆,而且設置爲開機關閉
[root@MYSQL-master-01 ~] service iptables stop
[root@MYSQL-master-01 ~] chkconfig iptables off

#開啓MySQL服務
[root@MYSQL-master-01 ~] service mysqld restart

設置MySQL數據庫開機啓動
[root@MYSQL-master-01 ~] chkconfig mysqld on

#設置mysql root用戶的密碼
[root@MYSQL-master-01 ~]mysqladmin -uroot password 123456

#修改數據庫配置文件/etc/my.cnf,
[root@MYSQL-master-01 ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=master-1
server-id=50

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#保存退出

#重啓MySQL服務
[root@MYSQL-master-01 ~] service mysqld restart

#登陸mysql服務
[root@MYSQL-master-01 ~] mysql -uroot -p123456

#受權,容許172.16.1.51服務器上的master數據庫用戶經過密碼爲123456進行登陸
mysql> grant replication slave on *.* to 'master'@'172.16.1.51' identified by '123456';

#獲取master的bin-log文件名和pos數值,
mysql> show master status;

在master02服務器上的操做svg

#安裝MySQL數據庫
[root@MYSQL-master-02 ~] yum -y install mysql mysql-server mysql-devel mysql-libs

#爲了試驗方便,關閉防火牆,而且設置爲開機關閉
[root@MYSQL-master-02 ~] service iptables stop
[root@MYSQL-master-02 ~] chkconfig iptables off

#開啓MySQL服務
[root@MYSQL-master-02 ~] service mysqld restart
[root@MYSQL-master-02 ~] chkconfig mysqld on

#設置mysql root用戶的密碼
[root@MYSQL-master-02 ~]mysqladmin -uroot password 123456

#修改數據庫配置文件/etc/my.cnf,
[root@MYSQL-master-02 ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=master-2
server-id=51

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#保存退出

#重啓MySQL服務
[root@MYSQL-master-02 ~] service mysqld restart

#登陸mysql服務
[root@MYSQL-master-02 ~] mysql -uroot -p123456
mysql> slave stop;

#其中a和b爲master01上的bin-log文件名和pos的數值
mysql> change master to master_host='172.16.1.50',master_user='master',master_password='123456',master_log_file='a',master_log_pos=b;
mysql> slave start;

#查看slave的狀態,若是出現Slave_IO_Running和Slave_SQL_Running的狀態都爲 Yes,則表示以master01爲主,master02爲從的MySQL服務搭建成功,
mysql> show slave status\G;
……………………………………………………………………………………………………………………
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
……………………………………………………………………………………………………………………

接下來開始搭建以master02爲主,master01爲從。

在master02服務器的操做

#登陸mysql服務
[root@MYSQL-master-02 ~]  mysql -uroot -p123456

#受權,容許172.16.1.50服務器上的master數據庫用戶經過密碼爲123456進行登陸
mysql> grant replication slave on *.* to 'master'@'172.16.1.50' identified by '123456';

#獲取master的bin-log文件名和pos數值,
show master status;

而後在master01上的操做

#登陸mysql服務
[root@MYSQL-master-01 ~]  mysql -uroot -p123456
mysql> slave stop;
#其中a和b爲master01上的bin-log文件名和pos的數值
mysql> change master to master_host='172.16.1.51',master_user='master', master_password='123456',master_log_file='a',master_log_pos=b;
mysql> slave start;

#查看slave的狀態,若是出現Slave_IO_Running(會出現延遲)和Slave_SQL_Running的狀態都爲 Yes,則表示以master02爲主,master01爲從的MySQL服務搭建成功,
mysql> show slave status\G;
……………………………………………………………………………………………………………………
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
……………………………………………………………………………………………………………………

至此,master的主主複製環境成功搭建

第二步:
搭建以slave服務器爲從,master服務器爲主的MySQL主從複製
重點說明
因爲MySQL不能作多主一從,因而我在slave建立兩個實例,端口爲330七、3308,其對應關係:master01<=>slave3307,master02<=>slave3308.
slave服務器上的操做

#安裝MySQL數據庫
[root@MYSQL-slave-01 ~] yum -y install mysql mysql-server mysql-devel mysql-libs

#爲了試驗方便,關閉防火牆,而且設置爲開機關閉
[root@MYSQL-slave-01 ~] service iptables stop
[root@MYSQL-slave-01 ~] chkconfig iptables off

#開啓MySQL服務
[root@MYSQL-slave-01 ~] service mysqld restart

#設置MySQL數據庫開機啓動
[root@MYSQL-slave-01 ~] chkconfig mysqld on

#設置mysql root用戶的密碼
[root@MYSQL-slave-01 ~]mysqladmin -uroot password 123456

#修改數據庫配置文件/etc/my.cnf,,添加兩個實例名字爲mysqld50,mysqld51,端口分別爲3307,3308。
[root@MYSQL-slave-01 ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
port=3306

[mysqld50]
datadir=/data/3307/
socket=/data/3307/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
port=3307
log-bin=slave
server-id=53
[mysqld51]
datadir=/data/3308/
socket=/data/3308/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
port=3308
log-bin=slave
server-id=54
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#保存退出

#建立實例的目錄,而且更改主屬爲mysql
[root@MYSQL-slave-01 ~]  mkdir -p /data/{3307,3308}
[root@MYSQL-slave-01 ~]  chown -R mysql.mysql /data/

#初始化實例
[root@MYSQL-slave-01 ~]  mysql_install_db --datadir=/data/3307/
[root@MYSQL-slave-01 ~]  mysql_install_db --datadir=/data/3308/

#開啓實例
[root@MYSQL-slave-01 ~]  mysqld_multi --defaults-file=/etc/my.cnf start 50
[root@MYSQL-slave-01 ~]  mysqld_multi --defaults-file=/etc/my.cnf start 51

#查看實例,能夠看到兩個實例is running
[root@MYSQL-slave-01 ~]# mysqld_multi --defaults-extra-file=/etc/my.cnf report
Reporting MySQL servers
MySQL server from group: mysqld50 is running
MySQL server from group: mysqld51 is running

#查看端口,發現有三個端口3306,3307,3308都開啓了
[root@MYSQL-slave-01 ~]# ss -tunlp | grep 330
tcp    LISTEN     0      50                     *:3306                  *:*      users:(("mysqld",2268,10))
tcp    LISTEN     0      50                     *:3307                  *:*      users:(("mysqld",2039,11))
tcp    LISTEN     0      50                     *:3308                  *:*      users:(("mysqld",2064,11))

#爲兩個實例設置root的登陸密碼
[root@MYSQL-slave-01 ~]  mysqladmin -uroot -S /data/3307/mysql.sock password 123456
[root@MYSQL-slave-01 ~]  mysqladmin -uroot -S /data/3308/mysql.sock password 123456

分別在master01和master02上進行對172.16.1.53進行受權用戶

#登陸master01服務器的數據庫
[root@MYSQL-master-01 ~] mysql -uroot -p123456
mysql> grant replication slave on *.* to 'slave'@'172.16.1.53' identified by '123456';

#查看master的bin-log文件名和pos數值
mysql> show master status;

#登陸master02服務器的數據庫
[root@MYSQL-master-01 ~] mysql -uroot -p123456
mysql> grant replication slave on *.* to 'slave'@'172.16.1.53' identified by '123456';

#查看master的bin-log文件名和pos數值
mysql> show master status;

在slave服務器上,以mysqld50實例(從)對應master01服務器(主)作主從複製,以mysqld51實例(從)對應master02服務器(主)作主從複製

[root@MYSQL-slave-01 ~]# mysql -uroot -S /data/3307/mysql.sock -p123456
mysql> slave stop;
mysql> reset slave;
#其中a和b爲master01上的bin-log文件名和pos的數值
mysql> change master to master_host='172.16.1.50',master_user='slave',master_password='123456',master_log_file='a',master_log_pos=b;
mysql> slave start;
#查看slave的狀態,若是出現Slave_IO_Running(會出現延遲)和Slave_SQL_Running的狀態都爲 Yes,則表示以master01爲主,slave的mysqld50實例爲從的MySQL主從複製服務搭建成功。
mysql> show slave status\G;
……………………………………………………………………………………………………………………
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
……………………………………………………………………………………………………………………

[root@MYSQL-slave-01 ~]# mysql -uroot -S /data/3308/mysql.sock -p123456
mysql> slave stop;
mysql> reset slave;
#其中a和b爲master01上的bin-log文件名和pos的數值
mysql> change master to master_host='172.16.1.51',master_user='slave',master_password='123456',master_log_file='a',master_log_pos=b;
mysql> slave start;
#查看slave的狀態,若是出現Slave_IO_Running(會出現延遲)和Slave_SQL_Running的狀態都爲 Yes,則表示以master02爲主,slave的mysqld51實例爲從的MySQL主從複製服務搭建成功。
mysql> show slave status\G;
……………………………………………………………………………………………………………………
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
……………………………………………………………………………………………………………………

至此,slave和master的主從複製搭建成功

第三步:
搭建keepalived環境,實現兩臺master的故障轉移

[root@MYSQL-master-01 ~]# yum -y install keepalived
[root@MYSQL-master-01 ~]# service keepalived restart
[root@MYSQL-master-01 ~]# chkconfig keepalived on
[root@MYSQL-master-01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    9194973x@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id master01
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.1.52/24 dev eth0 label eth0:1
    }
}

master02服務器上的操做:

[root@MYSQL-master-02 ~]# yum -y install keepalived
[root@MYSQL-master-02 ~]# service keepalived restart
[root@MYSQL-master-02 ~]# chkconfig keepalived on
[root@MYSQL-master-02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    9194973x@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id master02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.1.52/24 dev eth0 label eth0:1
    }
}
[root@MYSQL-master-02 ~]# service keepalived restart

至此,整個實驗完成,本實驗僅供學習交流。

相關文章
相關標籤/搜索