MySQL8集群搭建——基於MGR方式
說明:此集群搭建為單主模式,即一主多從
|
|
操作系統
|
HostName映射
|
|---|---|---|
|
192.168.91.131
|
CentOS7
|
master
|
|
192.168.91.132
|
CentOS7
|
node1
|
|
192.168.91.133
|
CentOS7
|
|
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
init 6
說明:
i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器
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
rpm -qa | grep mariadb
2> 卸載mariadb
rpm -e XXXXXXXX --nodeps
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
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

說明:
i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器
su root
輸入root對應的密碼,即可完成切換
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
cat /var/log/mysqld.log | grep password

mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> create user 'root'@'%' identified with mysql_native_password by '123456'; mysql> grant all privileges on *.* to 'root'@'%' with grant option; mysql> flush privileges;

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

systemctl start firewalld # 開放3306端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload
# 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
說明:
i> 以下安裝步驟在主、從服務器上均需要執行,也就是本例中的192.168.91.131、192.168.91.132、192.168.91.133服務器
ii> 切換為 root 用戶進行如下操作,切換root用戶命令如下
su root
輸入root對應的密碼,即可完成切換
systemctl stop firewalld.service; systemctl disable firewalld.service; systemctl mask firewalld.service;
3.2.2、安裝 iptables 防火牆
在根目錄文件夾下,執行如下命令,安裝iptables防火牆
yum -y install iptables-services
說明:
從
同時由於在使用
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

systemctl restart iptables.service
systemctl enable iptables.service

重新打開一個終端窗口,在新打開的窗口中,切換為 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"
systemctl restart mysqld.service
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';
mysql> install PLUGIN group_replication SONAME 'group_replication.so'; -- 查看group replication組件 mysql> show plugins;

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;
mysql> START GROUP_REPLICATION;
2> 在從節點上查看MGR組信息
mysql> SELECT * FROM performance_schema.replication_group_members;

Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33061'
vi /etc/selinux/config # 將 SELINUX=enforcing 改為 SELINUX=disabled
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;
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.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

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"





