引言
最近又上線了一個項目,感覺自己這段時間收獲不少就想把自己做這個項目用的技術總結梳理一下。這個項目是我自己發起,領導們不是特別重視所以得到資源有限,資源有限的情況我只能選擇手動搭建數據庫環境,資源充足的情況下還是推薦使用類似PolarDB這種雲數據庫。原因很多,穩定性好、使用維護簡單、擴容方便、還提供一系列的sql審計工具。
環境准備
號 |
環境和軟件 |
版本 |
數量 |
1 |
centos |
8.3 |
3 |
2 |
mysql |
8.0.21 |
3 |
安裝命令
yum -y install mysql-server # 安裝mysql -y 的意思就是安裝過程如果需要輸入y 可以不用在輸入。 systemctl enable mysqld.service # 設置為開啟自啟 systemctl start mysqld.service # 開啟mysql服務
vim /etc/my.cnf # 編輯mysql配置文件 默認安裝是在/etc目錄下
skip-grant-tables --shared-memory # 設置跳過密碼 添加到[service-clinet]標簽下如下圖:
mysql -u root -p # 輸入命令 然后回車鍵跳過密碼登錄
ALTER USER 'root'@'localhost' IDENTIFIED BY 'jishuzhai'; #添加root用戶和密碼 注意localhost意味這不能遠程登錄可以換成% 這里不推薦 建議創建新的賬號遠程訪問
再次編輯 /etc/my.cnf文件注釋掉剛才跳過密碼那句話
systemctl restart mysqld.service # 重啟mysql服務
mysql安裝注意事項
安裝命令這里只供參考,不過個人推薦使用yum命令安裝,這樣簡單快捷而且方便擴容,不過有一點在生產環境要注意,那就是磁盤初始容量一定要大,最好是冗余的,即使初始化數據容量很小。主從會產生大量的日志文件,磁盤容量很小很容易導致磁盤被寫滿,那個時候再去擴容需要停機維護。另外數據庫備份推薦備份目錄為數據盤並且主從數據庫都備份。
創建遠程訪問的賬號
CREATE USER 'proxysql'@'%' IDENTIFIED BY 'jishuzhai'; #創建賬號 GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%' WITH GRANT OPTION; # 賦予權限 flush privileges; # 刷新權限
注意 讀取賬號只需要主數據庫一個就可以了,但是這里為了下一步使用proxysql做讀寫分離 所以每一個數據庫實例都創建了一個賬號。
創建測試數據庫
CREATE DATABASE brief_test;# 創建數據庫 CREATE TABLE `test` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵', `service_name` varchar(50) NOT NULL COMMENT '自增', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; # 創建測試表 INSERT INTO `test` VALUES (1, 'master'); INSERT INTO `test` VALUES (2, 'slave1'); INSERT INTO `test` VALUES (3, 'slave2'); # 添加測試數據
注意在主庫上創建 然后同步到所有從數據庫 主從開始前要保證數據一致 不然會綁定失敗。
編輯主從數據庫配置
登錄到主數據的服務器編輯數據庫配置文件
將以下配置添加到/etc/my.conf 文件中 如下圖
[mysqld] #配置主庫 server_id=1 #服務器id 不能重復 1,2,3,4這種以此類推 log_bin=master-bin log_bin-index=master-bin.index binlog-do-db=brief_test #需要同步的數據庫名稱 配置多個數據庫需要配置多個binlog-do-db 例如 binlog-do-db=brief_test1 binlog-do-db=brief_test2 binlog-do-db=brief_test3 這種方式配置
systemctl restart mysqld.service#重啟mysql服務
登錄到從數據庫將以下配置添加到/etc/my.conf文件中如下圖
[mysqld] server_id=2 #服務編號不能重復 read_only=on #設置為只讀
systemctl restart mysqld.service #重啟mysql服務
最后一步配置主從
(1)登錄主數據庫 執行 show master status 如下圖
記錄file 和 position的值從數據庫綁定要用的到
(2)登錄從數據庫執行:
CHANGE MASTER TO MASTER_HOST='172.16.102.7', #主數據庫ip MASTER_PORT=3306, #主數據庫端口 MASTER_USER='proxysql', #主數據庫復制賬號 MASTER_PASSWORD='jishuzhai', #主數據庫密碼 MASTER_LOG_FILE='master-bin.000001', #剛才從master數據庫查詢file值 MASTER_LOG_POS=156; #剛才從master數據庫查詢postition值
然后執行
start slave; #開啟slave
然后執行
show slave status;#查看slave狀態
正確結果如下圖:
常見問題:
show slave status結果slave_io_running 和 slave_sql_running值均為No或者一個為no,我遇到四種情況。
第一種情況是server_id 重復。Mysql 8.0 的 server_id 必須在[mysql]標簽下 而且必須在[clinet-servser]配置之前才生效,結果就導致我明明配置server_id 卻還是連接失敗。針對這種情況可以使用
select @@server_id #查詢數據庫的server_id 可以看到當前的id
第二種情況是uuid重復 使用虛擬機安裝好數據庫 然后克隆出slave1、slave2 這種情況uuid也是重復的 導致連接失敗。針對這種情況可以手動修改
vim /var/lib/mysql/auto.cnf 如下圖:
隨便更改一個字符保持uuid 不重復即可。
第三種情況 主從數據庫不一致 主要表現某個應用連接到從數據庫並且寫入了數據 從數據庫雖然設置了只讀 但是root權限的賬號可以寫入。這種情況最麻煩但是好處理。停止所有應用或者設置主數據庫鎖住 然后把主數據同步到從數據庫然后重新連接。
第四種情況 事物回滾導致的 這種情況比少但是好處理
使用以下命令:
STOP SLAVE #先執行關閉語句 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;#重置值 START SLAVE #打開語句
關於清理binary日志
主從會產生大量的日志文件 可以使用以下方式自動清理
show binary logs;#查詢日志 set GLOBAL binlog_expire_logs_seconds = 1296000 #設置日志過期時間為15天單位秒 超過15的會被自動清除 SELECT @@binlog_expire_logs_seconds #查詢是否生效 flush logs;# 立即生效