基於MGR方式搭建MySQL8.0一主多從集群


MySQL8集群搭建——基於MGR方式

說明:此集群搭建為單主模式,即一主多從

0、前置工作

0.1、主、從服務器信息

主機名
操作系統
HostName映射
192.168.91.131
CentOS7
master
192.168.91.132
CentOS7
node1
192.168.91.133
CentOS7
node2

0.2、設置HostName與IP映射信息

1> 按照上面列表信息,修改IP地址對應的HostName,登錄每一個服務器,執行如下命令修改為對應的映射

vi /etc/hostname

2> 在每一個服務器下,執行如下命令,在hosts中添加IP與HostName映射的綁定關系

vi /etc/hosts

添加配置信息如下:

192.168.91.131 master 192.168.91.132 node1 192.168.91.133 node2

0.3、重啟服務器,使配置生效

init 6

1、安裝MySQL8.0

說明:

i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器

ii> MySQL安裝版本為:8.0.23

iii> 切換為 root 用戶進行如下操作,切換root用戶命令如下

su root

輸入root對應的密碼,即可完成切換

1.1、查找是否安裝MySQL

rpm -qa|grep mysql

若安裝有舊版本的MySQL,可參考如下方式進行卸載

1.1.1、rpm安裝方式卸載

rpm -e --nodeps mysql-XXXXXXXXX

說明:此處 XXXXXXXX 值為mysql相關的安裝包,請注意刪除所有mysql相關的安裝包

1.1.2、二進制包安裝方式卸載

# 停掉mysql systemctl stop mysqld.service # 查看狀態 systemctl status mysqld.service # 查找mysql find / -name mysql # 刪除查詢出來的所有MySQL相關文件 rm -rf XXXXXX # 查看和刪除mysql用戶 id mysql userdel mysql # 刪除配置文件 rm -f /etc/my.cnf

1.2、查看並卸載mariadb

1> 查看 mariadb 的安裝包

rpm -qa | grep mariadb

2> 卸載mariadb

rpm -e XXXXXXXX --nodeps

說明:此處 XXXXXXXX 值為mariadb相關的安裝包,請注意刪除所有mariadb相關的安裝包

1.3、安裝MySQL8.0

1> 在/usr/local目錄下創建mysql文件夾,通過ls查看目錄結構

cd /usr/local mkdir mysql ls

2> 進入到創建的mysql文件夾中,下載mysql安裝包

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.23-1.el7.x86_64.rpm-bundle.tar

說明:此處MySQL安裝版本為:8.0.23

3> 在mysql文件夾中,解壓下載的MySQL安裝包

tar -xvf mysql-8.0.23-1.el7.x86_64.rpm-bundle.tar

4> 在當前文件夾中,安裝 common,libs,client,server

rpm -ivh mysql-community-common-8.0.23-1.el7.x86_64.rpm --nodeps --force rpm -ivh mysql-community-libs-8.0.23-1.el7.x86_64.rpm --nodeps --force rpm -ivh mysql-community-client-8.0.23-1.el7.x86_64.rpm --nodeps --force rpm -ivh mysql-community-server-8.0.23-1.el7.x86_64.rpm --nodeps --force

 5> 在當前mysql文件夾下,執行如下命令,檢查mysql安裝情況

rpm -qa | grep mysql

2、配置MySQL8.0

說明:

i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器

ii> 切換為 root 用戶進行如下操作,切換root用戶命令如下

su root

輸入root對應的密碼,即可完成切換

2.1、初始化和配置MySQL

在當前mysql文件夾下,執行如下命令

mysqld --initialize chown mysql:mysql /var/lib/mysql -R
# 啟動MySQL systemctl start mysqld.service
# 設置MySQL自啟動 systemctl enable mysqld.service

說明:

# MySQL相關命令 # 1、啟動MySQL systemctl start mysqld.service # 2、停止MySQL systemctl stop mysqld.service # 3、重啟MySQL systemctl restart mysqld.service # 4、查看MySQL狀態 systemctl status mysqld.service # 5、設置MySQL自啟動 systemctl enable mysqld.sercice # 6、查看MySQL是否自啟動 systemctl list-unit-files|grep mysqld.service

2.2、查看並復制MySQL初始密碼

在當前mysql文件夾下,執行如下命令

cat /var/log/mysqld.log | grep password

2.3、 登錄MySQL

mysql -uroot -p

說明:此處MySQL的密碼為上一步的初始密碼

2.4、修改MySQL密碼

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

說明:MySQL密碼自行設置,這里以 123456 為例

2.5、遠程訪問的授權

mysql> create user 'root'@'%' identified with mysql_native_password by '123456'; mysql> grant all privileges on *.* to 'root'@'%' with grant option; mysql> flush privileges;

2.6、 修改加密規則並退出

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; mysql> flush privileges; mysql> exit;

3、配置防火牆

說明:關於防火牆配置,這里列出兩種方式配置,根據系統防火牆要求選擇

3.1、使用CentOS 7 默認防火牆firewalld

systemctl start firewalld # 開放3306端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload

說明:關於firewalld防火牆相關命令如下

# 1、啟動防火牆服務, firewalld.service 可簡寫為 firewalld systemctl start firewalld.service # 2、查看防火牆服務運行狀態 systemctl status firewalld.service # 3、重啟防火牆服務 systemctl restart firewalld.service # 4、關閉防火牆 systemctl stop firewalld.service # 5、開機啟動防火牆 systemctl enable firewalld.service # 6、禁止firewalld開機啟動 systemctl disable firewalld.service ## firewall-cmd相關
# 1、添加端口, 例如: 添加 3306 端口, 說明: --permanent 參數表示永久生效,若無此參數則在執行 reload 后失效 firewall-cmd --zone=public --add-port=80/tcp --permanent # 2、關閉端口, 例如:關閉3306端口 firewall-cmd --zone=public --remove-port=3306/tcp --permanent # 3、更新防火牆規則 firewall-cmd --reload # 4、查看開放端口, 例如: 查看開放的 3306 端口 firewall-cmd --zone= public --query-port=3306/tcp # 5、刪除開放端口, 例如: 刪除 3306 端口 firewall-cmd --zone= public --remove-port=3306/tcp --permanent # 6、查看防火牆所有開放的端口 firewall-cmd --zone=public --list-ports # 7、查看防火牆狀態(關閉后顯示notrunning,開啟后顯示running) firewall-cmd --state # 8、查看防火牆版本信息 firewall-cmd --version

3.2、使用 iptables 防火牆

說明:

i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器

ii> 切換為 root 用戶進行如下操作,切換root用戶命令如下

su root

輸入root對應的密碼,即可完成切換

3.2.1、關閉默認的firewall防火牆

systemctl stop firewalld.service; systemctl disable firewalld.service; systemctl mask firewalld.service;

3.2.2、安裝 iptables 防火牆

在根目錄文件夾下,執行如下命令,安裝iptables防火牆

yum -y install iptables-services

說明:

CentOS7(RHEL7)開始,官方的標准防火牆設置軟件從iptables變更為firewalld。如果需要使用iptables,則需禁用自帶的firewalld服務,同時安裝iptables服務。

同時由於在使用Docker時,啟用centos7默認的firewall,啟動端口映射時,防火牆規則不生效。docker默認使用了iptables防火牆機制。所以需要關閉firewall使用iptables解決。

3.2.3、設置並啟動防火牆

在根目錄文件夾下,執行如下命令

systemctl enable iptables; systemctl start iptables;

3.2.4、編輯防火牆文件,添加端口

在根目錄文件夾下,執行如下命令

vi /etc/sysconfig/iptables

添加如下端口配置

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8090 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 33061 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 33062 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 33063 -j ACCEPT

3.2.5、重啟防火牆使配置生效

在根目錄文件夾下,執行如下命令

systemctl restart iptables.service

3.2.6、設置防火牆開機啟動

systemctl enable iptables.service

3.2.7、使用 ifconfig 命令查看 IP地址

3.2.8、使用數據庫連接工具連接MySQL數據庫進行本地測試

 

4、基於MGR方式搭建MySQL集群

重新打開一個終端窗口,在新打開的窗口中,切換為 root 用戶進行如下操作,切換root用戶命令如下

su root

輸入root對應的密碼,即可完成切換

4.1、修改mysql配置文件信息(三個節點均需配置)

在根目錄下,修改mysql配置文件,執行如下命令

vi /etc/my.cnf

具體配置信息內容如下(以第一個節點為例):

datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid server_id=1 gtid_mode=ON enforce_gtid_consistency=ON binlog_checksum=NONE log_bin=binlog log_slave_updates=ON binlog_format=ROW master_info_repository=TABLE relay_log_info_repository=TABLE # 此參數是在server收集寫集合的同時以便將其記錄到二進制日志。寫集合基於每行的主鍵,並且是行更改后的唯一標識此標識將用於檢測沖突。 transaction_write_set_extraction=XXHASH64 # 組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致! loose-group_replication_group_name="aadaaaaa-adda-adda-aaaa-aaaaaaddaaaa" # 啟動mysql時不自動啟動組復制 loose-group_replication_start_on_boot=OFF # 本機IP地址或者映射,33061用於接收來自其他組成員的傳入連接 loose-group_replication_local_address= "master:33061" # 當前主機成員需要加入組時,Server先訪問這些種子成員中的一個,然后它請求重新配置以允許它加入組 # 需要注意的是,此參數不需要列出所有組成員,只需列出當前節點加入組需要訪問的節點即可。 loose-group_replication_group_seeds= "master:33061,node1:33062,node2:33063" # 是否自動引導組。此選項只能在一個server實例上使用,通常是首次引導組時(或在整組成員關閉的情況下),如果多次引導,可能出現腦裂。 loose-group_replication_bootstrap_group=OFF

第二個節點修改內容如下:

server_id=2 loose-group_replication_local_address= "node1:33062"

第三個節點修改內容如下:

server_id=3 loose-group_replication_local_address= "node2:33063"

三個節點添加完配置信息之后,分別重啟MySQL服務,以使配置生效

systemctl restart mysqld.service

4.2、創建復制賬號(三個節點均需配置)

登錄mysql,各節點執行如下命令

mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER mgruser@'%' IDENTIFIED BY '123456'; mysql> GRANT REPLICATION SLAVE ON *.* TO mgruser@'%'; mysql> FLUSH PRIVILEGES; mysql> SET SQL_LOG_BIN=1; mysql> CHANGE MASTER TO MASTER_USER='mgruser', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';

說明:上述命令中的復制賬號mgruser,可以根據自己喜好設置,但是需要保證各節點復制賬號保持一致

4.3、安裝MGR插件

mysql> install PLUGIN group_replication SONAME 'group_replication.so'; -- 查看group replication組件 mysql> show plugins;

4.4、啟動MGR單主模式

4.4.1、主節點操作

1> 在主節點(當前主節點為:192.168.91.131)啟動MGR,執行如下命令

mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION; mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

2> 查看MGR組信息

mysql> SELECT * FROM performance_schema.replication_group_members;

4.4.2、從節點操作

1> 從節點加入MGR,在從庫(192.168.91.132,192.168.91.133)上執行如下命令

mysql> START GROUP_REPLICATION;

2> 在從節點上查看MGR組信息

mysql> SELECT * FROM performance_schema.replication_group_members;

 可能遇到問題:

0> 若主庫啟動報如下錯:

Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33061'

解決方案:執行如下命令

vi /etc/selinux/config # 將 SELINUX=enforcing 改為 SELINUX=disabled

1> 若從節點state值一直為RECOVERING,同時查看日志報如下錯:

Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

注:查看日志命令如下:

cat /var/log/mysqld.log

報錯原因:由於mysql8.0之后加密規則變成 caching_sha2_password,所以使用MGR方式復制時,需要打開公鑰訪問。

解決方案:在每個從節點上執行下面命令

mysql> STOP GROUP_REPLICATION; mysql> SET GLOBAL group_replication_recovery_get_public_key=ON; mysql> START GROUP_REPLICATION;

再次查看MGR組信息

mysql> SELECT * FROM performance_schema.replication_group_members;

2> 從庫報錯如下信息

Slave SQL for channel 'group_replication_recovery': Error 'Can't create database 'test'; database exists' on query. Default database: 'test'. Query: 'CREATE DATABASE `test` /*!40100 COLLATE 'utf8mb4_general_ci' */', Error_code: MY-001007

解決方案:在從節點執行如下命令

mysql> STOP GROUP_REPLICATION; mysql> set global super_read_only=0; mysql> drop database test; mysql> set global super_read_only=1; mysql> START GROUP_REPLICATION; mysql> SELECT * FROM performance_schema.replication_group_members;

若從庫報錯如下信息

Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 6ef62e0a-1614-11ec-84c1-000c29e49c19:1-3, aadaaaaa-adda-adda-aaaa-aaaaaaddaaaa:1-7 > Group transactions: aadaaaaa-adda-adda-aaaa-aaaaaaddaaaa:1-2' Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

解決方案:在從節點執行如下命令

mysql> STOP GROUP_REPLICATION; mysql> RESET MASTER; mysql> START GROUP_REPLICATION; mysql> SELECT * FROM performance_schema.replication_group_members;

5、數據同步測試

1> 使用數據庫連接工具連接數據庫集群,進行讀寫操作,查看數據是否同步;

# 1、在主庫節點master數據庫上執行 mysql> CREATE DATABASE test; mysql> USE test; mysql> CREATE TABLE user (`id` INT(11) PRIMARY KEY, `name` varchar(256) NOT NULL); mysql> INSERT INTO user VALUES (1, '星空流年'); # 2、在3個節點查看, 可以看到均有相同的表和數據 mysql> select * from test.user; # 3、在從節點測試寫入,驗證不支持寫入操作

2> 主、從庫服務停掉,查看從庫服務器狀態變化

# 1、將從庫節點node1上從mgr組中去除 mysql> stop group_replication; # 2、在主庫節點master或從庫節點node2查看,發現僅剩2個節點 mysql> SELECT * FROM performance_schema.replication_group_members; # 3、在主庫節點master插入數據, 進行寫操作,此時查看從庫節點node1數據庫並沒有進行數據同步 # 4、將從庫節點node1加入mgr組,之后再次查看從庫節點node1數據庫,發現數據庫信息已同步 mysql> start group_replication; # 5、主庫節點master移除mgr組之后,會在從庫節點node1、node2中按照配置選擇對應的從庫節點作為主庫節點

6、MGR整合MySQL Router實現讀寫分離

6.1、安裝MySQL Router

說明:讀寫分離這部分,選擇從庫節點進行安裝部署(這里以 192.168.91.132 從庫節點舉例說明)

重新打開一個終端窗口,在新打開的窗口中,切換為 root 用戶進行如下操作,切換root用戶命令如下

su root

輸入root對應的密碼,即可完成切換

1> 進入到/usr/local/mysql文件夾下,下載MySQL Router安裝包,並解壓重命名

wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.23-el7-x86_64.tar.gz tar -xvf mysql-router-8.0.23-el7-x86_64.tar.gz mv mysql-router-8.0.23-el7-x86_64 mysql-router-8.0.23

2> 進入到mysql-router-8.0.23文件夾下,執行如下命令,添加系統變量

pwd echo "export PATH=$PATH:/usr/local/mysql/mysql-router-8.0.23/bin/" >> /etc/profile source /etc/profile

3> 在當前文件夾下,查看MySQL Router是否安裝成功

mysqlrouter --help mysqlrouter -V

6.2、配置MySQL Router

 1> 進入 /usr/local/mysql/mysql-router-8.0.23 文件夾下創建日志、數據文件夾

mkdir log mkdir data ls

 2> 在當前文件夾下,進行用戶授權

chown -R root:123456 /usr/local/mysql/mysql-router-8.0.23 ll

3> 進到 /usr/local/mysql/mysql-router-8.0.23/share/doc/mysqlrouter 文件夾下,復制sample_mysqlrouter.conf文件

cd /usr/local/mysql/mysql-router-8.0.23/share/doc/mysqlrouter cp sample_mysqlrouter.conf /etc/mysqlrouter.conf

4> 進到 /etc 文件夾下,編輯 mysqlrouter.conf 配置文件,添加如下信息

[DEFAULT] logging_folder=/usr/local/mysql/mysql-router-8.0.23/log runtime_folder=/usr/local/mysql/mysql-router-8.0.23/run data_folder=/usr/local/mysql/mysql-router-8.0.23/data connect_timeout=30 read_timeout=30 [logger] level = INFO [routing:primary] bind_address = 0.0.0.0 # 端口7001 bind_port = 7001 max_connections = 1024 # 可用的支持寫操作的主庫,或者主庫共用的IP destinations = 192.168.91.131:3306,192.168.91.132:3306,192.168.91.133:3306 routing_strategy = first-available [routing:secondary] bind_address = 0.0.0.0 # 端口7002 bind_port = 7002 max_connections = 1024 # 參與讀負載均衡的從庫 destinations = 192.168.91.132:3306,192.168.91.133:3306 routing_strategy = round-robin

5> 給 mysqlrouter.conf 配置文件授權

chown root:123456 /etc/mysqlrouter.conf ll

6> 修改iptables防火牆配置放開 7001/7002 端口

vi /etc/sysconfig/iptables

添加如下配置

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT

重啟iptables,使配置生效

systemctl restart iptables.service

7> 在當前文件夾下,啟動MySQL Router並進行讀寫測試

# 啟動router mysqlrouter --config=/etc/mysqlrouter.conf & # 只讀:(輪詢) mysql -h 192.168.91.132 -u root -p -P 7002 -e "select @@hostname" # 讀寫: mysql -h 192.168.91.132 -u root -p -P 7001 -e "select @@hostname"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM