1.工具及版本
1.1 MySQL版本
MySQL |
8.0.20 |
MySQL-shell |
8.0.20 |
mysql-router |
8.0.20 |
1.2 服務器版本
192.168.189.111 |
mysql01 |
centos7 1908 |
192.168.189.112 |
mysql02 |
centos7 1908 |
192.168.189.113 |
mysql03 |
centos7 1908 |
2. 搭建MySQL (三台服務器都執行)
安裝MySQL服務:
2.1. 刪除mariabdb服務
rpm -qa|grep mariadb
刪除上面列出的服務:rpm -e --nodeps xxxx
2.2.安裝mysql服務:按順序執行下面語句,中間缺少包請yum下載
一般會缺少net-tools,直接
yum install -y net-tools
就可以了
rpm -ivh mysql-community-common-8.0.20-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-8.0.20-1.el7.x86_64.rpm rpm -ivh mysql-community-client-8.0.20-1.el7.x86_64.rpm rpm -ivh mysql-community-server-8.0.20-1.el7.x86_64.rpm
2.3 修改my.cnf文件
vim /etc/my.cnf -- 添加以下內容 lower_case_table_names=1
2.4 啟動MySQL服務
systemctl start mysqld
如果沒有啟動成功,查看/var/log/mysqld.log
2.5 進入MySQL修改密碼
cat /var/log/mysqld.log | grep password -- 會顯示初始密碼,如下:
2020-09-21T07:40:03.235725Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ,Ukkmc*wp9!p
mysql -uroot -p -- 輸入上面的密碼: -- 修改密碼: alter user 'root'@'localhost' identified by 'Tz@202009'; -- 創建遠程訪問用戶和密碼並賦權 create user 'root'@'%' identified with mysql_native_password by 'Tz@202009'; grant all privileges on *.* to 'root'@'%' with grant option; flush privileges;
3. 安裝MySQL-shell (三台服務器都執行)
rpm -ivh mysql-shell-8.0.20-1.el7.x86_64.rpm
3.1 創建cluster前的准備
進入mysqlsh並連接mysql,每台服務器都要連接三次(注意:必須要先將三台機器每個都連接過三個MySQL,順序出錯則可能會出現問題)
三台機器都連接過數據庫后,再連接各自MySQL執行下面操作
如果最后出現status:ok,則可以創建clutser了。
3.2 創建cluster
隨便選擇一台機器執行下面語句,我這里選擇mysql01
出現紅框內容表示cluster創建成功
下面將另外兩台服務器加入集群(接着上面的命令繼續)
上面表示已經將mysql02加入到集群中了,同理將mysql03加入集群。
查看集群狀態
cluster.status()
可以看到集群的信息,其中mode:R/W 代表可讀可寫,R/O表示可讀
"topologyMode": "Single-Primary" 表示該集群為單主模式,即只有一台機器可寫,其余機器為只讀
也可以通過sql語句查詢集群的主副服務器
4.修改多主模式
方法一:
一行命令解決
cluster.switchToMultiPrimaryMode()
方法二:
這個方法比較麻煩。
MGR切換模式需要重新啟動組復制,因些需要在所有節點上先關閉組復制,設置 group_replication_single_primary_mode=OFF 等參數,再啟動組復制。
1) 停止組復制(在所有節點上執行): mysql> stop group_replication; Query OK, 0 rows affected (9.08 sec) mysql> set global group_replication_single_primary_mode=OFF; Query OK, 0 rows affected (0.00 sec) mysql> set global group_replication_enforce_update_everywhere_checks=ON; Query OK, 0 rows affected (0.00 sec) 2) 隨便選擇某個MGR節點執行 (比如這里選擇在mysql01節點): mysql -p123456 mysql> SET GLOBAL group_replication_bootstrap_group=ON; Query OK, 0 rows affected (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (2.20 sec) mysql> SET GLOBAL group_replication_bootstrap_group=OFF; Query OK, 0 rows affected (0.00 sec) 3) 然后在其他的MGR節點執行 (mysql02和mysql03上執行): mysql> START GROUP_REPLICATION; Query OK, 0 rows affected, 1 warning (5.89 sec)
然后進入mysqlsh

最后查看cluster狀態

已經修改為多主模式了,並且每個節點都是R/W,可讀可寫
5. 安裝mysql-router
rpm -ivh mysql-router-community-8.0.20-1.el7.x86_64.rpm vim /etc/mysqlrouter/mysqlrouter.conf -- 增加已下內容 [routing:read_writer] bind_address = 192.168.189.111 bind_port = 7001 mode = read-write destinations = mysql01:3306,mysql02:3306,mysql03:3306 max_connections = 1024 protocol = classic [routing:read_only] bind_address = 192.168.189.111 bind_port = 7002 mode = read-only destinations = mysql01:3306,mysql02:3306,mysql03:3306 max_connections = 1024 protocol = classic
啟動mysqlrouter服務 mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf & 查看是否啟動成功 ps -ef | grep router
至此,集群和router安裝結束,可以使用遠程工具連接。
我這里使用192.168.189.111:7002連接MySQL
配置文件解釋(來源網絡):
mysql router默認會尋找安裝目錄下的"mysqlrouter.conf"和家目錄下的".mysqlrouter.conf"。也可以在二進制程序mysqlrouter命令下使用"-c"或者"--config"手動指定配置文件。
MySQL router的配置文件是片段式的,常用的就3個片段:[DEFAULT]、[logger]、[routing:NAME]。片段名稱區分大小寫,且只支持單行"#"或";"注釋,不支持行中、行尾注釋。
1.DEFAULT片段的配置。
[DEFAULT]片段通常配置配置文件的目錄、日志的目錄、MySQL router運行時的目錄(如pid文件)。
例如:
[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /var/run/mysqlrouter
config_folder = /etc/mysqlrouter
2.logger片段的配置。
[logger]片段只有一個選項,設置日志的記錄級別。 [logger] level=info # 有debug、info(默認)、warning、error、fatal,不區分大小寫
3.routing片段的配置。
[routing:NAME]是MySQL router主要部分,設置不同的路由實例,其中NAME可以隨意命名。如[routing:slaves]、[routing:masters]。
在routing配置片段,可以設置的選項包括:
- (1).bind_address和bind_port
bind_address和bind_port是mysql router監聽前端SQL請求的地址和端口。其中端口是MySQL Router要求強制提供的,但可以不用bind_port綁定,因為它可用通過bind_address的IP:PORT格式指定。
一個routing規則中只能設置一個地址監聽指令,但可以通過"0.0.0.0"來監聽主機上所有的地址。如果沒有提供監聽地址,則默認監聽127.0.0.1。
另外,監聽地址不能出現在destinations指令指定的列表中。
- (2).destinations
定義routing規則的轉發目標,格式為HOST:PORT,HOST可以是IP也可以是主機名,多個轉發目標使用逗號分隔。如定義的目標列表是多個slave。 [routing:slaves] bind_address = 192.168.100.21:7001 destinations = 192.168.100.23:3306,192.168.100.24:3306 [routing:masters] bind_address = 192.168.100.21:7002 destinations = 192.168.100.22:3306,192.168.100.100:3306
(3).mode
MySQL router提供兩種mode:read-only和read-write。這兩種方式會產生不同的轉發調度方式。
- 設置為read-write,常用於設置destinations為master時,實現master的高可用。
- 調度方式:當MySQL router第一次收到客戶端請求時,會將請求轉發給destinations列表中的第一個目標,第二次收到客戶端請求還是會轉發給第一個目標,只有當第一個目標聯系不上(如關閉了MySQL服務、宕機等)才會聯系第二個目標,如果所有目標都聯系不上,MySQL Router會中斷。這種調度方式被稱為"first-available"。
- 當聯系上了某一個目標時,MySQL Router會將其緩存下來,下次收到請求還會繼續轉發給該目標。既然是緩存的目標,就意味着在MySQL Router重啟之后就會失效。
- 所以通過MySQL Router實現讀寫分離的寫時,可以設置多個master,讓性能好的master放在destinations列表的第一個位置,其他的master放在后面的位置作為備用master。
- 設置為read-only,常用於設置destinations為slave時,實現MySQL讀請求負載均衡。
- 調度方式:當MySQL route收到客戶端請求時,會從destinations列表中的第一個目標開始向后輪詢(round-robin),第一個請求轉發給第一個目標,第二個請求轉發給第二個目標,轉發給最后一個目標之后的下一個請求又轉發給第一個目標。如果第一個目標不可用,會依次向后檢查,直到目標可用,如果所有目標都不可用,則MySQL Router中斷。
- 那些不可用的目標會暫時被隔離,並且mysql router會不斷的檢查它們的狀況,當重新可用時會重新加入到目標列表。
(4).connect_timeout
MySQL Router聯系destinations的超時時間,默認為1秒,值的范圍為1-65536。應該盡量設置值小點,免得等待時間過長。
對於read-write模式,可以將超時時間設置的稍長一點點,防止誤認為主master不可用而去聯系備master。
對於read-only模式,可以將超時時間設置的稍短一點點,因為這種模式下是destinations列表輪詢的,即使誤判了影響也不會太大。
(5).其他選項
還能設置一些其他的指令,如使用的協議、最大請求數等,但是都可以不用設置使用默認值,它們都是MySQL Router結合MySQL優化過的一些選項,本身已經較完美了。