mysql主從

自打接觸運維以來,影響比較深的,一個雲服務,另外一個是容器,在不少東西使用起來愈來愈方便快捷的同時,有些最基本的東西老是不變的,因而有了這篇在雲服務器上經過建立容器搭建MySQL主從。mysql

且怒且悲且狂哉,是人是鬼是妖怪。    ——《悟空》linux

1、前言

MySQL 主從又叫作 replication、AB 複製。sql

意思是 A、B 兩臺服務器作主從配置以後,在 A 上寫數據,另一臺 B 也會跟着寫數據,二者數據是實時同步的。docker

MySQL 主從是基於 binlog 的,主庫上須開啓binlog才能進行主從同步。大體步驟以下:數據庫

一、主庫將更改操做記錄到 binlog 裏面;centos

二、從庫將主庫的 binlog 事件(sql語句)同步到本機上並記錄在relaylog(中繼日誌)中;bash

三、從庫根據 relaylog 裏面的 sql 語句按順序執行。服務器

主服務器上有一個 log dump 的線程,用來和從的I/O 線程傳遞 binlog。網絡

從上有兩個線程,其中 I/O 線程用來同步主上的 binlog 並生成 relaylog,另一個 sql 線程則用來把 relaylog 裏面的 sql 語句落地。運維

MySQL主從一類用做備份,一類爲了將從庫用做只讀庫,減輕主庫壓力。

 

2、基礎環境

2.1 下載二進制文件

http://mirrors.sohu.com/mysql/

這裏下載的是 5.6 版本的當作實驗。

2.2 建立一主一從

在 docker 環境的支持下,基於 centos 鏡像建立兩個獨立環境,一臺做爲主(mysql_master),一臺做爲從(mysql_slave)。

docker run --name=mysql_master -itd -p 3307:3306 -p 27:22 -v /usr/local/src/:/opt  docker.io/centos

docker run --name=mysql_slave -itd -p 3308:3306 -p 28:22 -v /usr/local/src/:/opt  docker.io/centos

通訊地址

mysql_master:172.17.0.4

mysql_slave   :172.17.0.3

 

2.3 分別在主從上安裝 mysql

一、登陸主服務器

docker exec -it mysql_master /bin/bash

二、解壓二進制文件

[root@0560232277b8 opt]# tar zxf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

三、將文件進行重命名

 

[root@0560232277b8 local]# mv mysql-5.6.41-linux-glibc2.12-x86_64 mysql

四、定義一下alias

 

[root@0560232277b8 local]# alias 'mysql=/usr/local/mysql/bin/mysql'

五、添加一個mysql用戶

 

useradd mysql

六、接着對mysql進行初始化,進入到mysql二進制目錄下

 

[root@0560232277b8 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file or directory

這裏咱們可能會發現沒有perl,安裝一下便可

yum install perl  perl-devel autoconf  perl-Data-Dumper  libaio numactl-libs -y

最後初始化完成

 

[root@0560232277b8 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/

七、修改配置

接着咱們須要修改一下配置文件my.cnf,將數據文件目錄 datadir 修改爲咱們配置的目錄

[mysqld]
datadir=/usr/local/mysql/data/
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mysql/mariadb.log
pid-file=/var/run/mysql/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

八、拷貝啓動文件

而後咱們能夠拷貝一下啓動文件,修改啓動文件中相應的配置

[root@0560232277b8 mysql]# cp support-files/mysql.server /etc/init.d/mysqld

定義好 basedir 和 datadir 地址

basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

在啓動過程當中可能須要建立一些不存在的文件,並給相應的目錄賦予mysql全部者及寫的權限

mkdir -p /var/lib/mysql
chown -R mysql. /var/lib/mysql
mkdir -p  /var/log/mysql  
chown -R mysql. /var/log/mysql
chmod -R 755 /usr/local/mysql/data

九、主庫啓動成功

 

[root@0560232277b8 mysql]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

十、從庫啓動成功

 

[root@40deaafc5701 mysql]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/40deaafc5701.err'.
. SUCCESS!

 

注:在登陸mysql時可能會出現sock問題

 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

作一個軟鏈接或者修改下配置文件 my.cnf 路徑便可

 

[root@0560232277b8 mysql]# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

 

3、主庫配置

3.1 修改配置

在配置文件 /etc/my.cnf 中添加 server-id 和 log_bin

 

server-id=4
log_bin=mysql_MS           # 只需在主上配置開啓 binlog

3.2 重啓 mysql

[root@0560232277b8 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

而後咱們就會看到在data目錄下生產了兩個文件,一個是binlog文件,一個是索引文件

 

-rw-rw---- 1 mysql mysql      120 Nov 24 05:43 mysql_MS.000001
-rw-rw---- 1 mysql mysql       18 Nov 24 05:43 mysql_MS.index

3.3 導入測試數據

咱們建立一個數據庫,導入一些數據到新建的庫中

[root@0560232277b8 /]# /usr/local/mysql/bin/mysql  -uroot -p jumpserver </opt/jumpserver.sql

接着能夠查看到新庫中的數據

mysql> use jumpserver;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------+
| Tables_in_jumpserver |
+----------------------+
| age                  |
| school               |
| user                 |
+----------------------+
3 rows in set (0.00 sec)

3.4 建立數據同步用戶

建立用做同步數據的用戶

 

mysql> grant replication slave on *.* to 'repl'@'172.17.0.3' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

暫時鎖定表的寫入操做

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)

查看 master 狀態

 

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

 

4、從庫配置

4.1 查看狀態

登陸到從庫服務器查看mysql狀態

 

[root@40deaafc5701 /]# /etc/init.d/mysqld status
 SUCCESS! MySQL running (491)

4.2 修改配置

修改配置文件,添加server-id(不能和master一致)

 

server-id=3

將主庫備份的數據庫文件導入到從庫中

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


[root@40deaafc5701 /]# mysql -uroot -p jumpserver </opt/jumpserver.sql

4.3 中止slave

 

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

4.4 配置鏈接到主庫

 

mysql> change master to master_host='172.17.0.4',master_user='repl',master_password='123456',master_log_file='mysql_MS.000001',master_log_pos=2872;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

4.5 開啓slave

 

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

4.6 解鎖主庫上的表

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

4.7 查看 slave 狀態

在從庫上查看狀態是否成功

 

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.4
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_MS.000001
          Read_Master_Log_Pos: 3170
               Relay_Log_File: 40deaafc5701-relay-bin.000002
                Relay_Log_Pos: 282
        Relay_Master_Log_File: mysql_MS.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
··· ··· ··· ···
··· ··· ··· ···

主要查看 Slave_IO_Running 和 Slave_SQL_Running 狀態是否成功,在這裏也能夠看到 master 的相關信息。

 

 

注:若是Slave_IO_Running 處於connecting狀態,能夠從如下三方面檢查配置

 

  • 網絡不通
  • 密碼不對
  • pos不對

 

檢查這三個地方根據 master 的狀態變化從新配置鏈接便可。

 

5、測試同步

在主庫上刪除一張 age 表

mysql> show tables;
+----------------------+
| Tables_in_jumpserver |
+----------------------+
| age                  |
| school               |
| user                 |
+----------------------+
3 rows in set (0.00 sec)

mysql> 
mysql> 
mysql> drop table age;
Query OK, 0 rows affected (0.01 sec)

在從庫上也同步顯示 age 表已刪除

mysql> show tables;
+----------------------+
| Tables_in_jumpserver |
+----------------------+
| age                  |
| school               |
| user                 |
+----------------------+
3 rows in set (0.00 sec)

mysql> show tables;
+----------------------+
| Tables_in_jumpserver |
+----------------------+
| school               |
| user                 |
+----------------------+
2 rows in set (0.00 sec)
相關文章
相關標籤/搜索