前期準備
- 兩臺服務器,服務器使用的是 centos7
- mysql-5.7.24-linux-glibc2.12-x86_64 安裝包 使用是版本是 mysql-5.7.24
數據庫安裝
1,將 mysql 安裝包上傳到兩臺服務器上,我使用 xshell 作爲上傳工具
2,解壓安裝包
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
3,創建需要安裝的路徑,之後移動剛纔解壓的文件夾,同時重命名
mkdir /app #創建一個文件夾專門用來存放安裝的程序
mv mysql-5.7.24-linux-glibc2.12-x86_64/* /app/mysql #移動文件並重命名
4,創建用戶組、用戶、文件夾、賦權
groupadd mysql #創建用戶組
useradd -r -g mysql mysql #創建用戶 -r:建立系統賬號 -g:指定用戶組
cd /app/mysql #切換到安裝目錄
mkdir data #創建數據存放目錄
mkdir mysql-log #創建日誌存放目錄
mkdir mysql-log/err-log
mkdir mysql-log/slow-log
mkdir mysql-log/bin-log #主機需要此目錄
chown -R root:mysql . #將當前目錄以及字母裏,所有者改變爲 mysql,所屬組修改爲 mysql
chown -R mysql:mysql data
chown -R mysql:mysql mysql-log
5,配置 /etc/my.cnf
vi /etc/my.cnf
主機配置文件:
[mysqld]
port = 3306 #端口
basedir = /app/mysql #mysql安裝路徑
datadir = /app/mysql/data/ #mysql數據存放路徑
#日誌設置
log-error = /app/mysql/mysql-log/err-log/db-err.log #錯誤日誌路徑
slow-query-log-file = /app/mysql/mysql-log/slow-log/db-slow.log #慢SQL日誌路徑
long-query-time = 3 #怎樣纔算是慢sql,單位是秒
#開啓 binlog 同步
server_id = 0001 #一個集羣內的 MySQL 服務器 ID,全局唯一
log-bin = /app/mysql/mysql-log/bin-log/db-binlog #開啓 Binlog 並寫明存放日誌的位置
max-binlog-cache_size = 64M #binlog 最大能夠使用cache的內存大小
max-binlog-size = 1G #binlog 日誌每達到設定大小後,會使用新的 binlog 日誌
expire_logs_days = 15 #只保留最近15天的日誌
binlog-format = mixed #混合模式複製
innodb_flush_log_at_trx_commit = 2 #和 sync_binlog 控制MySQL磁盤寫入策略以及數據安全性
sync-binlog = 500 #控制數據庫的binlog刷到磁盤上去
#性能調優配置
innodb_buffer_pool_size = 24576M
max_connections = 5000
max_connect_errors = 6000
external-locking = FALSE
max_allowed_packet = 64M
join_buffer_size = 64M
sort_buffer_size = 2M
read_rnd_buffer_size = 16M
#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
從機配置文件:
[mysqld]
basedir = /app/mysql
datadir = /app/mysql/data
port = 3306
server_id = 0002 #這裏需要在集羣中保持唯一
#日誌設置
expire_logs_days = 15
long-query-time = 3
slow-query-log-file=/app/mysql/mysql-log/slow-log/db-slow.log
log-error=/app/mysql/mysql-log/err-log/db-err.log
#主從設置
replicate-do-db=db_test #需要從主庫同步的數據庫1
replicate-do-db=db_dev #需要從主庫同步的數據庫2
read_only=1 #只讀設置
#性能調優設置
innodb_buffer_pool_size = 24576M
max_connections = 5000
max_connect_errors = 6000
external-locking = FALSE
max_allowed_packet = 64M
join_buffer_size = 64M
sort_buffer_size = 2M
read_rnd_buffer_size = 16M
#SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
6,設置鏈接和服務
cp /app/mysql/support-files/mysql.server /etc/init.d/mysql # 可以使用service mysql start
ln -s /app/mysql/bin/mysql /usr/bin #任何路徑可以使用 mysql 命令
數據庫初始化
1,初始化數據庫
cd /app/mysql/bin/
./mysqld --defaults-file=/etc/my.cnf --user=mysql --initialize #初始化
2,查看密碼(初始化數據庫之後會生成一個 root 賬戶的默認密碼)
cat /app/mysql/mysql-log/err-log/db-err.log
3,啓動 mysql
service mysql start
4,登錄並修改 root 密碼
mysql -u root -p
set password = password('root');
flush privileges;
#如果需要 root 遠程連接,執行以下語句
use mysql;
update user set host = '%' where user = 'root';
flush privileges;
創建用戶並賦權
主機
#需要創建用於和從機“通信”的用戶,具有同步權限,後續操作需要
grant replication slave on *.* to 'copy'@'%' identified by 'copy';
flush privileges;
#主機可以創建一個用戶用於訪問和操作某些特定的庫,不應該讓應用直接使用 root 用戶. 這裏的 db_test 是創建的一個測試庫
grant all privileges on db_test.* to "app_user"@'%' identified by "app_user";
flush privileges;
從機
#需要創建用於“只讀”權限的用戶
grant select on db_test.* to 'readonly'@'%' identified by "readonly";
flush privileges;
主從同步啓動
主機
#獲得 master 二進制日誌文件名及位置
show master status
從機
stop slave; #暫停
reset slave; #重置
change master to master_host="主機IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #設置和主機同步的用戶信息,日誌文件信息
start slave; #啓動
show slave status \G #查看從機狀態,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes
驗證
主機和從機都創建數據庫 db_test
create database db_test
主機數據庫新增表和數據,驗證從機是否同步成功
可能出現的問題
未開啓防火牆端口,導致無法通過遠程軟件訪問到數據庫,navicat 提示 10038
#開啓防火牆 3306 端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent # centos7
firewall-cmd --reload
MySQL數據同步,出現Slave_SQL_Running:no和slave_io_running:no問題的解決方法
解決辦法如下:
依次執行:
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
start slave;
show slave status\G
如果是slave_io_running:no
解決辦法如下:
查看主服務器
show master status\G
在從服務器上查看
問題所在:發現Master_Log_File沒有對應。
出現Slave_IO_Running: No的機器上操作
依次執行:
slave stop;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
slave start;
show slave status\G
MHA集羣報錯:The slave I/O thread stops because master and slave have equal MySQL server UUIDs
問題提示主從使用了相同的server UUID,一個個的檢查:
檢查主從server_id
主庫:show variables like 'server_id';
從庫:show variables like 'server_id';
server_id不一樣,排除。
檢查主從狀態:
主庫:show master status;
從庫:
File一樣,排除。
最後檢查發現他們的auto.cnf中的server-uuid是一樣的。。。
vim /var/lib/mysql/auto.cnf #mysql安裝目錄下的data目錄裏
問題解決
停止從庫的mysqld服務,刪除他的auto.cnf文件,再啓動數據庫服務即可:
原理分析
我搭建集羣是先在虛擬機上搭好主庫環境,然後直接克隆鏡像當作從庫,這樣會導致主從庫生成相同的server-uuid。只需刪除一個server-uuid並重啓數據庫服務即可解決問題。