centos7上mariadb10.3多例項安裝部署及主從複製
mariaDB是開源的資料庫,是mysql的衍生版。
Mariadb官方: https://mariadb.com/
os:centos7
mariadb:10.3
yum安裝實現。
一個版本mysql通過多個埠實現
規劃3個例項的埠:3306/3307/3308。
將各自的配置檔案、日誌檔案、pid、socket單獨存放。
一、yum安裝
採用 yum安裝,centos7預設的yum源是mariadb5.5版本,所以需要修改yum倉庫配置檔案,以安裝10.3.0版本的mariadb
vim /etc/yum.repos.d/CentOS-Base.repo
在倉庫配置檔案中新增如下行
# MariaDB 10.3 CentOS repository list - created 2019-01-07 01:34 UTC # [mariadb] name = MariaDB baseurl = gpgkey= gpgcheck=1
完成後,更新yum快取,然後檢查maradb是否已經更換
yum info MariaDB-server
確認後,即可使用yum進行安裝
yum install MariaDB-server
二、配置
三個資料庫例項都放在獨立的目錄中
mkdir -pv /data/{3306,3307,3308}/{etc,socket,pid,log,data}
完成後的目錄結構如下所示:
確認mysql的使用者賬戶是否已經被建立
getent passwd mysql
修改資料庫的許可權和組資訊
chown -R mysql.mysql /data
生成各個例項資料庫檔案
mysql_install_db --datadir=/data/3306/data --user=mysql --basedir=/usr mysql_install_db --datadir=/data/3307/data --user=mysql --basedir=/usr mysql_install_db --datadir=/data/3308/data --user=mysql --basedir=/usr
根據3個不同的例項準備3個配置檔案,用/etc/my.cnf 當模板:
將配置檔案考到各自的檔案下:
cp /etc/my.cnf /data/3306/etc/ cp /etc/my.cnf /data/3307/etc/ cp /etc/my.cnf /data/3308/etc/
修改各自例項的配置檔案,如下所示:
vim /data/3306/etc/my.cnf
[mysqld] port=3306 #手動新增部分 datadir=/data/3306/data socket=/data/3306/socket/mysql.sock [mysqld_safe] log-error=/data/3306/log/mariadb.log pid-file=/data/3306/pid/mariadb.pid #!includedir /etc/my.cnf.d #需要註釋掉
其他例項3307,3308的配置檔案也按上修改
注意,配置檔案中,可以有很多優化,可以查詢資料後製定
三、準備啟動指令碼
首先確認停止mariadb服務
systemctl stop mariadb
在/data/3306/路徑下建立mysql啟動指令碼,指令碼內容如下:
touch /data/3306/mysql vim /data/3306/mysql #!/bin/bash port=3306 #設定例項埠號 mysql_user="root" mysql_pwd="[email protected]" #設定資料庫密碼 cmd_path="/usr/bin" mysql_basedir="/data" mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock" function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null & else printf "MySQL is running...\n" exit fi } function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown fi } function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n" esac
完成後的目錄結構如下:
注意修改3307,3308各個例項的指令碼
cp /data/3306/mysqld /data/3307/(配置檔案埠改為port=3307) cp /data/3306/mysqld /data/3308/(配置檔案埠改為port=3308)
設定合適的許可權
chmod 700 /data/3306/mysqld chmod 700 /data/3307/mysqld chmod 700 /data/3308/mysqld
啟動指令碼
./ mysqld start
檢查服務啟動狀態
可見 各個埠都是正常開啟
測試連線
需要用sock指定檔案連結到 mysql
mysql -S /data/3306/socket/mysql.sock mysql -S /data/3307/socket/mysql.sock mysql -S /data/3308/socket/mysql.sock
通過檢視埠判斷進入哪個例項
show variables like 'port';
設定密碼
mysqladmin -uroot -S /data/3306/socket/mysql.sock password '[email protected]'
此時進入3306例項資料庫
mysql -S /data/3306/socket/mysql.sock -u root -p
四、主從複製
主從複製是一個非同步的複製過程,資料從一個Mysql資料庫複製到另一個mysql資料庫,在主和從之間實現整個主從複製使的過程是由三個執行緒參與完成的。
其中有兩個執行緒在從端,另外一個執行緒在主端。
要實現主從複製,首先必須開啟master端的binlog記錄功能,否則無法實現。整個主從複製過程就是從端從主端獲取binlog日誌,然後再到slave上以相同的順序獲取binlog日誌中所記錄的各種
SQL操作。
要開啟binlog記錄功能,可通過配置檔案my.cnf中的mysqld模組增加log-bin引數選項來實現。
主從複製原理
從庫生成兩個執行緒,一個I/O執行緒,一個SQL執行緒;
i/o執行緒去請求主庫 的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 檔案中;
主庫會生成一個 log dump 執行緒,用來給從庫 i/o執行緒傳binlog;
SQL 執行緒,會讀取relay log檔案中的日誌,並解析成具體操作,來實現主從的操作一致,而最終資料一致;
主從複製重點:
1)主從複製是非同步的邏輯的sql語句級的複製
2)複製時,主庫有一個I/O執行緒,從庫有有兩個執行緒,即I/O和SQL執行緒。
3)實現主從複製的必要條件是主庫需要開啟binlog功能
4)作為複製的所有mysql節點的server-id都不能相同
5)binlog檔案只記錄對資料庫有更改的sql語句,不記錄任何查詢語句。
以本機單機資料庫多例項環境測試主從複製
主庫於從庫IP資訊如下:
主庫 3306
從庫1 3307
從庫2 3308
4.1設定server-id值並開啟binlog功能引數
修改主庫配置檔案my.cnf,按照如下修改兩個引數
vim /data/etc/my.cnf [mysqld] server-id =1 #用於同步的每臺機器或者例項server-id都不能相同 log-bin = /data/3306/mysql-bin #注意,只需要主庫設定即可,從庫不需要設定此引數
說明:
引數要放在my.cnf的[mysqld]模組下
server-id的值不能相同
引數不能重複
修改完成後重啟資料庫
/data/3306/mysql restart
登陸資料庫,檢查引數的更改情況,如下:
mysql -S /data/3306/socket/mysql.sock -u root [email protected] show variables like 'server_id'; show variables like 'log_bin';
按照這個方法檢查其他例項資料庫
4.2主庫建立用於主從複製的賬號
從庫想要和主庫同步,必須有一個可以連線主庫的賬號,並且這個賬號是主庫上建立的,許可權是執行主庫連線並同步資料庫。
登陸主庫後,建立用於從庫複製的賬號rep
grant replication slave on *.* to 'rep'@'172.31.208.%' identified by '[email protected]'; flush privileges;
檢查主庫rep賬號
4.3實現對主資料庫鎖表只讀
對主資料庫鎖表只讀
flush table with read lock;
檢視主庫狀態
鎖表後,匯出主庫資料(新開一個ssh連線)
mkdir /data/backup -p mysqldump -uroot -p'[email protected]' -S /data/3306/socket/mysql.sock --events -A -B |gzip >/data/backup/mysql_bak.$(date +%F).sql.gz
為了確保匯出資料期間,資料庫沒有資料插入,匯出主庫完畢後可以再次檢查主庫狀態資訊,結果如下:
可以看到主庫沒有資料寫入
完成主庫匯出後,解鎖主庫,恢復可寫
unlock tables;
完成匯出後,則可以使用mysqldump將主庫資料備份到從庫上
4.4從庫上配置
資料庫的server-id一般在一套主從複製體系內時唯一的,從庫的server-id需要和主庫和其他從庫的不同,並且要註釋掉從庫的binlog引數配置,如果從庫不做級聯複製,並且不作為備份作用,則不需要開啟binlog,開啟反而會增加從庫磁碟I/O壓力。
但是有兩種情況需要開啟從庫的binlog記錄功能,記錄資料庫更新的SQL語句。
1)A-B-C級聯同步,中間的B資料庫服務,需要開啟binlog記錄功能
2)在從庫做資料庫備份要開啟binlog記錄功能,因為資料庫備份必須要有全備和binlog日誌,才是完成的備份。
完成從庫3307的配置檔案修改後,檢查從庫引數改變情況
使用mysqldump命令將主庫備份檔案恢復到從庫
gzip -d mysql_bak.2019-01-07.sql.gz mysql -uroot [email protected] -S /data/3307/socket/mysql.sock <mysql_bak.2019-01-07.sql
4.5 主從庫同步
從庫的配置資訊如下:
CHANGE MASTER TO MASTER_HOST='172.31.208.81', #主庫ip MASTER_PORT=3306, #主庫埠 MASTER_USER='rep', #主庫上的複製許可權使用者rep MASTER_PASSWORD='[email protected]', #rep使用者密碼 MASTER_LOG_FILE='mysql-bin.000001', #show master status時檢視到的二進位制檔名稱,注意不能多空格 MASTER_LOG_POS=648; #show master status時看到的二進位制日誌偏移量,注意不能多空格
也可以按照如下方式配置從庫連線主資料庫進行配置
實際上,以上操作資訊實際上是寫入從庫新的master.info檔案中
啟動從庫主從複製開關,並檢視複製狀態
mysql -uroot [email protected] -S /data/3307/socket/mysql.sock -e "start slave;" mysql -uroot [email protected] -S /data/3307/socket/mysql.sock -e "show slave status\G;"
主從複製是否成功,最關鍵的是下面的3項狀態引數
mysql -uroot [email protected] -S /data/3307/socket/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"
說明:
Slave_IO_Running :IO執行緒狀態,IO執行緒負責從庫到主庫讀取binlog日誌,並寫入從庫的中繼日誌,狀態為yes表示IO工作征程
Slave_SQL_Runing :SQL執行緒狀態,SQL執行緒負責讀取中繼日誌中的資料並轉換為SQL 語句到從資料庫,狀態為YES 表示SQL執行緒工作正常
Seconds_Behind_Master: 複製過程中從庫比主庫的延遲秒數
4.6總結
1、主庫配置log-bin和server-id引數,從庫只用配置 server-id,配置完成後重啟資料庫
2、主庫增加同步使用者賬號,例如rep 授權 repliaction slave許可權
3、登陸主庫,整庫鎖表flush table with read lock,檢查show master status 檢視binlog的位置狀態
4、同步之前,備份主庫,可以使用mydump匯出到指定位置
5、完成主庫匯出後,執行unlock tables解鎖主庫
6、把主庫匯出的資料恢復到從庫
7、根據主庫show master status 檢視的binlog位置狀態,從庫執行change master to 語句
8、從庫開啟複製開關,執行start slave;
9 、從庫show slave status\G,檢查同步狀態